vafast 0.4.6 → 0.4.19

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 (163) hide show
  1. package/README.md +70 -8
  2. package/dist/base-server-B7MYJNsl.mjs +112 -0
  3. package/dist/{base-server-DMhpmq5v.mjs.map → base-server-B7MYJNsl.mjs.map} +1 -1
  4. package/dist/{base-server-CtA1bZSg.d.mts → base-server-DLxtulAO.d.mts} +2 -2
  5. package/dist/{base64url-DUtluDF0.mjs → base64url-C2zopQdH.mjs} +1 -1
  6. package/dist/{base64url-DUtluDF0.mjs.map → base64url-C2zopQdH.mjs.map} +1 -1
  7. package/dist/{base64url-0N9uQPjZ.d.mts → base64url-Dwi2Afhc.d.mts} +1 -1
  8. package/dist/{component-route-DF5feXJI.d.mts → component-route-nrrO0iSI.d.mts} +2 -2
  9. package/dist/{component-router-uSylkByf.mjs → component-router-RwPL20vN.mjs} +10 -11
  10. package/dist/{component-router-uSylkByf.mjs.map → component-router-RwPL20vN.mjs.map} +1 -1
  11. package/dist/component-server-DomPJ_7S.mjs +119 -0
  12. package/dist/{component-server-DIgykV0F.mjs.map → component-server-DomPJ_7S.mjs.map} +1 -1
  13. package/dist/{component-server-DvcPVnL4.d.mts → component-server-JqpDC7wy.d.mts} +4 -4
  14. package/dist/{create-handler-DRcJRkx9.d.mts → create-handler-DKw-sQOV.d.mts} +2 -2
  15. package/dist/{create-handler-IzOE24L5.mjs → create-handler-RconAcAB.mjs} +5 -6
  16. package/dist/{create-handler-IzOE24L5.mjs.map → create-handler-RconAcAB.mjs.map} +1 -1
  17. package/dist/defineRoute.d.mts +3 -3
  18. package/dist/{dependency-manager-C_qZvkaw.d.mts → dependency-manager-C3_7ic4h.d.mts} +1 -1
  19. package/dist/dependency-manager-DCmh7xFc.mjs +60 -0
  20. package/dist/{dependency-manager-BpN2YufZ.mjs.map → dependency-manager-DCmh7xFc.mjs.map} +1 -1
  21. package/dist/{formats-CYLwo9GJ.d.mts → formats-Dk-DSBY4.d.mts} +1 -1
  22. package/dist/{go-await-2Pzj4snS.mjs → go-await-C4ZdEUwY.mjs} +1 -1
  23. package/dist/{go-await-2Pzj4snS.mjs.map → go-await-C4ZdEUwY.mjs.map} +1 -1
  24. package/dist/{go-await-DRItVwwh.d.mts → go-await-DL1A_-4X.d.mts} +1 -1
  25. package/dist/{handle-D0TFoOiX.d.mts → handle-BhR3oyky.d.mts} +1 -1
  26. package/dist/{handle-s4V-E2RE.mjs → handle-BxJwSvV0.mjs} +2 -2
  27. package/dist/{handle-s4V-E2RE.mjs.map → handle-BxJwSvV0.mjs.map} +1 -1
  28. package/dist/{html-renderer-CMGKJoIy.d.mts → html-renderer-CfKK2BrP.d.mts} +1 -1
  29. package/dist/{html-renderer-CuakkPIt.mjs → html-renderer-DTtJ_Yic.mjs} +26 -27
  30. package/dist/{html-renderer-CuakkPIt.mjs.map → html-renderer-DTtJ_Yic.mjs.map} +1 -1
  31. package/dist/{index-CdOYxwDQ.d.mts → index-CEfOqqvd.d.mts} +5 -5
  32. package/dist/index.d.mts +24 -24
  33. package/dist/index.mjs +20 -23
  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 -2
  37. package/dist/{middleware-CV5o-4wk.mjs → middleware-CewKbtb4.mjs} +51 -58
  38. package/dist/{middleware-CV5o-4wk.mjs.map → middleware-CewKbtb4.mjs.map} +1 -1
  39. package/dist/{middleware-5PjaxPMA.d.mts → middleware-KXEoefLX.d.mts} +2 -2
  40. package/dist/middleware.d.mts +3 -3
  41. package/dist/middleware.mjs +1 -2
  42. package/dist/monitoring/index.d.mts +8 -33
  43. package/dist/monitoring/index.mjs +1 -27
  44. package/dist/monitoring/native-monitor.d.mts +148 -27
  45. package/dist/monitoring/native-monitor.mjs +320 -116
  46. package/dist/monitoring/native-monitor.mjs.map +1 -1
  47. package/dist/node-server/index.d.mts +1 -1
  48. package/dist/node-server/index.mjs +3 -3
  49. package/dist/node-server/request.mjs +1 -1
  50. package/dist/node-server/response.mjs +1 -1
  51. package/dist/node-server/serve.d.mts +1 -1
  52. package/dist/node-server/serve.mjs +2 -2
  53. package/dist/{parsers-7lvt3Oss.d.mts → parsers-BerGr2_q.d.mts} +1 -1
  54. package/dist/{parsers-BQ63b0YE.mjs → parsers-DpH_mD0H.mjs} +1 -1
  55. package/dist/{parsers-BQ63b0YE.mjs.map → parsers-DpH_mD0H.mjs.map} +1 -1
  56. package/dist/path-matcher-CGczAIl_.mjs +61 -0
  57. package/dist/{path-matcher-BNaaJgI3.mjs.map → path-matcher-CGczAIl_.mjs.map} +1 -1
  58. package/dist/radix-tree-qqSjnVXF.mjs +163 -0
  59. package/dist/{radix-tree-Qxr-QpCx.mjs.map → radix-tree-qqSjnVXF.mjs.map} +1 -1
  60. package/dist/{request-B886yCvG.mjs → request-B-Nct5f7.mjs} +1 -1
  61. package/dist/{request-B886yCvG.mjs.map → request-B-Nct5f7.mjs.map} +1 -1
  62. package/dist/{request-validator-DLFtm4uV.mjs → request-validator-Bz9X48FX.mjs} +3 -3
  63. package/dist/{request-validator-DLFtm4uV.mjs.map → request-validator-Bz9X48FX.mjs.map} +1 -1
  64. package/dist/{request-validator-42lY21gn.d.mts → request-validator-Coo8dI-p.d.mts} +2 -2
  65. package/dist/{response-CxYf6Ep3.d.mts → response-BMfdEcTm.d.mts} +2 -2
  66. package/dist/{response-30WnzABq.mjs → response-BnkYA4pj.mjs} +1 -1
  67. package/dist/{response-30WnzABq.mjs.map → response-BnkYA4pj.mjs.map} +1 -1
  68. package/dist/{route-CUbNpSwz.d.mts → route-6A7umH7b.d.mts} +2 -2
  69. package/dist/{route-B3ONOzxQ.mjs → route-Ds53PR4M.mjs} +1 -1
  70. package/dist/{route-B3ONOzxQ.mjs.map → route-Ds53PR4M.mjs.map} +1 -1
  71. package/dist/{route-registry-CYD7m6QP.d.mts → route-registry-CmABJA2V.d.mts} +2 -2
  72. package/dist/route-registry-emTmRrWQ.mjs +226 -0
  73. package/dist/{route-registry-BVvbghgH.mjs.map → route-registry-emTmRrWQ.mjs.map} +1 -1
  74. package/dist/router/index.d.mts +2 -2
  75. package/dist/router/index.mjs +3 -9
  76. package/dist/router/radix-tree.d.mts +3 -3
  77. package/dist/router/radix-tree.mjs +1 -2
  78. package/dist/{router-B9HUUCkR.mjs → router-xWzwz_1a.mjs} +2 -5
  79. package/dist/{router-B9HUUCkR.mjs.map → router-xWzwz_1a.mjs.map} +1 -1
  80. package/dist/router.d.mts +3 -3
  81. package/dist/router.mjs +1 -2
  82. package/dist/{schema-DOKg31ZX.d.mts → schema-B6DFN5c2.d.mts} +1 -1
  83. package/dist/{serve-DgWBnexE.mjs → serve-48LEIkPa.mjs} +3 -3
  84. package/dist/{serve-DgWBnexE.mjs.map → serve-48LEIkPa.mjs.map} +1 -1
  85. package/dist/{serve-B5WmhK6m.d.mts → serve-AG80VaIr.d.mts} +1 -1
  86. package/dist/serve.d.mts +1 -1
  87. package/dist/serve.mjs +2 -2
  88. package/dist/server/base-server.d.mts +3 -3
  89. package/dist/server/base-server.mjs +1 -2
  90. package/dist/server/component-server.d.mts +4 -4
  91. package/dist/server/component-server.mjs +2 -3
  92. package/dist/server/index.d.mts +6 -6
  93. package/dist/server/index.mjs +6 -7
  94. package/dist/server/server-factory.d.mts +6 -6
  95. package/dist/server/server-factory.mjs +5 -6
  96. package/dist/server/server.d.mts +4 -4
  97. package/dist/server/server.mjs +2 -3
  98. package/dist/server-C75o1b-a.mjs +70 -0
  99. package/dist/server-C75o1b-a.mjs.map +1 -0
  100. package/dist/{server-CWIZP6nb.d.mts → server-DGA3dd5s.d.mts} +3 -3
  101. package/dist/server-L_FNwdap.mjs +137 -0
  102. package/dist/{server-C3yoZXNs.mjs.map → server-L_FNwdap.mjs.map} +1 -1
  103. package/dist/{sse-BDIptC85.d.mts → sse-BgLhEo43.d.mts} +2 -2
  104. package/dist/{sse-CCVfFW6s.mjs → sse-CBl-szg1.mjs} +3 -3
  105. package/dist/{sse-CCVfFW6s.mjs.map → sse-CBl-szg1.mjs.map} +1 -1
  106. package/dist/types/component-route.d.mts +1 -1
  107. package/dist/types/index.d.mts +5 -5
  108. package/dist/types/index.mjs +1 -1
  109. package/dist/types/route.d.mts +1 -1
  110. package/dist/types/route.mjs +1 -1
  111. package/dist/types/schema.d.mts +1 -1
  112. package/dist/types/types.d.mts +1 -1
  113. package/dist/{types-mpeSaHdI.d.mts → types-D1PUFkda.d.mts} +1 -1
  114. package/dist/utils/base64url.d.mts +1 -1
  115. package/dist/utils/base64url.mjs +1 -1
  116. package/dist/utils/create-handler.d.mts +2 -2
  117. package/dist/utils/create-handler.mjs +4 -4
  118. package/dist/utils/dependency-manager.d.mts +1 -1
  119. package/dist/utils/dependency-manager.mjs +1 -2
  120. package/dist/utils/formats.d.mts +1 -1
  121. package/dist/utils/go-await.d.mts +1 -1
  122. package/dist/utils/go-await.mjs +1 -1
  123. package/dist/utils/handle.d.mts +1 -1
  124. package/dist/utils/handle.mjs +2 -2
  125. package/dist/utils/html-renderer.d.mts +1 -1
  126. package/dist/utils/html-renderer.mjs +1 -2
  127. package/dist/utils/index.d.mts +16 -16
  128. package/dist/utils/index.mjs +13 -21
  129. package/dist/utils/parsers.d.mts +1 -1
  130. package/dist/utils/parsers.mjs +1 -1
  131. package/dist/utils/path-matcher.mjs +1 -2
  132. package/dist/utils/request-validator.d.mts +2 -2
  133. package/dist/utils/request-validator.mjs +3 -3
  134. package/dist/utils/response.d.mts +4 -4
  135. package/dist/utils/response.mjs +1 -2
  136. package/dist/utils/route-registry.d.mts +3 -3
  137. package/dist/utils/route-registry.mjs +1 -2
  138. package/dist/utils/sse.d.mts +2 -2
  139. package/dist/utils/sse.mjs +3 -3
  140. package/dist/utils/validators/validators.d.mts +1 -1
  141. package/dist/utils/validators/validators.mjs +1 -1
  142. package/dist/{validators-CPmnj_y9.d.mts → validators-Ch71zkT8.d.mts} +1 -1
  143. package/dist/{validators-WXQ49LcR.mjs → validators-DBkyw6BG.mjs} +1 -1
  144. package/dist/{validators-WXQ49LcR.mjs.map → validators-DBkyw6BG.mjs.map} +1 -1
  145. package/package.json +7 -2
  146. package/dist/base-server-DMhpmq5v.mjs +0 -113
  147. package/dist/chunk-DW4-Jl94.mjs +0 -37
  148. package/dist/component-server-DIgykV0F.mjs +0 -124
  149. package/dist/dependency-manager-BpN2YufZ.mjs +0 -61
  150. package/dist/monitoring/index.mjs.map +0 -1
  151. package/dist/monitoring/types.d.mts +0 -150
  152. package/dist/path-matcher-BNaaJgI3.mjs +0 -62
  153. package/dist/radix-tree-Qxr-QpCx.mjs +0 -157
  154. package/dist/route-registry-BVvbghgH.mjs +0 -225
  155. package/dist/router/index.mjs.map +0 -1
  156. package/dist/schema-CflsMJuG.mjs +0 -1
  157. package/dist/server-BttM6Ssc.mjs +0 -88
  158. package/dist/server-BttM6Ssc.mjs.map +0 -1
  159. package/dist/server-C3yoZXNs.mjs +0 -136
  160. package/dist/utils/index.mjs.map +0 -1
  161. /package/dist/{component-route-BKUFoJ5P.mjs → component-route-DNgAj6VC.mjs} +0 -0
  162. /package/dist/{index-CTHojwxd.d.mts → index-CREkvfw9.d.mts} +0 -0
  163. /package/dist/{monitoring/types.mjs → schema-1fwiv7cm.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"create-handler-IzOE24L5.mjs","names":[],"sources":["../src/utils/create-handler.ts"],"sourcesContent":["/**\n * 类型安全的路由处理器工厂\n *\n * 非柯里化设计,API 更简洁\n *\n * @author Framework Team\n * @version 3.0.0\n * @license MIT\n */\n\nimport type {\n RouteSchema,\n HandlerContext,\n HandlerContextWithExtra,\n} from \"../types/schema\";\nimport { parseBody, parseQuery, parseHeaders, parseCookies } from \"./parsers\";\nimport { goAwait } from \"./go-await\";\nimport { json } from \"./response\";\nimport {\n validateAllSchemas,\n precompileSchemas,\n} from \"./validators/validators\";\n\n/**\n * 自动响应转换\n * 将各种返回值类型转换为 Response 对象\n */\nfunction autoResponse(result: unknown): Response {\n // 已经是 Response\n if (result instanceof Response) {\n return result;\n }\n\n // null/undefined -> 204\n if (result === null || result === undefined) {\n return new Response(null, { status: 204 });\n }\n\n // 字符串 -> text/plain\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 数字/布尔 -> text/plain\n if (typeof result === \"number\" || typeof result === \"boolean\") {\n return new Response(String(result), {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 对象 -> 检查是否是 { data, status, headers } 格式\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (\"data\" in obj && (\"status\" in obj || \"headers\" in obj)) {\n const { data, status = 200, headers = {} } = obj;\n\n if (data === null || data === undefined) {\n return new Response(null, {\n status: status === 200 ? 204 : (status as number),\n headers: headers as HeadersInit,\n });\n }\n\n if (\n typeof data === \"string\" ||\n typeof data === \"number\" ||\n typeof data === \"boolean\"\n ) {\n return new Response(String(data), {\n status: status as number,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...(headers as Record<string, string>),\n },\n });\n }\n\n return json(data, status as number, headers as Record<string, string>);\n }\n\n // 普通对象 -> JSON\n return json(result);\n }\n\n // 其他类型 -> 204\n return new Response(null, { status: 204 });\n}\n\n/**\n * 处理验证错误\n */\nfunction handleValidationError(error: Error): Response {\n return json(\n {\n success: false,\n error: \"Validation Error\",\n message: error.message,\n timestamp: new Date().toISOString(),\n },\n 400,\n );\n}\n\n/**\n * 处理内部错误\n */\nfunction handleInternalError(error: unknown): Response {\n return json(\n {\n success: false,\n error: \"Internal Error\",\n message: error instanceof Error ? error.message : \"未知错误\",\n },\n 500,\n );\n}\n\n/** 空 schema 的上下文类型 */\ntype EmptySchemaContext = {\n req: Request;\n body: unknown;\n query: Record<string, string>;\n params: Record<string, string>;\n headers: Record<string, string>;\n cookies: Record<string, string>;\n};\n\n/**\n * 判断是否为 handler 函数\n */\nfunction isHandler(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\n/**\n * 创建类型安全的路由处理器\n *\n * @example\n * ```typescript\n * // 无 schema - 直接传入 handler\n * createHandler(({ params }) => `User: ${params.id}`)\n *\n * // 有 schema - 传入 schema 和 handler\n * createHandler(\n * { body: Type.Object({ name: Type.String() }) },\n * ({ body }) => ({ hello: body.name })\n * )\n * ```\n */\n/**\n * 带类型推断的 Handler - 保留返回类型信息用于客户端类型推断\n */\nexport type InferableHandler<TReturn, TSchema extends RouteSchema = RouteSchema> = ((req: Request) => Promise<Response>) & {\n /** 返回类型标记(仅用于类型推断,运行时不存在) */\n __returnType: TReturn;\n /** Schema 类型标记 */\n __schema: TSchema;\n};\n\n\n// 重载 1: 无 schema\nexport function createHandler<R>(\n handler: (ctx: EmptySchemaContext) => R | Promise<R>,\n): InferableHandler<R>;\n\n// 重载 2: 有 schema\nexport function createHandler<const T extends RouteSchema, R>(\n schema: T,\n handler: (ctx: HandlerContext<T>) => R | Promise<R>,\n): InferableHandler<R, T>;\n\n// 实现\nexport function createHandler<const T extends RouteSchema, R>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContext<T>) => R | Promise<R>,\n): InferableHandler<R, T> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (ctx: HandlerContext<T>) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemas(schema);\n }\n\n const handlerFn = async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemas(schema, data);\n }\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n });\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n\n // 类型断言:这些属性只在编译时用于类型推断,运行时不存在\n return handlerFn as InferableHandler<R, T>;\n}\n\n/**\n * 创建带额外上下文的路由处理器\n *\n * 用于中间件注入额外数据的场景\n *\n * @example\n * ```typescript\n * // 定义中间件注入的类型\n * type AuthContext = { user: { id: string; role: string } };\n *\n * // 无 schema\n * createHandlerWithExtra<AuthContext>(({ user }) => {\n * return { userId: user.id };\n * })\n *\n * // 有 schema\n * createHandlerWithExtra<AuthContext>(\n * { body: Type.Object({ action: Type.String() }) },\n * ({ body, user }) => ({ success: true, userId: user.id })\n * )\n * ```\n */\n// 重载 1: 无 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n R = unknown,\n>(\n handler: (ctx: EmptySchemaContext & TExtra) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 重载 2: 有 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schema: T,\n handler: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 实现\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext & TExtra) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (\n ctx: HandlerContextWithExtra<T, TExtra>,\n ) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemas(schema);\n }\n\n return async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemas(schema, data);\n }\n\n // 获取中间件注入的额外数据\n const extras = ((req as unknown as Record<string, unknown>).__locals ??\n {}) as TExtra;\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n ...extras,\n } as HandlerContextWithExtra<T, TExtra>);\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n}\n\n/**\n * 简单的路由处理器 (无 schema 验证,只有 req)\n *\n * @example\n * ```typescript\n * simpleHandler(({ req }) => {\n * return { message: \"Hello World\" };\n * })\n * ```\n */\nexport function simpleHandler<R>(\n handler: (ctx: { req: Request }) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n return async (req: Request): Promise<Response> => {\n try {\n const result = await handler({ req });\n return autoResponse(result);\n } catch (error) {\n return handleInternalError(error);\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"create-handler-RconAcAB.mjs","names":[],"sources":["../src/utils/create-handler.ts"],"sourcesContent":["/**\n * 类型安全的路由处理器工厂\n *\n * 非柯里化设计,API 更简洁\n *\n * @author Framework Team\n * @version 3.0.0\n * @license MIT\n */\n\nimport type {\n RouteSchema,\n HandlerContext,\n HandlerContextWithExtra,\n} from \"../types/schema\";\nimport { parseBody, parseQuery, parseHeaders, parseCookies } from \"./parsers\";\nimport { goAwait } from \"./go-await\";\nimport { json } from \"./response\";\nimport {\n validateAllSchemas,\n precompileSchemas,\n} from \"./validators/validators\";\n\n/**\n * 自动响应转换\n * 将各种返回值类型转换为 Response 对象\n */\nfunction autoResponse(result: unknown): Response {\n // 已经是 Response\n if (result instanceof Response) {\n return result;\n }\n\n // null/undefined -> 204\n if (result === null || result === undefined) {\n return new Response(null, { status: 204 });\n }\n\n // 字符串 -> text/plain\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 数字/布尔 -> text/plain\n if (typeof result === \"number\" || typeof result === \"boolean\") {\n return new Response(String(result), {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 对象 -> 检查是否是 { data, status, headers } 格式\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (\"data\" in obj && (\"status\" in obj || \"headers\" in obj)) {\n const { data, status = 200, headers = {} } = obj;\n\n if (data === null || data === undefined) {\n return new Response(null, {\n status: status === 200 ? 204 : (status as number),\n headers: headers as HeadersInit,\n });\n }\n\n if (\n typeof data === \"string\" ||\n typeof data === \"number\" ||\n typeof data === \"boolean\"\n ) {\n return new Response(String(data), {\n status: status as number,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...(headers as Record<string, string>),\n },\n });\n }\n\n return json(data, status as number, headers as Record<string, string>);\n }\n\n // 普通对象 -> JSON\n return json(result);\n }\n\n // 其他类型 -> 204\n return new Response(null, { status: 204 });\n}\n\n/**\n * 处理验证错误\n */\nfunction handleValidationError(error: Error): Response {\n return json(\n {\n success: false,\n error: \"Validation Error\",\n message: error.message,\n timestamp: new Date().toISOString(),\n },\n 400,\n );\n}\n\n/**\n * 处理内部错误\n */\nfunction handleInternalError(error: unknown): Response {\n return json(\n {\n success: false,\n error: \"Internal Error\",\n message: error instanceof Error ? error.message : \"未知错误\",\n },\n 500,\n );\n}\n\n/** 空 schema 的上下文类型 */\ntype EmptySchemaContext = {\n req: Request;\n body: unknown;\n query: Record<string, string>;\n params: Record<string, string>;\n headers: Record<string, string>;\n cookies: Record<string, string>;\n};\n\n/**\n * 判断是否为 handler 函数\n */\nfunction isHandler(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\n/**\n * 创建类型安全的路由处理器\n *\n * @example\n * ```typescript\n * // 无 schema - 直接传入 handler\n * createHandler(({ params }) => `User: ${params.id}`)\n *\n * // 有 schema - 传入 schema 和 handler\n * createHandler(\n * { body: Type.Object({ name: Type.String() }) },\n * ({ body }) => ({ hello: body.name })\n * )\n * ```\n */\n/**\n * 带类型推断的 Handler - 保留返回类型信息用于客户端类型推断\n */\nexport type InferableHandler<TReturn, TSchema extends RouteSchema = RouteSchema> = ((req: Request) => Promise<Response>) & {\n /** 返回类型标记(仅用于类型推断,运行时不存在) */\n __returnType: TReturn;\n /** Schema 类型标记 */\n __schema: TSchema;\n};\n\n\n// 重载 1: 无 schema\nexport function createHandler<R>(\n handler: (ctx: EmptySchemaContext) => R | Promise<R>,\n): InferableHandler<R>;\n\n// 重载 2: 有 schema\nexport function createHandler<const T extends RouteSchema, R>(\n schema: T,\n handler: (ctx: HandlerContext<T>) => R | Promise<R>,\n): InferableHandler<R, T>;\n\n// 实现\nexport function createHandler<const T extends RouteSchema, R>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContext<T>) => R | Promise<R>,\n): InferableHandler<R, T> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (ctx: HandlerContext<T>) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemas(schema);\n }\n\n const handlerFn = async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemas(schema, data);\n }\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n });\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n\n // 类型断言:这些属性只在编译时用于类型推断,运行时不存在\n return handlerFn as InferableHandler<R, T>;\n}\n\n/**\n * 创建带额外上下文的路由处理器\n *\n * 用于中间件注入额外数据的场景\n *\n * @example\n * ```typescript\n * // 定义中间件注入的类型\n * type AuthContext = { user: { id: string; role: string } };\n *\n * // 无 schema\n * createHandlerWithExtra<AuthContext>(({ user }) => {\n * return { userId: user.id };\n * })\n *\n * // 有 schema\n * createHandlerWithExtra<AuthContext>(\n * { body: Type.Object({ action: Type.String() }) },\n * ({ body, user }) => ({ success: true, userId: user.id })\n * )\n * ```\n */\n// 重载 1: 无 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n R = unknown,\n>(\n handler: (ctx: EmptySchemaContext & TExtra) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 重载 2: 有 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schema: T,\n handler: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 实现\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext & TExtra) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (\n ctx: HandlerContextWithExtra<T, TExtra>,\n ) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemas(schema);\n }\n\n return async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemas(schema, data);\n }\n\n // 获取中间件注入的额外数据\n const extras = ((req as unknown as Record<string, unknown>).__locals ??\n {}) as TExtra;\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n ...extras,\n } as HandlerContextWithExtra<T, TExtra>);\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n}\n\n/**\n * 简单的路由处理器 (无 schema 验证,只有 req)\n *\n * @example\n * ```typescript\n * simpleHandler(({ req }) => {\n * return { message: \"Hello World\" };\n * })\n * ```\n */\nexport function simpleHandler<R>(\n handler: (ctx: { req: Request }) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n return async (req: Request): Promise<Response> => {\n try {\n const result = await handler({ req });\n return autoResponse(result);\n } catch (error) {\n return handleInternalError(error);\n }\n };\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { i as RouteSchema } from "./schema-DOKg31ZX.mjs";
2
- import "./index-CTHojwxd.mjs";
3
- import { t as InferableHandler } from "./create-handler-DRcJRkx9.mjs";
1
+ import { i as RouteSchema } from "./schema-B6DFN5c2.mjs";
2
+ import "./index-CREkvfw9.mjs";
3
+ import { t as InferableHandler } from "./create-handler-DKw-sQOV.mjs";
4
4
 
5
5
  //#region src/defineRoute.d.ts
6
6
 
@@ -24,4 +24,4 @@ declare class DependencyManager {
24
24
  }
25
25
  //#endregion
26
26
  export { DependencyManager as t };
27
- //# sourceMappingURL=dependency-manager-C_qZvkaw.d.mts.map
27
+ //# sourceMappingURL=dependency-manager-C3_7ic4h.d.mts.map
@@ -0,0 +1,60 @@
1
+ //#region src/utils/dependency-manager.ts
2
+ /**
3
+ * 依赖管理器
4
+ * 负责按需加载和管理框架依赖
5
+ */
6
+ var DependencyManager = class {
7
+ dependencyCache = /* @__PURE__ */ new Map();
8
+ /**
9
+ * 按需获取框架依赖
10
+ */
11
+ async getFrameworkDeps(framework) {
12
+ if (this.dependencyCache.has(framework)) return this.dependencyCache.get(framework);
13
+ console.log(`📦 按需加载 ${framework} 依赖...`);
14
+ try {
15
+ let deps;
16
+ switch (framework) {
17
+ case "vue":
18
+ deps = await Promise.all([import("vue"), import("@vue/server-renderer")]);
19
+ break;
20
+ case "react":
21
+ deps = await Promise.all([import("react"), import("react-dom/server")]);
22
+ break;
23
+ default: throw new Error(`不支持的框架: ${framework}`);
24
+ }
25
+ this.dependencyCache.set(framework, deps);
26
+ console.log(`✅ ${framework} 依赖加载完成`);
27
+ return deps;
28
+ } catch (error) {
29
+ console.error(`❌ ${framework} 依赖加载失败:`, error);
30
+ throw error;
31
+ }
32
+ }
33
+ /**
34
+ * 检测组件类型
35
+ */
36
+ detectComponentType(component) {
37
+ if (component.render && typeof component.render === "function") return "vue";
38
+ if (component.$$typeof) return "react";
39
+ return "vue";
40
+ }
41
+ /**
42
+ * 清除缓存
43
+ */
44
+ clearCache() {
45
+ this.dependencyCache.clear();
46
+ console.log("🧹 依赖缓存已清除");
47
+ }
48
+ /**
49
+ * 获取缓存状态
50
+ */
51
+ getCacheStatus() {
52
+ const status = {};
53
+ for (const [framework] of this.dependencyCache) status[framework] = true;
54
+ return status;
55
+ }
56
+ };
57
+
58
+ //#endregion
59
+ export { DependencyManager as t };
60
+ //# sourceMappingURL=dependency-manager-DCmh7xFc.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependency-manager-BpN2YufZ.mjs","names":[],"sources":["../src/utils/dependency-manager.ts"],"sourcesContent":["/**\n * 依赖管理器\n * 负责按需加载和管理框架依赖\n */\nexport class DependencyManager {\n private dependencyCache = new Map<string, any>();\n\n /**\n * 按需获取框架依赖\n */\n async getFrameworkDeps(framework: \"vue\" | \"react\") {\n if (this.dependencyCache.has(framework)) {\n return this.dependencyCache.get(framework);\n }\n\n console.log(`📦 按需加载 ${framework} 依赖...`);\n\n try {\n let deps;\n switch (framework) {\n case \"vue\":\n deps = await Promise.all([\n import(\"vue\"),\n import(\"@vue/server-renderer\"),\n ]);\n break;\n case \"react\":\n deps = await Promise.all([\n import(\"react\"),\n import(\"react-dom/server\"),\n ]);\n break;\n default:\n throw new Error(`不支持的框架: ${framework}`);\n }\n\n this.dependencyCache.set(framework, deps);\n console.log(`✅ ${framework} 依赖加载完成`);\n return deps;\n } catch (error) {\n console.error(`❌ ${framework} 依赖加载失败:`, error);\n throw error;\n }\n }\n\n /**\n * 检测组件类型\n */\n detectComponentType(component: any): \"vue\" | \"react\" {\n // 简单的组件类型检测\n if (component.render && typeof component.render === \"function\") {\n return \"vue\";\n }\n if (component.$$typeof) {\n return \"react\";\n }\n // 默认使用 Vue\n return \"vue\";\n }\n\n /**\n * 清除缓存\n */\n clearCache(): void {\n this.dependencyCache.clear();\n console.log(\"🧹 依赖缓存已清除\");\n }\n\n /**\n * 获取缓存状态\n */\n getCacheStatus(): Record<string, boolean> {\n const status: Record<string, boolean> = {};\n for (const [framework] of this.dependencyCache) {\n status[framework] = true;\n }\n return status;\n }\n}\n"],"mappings":";;;;;CAIa,oBAAb,MAA+B;EAC7B,AAAQ,kCAAkB,IAAI,KAAkB;;;;EAKhD,MAAM,iBAAiB,WAA4B;AACjD,OAAI,KAAK,gBAAgB,IAAI,UAAU,CACrC,QAAO,KAAK,gBAAgB,IAAI,UAAU;AAG5C,WAAQ,IAAI,WAAW,UAAU,QAAQ;AAEzC,OAAI;IACF,IAAI;AACJ,YAAQ,WAAR;KACE,KAAK;AACH,aAAO,MAAM,QAAQ,IAAI,CACvB,OAAO,QACP,OAAO,wBACR,CAAC;AACF;KACF,KAAK;AACH,aAAO,MAAM,QAAQ,IAAI,CACvB,OAAO,UACP,OAAO,oBACR,CAAC;AACF;KACF,QACE,OAAM,IAAI,MAAM,WAAW,YAAY;;AAG3C,SAAK,gBAAgB,IAAI,WAAW,KAAK;AACzC,YAAQ,IAAI,KAAK,UAAU,SAAS;AACpC,WAAO;YACA,OAAO;AACd,YAAQ,MAAM,KAAK,UAAU,WAAW,MAAM;AAC9C,UAAM;;;;;;EAOV,oBAAoB,WAAiC;AAEnD,OAAI,UAAU,UAAU,OAAO,UAAU,WAAW,WAClD,QAAO;AAET,OAAI,UAAU,SACZ,QAAO;AAGT,UAAO;;;;;EAMT,aAAmB;AACjB,QAAK,gBAAgB,OAAO;AAC5B,WAAQ,IAAI,aAAa;;;;;EAM3B,iBAA0C;GACxC,MAAM,SAAkC,EAAE;AAC1C,QAAK,MAAM,CAAC,cAAc,KAAK,gBAC7B,QAAO,aAAa;AAEtB,UAAO"}
1
+ {"version":3,"file":"dependency-manager-DCmh7xFc.mjs","names":[],"sources":["../src/utils/dependency-manager.ts"],"sourcesContent":["/**\n * 依赖管理器\n * 负责按需加载和管理框架依赖\n */\nexport class DependencyManager {\n private dependencyCache = new Map<string, any>();\n\n /**\n * 按需获取框架依赖\n */\n async getFrameworkDeps(framework: \"vue\" | \"react\") {\n if (this.dependencyCache.has(framework)) {\n return this.dependencyCache.get(framework);\n }\n\n console.log(`📦 按需加载 ${framework} 依赖...`);\n\n try {\n let deps;\n switch (framework) {\n case \"vue\":\n deps = await Promise.all([\n import(\"vue\"),\n import(\"@vue/server-renderer\"),\n ]);\n break;\n case \"react\":\n deps = await Promise.all([\n import(\"react\"),\n import(\"react-dom/server\"),\n ]);\n break;\n default:\n throw new Error(`不支持的框架: ${framework}`);\n }\n\n this.dependencyCache.set(framework, deps);\n console.log(`✅ ${framework} 依赖加载完成`);\n return deps;\n } catch (error) {\n console.error(`❌ ${framework} 依赖加载失败:`, error);\n throw error;\n }\n }\n\n /**\n * 检测组件类型\n */\n detectComponentType(component: any): \"vue\" | \"react\" {\n // 简单的组件类型检测\n if (component.render && typeof component.render === \"function\") {\n return \"vue\";\n }\n if (component.$$typeof) {\n return \"react\";\n }\n // 默认使用 Vue\n return \"vue\";\n }\n\n /**\n * 清除缓存\n */\n clearCache(): void {\n this.dependencyCache.clear();\n console.log(\"🧹 依赖缓存已清除\");\n }\n\n /**\n * 获取缓存状态\n */\n getCacheStatus(): Record<string, boolean> {\n const status: Record<string, boolean> = {};\n for (const [framework] of this.dependencyCache) {\n status[framework] = true;\n }\n return status;\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,oBAAb,MAA+B;CAC7B,AAAQ,kCAAkB,IAAI,KAAkB;;;;CAKhD,MAAM,iBAAiB,WAA4B;AACjD,MAAI,KAAK,gBAAgB,IAAI,UAAU,CACrC,QAAO,KAAK,gBAAgB,IAAI,UAAU;AAG5C,UAAQ,IAAI,WAAW,UAAU,QAAQ;AAEzC,MAAI;GACF,IAAI;AACJ,WAAQ,WAAR;IACE,KAAK;AACH,YAAO,MAAM,QAAQ,IAAI,CACvB,OAAO,QACP,OAAO,wBACR,CAAC;AACF;IACF,KAAK;AACH,YAAO,MAAM,QAAQ,IAAI,CACvB,OAAO,UACP,OAAO,oBACR,CAAC;AACF;IACF,QACE,OAAM,IAAI,MAAM,WAAW,YAAY;;AAG3C,QAAK,gBAAgB,IAAI,WAAW,KAAK;AACzC,WAAQ,IAAI,KAAK,UAAU,SAAS;AACpC,UAAO;WACA,OAAO;AACd,WAAQ,MAAM,KAAK,UAAU,WAAW,MAAM;AAC9C,SAAM;;;;;;CAOV,oBAAoB,WAAiC;AAEnD,MAAI,UAAU,UAAU,OAAO,UAAU,WAAW,WAClD,QAAO;AAET,MAAI,UAAU,SACZ,QAAO;AAGT,SAAO;;;;;CAMT,aAAmB;AACjB,OAAK,gBAAgB,OAAO;AAC5B,UAAQ,IAAI,aAAa;;;;;CAM3B,iBAA0C;EACxC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,cAAc,KAAK,gBAC7B,QAAO,aAAa;AAEtB,SAAO"}
@@ -39,4 +39,4 @@ declare const Patterns: {
39
39
  };
40
40
  //#endregion
41
41
  export { registerFormats as i, hasFormat as n, registerFormat as r, Patterns as t };
42
- //# sourceMappingURL=formats-CYLwo9GJ.d.mts.map
42
+ //# sourceMappingURL=formats-Dk-DSBY4.d.mts.map
@@ -30,4 +30,4 @@ function goAwait(promise) {
30
30
 
31
31
  //#endregion
32
32
  export { goAwait as t };
33
- //# sourceMappingURL=go-await-2Pzj4snS.mjs.map
33
+ //# sourceMappingURL=go-await-C4ZdEUwY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"go-await-2Pzj4snS.mjs","names":[],"sources":["../src/utils/go-await.ts"],"sourcesContent":["/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @author Framework Team\n * @version 1.0.0\n * @license MIT\n */\n\n/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @param promise 要处理的 Promise\n * @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果\n *\n * @example\n * ```typescript\n * const [error, result] = await goAwait(someAsyncFunction());\n * if (error) {\n * console.error(\"操作失败:\", error);\n * } else {\n * console.log(\"操作成功:\", result);\n * }\n * ```\n */\nexport function goAwait<T>(\n promise: Promise<T>,\n): Promise<[Error | null, T | undefined]> {\n return promise\n .then<[null, T]>((data) => [null, data])\n .catch<\n [Error, undefined]\n >((err) => [err instanceof Error ? err : new Error(String(err)), undefined]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,QACd,SACwC;AACxC,QAAO,QACJ,MAAiB,SAAS,CAAC,MAAM,KAAK,CAAC,CACvC,OAEE,QAAQ,CAAC,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,EAAE,OAAU,CAAC"}
1
+ {"version":3,"file":"go-await-C4ZdEUwY.mjs","names":[],"sources":["../src/utils/go-await.ts"],"sourcesContent":["/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @author Framework Team\n * @version 1.0.0\n * @license MIT\n */\n\n/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @param promise 要处理的 Promise\n * @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果\n *\n * @example\n * ```typescript\n * const [error, result] = await goAwait(someAsyncFunction());\n * if (error) {\n * console.error(\"操作失败:\", error);\n * } else {\n * console.log(\"操作成功:\", result);\n * }\n * ```\n */\nexport function goAwait<T>(\n promise: Promise<T>,\n): Promise<[Error | null, T | undefined]> {\n return promise\n .then<[null, T]>((data) => [null, data])\n .catch<\n [Error, undefined]\n >((err) => [err instanceof Error ? err : new Error(String(err)), undefined]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,QACd,SACwC;AACxC,QAAO,QACJ,MAAiB,SAAS,CAAC,MAAM,KAAK,CAAC,CACvC,OAEE,QAAQ,CAAC,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,EAAE,OAAU,CAAC"}
@@ -27,4 +27,4 @@
27
27
  declare function goAwait<T>(promise: Promise<T>): Promise<[Error | null, T | undefined]>;
28
28
  //#endregion
29
29
  export { goAwait as t };
30
- //# sourceMappingURL=go-await-DRItVwwh.d.mts.map
30
+ //# sourceMappingURL=go-await-DL1A_-4X.d.mts.map
@@ -12,4 +12,4 @@ declare function setLocals<T extends object>(req: Request, extras: T): void;
12
12
  declare function getLocals<T extends object>(req: Request): T;
13
13
  //#endregion
14
14
  export { setLocals as i, getLocals as n, setCookie as r, getCookie as t };
15
- //# sourceMappingURL=handle-D0TFoOiX.d.mts.map
15
+ //# sourceMappingURL=handle-BhR3oyky.d.mts.map
@@ -1,4 +1,4 @@
1
- import { a as parseCookies } from "./parsers-BQ63b0YE.mjs";
1
+ import { a as parseCookies } from "./parsers-DpH_mD0H.mjs";
2
2
 
3
3
  //#region src/utils/handle.ts
4
4
  /** 获取单个 Cookie 值 */
@@ -27,4 +27,4 @@ function getLocals(req) {
27
27
 
28
28
  //#endregion
29
29
  export { setLocals as i, getLocals as n, setCookie as r, getCookie as t };
30
- //# sourceMappingURL=handle-s4V-E2RE.mjs.map
30
+ //# sourceMappingURL=handle-BxJwSvV0.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"handle-s4V-E2RE.mjs","names":[],"sources":["../src/utils/handle.ts"],"sourcesContent":["import { parseCookies } from \"./parsers\";\n\n/** 获取单个 Cookie 值 */\nexport function getCookie(req: Request, key: string): string | null {\n const cookies = parseCookies(req);\n return cookies[key] || null;\n}\n\n/** 生成 Set-Cookie 头 */\nexport function setCookie(\n key: string,\n value: string,\n options: {\n path?: string;\n httpOnly?: boolean;\n maxAge?: number;\n secure?: boolean;\n } = {},\n): string {\n let cookie = `${key}=${encodeURIComponent(value)}`;\n\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.httpOnly) cookie += `; HttpOnly`;\n if (options.secure) cookie += `; Secure`;\n if (options.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n\n return cookie;\n}\n\n// 提供给中间件写入\"局部上下文\"的工具函数\nexport function setLocals<T extends object>(req: Request, extras: T) {\n const target = req as unknown as Record<string, unknown>;\n target.__locals = { ...((target.__locals as object) ?? {}), ...extras };\n}\n\n// 获取中间件注入的局部上下文\nexport function getLocals<T extends object>(req: Request): T {\n const target = req as unknown as Record<string, unknown>;\n return (target.__locals ?? {}) as T;\n}\n"],"mappings":";;;;AAGA,SAAgB,UAAU,KAAc,KAA4B;AAElE,QADgB,aAAa,IAAI,CAClB,QAAQ;;;AAIzB,SAAgB,UACd,KACA,OACA,UAKI,EAAE,EACE;CACR,IAAI,SAAS,GAAG,IAAI,GAAG,mBAAmB,MAAM;AAEhD,KAAI,QAAQ,KAAM,WAAU,UAAU,QAAQ;AAC9C,KAAI,QAAQ,SAAU,WAAU;AAChC,KAAI,QAAQ,OAAQ,WAAU;AAC9B,KAAI,QAAQ,OAAQ,WAAU,aAAa,QAAQ;AAEnD,QAAO;;AAIT,SAAgB,UAA4B,KAAc,QAAW;CACnE,MAAM,SAAS;AACf,QAAO,WAAW;EAAE,GAAK,OAAO,YAAuB,EAAE;EAAG,GAAG;EAAQ;;AAIzE,SAAgB,UAA4B,KAAiB;AAE3D,QADe,IACA,YAAY,EAAE"}
1
+ {"version":3,"file":"handle-BxJwSvV0.mjs","names":[],"sources":["../src/utils/handle.ts"],"sourcesContent":["import { parseCookies } from \"./parsers\";\n\n/** 获取单个 Cookie 值 */\nexport function getCookie(req: Request, key: string): string | null {\n const cookies = parseCookies(req);\n return cookies[key] || null;\n}\n\n/** 生成 Set-Cookie 头 */\nexport function setCookie(\n key: string,\n value: string,\n options: {\n path?: string;\n httpOnly?: boolean;\n maxAge?: number;\n secure?: boolean;\n } = {},\n): string {\n let cookie = `${key}=${encodeURIComponent(value)}`;\n\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.httpOnly) cookie += `; HttpOnly`;\n if (options.secure) cookie += `; Secure`;\n if (options.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n\n return cookie;\n}\n\n// 提供给中间件写入\"局部上下文\"的工具函数\nexport function setLocals<T extends object>(req: Request, extras: T) {\n const target = req as unknown as Record<string, unknown>;\n target.__locals = { ...((target.__locals as object) ?? {}), ...extras };\n}\n\n// 获取中间件注入的局部上下文\nexport function getLocals<T extends object>(req: Request): T {\n const target = req as unknown as Record<string, unknown>;\n return (target.__locals ?? {}) as T;\n}\n"],"mappings":";;;;AAGA,SAAgB,UAAU,KAAc,KAA4B;AAElE,QADgB,aAAa,IAAI,CAClB,QAAQ;;;AAIzB,SAAgB,UACd,KACA,OACA,UAKI,EAAE,EACE;CACR,IAAI,SAAS,GAAG,IAAI,GAAG,mBAAmB,MAAM;AAEhD,KAAI,QAAQ,KAAM,WAAU,UAAU,QAAQ;AAC9C,KAAI,QAAQ,SAAU,WAAU;AAChC,KAAI,QAAQ,OAAQ,WAAU;AAC9B,KAAI,QAAQ,OAAQ,WAAU,aAAa,QAAQ;AAEnD,QAAO;;AAIT,SAAgB,UAA4B,KAAc,QAAW;CACnE,MAAM,SAAS;AACf,QAAO,WAAW;EAAE,GAAK,OAAO,YAAuB,EAAE;EAAG,GAAG;EAAQ;;AAIzE,SAAgB,UAA4B,KAAiB;AAE3D,QADe,IACA,YAAY,EAAE"}
@@ -19,4 +19,4 @@ declare class HtmlRenderer {
19
19
  }
20
20
  //#endregion
21
21
  export { HtmlRenderer as t };
22
- //# sourceMappingURL=html-renderer-CMGKJoIy.d.mts.map
22
+ //# sourceMappingURL=html-renderer-CfKK2BrP.d.mts.map
@@ -1,14 +1,14 @@
1
- import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
2
-
3
1
  //#region src/utils/html-renderer.ts
4
- var HtmlRenderer;
5
- var init_html_renderer = __esmMin((() => {
6
- HtmlRenderer = class {
7
- /**
8
- * 生成基础HTML模板
9
- */
10
- static generateBaseHtml(content, context, clientScriptPath = "/client.js") {
11
- return `
2
+ /**
3
+ * HTML渲染工具类
4
+ * 提供统一的HTML模板生成功能
5
+ */
6
+ var HtmlRenderer = class {
7
+ /**
8
+ * 生成基础HTML模板
9
+ */
10
+ static generateBaseHtml(content, context, clientScriptPath = "/client.js") {
11
+ return `
12
12
  <!doctype html>
13
13
  <html>
14
14
  <head>
@@ -29,18 +29,18 @@ var init_html_renderer = __esmMin((() => {
29
29
  </body>
30
30
  </html>
31
31
  `;
32
- }
33
- /**
34
- * 生成Vue组件HTML
35
- */
36
- static generateVueHtml(content, context, clientScriptPath = "/client.js") {
37
- return this.generateBaseHtml(content, context, clientScriptPath);
38
- }
39
- /**
40
- * 生成React组件HTML
41
- */
42
- static generateReactHtml(content, context, clientScriptPath = "/client.js") {
43
- return `
32
+ }
33
+ /**
34
+ * 生成Vue组件HTML
35
+ */
36
+ static generateVueHtml(content, context, clientScriptPath = "/client.js") {
37
+ return this.generateBaseHtml(content, context, clientScriptPath);
38
+ }
39
+ /**
40
+ * 生成React组件HTML
41
+ */
42
+ static generateReactHtml(content, context, clientScriptPath = "/client.js") {
43
+ return `
44
44
  <!doctype html>
45
45
  <html>
46
46
  <head>
@@ -61,10 +61,9 @@ var init_html_renderer = __esmMin((() => {
61
61
  </body>
62
62
  </html>
63
63
  `;
64
- }
65
- };
66
- }));
64
+ }
65
+ };
67
66
 
68
67
  //#endregion
69
- export { init_html_renderer as n, HtmlRenderer as t };
70
- //# sourceMappingURL=html-renderer-CuakkPIt.mjs.map
68
+ export { HtmlRenderer as t };
69
+ //# sourceMappingURL=html-renderer-DTtJ_Yic.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-renderer-CuakkPIt.mjs","names":[],"sources":["../src/utils/html-renderer.ts"],"sourcesContent":["/**\n * HTML渲染工具类\n * 提供统一的HTML模板生成功能\n */\nexport class HtmlRenderer {\n /**\n * 生成基础HTML模板\n */\n static generateBaseHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"app\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n\n /**\n * 生成Vue组件HTML\n */\n static generateVueHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return this.generateBaseHtml(content, context, clientScriptPath);\n }\n\n /**\n * 生成React组件HTML\n */\n static generateReactHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"root\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n}\n"],"mappings":";;;;;CAIa,eAAb,MAA0B;;;;EAIxB,OAAO,iBACL,SACA,SACA,mBAA2B,cACnB;AACR,UAAO;;;;;;;;;0BASe,QAAQ;;;wBAGV,KAAK,UAAU,QAAQ,UAAU,EAAE,CAAC,CAAC;uBACtC,KAAK,UAAU,QAAQ,SAAS,EAAE,CAAC,CAAC;2BAChC,QAAQ,SAAS;;;uCAGL,iBAAiB;;;;;;;;EAStD,OAAO,gBACL,SACA,SACA,mBAA2B,cACnB;AACR,UAAO,KAAK,iBAAiB,SAAS,SAAS,iBAAiB;;;;;EAMlE,OAAO,kBACL,SACA,SACA,mBAA2B,cACnB;AACR,UAAO;;;;;;;;;2BASgB,QAAQ;;;wBAGX,KAAK,UAAU,QAAQ,UAAU,EAAE,CAAC,CAAC;uBACtC,KAAK,UAAU,QAAQ,SAAS,EAAE,CAAC,CAAC;2BAChC,QAAQ,SAAS;;;uCAGL,iBAAiB"}
1
+ {"version":3,"file":"html-renderer-DTtJ_Yic.mjs","names":[],"sources":["../src/utils/html-renderer.ts"],"sourcesContent":["/**\n * HTML渲染工具类\n * 提供统一的HTML模板生成功能\n */\nexport class HtmlRenderer {\n /**\n * 生成基础HTML模板\n */\n static generateBaseHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"app\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n\n /**\n * 生成Vue组件HTML\n */\n static generateVueHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return this.generateBaseHtml(content, context, clientScriptPath);\n }\n\n /**\n * 生成React组件HTML\n */\n static generateReactHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"root\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,eAAb,MAA0B;;;;CAIxB,OAAO,iBACL,SACA,SACA,mBAA2B,cACnB;AACR,SAAO;;;;;;;;;0BASe,QAAQ;;;wBAGV,KAAK,UAAU,QAAQ,UAAU,EAAE,CAAC,CAAC;uBACtC,KAAK,UAAU,QAAQ,SAAS,EAAE,CAAC,CAAC;2BAChC,QAAQ,SAAS;;;uCAGL,iBAAiB;;;;;;;;CAStD,OAAO,gBACL,SACA,SACA,mBAA2B,cACnB;AACR,SAAO,KAAK,iBAAiB,SAAS,SAAS,iBAAiB;;;;;CAMlE,OAAO,kBACL,SACA,SACA,mBAA2B,cACnB;AACR,SAAO;;;;;;;;;2BASgB,QAAQ;;;wBAGX,KAAK,UAAU,QAAQ,UAAU,EAAE,CAAC,CAAC;uBACtC,KAAK,UAAU,QAAQ,SAAS,EAAE,CAAC,CAAC;2BAChC,QAAQ,SAAS;;;uCAGL,iBAAiB"}
@@ -1,7 +1,7 @@
1
- import { l as Route, s as NestedRoute } from "./types-mpeSaHdI.mjs";
2
- import { r as NestedComponentRoute, t as ComponentRoute } from "./component-route-DF5feXJI.mjs";
3
- import { t as Server } from "./server-CWIZP6nb.mjs";
4
- import { t as ComponentServer } from "./component-server-DvcPVnL4.mjs";
1
+ import { l as Route, s as NestedRoute } from "./types-D1PUFkda.mjs";
2
+ import { r as NestedComponentRoute, t as ComponentRoute } from "./component-route-nrrO0iSI.mjs";
3
+ import { t as Server } from "./server-DGA3dd5s.mjs";
4
+ import { t as ComponentServer } from "./component-server-JqpDC7wy.mjs";
5
5
 
6
6
  //#region src/server/server-factory.d.ts
7
7
 
@@ -45,4 +45,4 @@ declare class ServerFactory {
45
45
  }
46
46
  //#endregion
47
47
  export { ServerFactory as t };
48
- //# sourceMappingURL=index-CdOYxwDQ.d.mts.map
48
+ //# sourceMappingURL=index-CEfOqqvd.d.mts.map
package/dist/index.d.mts CHANGED
@@ -1,30 +1,30 @@
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
- import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "./create-handler-DRcJRkx9.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-D1PUFkda.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-6A7umH7b.mjs";
3
+ import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "./component-route-nrrO0iSI.mjs";
4
+ import { a as TypedHandler, i as RouteSchema, n as HandlerContextWithExtra, o as TypedRouteConfig, r as InferSchema, t as HandlerContext } from "./schema-B6DFN5c2.mjs";
5
+ import "./index-CREkvfw9.mjs";
6
+ import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "./create-handler-DKw-sQOV.mjs";
7
7
  import { InferableRoute, RouteDefinition, defineRoutes, del, get, patch, post, put, route } from "./defineRoute.mjs";
8
- import { t as BaseServer } from "./base-server-CtA1bZSg.mjs";
9
- import { t as Server } from "./server-CWIZP6nb.mjs";
10
- import { t as DependencyManager } from "./dependency-manager-C_qZvkaw.mjs";
11
- import { t as ComponentServer } from "./component-server-DvcPVnL4.mjs";
12
- import { t as ServerFactory } from "./index-CdOYxwDQ.mjs";
13
- import { n as composeMiddleware, t as VafastError } from "./middleware-5PjaxPMA.mjs";
14
- 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";
15
- 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";
16
- import { t as goAwait } from "./go-await-DRItVwwh.mjs";
17
- import { n as base64urlEncode, t as base64urlDecode } from "./base64url-0N9uQPjZ.mjs";
18
- import { i as setLocals, n as getLocals } from "./handle-D0TFoOiX.mjs";
19
- import { a as ValidationError, c as getValidatorCacheStats, d as validateFast, f as validateSchema, l as precompileSchemas, o as ValidationResult, p as validateSchemaOrThrow, s as createValidator, t as SchemaConfig, u as validateAllSchemas } from "./validators-CPmnj_y9.mjs";
20
- import { a as parseAndValidateRequest, i as createRequestValidator, o as parseRequest, s as validateRequest } from "./request-validator-42lY21gn.mjs";
21
- import { t as HtmlRenderer } from "./html-renderer-CMGKJoIy.mjs";
22
- import { i as registerFormats, n as hasFormat, r as registerFormat, t as Patterns } from "./formats-CYLwo9GJ.mjs";
23
- import { a as createSSEHandler, i as SSEMarker, r as SSEHandler, t as SSEEvent } from "./sse-BDIptC85.mjs";
24
- 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";
8
+ import { t as BaseServer } from "./base-server-DLxtulAO.mjs";
9
+ import { t as Server } from "./server-DGA3dd5s.mjs";
10
+ import { t as DependencyManager } from "./dependency-manager-C3_7ic4h.mjs";
11
+ import { t as ComponentServer } from "./component-server-JqpDC7wy.mjs";
12
+ import { t as ServerFactory } from "./index-CEfOqqvd.mjs";
13
+ import { n as composeMiddleware, t as VafastError } from "./middleware-KXEoefLX.mjs";
14
+ 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-BerGr2_q.mjs";
15
+ import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "./response-BMfdEcTm.mjs";
16
+ import { t as goAwait } from "./go-await-DL1A_-4X.mjs";
17
+ import { n as base64urlEncode, t as base64urlDecode } from "./base64url-Dwi2Afhc.mjs";
18
+ import { i as setLocals, n as getLocals } from "./handle-BhR3oyky.mjs";
19
+ import { a as ValidationError, c as getValidatorCacheStats, d as validateFast, f as validateSchema, l as precompileSchemas, o as ValidationResult, p as validateSchemaOrThrow, s as createValidator, t as SchemaConfig, u as validateAllSchemas } from "./validators-Ch71zkT8.mjs";
20
+ import { a as parseAndValidateRequest, i as createRequestValidator, o as parseRequest, s as validateRequest } from "./request-validator-Coo8dI-p.mjs";
21
+ import { t as HtmlRenderer } from "./html-renderer-CfKK2BrP.mjs";
22
+ import { i as registerFormats, n as hasFormat, r as registerFormat, t as Patterns } from "./formats-Dk-DSBY4.mjs";
23
+ import { a as createSSEHandler, i as SSEMarker, r as SSEHandler, t as SSEEvent } from "./sse-BgLhEo43.mjs";
24
+ 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-CmABJA2V.mjs";
25
25
  import "./utils/index.mjs";
26
26
  import { flattenNestedRoutes, normalizePath } from "./router.mjs";
27
- import { i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "./serve-B5WmhK6m.mjs";
27
+ import { i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "./serve-AG80VaIr.mjs";
28
28
  import "./serve.mjs";
29
29
  import { FormatRegistry, Type } from "@sinclair/typebox";
30
30
  export { BaseRouteConfig, BaseServer, CompatibleRoute, ComponentRoute, ComponentServer, DependencyManager, ExtendedRouteConfig, type FetchHandler, FlattenedComponentRoute, FlattenedRoute, FormatRegistry, Handler, HandlerContext, HandlerContextWithExtra, HtmlRenderer, InferSchema, InferableHandler, InferableRoute, Method, Middleware, NestedComponentRoute, NestedRoute, NestedRouteConfig, Patterns, ResponseBody, Route, RouteDefinition, RouteMeta, RouteRegistry, RouteSchema, SSEEvent, SSEHandler, SSEMarker, SchemaConfig, type ServeOptions, type ServeResult, Server, ServerFactory, Type, TypedHandler, TypedRoute, TypedRouteConfig, VafastError, ValidationError, ValidationResult, base64urlDecode, base64urlEncode, composeMiddleware, createHandler, createHandlerWithExtra, createRequestValidator, createRouteRegistry, createSSEHandler, createTypedRoute, createValidator, defineRoutes, del, empty, err, filterRoutes, flattenNestedRoutes, get, getAllRoutes, getCookie, getHeader, getLocals, getRoute, getRouteRegistry, getValidatorCacheStats, goAwait, hasFormat, html, isTypedRoute, json, normalizePath, parseAndValidateRequest, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, parseRequest, patch, post, precompileSchemas, put, redirect, registerFormat, registerFormats, route, serve, setLocals, simpleHandler, stream, text, validateAllSchemas, validateFast, validateRequest, validateSchema, validateSchemaOrThrow };
package/dist/index.mjs CHANGED
@@ -1,34 +1,31 @@
1
1
  import { defineRoutes, del, get, patch, post, put, route } from "./defineRoute.mjs";
2
- import { n as init_router, r as normalizePath, t as flattenNestedRoutes } from "./router-B9HUUCkR.mjs";
3
- import { a as err, c as json, d as stream, f as text, i as empty, n as composeMiddleware, o as html, r as init_middleware, t as VafastError, u as redirect } from "./middleware-CV5o-4wk.mjs";
4
- import { t as BaseServer } from "./base-server-DMhpmq5v.mjs";
5
- import { a as getRoute, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, t as RouteRegistry } from "./route-registry-BVvbghgH.mjs";
6
- import { t as Server } from "./server-C3yoZXNs.mjs";
7
- import { t as HtmlRenderer } from "./html-renderer-CuakkPIt.mjs";
8
- import { t as DependencyManager } from "./dependency-manager-BpN2YufZ.mjs";
9
- import { t as ComponentServer } from "./component-server-DIgykV0F.mjs";
10
- import { r as ServerFactory, t as init_server } from "./server-BttM6Ssc.mjs";
11
- 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";
12
- import { t as goAwait } from "./go-await-2Pzj4snS.mjs";
13
- 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";
14
- import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "./create-handler-IzOE24L5.mjs";
15
- import { n as base64urlEncode, t as base64urlDecode } from "./base64url-DUtluDF0.mjs";
16
- import { i as setLocals, n as getLocals } from "./handle-s4V-E2RE.mjs";
17
- import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "./request-validator-DLFtm4uV.mjs";
2
+ import { n as normalizePath, t as flattenNestedRoutes } from "./router-xWzwz_1a.mjs";
3
+ import { a as html, c as redirect, i as err, l as stream, n as composeMiddleware, o as json, r as empty, t as VafastError, u as text } from "./middleware-CewKbtb4.mjs";
4
+ import { t as BaseServer } from "./base-server-B7MYJNsl.mjs";
5
+ import { a as getRoute, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, t as RouteRegistry } from "./route-registry-emTmRrWQ.mjs";
6
+ import { t as Server } from "./server-L_FNwdap.mjs";
7
+ import { t as HtmlRenderer } from "./html-renderer-DTtJ_Yic.mjs";
8
+ import { t as DependencyManager } from "./dependency-manager-DCmh7xFc.mjs";
9
+ import { t as ComponentServer } from "./component-server-DomPJ_7S.mjs";
10
+ import { t as ServerFactory } from "./server-C75o1b-a.mjs";
11
+ 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-DpH_mD0H.mjs";
12
+ import { t as goAwait } from "./go-await-C4ZdEUwY.mjs";
13
+ import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema } from "./validators-DBkyw6BG.mjs";
14
+ import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "./create-handler-RconAcAB.mjs";
15
+ import { n as base64urlEncode, t as base64urlDecode } from "./base64url-C2zopQdH.mjs";
16
+ import { i as setLocals, n as getLocals } from "./handle-BxJwSvV0.mjs";
17
+ import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "./request-validator-Bz9X48FX.mjs";
18
18
  import { Patterns, hasFormat, registerFormat, registerFormats } from "./utils/formats.mjs";
19
- import { t as createSSEHandler } from "./sse-CCVfFW6s.mjs";
19
+ import { t as createSSEHandler } from "./sse-CBl-szg1.mjs";
20
20
  import "./utils/index.mjs";
21
- import { n as isTypedRoute, t as createTypedRoute } from "./route-B3ONOzxQ.mjs";
21
+ import { n as isTypedRoute, t as createTypedRoute } from "./route-Ds53PR4M.mjs";
22
22
  import "./types/index.mjs";
23
- import "./request-B886yCvG.mjs";
24
- import { n as serve } from "./serve-DgWBnexE.mjs";
23
+ import "./request-B-Nct5f7.mjs";
24
+ import { n as serve } from "./serve-48LEIkPa.mjs";
25
25
  import "./serve.mjs";
26
26
  import { FormatRegistry, Type } from "@sinclair/typebox";
27
27
 
28
28
  //#region src/index.ts
29
- init_server();
30
- init_middleware();
31
- init_router();
32
29
  registerFormats();
33
30
 
34
31
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from \"./server\";\nexport * from \"./middleware\";\nexport * from \"./utils\";\nexport * from \"./router\";\nexport * from \"./defineRoute\";\nexport * from \"./types\";\n\n// 统一的 serve 函数\nexport { serve } from \"./serve\";\nexport type { ServeOptions, ServeResult, FetchHandler } from \"./serve\";\n\n// 重新导出 TypeBox 类型\nexport { Type, FormatRegistry } from \"@sinclair/typebox\";\n\n// 自动注册内置 format 验证器\nimport { registerFormats } from \"./utils/formats\";\nregisterFormats();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,iBAAiB"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from \"./server\";\nexport * from \"./middleware\";\nexport * from \"./utils\";\nexport * from \"./router\";\nexport * from \"./defineRoute\";\nexport * from \"./types\";\n\n// 统一的 serve 函数\nexport { serve } from \"./serve\";\nexport type { ServeOptions, ServeResult, FetchHandler } from \"./serve\";\n\n// 重新导出 TypeBox 类型\nexport { Type, FormatRegistry } from \"@sinclair/typebox\";\n\n// 自动注册内置 format 验证器\nimport { registerFormats } from \"./utils/formats\";\nregisterFormats();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,iBAAiB"}
@@ -1,4 +1,4 @@
1
- import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "../component-route-DF5feXJI.mjs";
1
+ import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "../component-route-nrrO0iSI.mjs";
2
2
 
3
3
  //#region src/middleware/component-router.d.ts
4
4
 
@@ -1,4 +1,3 @@
1
- import { n as flattenComponentRoutes, r as init_component_router, t as componentRouter } from "../component-router-uSylkByf.mjs";
1
+ import { n as flattenComponentRoutes, t as componentRouter } from "../component-router-RwPL20vN.mjs";
2
2
 
3
- init_component_router();
4
3
  export { componentRouter, flattenComponentRoutes };