vafast 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{base-server-Bq4_lJWK.mjs → base-server-CSkyjEaY.mjs} +2 -2
- package/dist/{base-server-Bq4_lJWK.mjs.map → base-server-CSkyjEaY.mjs.map} +1 -1
- package/dist/{base-server-Gakrozqk.d.mts → base-server-DvGS6ATg.d.mts} +2 -2
- package/dist/{base64url-BY-HBSpL.d.mts → base64url-0N9uQPjZ.d.mts} +1 -1
- package/dist/{base64url-DLDOeXsk.mjs → base64url-CwQnvZyp.mjs} +1 -1
- package/dist/{base64url-DLDOeXsk.mjs.map → base64url-CwQnvZyp.mjs.map} +1 -1
- package/dist/{component-route-BYV_X1rA.d.mts → component-route-CZawYn61.d.mts} +2 -2
- package/dist/{component-router-DXUXLp1R.mjs → component-router-CErbGh2A.mjs} +2 -2
- package/dist/{component-router-DXUXLp1R.mjs.map → component-router-CErbGh2A.mjs.map} +1 -1
- package/dist/{component-server-BOz4Q-Qt.d.mts → component-server-CGzU4bss.d.mts} +4 -4
- package/dist/{component-server-ARXvZJUQ.mjs → component-server-DAbIyIPI.mjs} +7 -7
- package/dist/{component-server-ARXvZJUQ.mjs.map → component-server-DAbIyIPI.mjs.map} +1 -1
- package/dist/{create-handler-CbSoroA1.mjs → create-handler-B_pfxh3m.mjs} +5 -5
- package/dist/{create-handler-CbSoroA1.mjs.map → create-handler-B_pfxh3m.mjs.map} +1 -1
- package/dist/{create-handler-Dtt0xv6g.d.mts → create-handler-Bo-hvWp-.d.mts} +2 -2
- package/dist/defineRoute.d.mts +3 -3
- package/dist/{dependency-manager-Dbug5INp.d.mts → dependency-manager-C6vFWP2L.d.mts} +1 -1
- package/dist/{dependency-manager-CPkwMI7J.mjs → dependency-manager-Czg7Po2j.mjs} +2 -2
- package/dist/{dependency-manager-CPkwMI7J.mjs.map → dependency-manager-Czg7Po2j.mjs.map} +1 -1
- package/dist/{formats-BSqJWCsG.d.mts → formats-CYLwo9GJ.d.mts} +1 -1
- package/dist/{go-await-B-KP-K8x.mjs → go-await-BGAGJfrB.mjs} +1 -1
- package/dist/{go-await-B-KP-K8x.mjs.map → go-await-BGAGJfrB.mjs.map} +1 -1
- package/dist/{go-await-CqPx9dVQ.d.mts → go-await-DRItVwwh.d.mts} +1 -1
- package/dist/{handle-BhpqNgGf.mjs → handle-Csjtywdc.mjs} +2 -2
- package/dist/{handle-BhpqNgGf.mjs.map → handle-Csjtywdc.mjs.map} +1 -1
- package/dist/{handle-DOidKTI-.d.mts → handle-D0TFoOiX.d.mts} +1 -1
- package/dist/{html-renderer-C3LKTLme.d.mts → html-renderer-CMGKJoIy.d.mts} +1 -1
- package/dist/{html-renderer-CJ3B2Hft.mjs → html-renderer-CczE8mwC.mjs} +2 -2
- package/dist/{html-renderer-CJ3B2Hft.mjs.map → html-renderer-CczE8mwC.mjs.map} +1 -1
- package/dist/{index-DFsQyT61.d.mts → index-Ci52vt55.d.mts} +5 -5
- package/dist/index.d.mts +24 -29
- package/dist/index.mjs +22 -27
- package/dist/index.mjs.map +1 -1
- package/dist/middleware/component-router.d.mts +1 -1
- package/dist/middleware/component-router.mjs +1 -1
- package/dist/{middleware-3ShRJyd1.mjs → middleware-Byp3Hjae.mjs} +3 -3
- package/dist/{middleware-3ShRJyd1.mjs.map → middleware-Byp3Hjae.mjs.map} +1 -1
- package/dist/middleware.d.mts +3 -3
- package/dist/middleware.mjs +1 -1
- package/dist/monitoring/index.d.mts +6 -6
- package/dist/monitoring/index.mjs +3 -3
- package/dist/monitoring/native-monitor.d.mts +6 -6
- package/dist/monitoring/native-monitor.mjs +4 -4
- package/dist/node-server/index.d.mts +1 -1
- package/dist/node-server/index.mjs +3 -3
- package/dist/node-server/request.mjs +1 -1
- package/dist/node-server/response.mjs +1 -1
- package/dist/node-server/serve.d.mts +1 -1
- package/dist/node-server/serve.mjs +2 -2
- package/dist/{parsers-CodQFP1Z.d.mts → parsers-7lvt3Oss.d.mts} +1 -1
- package/dist/{parsers-ROIZWSGI.mjs → parsers-CI_TZ7pO.mjs} +1 -1
- package/dist/{parsers-ROIZWSGI.mjs.map → parsers-CI_TZ7pO.mjs.map} +1 -1
- package/dist/{path-matcher-CXMJ-IrG.mjs → path-matcher-73cJd5Y7.mjs} +2 -2
- package/dist/{path-matcher-CXMJ-IrG.mjs.map → path-matcher-73cJd5Y7.mjs.map} +1 -1
- package/dist/{radix-tree-BWmhTLhT.mjs → radix-tree-D0XYaJKb.mjs} +2 -2
- package/dist/{radix-tree-BWmhTLhT.mjs.map → radix-tree-D0XYaJKb.mjs.map} +1 -1
- package/dist/{request-B2BkUecT.mjs → request-CKC3Ox6M.mjs} +1 -1
- package/dist/{request-B2BkUecT.mjs.map → request-CKC3Ox6M.mjs.map} +1 -1
- package/dist/{request-validator-u2Ccj3_x.d.mts → request-validator-42lY21gn.d.mts} +2 -2
- package/dist/{request-validator-Dyqng-H_.mjs → request-validator-_J5HloRq.mjs} +3 -3
- package/dist/{request-validator-Dyqng-H_.mjs.map → request-validator-_J5HloRq.mjs.map} +1 -1
- package/dist/{response-CUyV5FIm.d.mts → response-A-sZZiJ7.d.mts} +1 -1
- package/dist/{response-BhFKEphr.mjs → response-Cf5FgtmE.mjs} +1 -1
- package/dist/{response-BhFKEphr.mjs.map → response-Cf5FgtmE.mjs.map} +1 -1
- package/dist/{response-CSKW5hsS.mjs → response-DXg4i_yh.mjs} +2 -2
- package/dist/{response-CSKW5hsS.mjs.map → response-DXg4i_yh.mjs.map} +1 -1
- package/dist/{route-BRR15b-p.mjs → route-9pAVP1GC.mjs} +1 -1
- package/dist/{route-BRR15b-p.mjs.map → route-9pAVP1GC.mjs.map} +1 -1
- package/dist/{route-BqmWCG4e.d.mts → route-BJ-40LNI.d.mts} +2 -2
- package/dist/{route-registry-ykzRmaHB.d.mts → route-registry--tx1PNui.d.mts} +2 -2
- package/dist/{route-registry-AlkDgbcE.mjs → route-registry-mcTG0M-t.mjs} +2 -2
- package/dist/{route-registry-AlkDgbcE.mjs.map → route-registry-mcTG0M-t.mjs.map} +1 -1
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +2 -2
- package/dist/router/radix-tree.d.mts +3 -3
- package/dist/router/radix-tree.mjs +1 -1
- package/dist/{router-BOeVQrjz.mjs → router-B9HUUCkR.mjs} +2 -2
- package/dist/{router-BOeVQrjz.mjs.map → router-B9HUUCkR.mjs.map} +1 -1
- package/dist/router.d.mts +3 -3
- package/dist/router.mjs +1 -1
- package/dist/{schema-CVuttFSw.d.mts → schema-CPQudJpE.d.mts} +1 -1
- package/dist/{serve-BQQ2JzIH.d.mts → serve-B5WmhK6m.d.mts} +1 -1
- package/dist/{serve-MRGGK7-q.mjs → serve-Be6NvuQk.mjs} +3 -3
- package/dist/{serve-MRGGK7-q.mjs.map → serve-Be6NvuQk.mjs.map} +1 -1
- package/dist/serve.d.mts +1 -1
- package/dist/serve.mjs +2 -2
- package/dist/server/base-server.d.mts +3 -3
- package/dist/server/base-server.mjs +1 -1
- package/dist/server/component-server.d.mts +4 -4
- package/dist/server/component-server.mjs +2 -2
- package/dist/server/index.d.mts +6 -6
- package/dist/server/index.mjs +5 -5
- package/dist/server/server-factory.d.mts +6 -6
- package/dist/server/server-factory.mjs +3 -3
- package/dist/server/server.d.mts +4 -4
- package/dist/server/server.mjs +1 -1
- package/dist/{server-C8WCshmG.mjs → server-BmPKs8oM.mjs} +8 -8
- package/dist/{server-C8WCshmG.mjs.map → server-BmPKs8oM.mjs.map} +1 -1
- package/dist/{server-B0nzGCG5.mjs → server-Cbd3Ia51.mjs} +5 -5
- package/dist/{server-B0nzGCG5.mjs.map → server-Cbd3Ia51.mjs.map} +1 -1
- package/dist/{server-Drc2kSxp.d.mts → server-D9gjszHe.d.mts} +3 -3
- package/dist/{sse-BOd2pvUK.d.mts → sse-BMM6KTfy.d.mts} +2 -2
- package/dist/{sse-US5D9mgE.mjs → sse-BT5yyLgX.mjs} +3 -3
- package/dist/{sse-US5D9mgE.mjs.map → sse-BT5yyLgX.mjs.map} +1 -1
- package/dist/types/component-route.d.mts +1 -1
- package/dist/types/index.d.mts +5 -5
- package/dist/types/index.mjs +1 -1
- package/dist/types/route.d.mts +1 -1
- package/dist/types/route.mjs +1 -1
- package/dist/types/schema.d.mts +1 -1
- package/dist/types/types.d.mts +1 -1
- package/dist/{types-Cb7_2VSt.d.mts → types-DuTa8AVN.d.mts} +1 -1
- package/dist/utils/base64url.d.mts +1 -1
- package/dist/utils/base64url.mjs +1 -1
- package/dist/utils/create-handler.d.mts +2 -2
- package/dist/utils/create-handler.mjs +3 -3
- package/dist/utils/dependency-manager.d.mts +1 -1
- package/dist/utils/dependency-manager.mjs +1 -1
- package/dist/utils/formats.d.mts +1 -1
- package/dist/utils/go-await.d.mts +1 -1
- package/dist/utils/go-await.mjs +1 -1
- package/dist/utils/handle.d.mts +1 -1
- package/dist/utils/handle.mjs +2 -2
- package/dist/utils/html-renderer.d.mts +1 -1
- package/dist/utils/html-renderer.mjs +1 -1
- package/dist/utils/index.d.mts +15 -15
- package/dist/utils/index.mjs +12 -12
- package/dist/utils/parsers.d.mts +1 -1
- package/dist/utils/parsers.mjs +1 -1
- package/dist/utils/path-matcher.mjs +1 -1
- package/dist/utils/request-validator.d.mts +2 -2
- package/dist/utils/request-validator.mjs +3 -3
- package/dist/utils/response.d.mts +1 -1
- package/dist/utils/response.mjs +1 -1
- package/dist/utils/route-registry.d.mts +3 -3
- package/dist/utils/route-registry.mjs +1 -1
- package/dist/utils/sse.d.mts +2 -2
- package/dist/utils/sse.mjs +3 -3
- package/dist/utils/validators/validators.d.mts +1 -1
- package/dist/utils/validators/validators.mjs +1 -1
- package/dist/{validators-CbCLj0Rc.mjs → validators-BBrGePBr.mjs} +1 -1
- package/dist/{validators-CbCLj0Rc.mjs.map → validators-BBrGePBr.mjs.map} +1 -1
- package/dist/{validators-C0eZyxPh.d.mts → validators-CPmnj_y9.d.mts} +1 -1
- package/package.json +1 -1
- package/dist/auth/token.d.mts +0 -44
- package/dist/auth/token.mjs +0 -105
- package/dist/auth/token.mjs.map +0 -1
- package/dist/middleware/auth.d.mts +0 -20
- package/dist/middleware/auth.mjs +0 -98
- package/dist/middleware/auth.mjs.map +0 -1
- package/dist/middleware/authMiddleware.d.mts +0 -9
- package/dist/middleware/authMiddleware.mjs +0 -19
- package/dist/middleware/authMiddleware.mjs.map +0 -1
- package/dist/middleware/cors.d.mts +0 -16
- package/dist/middleware/cors.mjs +0 -38
- package/dist/middleware/cors.mjs.map +0 -1
- package/dist/middleware/rateLimit.d.mts +0 -14
- package/dist/middleware/rateLimit.mjs +0 -34
- package/dist/middleware/rateLimit.mjs.map +0 -1
- /package/dist/{chunk-67U6L5Jh.mjs → chunk-DW4-Jl94.mjs} +0 -0
- /package/dist/{component-route-Do2yyYTi.mjs → component-route-CYxLOnci.mjs} +0 -0
- /package/dist/{index-DXJd7-2Z.d.mts → index-CzItj62a.d.mts} +0 -0
- /package/dist/{schema-CbAaktsZ.mjs → schema-CtVBNfnQ.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-
|
|
1
|
+
{"version":3,"file":"response-DXg4i_yh.mjs","names":["stream"],"sources":["../src/utils/response.ts"],"sourcesContent":["// src/response.ts\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n"],"mappings":";;;;AAGA,SAAgB,KACd,MACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,OAAO,KAAK,UAAU,KAAK;AAGjC,KAAI,OAAO,KAAK,QAAQ,CAAC,WAAW,EAClC,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS,EAAE,gBAAgB,oBAAoB;EAChD,CAAC;CAIJ,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS;EACV,CAAC;;;;;;AAWJ,SAAgB,YAAY,UAA6B;AAEvD,KAAI,oBAAoB,SAAU,QAAO;AAGzC,SAAQ,UAAU,aAAa,MAA/B;EACE,KAAK,SACH,QAAO,IAAI,SAAS,UAAoB,EAAE,SAAS,cAAc,CAAC;EAEpE,KAAK;EACL,KAAK,QACH,QAAO,IAAI,SAAS,KAAK,UAAU,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;EAE1E,KAAK;EACL,KAAK,UACH,QAAO,IAAI,SAAS,OAAO,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;EAElE,KAAK,OAEH,QAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,CAAC;EAE5C,KAAK,iBACH,QAAO,IAAI,SAAS,SAA2B;EAEjD,KAAK,OACH,QAAO,IAAI,SAAS,SAAiB;EAEvC,KAAK,cACH,QAAO,IAAI,SAAS,SAAwB;EAE9C,KAAK,aACH,QAAO,IAAI,SAAS,SAAgC;EAEtD;AAEE,OAAI,oBAAoB,QACtB,QAAO,SAAS,KAAK,YAAY;AAGnC,UAAO,IAAI,SAAS,KAAK,UAAU,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;;;;AAK9E,SAAgB,SAAS,UAAkB,SAAoB,KAAe;AAC5E,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS,EACP,UAAU,UACX;EACF,CAAC;;;AAIJ,SAAgB,KACd,SACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,SAAS;EAC3B;EACA,SAAS;EACV,CAAC;;;AAIJ,SAAgB,KACd,SACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,SAAS;EAC3B;EACA,SAAS;EACV,CAAC;;;AAIJ,SAAgB,MAAM,SAAS,KAAK,UAAuB,EAAE,EAAY;AACvE,QAAO,IAAI,SAAS,MAAM;EACxB;EACA;EACD,CAAC;;;AAIJ,SAAgB,OACd,UACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAASA,UAAQ;EAC1B;EACA,SAAS;EACV,CAAC;;;;CApHE,eAAe,EAAE,gBAAgB,oBAAoB;CACrD,eAAe,EAAE,gBAAgB,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-
|
|
1
|
+
{"version":3,"file":"route-9pAVP1GC.mjs","names":[],"sources":["../src/types/route.ts"],"sourcesContent":["import { Route, ResponseBody } from \"./types\";\n\n// 定义中间件类型\nexport interface Middleware {\n (req: Request, next: () => Promise<Response>): Promise<Response>;\n}\n\n// 基础路由配置\nexport interface BaseRouteConfig {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\";\n path: string;\n handler: (req: Request) => ResponseBody | Promise<ResponseBody>;\n}\n\n// 扩展的路由配置 - 只保留Schema验证和中间件\nexport interface ExtendedRouteConfig extends BaseRouteConfig {\n // Tirne 中间件系统\n middleware?: Middleware[];\n\n // Schema验证配置\n body?: any;\n query?: any;\n params?: any;\n headers?: any;\n cookies?: any;\n\n // 其他配置\n docs?: {\n description?: string;\n tags?: string[];\n security?: any[];\n responses?: Record<string, any>;\n };\n timeout?: number;\n maxBodySize?: string;\n\n // 允许任意扩展\n [key: string]: any;\n}\n\n// 嵌套路由配置\nexport interface NestedRouteConfig {\n path: string;\n middleware?: Middleware[];\n children?: (NestedRouteConfig | ExtendedRouteConfig)[];\n}\n\n// 类型安全的路由\nexport type TypedRoute = ExtendedRouteConfig;\n\n// 兼容类型:可以接受Route或TypedRoute\nexport type CompatibleRoute = Route | TypedRoute;\n\n// 扁平化后的路由,包含完整的中间件链\nexport interface FlattenedRoute extends ExtendedRouteConfig {\n fullPath: string;\n middlewareChain: Middleware[];\n}\n\n// 导出一些实际的函数,确保 JavaScript 代码生成\nexport function createTypedRoute(\n config: ExtendedRouteConfig,\n): ExtendedRouteConfig {\n return config;\n}\n\nexport function isTypedRoute(route: any): route is TypedRoute {\n return (\n route &&\n typeof route === \"object\" &&\n \"method\" in route &&\n \"path\" in route &&\n \"handler\" in route\n );\n}\n"],"mappings":";AA4DA,SAAgB,iBACd,QACqB;AACrB,QAAO;;AAGT,SAAgB,aAAa,OAAiC;AAC5D,QACE,SACA,OAAO,UAAU,YACjB,YAAY,SACZ,UAAU,SACV,aAAa"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as ResponseBody, l as Route } from "./types-
|
|
1
|
+
import { c as ResponseBody, l as Route } from "./types-DuTa8AVN.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/types/route.d.ts
|
|
4
4
|
interface Middleware {
|
|
@@ -41,4 +41,4 @@ declare function createTypedRoute(config: ExtendedRouteConfig): ExtendedRouteCon
|
|
|
41
41
|
declare function isTypedRoute(route: any): route is TypedRoute;
|
|
42
42
|
//#endregion
|
|
43
43
|
export { Middleware as a, createTypedRoute as c, FlattenedRoute as i, isTypedRoute as l, CompatibleRoute as n, NestedRouteConfig as o, ExtendedRouteConfig as r, TypedRoute as s, BaseRouteConfig as t };
|
|
44
|
-
//# sourceMappingURL=route-
|
|
44
|
+
//# sourceMappingURL=route-BJ-40LNI.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as Method, n as FlattenedRoute } from "./types-
|
|
1
|
+
import { a as Method, n as FlattenedRoute } from "./types-DuTa8AVN.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/route-registry.d.ts
|
|
4
4
|
|
|
@@ -173,4 +173,4 @@ declare function getAllRoutes(): RouteMeta[];
|
|
|
173
173
|
declare function filterRoutes<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[];
|
|
174
174
|
//#endregion
|
|
175
175
|
export { getAllRoutes as a, setGlobalRegistry as c, filterRoutes as i, RouteRegistry as n, getRoute as o, createRouteRegistry as r, getRouteRegistry as s, RouteMeta as t };
|
|
176
|
-
//# sourceMappingURL=route-registry
|
|
176
|
+
//# sourceMappingURL=route-registry--tx1PNui.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as __esmMin } from "./chunk-
|
|
1
|
+
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/route-registry.ts
|
|
4
4
|
/**
|
|
@@ -222,4 +222,4 @@ var init_route_registry = __esmMin((() => {
|
|
|
222
222
|
|
|
223
223
|
//#endregion
|
|
224
224
|
export { getRoute as a, setGlobalRegistry as c, getAllRoutes as i, createRouteRegistry as n, getRouteRegistry as o, filterRoutes as r, init_route_registry as s, RouteRegistry as t };
|
|
225
|
-
//# sourceMappingURL=route-registry-
|
|
225
|
+
//# sourceMappingURL=route-registry-mcTG0M-t.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-registry-
|
|
1
|
+
{"version":3,"file":"route-registry-mcTG0M-t.mjs","names":[],"sources":["../src/utils/route-registry.ts"],"sourcesContent":["/**\n * 路由注册表\n *\n * 提供路由元信息的收集和查询能力\n * 可用于:API 文档生成、Webhook 事件注册、权限检查、审计日志等\n *\n * @example\n * ```typescript\n * // 创建注册表\n * const registry = createRouteRegistry(server.getRoutes())\n *\n * // 查询路由\n * const route = registry.get('POST', '/auth/signIn')\n *\n * // 筛选有 webhook 配置的路由\n * const webhookRoutes = registry.filter('webhook')\n *\n * // 按分类获取\n * const authRoutes = registry.getByCategory('auth')\n * ```\n */\n\nimport type { FlattenedRoute, Method } from '../types'\n\n/**\n * 路由元信息(不含 handler 和 middleware)\n */\nexport interface RouteMeta {\n method: Method\n path: string\n fullPath: string\n name?: string\n description?: string\n /** 扩展字段 */\n [key: string]: unknown\n}\n\n/**\n * 路由注册表\n *\n * 泛型 T 用于定义扩展字段的类型\n */\nexport class RouteRegistry<T extends Record<string, unknown> = Record<string, unknown>> {\n /** 所有路由元信息 */\n private routes: RouteMeta[] = []\n\n /** 路由映射表:METHOD:fullPath -> RouteMeta */\n private routeMap = new Map<string, RouteMeta>()\n\n /** 分类映射表:category -> RouteMeta[] */\n private categoryMap = new Map<string, RouteMeta[]>()\n\n constructor(routes: FlattenedRoute[]) {\n this.buildRegistry(routes)\n }\n\n /**\n * 构建注册表\n */\n private buildRegistry(routes: FlattenedRoute[]): void {\n for (const route of routes) {\n // 提取元信息(排除 handler 和 middleware)\n const meta: RouteMeta = {\n method: route.method,\n path: route.path,\n fullPath: route.fullPath,\n name: route.name,\n description: route.description,\n }\n\n // 复制扩展字段\n for (const key of Object.keys(route)) {\n if (!['method', 'path', 'fullPath', 'name', 'description', 'handler', 'middleware', 'middlewareChain'].includes(key)) {\n meta[key] = route[key as keyof FlattenedRoute]\n }\n }\n\n this.routes.push(meta)\n this.routeMap.set(`${route.method}:${route.fullPath}`, meta)\n\n // 按分类索引\n const category = this.extractCategory(route.fullPath)\n if (!this.categoryMap.has(category)) {\n this.categoryMap.set(category, [])\n }\n this.categoryMap.get(category)!.push(meta)\n }\n }\n\n /**\n * 提取分类(第一段路径)\n */\n private extractCategory(path: string): string {\n const segments = path.split('/').filter(Boolean)\n return segments[0] || 'root'\n }\n\n // ============================================\n // 查询接口\n // ============================================\n\n /**\n * 获取所有路由元信息\n */\n getAll(): RouteMeta[] {\n return [...this.routes]\n }\n\n /**\n * 按 method + path 查询路由\n */\n get(method: string, path: string): (RouteMeta & T) | undefined {\n return this.routeMap.get(`${method}:${path}`) as (RouteMeta & T) | undefined\n }\n\n /**\n * 检查路由是否存在\n */\n has(method: string, path: string): boolean {\n return this.routeMap.has(`${method}:${path}`)\n }\n\n /**\n * 按分类获取路由\n */\n getByCategory(category: string): RouteMeta[] {\n return this.categoryMap.get(category) || []\n }\n\n /**\n * 获取所有分类\n */\n getCategories(): string[] {\n return Array.from(this.categoryMap.keys()).sort()\n }\n\n /**\n * 筛选有特定字段的路由\n *\n * @example\n * ```typescript\n * // 获取所有配置了 webhook 的路由\n * const webhookRoutes = registry.filter('webhook')\n * ```\n */\n filter<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[] {\n return this.routes.filter((r) => field in r && r[field] !== undefined) as (RouteMeta & Record<K, unknown>)[]\n }\n\n /**\n * 按条件筛选路由\n *\n * @example\n * ```typescript\n * // 获取所有 POST 请求\n * const postRoutes = registry.filterBy(r => r.method === 'POST')\n * ```\n */\n filterBy(predicate: (route: RouteMeta) => boolean): RouteMeta[] {\n return this.routes.filter(predicate)\n }\n\n /**\n * 获取路由数量\n */\n get size(): number {\n return this.routes.length\n }\n\n /**\n * 遍历所有路由\n */\n forEach(callback: (route: RouteMeta, index: number) => void): void {\n this.routes.forEach(callback)\n }\n\n /**\n * 映射所有路由\n */\n map<R>(callback: (route: RouteMeta, index: number) => R): R[] {\n return this.routes.map(callback)\n }\n}\n\n/**\n * 创建路由注册表\n *\n * @example\n * ```typescript\n * // 定义扩展字段类型\n * interface MyRouteMeta {\n * webhook?: { eventKey: string }\n * permission?: string\n * }\n *\n * // 创建带类型的注册表\n * const registry = createRouteRegistry<MyRouteMeta>(server.getRoutes())\n *\n * // 类型安全的查询\n * const route = registry.get('POST', '/auth/signIn')\n * if (route?.webhook) {\n * console.log(route.webhook.eventKey)\n * }\n * ```\n */\nexport function createRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(\n routes: FlattenedRoute[]\n): RouteRegistry<T> {\n return new RouteRegistry<T>(routes)\n}\n\n// ============================================\n// 全局 Registry(单例模式)\n// ============================================\n\n/** 全局 registry 实例 */\nlet globalRegistry: RouteRegistry | null = null\n\n/**\n * 设置全局 registry(框架内部使用)\n * @internal\n */\nexport function setGlobalRegistry(registry: RouteRegistry): void {\n globalRegistry = registry\n}\n\n/**\n * 获取全局路由注册表\n *\n * @example\n * ```typescript\n * // 在任意文件中\n * import { getRouteRegistry } from 'vafast'\n *\n * const registry = getRouteRegistry()\n * const webhookRoutes = registry.filter('webhook')\n * ```\n *\n * @throws 如果 Server 尚未创建\n */\nexport function getRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(): RouteRegistry<T> {\n if (!globalRegistry) {\n throw new Error('RouteRegistry not initialized. Make sure Server is created first.')\n }\n return globalRegistry as RouteRegistry<T>\n}\n\n/**\n * 按 method + path 获取单个路由\n *\n * 便捷函数,无需先获取 registry\n *\n * @example\n * ```typescript\n * // 在中间件或接口中\n * import { getRoute } from 'vafast'\n *\n * const route = getRoute('POST', '/auth/signIn')\n * if (route?.webhook) {\n * console.log('This route has webhook:', route.webhook)\n * }\n * ```\n */\nexport function getRoute<T extends Record<string, unknown> = Record<string, unknown>>(\n method: string,\n path: string\n): (RouteMeta & T) | undefined {\n return getRouteRegistry<T>().get(method, path)\n}\n\n/**\n * 获取所有路由\n *\n * @example\n * ```typescript\n * import { getAllRoutes } from 'vafast'\n *\n * const routes = getAllRoutes()\n * console.log(`Total ${routes.length} routes`)\n * ```\n */\nexport function getAllRoutes(): RouteMeta[] {\n return getRouteRegistry().getAll()\n}\n\n/**\n * 筛选有特定字段的路由\n *\n * @example\n * ```typescript\n * import { filterRoutes } from 'vafast'\n *\n * // 获取所有配置了 webhook 的路由\n * const webhookRoutes = filterRoutes('webhook')\n * ```\n */\nexport function filterRoutes<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[] {\n return getRouteRegistry().filter(field)\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6MA,SAAgB,oBACd,QACkB;AAClB,QAAO,IAAI,cAAiB,OAAO;;;;;;AAcrC,SAAgB,kBAAkB,UAA+B;AAC/D,kBAAiB;;;;;;;;;;;;;;;;AAiBnB,SAAgB,mBAAkG;AAChH,KAAI,CAAC,eACH,OAAM,IAAI,MAAM,oEAAoE;AAEtF,QAAO;;;;;;;;;;;;;;;;;;AAmBT,SAAgB,SACd,QACA,MAC6B;AAC7B,QAAO,kBAAqB,CAAC,IAAI,QAAQ,KAAK;;;;;;;;;;;;;AAchD,SAAgB,eAA4B;AAC1C,QAAO,kBAAkB,CAAC,QAAQ;;;;;;;;;;;;;AAcpC,SAAgB,aAA+B,OAA8C;AAC3F,QAAO,kBAAkB,CAAC,OAAO,MAAM;;;;CA/P5B,gBAAb,MAAwF;;EAEtF,AAAQ,SAAsB,EAAE;;EAGhC,AAAQ,2BAAW,IAAI,KAAwB;;EAG/C,AAAQ,8BAAc,IAAI,KAA0B;EAEpD,YAAY,QAA0B;AACpC,QAAK,cAAc,OAAO;;;;;EAM5B,AAAQ,cAAc,QAAgC;AACpD,QAAK,MAAM,SAAS,QAAQ;IAE1B,MAAM,OAAkB;KACtB,QAAQ,MAAM;KACd,MAAM,MAAM;KACZ,UAAU,MAAM;KAChB,MAAM,MAAM;KACZ,aAAa,MAAM;KACpB;AAGD,SAAK,MAAM,OAAO,OAAO,KAAK,MAAM,CAClC,KAAI,CAAC;KAAC;KAAU;KAAQ;KAAY;KAAQ;KAAe;KAAW;KAAc;KAAkB,CAAC,SAAS,IAAI,CAClH,MAAK,OAAO,MAAM;AAItB,SAAK,OAAO,KAAK,KAAK;AACtB,SAAK,SAAS,IAAI,GAAG,MAAM,OAAO,GAAG,MAAM,YAAY,KAAK;IAG5D,MAAM,WAAW,KAAK,gBAAgB,MAAM,SAAS;AACrD,QAAI,CAAC,KAAK,YAAY,IAAI,SAAS,CACjC,MAAK,YAAY,IAAI,UAAU,EAAE,CAAC;AAEpC,SAAK,YAAY,IAAI,SAAS,CAAE,KAAK,KAAK;;;;;;EAO9C,AAAQ,gBAAgB,MAAsB;AAE5C,UADiB,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAChC,MAAM;;;;;EAUxB,SAAsB;AACpB,UAAO,CAAC,GAAG,KAAK,OAAO;;;;;EAMzB,IAAI,QAAgB,MAA2C;AAC7D,UAAO,KAAK,SAAS,IAAI,GAAG,OAAO,GAAG,OAAO;;;;;EAM/C,IAAI,QAAgB,MAAuB;AACzC,UAAO,KAAK,SAAS,IAAI,GAAG,OAAO,GAAG,OAAO;;;;;EAM/C,cAAc,UAA+B;AAC3C,UAAO,KAAK,YAAY,IAAI,SAAS,IAAI,EAAE;;;;;EAM7C,gBAA0B;AACxB,UAAO,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC,CAAC,MAAM;;;;;;;;;;;EAYnD,OAAyB,OAA8C;AACrE,UAAO,KAAK,OAAO,QAAQ,MAAM,SAAS,KAAK,EAAE,WAAW,OAAU;;;;;;;;;;;EAYxE,SAAS,WAAuD;AAC9D,UAAO,KAAK,OAAO,OAAO,UAAU;;;;;EAMtC,IAAI,OAAe;AACjB,UAAO,KAAK,OAAO;;;;;EAMrB,QAAQ,UAA2D;AACjE,QAAK,OAAO,QAAQ,SAAS;;;;;EAM/B,IAAO,UAAuD;AAC5D,UAAO,KAAK,OAAO,IAAI,SAAS;;;CAoChC,iBAAuC"}
|
package/dist/router/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
1
|
+
import "../schema-CPQudJpE.mjs";
|
|
2
|
+
import "../index-CzItj62a.mjs";
|
|
3
3
|
import { flattenNestedRoutes, normalizePath } from "../router.mjs";
|
|
4
4
|
import { RadixRouter } from "./radix-tree.mjs";
|
|
5
5
|
export { RadixRouter, flattenNestedRoutes, normalizePath };
|
package/dist/router/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as init_router, r as normalizePath, t as flattenNestedRoutes } from "../router-
|
|
2
|
-
import { n as init_radix_tree, t as RadixRouter } from "../radix-tree-
|
|
1
|
+
import { n as init_router, r as normalizePath, t as flattenNestedRoutes } from "../router-B9HUUCkR.mjs";
|
|
2
|
+
import { n as init_radix_tree, t as RadixRouter } from "../radix-tree-D0XYaJKb.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/router/index.ts
|
|
5
5
|
init_radix_tree();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as Method, o as Middleware, r as Handler } from "../types-
|
|
2
|
-
import "../schema-
|
|
3
|
-
import "../index-
|
|
1
|
+
import { a as Method, o as Middleware, r as Handler } from "../types-DuTa8AVN.mjs";
|
|
2
|
+
import "../schema-CPQudJpE.mjs";
|
|
3
|
+
import "../index-CzItj62a.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/router/radix-tree.d.ts
|
|
6
6
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as __esmMin } from "./chunk-
|
|
1
|
+
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/router.ts
|
|
4
4
|
/**
|
|
@@ -68,4 +68,4 @@ var init_router = __esmMin((() => {}));
|
|
|
68
68
|
|
|
69
69
|
//#endregion
|
|
70
70
|
export { init_router as n, normalizePath as r, flattenNestedRoutes as t };
|
|
71
|
-
//# sourceMappingURL=router-
|
|
71
|
+
//# sourceMappingURL=router-B9HUUCkR.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-
|
|
1
|
+
{"version":3,"file":"router-B9HUUCkR.mjs","names":[],"sources":["../src/router.ts"],"sourcesContent":["/**\n * 路由工具函数\n *\n * 提供路由处理的基础工具\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Middleware } from \"./types\";\n\n/**\n * 扁平化嵌套路由\n *\n * 将嵌套路由结构转换为扁平数组,计算完整路径和中间件链\n *\n * @example\n * ```typescript\n * const routes = flattenNestedRoutes([\n * {\n * path: \"/api\",\n * middleware: [authMiddleware],\n * children: [\n * { path: \"/users\", method: \"GET\", handler: getUsers },\n * { path: \"/users/:id\", method: \"GET\", handler: getUser },\n * ],\n * },\n * ]);\n * // 结果:\n * // [\n * // { fullPath: \"/api/users\", method: \"GET\", ... },\n * // { fullPath: \"/api/users/:id\", method: \"GET\", ... },\n * // ]\n * ```\n */\nexport function flattenNestedRoutes(\n routes: (Route | NestedRoute)[],\n): FlattenedRoute[] {\n const flattened: FlattenedRoute[] = [];\n\n function processRoute(\n route: Route | NestedRoute,\n parentPath = \"\",\n parentMiddleware: Middleware[] = [],\n parentName?: string,\n ): void {\n // 计算当前完整路径\n const currentPath = normalizePath(parentPath + route.path);\n // 合并中间件链\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n // 当前路由的 name(用于传递给子路由)\n const currentName = route.name || parentName;\n\n if (\"method\" in route && \"handler\" in route) {\n // 叶子路由(有处理函数)\n const leafRoute = route as Route;\n flattened.push({\n ...leafRoute,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n parentName: parentName, // 保存父级名称\n });\n } else if (\"children\" in route && route.children) {\n // 分组路由,递归处理子路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware, currentName);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 标准化路径\n *\n * - 解码 URL 编码字符\n * - 去除重复斜杠\n * - 处理结尾斜杠\n *\n * @example\n * ```typescript\n * normalizePath(\"//api//users/\") // \"/api/users\"\n * normalizePath(\"/api/%20test\") // \"/api/ test\"\n * ```\n */\nexport function normalizePath(path: string): string {\n // 解码 URL 编码\n let normalized = decodeURIComponent(path);\n\n // 去除重复斜杠\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // 空路径转为根路径\n if (normalized === \"\") return \"/\";\n\n // 去除结尾斜杠(根路径除外)\n if (normalized !== \"/\" && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,oBACd,QACkB;CAClB,MAAM,YAA8B,EAAE;CAEtC,SAAS,aACP,OACA,aAAa,IACb,mBAAiC,EAAE,EACnC,YACM;EAEN,MAAM,cAAc,cAAc,aAAa,MAAM,KAAK;EAE1D,MAAM,oBAAoB,CACxB,GAAG,kBACH,GAAI,MAAM,cAAc,EAAE,CAC3B;EAED,MAAM,cAAc,MAAM,QAAQ;AAElC,MAAI,YAAY,SAAS,aAAa,OAAO;GAE3C,MAAM,YAAY;AAClB,aAAU,KAAK;IACb,GAAG;IACH,UAAU;IACV,iBAAiB;IACL;IACb,CAAC;aACO,cAAc,SAAS,MAAM,SAEtC,MAAK,MAAM,SAAS,MAAM,SACxB,cAAa,OAAO,aAAa,mBAAmB,YAAY;;AAKtE,MAAK,MAAM,SAAS,OAClB,cAAa,MAAM;AAGrB,QAAO;;;;;;;;;;;;;;;AAgBT,SAAgB,cAAc,MAAsB;CAElD,IAAI,aAAa,mBAAmB,KAAK;AAGzC,cAAa,WAAW,QAAQ,QAAQ,IAAI;AAG5C,KAAI,eAAe,GAAI,QAAO;AAG9B,KAAI,eAAe,OAAO,WAAW,SAAS,IAAI,CAChD,cAAa,WAAW,MAAM,GAAG,GAAG;AAGtC,QAAO"}
|
package/dist/router.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-
|
|
2
|
-
import "./schema-
|
|
3
|
-
import "./index-
|
|
1
|
+
import { l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-DuTa8AVN.mjs";
|
|
2
|
+
import "./schema-CPQudJpE.mjs";
|
|
3
|
+
import "./index-CzItj62a.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/router.d.ts
|
|
6
6
|
|
package/dist/router.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as init_router, r as normalizePath, t as flattenNestedRoutes } from "./router-
|
|
1
|
+
import { n as init_router, r as normalizePath, t as flattenNestedRoutes } from "./router-B9HUUCkR.mjs";
|
|
2
2
|
|
|
3
3
|
init_router();
|
|
4
4
|
export { flattenNestedRoutes, normalizePath };
|
|
@@ -78,4 +78,4 @@ interface TypedRouteConfig<T extends RouteSchema = RouteSchema> {
|
|
|
78
78
|
}
|
|
79
79
|
//#endregion
|
|
80
80
|
export { TypedHandler as a, RouteSchema as i, HandlerContextWithExtra as n, TypedRouteConfig as o, InferSchema as r, HandlerContext as t };
|
|
81
|
-
//# sourceMappingURL=schema-
|
|
81
|
+
//# sourceMappingURL=schema-CPQudJpE.d.mts.map
|
|
@@ -66,4 +66,4 @@ declare function serve(options: ServeOptions, callback?: () => void): ServeResul
|
|
|
66
66
|
declare function createAdaptorServer(fetch: FetchHandler, onError?: (error: Error) => Response | Promise<Response>): Server;
|
|
67
67
|
//#endregion
|
|
68
68
|
export { createAdaptorServer as a, ServeResult as i, GracefulShutdownOptions as n, serve as o, ServeOptions as r, FetchHandler as t };
|
|
69
|
-
//# sourceMappingURL=serve-
|
|
69
|
+
//# sourceMappingURL=serve-B5WmhK6m.d.mts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as createProxyRequest } from "./request-
|
|
2
|
-
import { t as writeResponse } from "./response-
|
|
1
|
+
import { t as createProxyRequest } from "./request-CKC3Ox6M.mjs";
|
|
2
|
+
import { t as writeResponse } from "./response-Cf5FgtmE.mjs";
|
|
3
3
|
import { createServer } from "node:http";
|
|
4
4
|
|
|
5
5
|
//#region src/node-server/serve.ts
|
|
@@ -104,4 +104,4 @@ function createAdaptorServer(fetch, onError) {
|
|
|
104
104
|
|
|
105
105
|
//#endregion
|
|
106
106
|
export { serve as n, createAdaptorServer as t };
|
|
107
|
-
//# sourceMappingURL=serve-
|
|
107
|
+
//# sourceMappingURL=serve-Be6NvuQk.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-
|
|
1
|
+
{"version":3,"file":"serve-Be6NvuQk.mjs","names":[],"sources":["../src/node-server/serve.ts"],"sourcesContent":["/**\n * Node.js 服务器适配器\n * 提供类似 Bun.serve 的 API\n */\n\nimport {\n createServer,\n type Server as HttpServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { createProxyRequest } from \"./request\";\nimport { writeResponse } from \"./response\";\n\n/** fetch 函数类型 */\nexport type FetchHandler = (request: Request) => Response | Promise<Response>;\n\n/** 优雅关闭配置 */\nexport interface GracefulShutdownOptions {\n /** 关闭超时时间(毫秒),默认 30000 */\n timeout?: number;\n /** 关闭前回调 */\n onShutdown?: () => void | Promise<void>;\n /** 关闭完成回调 */\n onShutdownComplete?: () => void;\n /** 监听的信号,默认 ['SIGINT', 'SIGTERM'] */\n signals?: NodeJS.Signals[];\n}\n\n/** serve 配置选项 */\nexport interface ServeOptions {\n /** fetch 处理函数 */\n fetch: FetchHandler;\n /** 端口号,默认 3000 */\n port?: number;\n /** 主机名,默认 0.0.0.0 */\n hostname?: string;\n /** 错误处理函数 */\n onError?: (error: Error) => Response | Promise<Response>;\n /** 优雅关闭配置,设置为 true 使用默认配置 */\n gracefulShutdown?: boolean | GracefulShutdownOptions;\n}\n\n/** serve 返回的服务器信息 */\nexport interface ServeResult {\n /** Node.js HTTP Server 实例 */\n server: HttpServer;\n /** 服务器端口 */\n port: number;\n /** 服务器主机名 */\n hostname: string;\n /** 关闭服务器 */\n stop: () => Promise<void>;\n /** 优雅关闭(等待现有请求完成) */\n shutdown: () => Promise<void>;\n}\n\n/**\n * 创建请求处理函数\n */\nfunction createRequestHandler(\n fetch: FetchHandler,\n defaultHost: string,\n onError?: (error: Error) => Response | Promise<Response>,\n) {\n return async (incoming: IncomingMessage, outgoing: ServerResponse) => {\n try {\n // 创建代理 Request(延迟创建真实 Request)\n const request = createProxyRequest(incoming, defaultHost);\n\n // 调用 fetch handler\n const response = await fetch(request);\n\n // 流式写入 Response\n await writeResponse(response, outgoing);\n } catch (error) {\n // 错误处理\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (onError) {\n try {\n const errorResponse = await onError(err);\n await writeResponse(errorResponse, outgoing);\n return;\n } catch {\n // onError 也失败了,返回 500\n }\n }\n\n // 默认错误响应\n if (!outgoing.headersSent) {\n outgoing.statusCode = 500;\n outgoing.setHeader(\"Content-Type\", \"text/plain\");\n outgoing.end(\"Internal Server Error\");\n }\n }\n };\n}\n\n/**\n * 启动 HTTP 服务器\n *\n * @example\n * ```ts\n * import { serve } from \"@vafast/node-server\";\n * import { Server } from \"vafast\";\n *\n * const app = new Server([\n * { method: \"GET\", path: \"/\", handler: () => \"Hello World\" },\n * ]);\n *\n * serve({ fetch: app.fetch, port: 3000 }, () => {\n * console.log(\"Server running on http://localhost:3000\");\n * });\n * ```\n */\nexport function serve(\n options: ServeOptions,\n callback?: () => void,\n): ServeResult {\n const { fetch, port = 3000, hostname = \"0.0.0.0\", onError, gracefulShutdown } = options;\n\n const defaultHost = `${hostname === \"0.0.0.0\" ? \"localhost\" : hostname}:${port}`;\n const handler = createRequestHandler(fetch, defaultHost, onError);\n\n const server = createServer(handler);\n\n // 追踪活跃连接\n const connections = new Set<import(\"node:net\").Socket>();\n\n server.on(\"connection\", (socket) => {\n connections.add(socket);\n socket.on(\"close\", () => connections.delete(socket));\n });\n\n // 优雅关闭函数\n let isShuttingDown = false;\n\n const shutdown = async (): Promise<void> => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n\n const shutdownOptions: GracefulShutdownOptions =\n typeof gracefulShutdown === \"object\" ? gracefulShutdown : {};\n\n const timeout = shutdownOptions.timeout ?? 30000;\n\n // 执行关闭前回调\n if (shutdownOptions.onShutdown) {\n await shutdownOptions.onShutdown();\n }\n\n return new Promise<void>((resolve) => {\n // 设置超时强制关闭\n const forceCloseTimer = setTimeout(() => {\n // 强制关闭所有连接\n for (const socket of connections) {\n socket.destroy();\n }\n connections.clear();\n resolve();\n }, timeout);\n\n // 停止接受新连接\n server.close(() => {\n clearTimeout(forceCloseTimer);\n shutdownOptions.onShutdownComplete?.();\n resolve();\n });\n\n // 关闭空闲连接\n for (const socket of connections) {\n // 如果连接空闲,立即关闭\n if (!socket.writableLength) {\n socket.end();\n }\n }\n });\n };\n\n // 注册信号处理\n if (gracefulShutdown) {\n const shutdownOptions: GracefulShutdownOptions =\n typeof gracefulShutdown === \"object\" ? gracefulShutdown : {};\n\n const signals = shutdownOptions.signals ?? [\"SIGINT\", \"SIGTERM\"];\n\n for (const signal of signals) {\n process.on(signal, () => {\n shutdown().then(() => process.exit(0));\n });\n }\n }\n\n // 启动服务器\n server.listen(port, hostname, callback);\n\n return {\n server,\n port,\n hostname,\n stop: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n }),\n shutdown,\n };\n}\n\n/**\n * 创建适配器服务器(不自动启动)\n * 用于需要更多控制的场景\n */\nexport function createAdaptorServer(\n fetch: FetchHandler,\n onError?: (error: Error) => Response | Promise<Response>,\n): HttpServer {\n const handler = createRequestHandler(fetch, \"localhost\", onError);\n return createServer(handler);\n}\n"],"mappings":";;;;;;;;;;;;AA4DA,SAAS,qBACP,OACA,aACA,SACA;AACA,QAAO,OAAO,UAA2B,aAA6B;AACpE,MAAI;AAQF,SAAM,cAHW,MAAM,MAHP,mBAAmB,UAAU,YAAY,CAGpB,EAGP,SAAS;WAChC,OAAO;GAEd,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AAErE,OAAI,QACF,KAAI;AAEF,UAAM,cADgB,MAAM,QAAQ,IAAI,EACL,SAAS;AAC5C;WACM;AAMV,OAAI,CAAC,SAAS,aAAa;AACzB,aAAS,aAAa;AACtB,aAAS,UAAU,gBAAgB,aAAa;AAChD,aAAS,IAAI,wBAAwB;;;;;;;;;;;;;;;;;;;;;;AAuB7C,SAAgB,MACd,SACA,UACa;CACb,MAAM,EAAE,OAAO,OAAO,KAAM,WAAW,WAAW,SAAS,qBAAqB;CAKhF,MAAM,SAAS,aAFC,qBAAqB,OADjB,GAAG,aAAa,YAAY,cAAc,SAAS,GAAG,QACjB,QAAQ,CAE7B;CAGpC,MAAM,8BAAc,IAAI,KAAgC;AAExD,QAAO,GAAG,eAAe,WAAW;AAClC,cAAY,IAAI,OAAO;AACvB,SAAO,GAAG,eAAe,YAAY,OAAO,OAAO,CAAC;GACpD;CAGF,IAAI,iBAAiB;CAErB,MAAM,WAAW,YAA2B;AAC1C,MAAI,eAAgB;AACpB,mBAAiB;EAEjB,MAAM,kBACJ,OAAO,qBAAqB,WAAW,mBAAmB,EAAE;EAE9D,MAAM,UAAU,gBAAgB,WAAW;AAG3C,MAAI,gBAAgB,WAClB,OAAM,gBAAgB,YAAY;AAGpC,SAAO,IAAI,SAAe,YAAY;GAEpC,MAAM,kBAAkB,iBAAiB;AAEvC,SAAK,MAAM,UAAU,YACnB,QAAO,SAAS;AAElB,gBAAY,OAAO;AACnB,aAAS;MACR,QAAQ;AAGX,UAAO,YAAY;AACjB,iBAAa,gBAAgB;AAC7B,oBAAgB,sBAAsB;AACtC,aAAS;KACT;AAGF,QAAK,MAAM,UAAU,YAEnB,KAAI,CAAC,OAAO,eACV,QAAO,KAAK;IAGhB;;AAIJ,KAAI,kBAAkB;EAIpB,MAAM,WAFJ,OAAO,qBAAqB,WAAW,mBAAmB,EAAE,EAE9B,WAAW,CAAC,UAAU,UAAU;AAEhE,OAAK,MAAM,UAAU,QACnB,SAAQ,GAAG,cAAc;AACvB,aAAU,CAAC,WAAW,QAAQ,KAAK,EAAE,CAAC;IACtC;;AAKN,QAAO,OAAO,MAAM,UAAU,SAAS;AAEvC,QAAO;EACL;EACA;EACA;EACA,YACE,IAAI,SAAe,SAAS,WAAW;AACrC,UAAO,OAAO,QAAQ;AACpB,QAAI,IAAK,QAAO,IAAI;QACf,UAAS;KACd;IACF;EACJ;EACD;;;;;;AAOH,SAAgB,oBACd,OACA,SACY;AAEZ,QAAO,aADS,qBAAqB,OAAO,aAAa,QAAQ,CACrC"}
|
package/dist/serve.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as createAdaptorServer, i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "./serve-
|
|
1
|
+
import { a as createAdaptorServer, i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "./serve-B5WmhK6m.mjs";
|
|
2
2
|
export { type FetchHandler, type ServeOptions, type ServeResult, createAdaptorServer, serve };
|
package/dist/serve.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import { t as BaseServer } from "../base-server-
|
|
1
|
+
import "../schema-CPQudJpE.mjs";
|
|
2
|
+
import "../index-CzItj62a.mjs";
|
|
3
|
+
import { t as BaseServer } from "../base-server-DvGS6ATg.mjs";
|
|
4
4
|
export { BaseServer };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import { t as ComponentServer } from "../component-server-
|
|
1
|
+
import "../schema-CPQudJpE.mjs";
|
|
2
|
+
import "../index-CzItj62a.mjs";
|
|
3
|
+
import "../base-server-DvGS6ATg.mjs";
|
|
4
|
+
import { t as ComponentServer } from "../component-server-CGzU4bss.mjs";
|
|
5
5
|
export { ComponentServer };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../dependency-manager-
|
|
2
|
-
import { n as init_component_server, t as ComponentServer } from "../component-server-
|
|
1
|
+
import "../dependency-manager-Czg7Po2j.mjs";
|
|
2
|
+
import { n as init_component_server, t as ComponentServer } from "../component-server-DAbIyIPI.mjs";
|
|
3
3
|
|
|
4
4
|
init_component_server();
|
|
5
5
|
export { ComponentServer };
|
package/dist/server/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import { t as BaseServer } from "../base-server-
|
|
4
|
-
import { t as Server } from "../server-
|
|
5
|
-
import { t as ComponentServer } from "../component-server-
|
|
6
|
-
import { t as ServerFactory } from "../index-
|
|
1
|
+
import "../schema-CPQudJpE.mjs";
|
|
2
|
+
import "../index-CzItj62a.mjs";
|
|
3
|
+
import { t as BaseServer } from "../base-server-DvGS6ATg.mjs";
|
|
4
|
+
import { t as Server } from "../server-D9gjszHe.mjs";
|
|
5
|
+
import { t as ComponentServer } from "../component-server-CGzU4bss.mjs";
|
|
6
|
+
import { t as ServerFactory } from "../index-Ci52vt55.mjs";
|
|
7
7
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as BaseServer } from "../base-server-
|
|
2
|
-
import { t as Server } from "../server-
|
|
3
|
-
import "../dependency-manager-
|
|
4
|
-
import { t as ComponentServer } from "../component-server-
|
|
5
|
-
import { r as ServerFactory, t as init_server } from "../server-
|
|
1
|
+
import { t as BaseServer } from "../base-server-CSkyjEaY.mjs";
|
|
2
|
+
import { t as Server } from "../server-BmPKs8oM.mjs";
|
|
3
|
+
import "../dependency-manager-Czg7Po2j.mjs";
|
|
4
|
+
import { t as ComponentServer } from "../component-server-DAbIyIPI.mjs";
|
|
5
|
+
import { r as ServerFactory, t as init_server } from "../server-Cbd3Ia51.mjs";
|
|
6
6
|
|
|
7
7
|
init_server();
|
|
8
8
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import "../server-
|
|
5
|
-
import "../component-server-
|
|
6
|
-
import { t as ServerFactory } from "../index-
|
|
1
|
+
import "../schema-CPQudJpE.mjs";
|
|
2
|
+
import "../index-CzItj62a.mjs";
|
|
3
|
+
import "../base-server-DvGS6ATg.mjs";
|
|
4
|
+
import "../server-D9gjszHe.mjs";
|
|
5
|
+
import "../component-server-CGzU4bss.mjs";
|
|
6
|
+
import { t as ServerFactory } from "../index-Ci52vt55.mjs";
|
|
7
7
|
export { ServerFactory };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import "../dependency-manager-
|
|
2
|
-
import "../component-server-
|
|
3
|
-
import { i as init_server_factory, r as ServerFactory } from "../server-
|
|
1
|
+
import "../dependency-manager-Czg7Po2j.mjs";
|
|
2
|
+
import "../component-server-DAbIyIPI.mjs";
|
|
3
|
+
import { i as init_server_factory, r as ServerFactory } from "../server-Cbd3Ia51.mjs";
|
|
4
4
|
|
|
5
5
|
init_server_factory();
|
|
6
6
|
export { ServerFactory };
|
package/dist/server/server.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import { t as Server } from "../server-
|
|
1
|
+
import "../schema-CPQudJpE.mjs";
|
|
2
|
+
import "../index-CzItj62a.mjs";
|
|
3
|
+
import "../base-server-DvGS6ATg.mjs";
|
|
4
|
+
import { t as Server } from "../server-D9gjszHe.mjs";
|
|
5
5
|
export { Server };
|
package/dist/server/server.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { t as __esmMin } from "./chunk-
|
|
2
|
-
import { n as init_router, t as flattenNestedRoutes } from "./router-
|
|
3
|
-
import { i as json, r as init_response } from "./response-
|
|
4
|
-
import { n as composeMiddleware, r as init_middleware } from "./middleware-
|
|
5
|
-
import { n as init_base_server, t as BaseServer } from "./base-server-
|
|
6
|
-
import { n as init_radix_tree, t as RadixRouter } from "./radix-tree-
|
|
7
|
-
import { c as setGlobalRegistry, s as init_route_registry, t as RouteRegistry } from "./route-registry-
|
|
1
|
+
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
|
+
import { n as init_router, t as flattenNestedRoutes } from "./router-B9HUUCkR.mjs";
|
|
3
|
+
import { i as json, r as init_response } from "./response-DXg4i_yh.mjs";
|
|
4
|
+
import { n as composeMiddleware, r as init_middleware } from "./middleware-Byp3Hjae.mjs";
|
|
5
|
+
import { n as init_base_server, t as BaseServer } from "./base-server-CSkyjEaY.mjs";
|
|
6
|
+
import { n as init_radix_tree, t as RadixRouter } from "./radix-tree-D0XYaJKb.mjs";
|
|
7
|
+
import { c as setGlobalRegistry, s as init_route_registry, t as RouteRegistry } from "./route-registry-mcTG0M-t.mjs";
|
|
8
8
|
|
|
9
9
|
//#region src/server/server.ts
|
|
10
10
|
var Server;
|
|
@@ -134,4 +134,4 @@ var init_server = __esmMin((() => {
|
|
|
134
134
|
|
|
135
135
|
//#endregion
|
|
136
136
|
export { init_server as n, Server as t };
|
|
137
|
-
//# sourceMappingURL=server-
|
|
137
|
+
//# sourceMappingURL=server-BmPKs8oM.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-
|
|
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":";;;;;;;;;;;cAQgD;kBACE;gBACT;mBACE;kBACQ;sBACwB;CAa9D,SAAb,cAA4B,WAAW;EACrC,AAAQ;EACR,AAAQ;;EAER,AAAQ,aAAa;;EAErB,AAAQ,8BAA8B;EAEtC,YAAY,SAA2C,EAAE,EAAE;AACzD,UAAO;AACP,QAAK,SAAS,IAAI,aAAa;AAC/B,QAAK,SAAS,EAAE;AAGhB,QAAK,OAAO,aAAa,YAAY,YACnC,kBAAkB,YAAY,QAAQ,CACvC;AAED,OAAI,OAAO,SAAS,EAClB,MAAK,eAAe,CAAC,GAAG,OAAO,CAAC;;;;;;EAQpC,UAAgB;AACd,QAAK,OAAO,cAAc,KAAK,iBAAiB;AAChD,QAAK,aAAa;AAClB,QAAK,8BAA8B,KAAK,iBAAiB;AACzD,UAAO;;EAGT,AAAQ,eAAe,QAAuC;GAC5D,MAAM,YAAY,oBAAoB,OAAO;AAC7C,QAAK,OAAO,KAAK,GAAG,UAAU;AAE9B,QAAK,MAAM,SAAS,UAClB,MAAK,OAAO,SACV,MAAM,QACN,MAAM,UACN,MAAM,SACN,MAAM,mBAAmB,EAAE,CAC5B;AAGH,QAAK,qBAAqB,UAAU;AACpC,QAAK,mBAAmB,UAAU;AAGlC,OAAI,KAAK,iBAAiB,WAAW,KAAK,CAAC,KAAK,WAC9C,MAAK,SAAS;AAIhB,qBAAkB,IAAI,cAAc,KAAK,OAAO,CAAC;;;EAInD,AAAQ,gBAAgB,KAAqB;GAC3C,IAAI,QAAQ,IAAI,QAAQ,MAAM;AAC9B,WAAQ,UAAU,KAAK,IAAI,QAAQ;GAEnC,MAAM,YAAY,IAAI,QAAQ,KAAK,MAAM;AACzC,OAAI,cAAc,GAAI,QAAO;GAE7B,IAAI,MAAM,IAAI,QAAQ,KAAK,UAAU;AACrC,OAAI,QAAQ,GAAI,OAAM,IAAI,QAAQ,KAAK,UAAU;AACjD,OAAI,QAAQ,GAAI,OAAM,IAAI;AAE1B,UAAO,IAAI,UAAU,WAAW,IAAI,IAAI;;;EAI1C,AAAQ,oBAAoB,QAAgB,UAA4B;GACtE,MAAM,iBAAiB,KAAK,OAAO,kBAAkB,SAAS;AAC9D,OAAI,eAAe,SAAS,EAC1B,QAAO,KACL;IACE,SAAS;IACT,OAAO;IACP,SAAS,UAAU,OAAO;IAC1B;IACD,EACD,KACA,EAAE,OAAO,eAAe,KAAK,KAAK,EAAE,CACrC;AAEH,UAAO,KAAK;IAAE,SAAS;IAAO,OAAO;IAAa,EAAE,IAAI;;;EAI1D,QAAQ,OAAO,QAAoC;GACjD,MAAM,WAAW,KAAK,gBAAgB,IAAI,IAAI;GAC9C,MAAM,SAAS,IAAI;GAEnB,MAAM,QAAQ,KAAK,OAAO,MAAM,QAAQ,SAAS;AAEjD,OAAI,OAAO;AACT,IAAC,IAA2C,SAAS,MAAM;AAG3D,QACE,MAAM,YACN,KAAK,iBAAiB,WAAW,KAAK,4BAEtC,QAAO,MAAM,SAAS,IAAI;AAO5B,WAFgB,kBADM,CAAC,GAAG,KAAK,kBAAkB,GAAG,MAAM,WAAW,EACpB,MAAM,QAAQ,CAEhD,IAAI;;AAKrB,OAAI,WAAW,WAAW;IACxB,MAAM,iBAAiB,KAAK,OAAO,kBAAkB,SAAS;AAC9D,QAAI,eAAe,SAAS,GAAG;KAM7B,MAAM,kBAJW,KAAK,OAAO,MAC3B,eAAe,IACf,SACD,EACiC,cAAc,EAAE;KAClD,MAAM,gBAAgB,CAAC,GAAG,KAAK,kBAAkB,GAAG,gBAAgB;KAGpE,MAAM,uBACJ,IAAI,SAAS,MAAM;MACjB,QAAQ;MACR,SAAS,EAAE,OAAO,eAAe,KAAK,KAAK,EAAE;MAC9C,CAAC;AAGJ,YADgB,kBAAkB,eAAe,eAAe,CACjD,IAAI;;;AAKvB,OAAI,KAAK,iBAAiB,SAAS,EAIjC,QAHgB,kBAAkB,KAAK,wBACrC,KAAK,oBAAoB,QAAQ,SAAS,CAC3C,CACc,IAAI;AAGrB,UAAO,KAAK,oBAAoB,QAAQ,SAAS;;EAGnD,SAAS,OAAoB;GAC3B,MAAM,iBAAiC;IACrC,GAAG;IACH,UAAU,MAAM;IAChB,iBAAiB,MAAM,cAAc,EAAE;IACxC;AAED,QAAK,OAAO,KAAK,eAAe;AAChC,QAAK,OAAO,SACV,MAAM,QACN,MAAM,MACN,MAAM,SACN,MAAM,cAAc,EAAE,CACvB;;EAGH,UAAU,QAAgD;AACxD,QAAK,eAAe,CAAC,GAAG,OAAO,CAAC;;EAGlC,YAAqD;AACnD,UAAO,KAAK,OAAO,WAAW;;;;;;;;;;;;;;;EAgBhC,oBAAsC;AACpC,UAAO,KAAK"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { n as __exportAll, t as __esmMin } from "./chunk-
|
|
2
|
-
import { n as init_base_server, t as BaseServer } from "./base-server-
|
|
3
|
-
import { n as init_server$1, t as Server } from "./server-
|
|
4
|
-
import { n as init_component_server, t as ComponentServer } from "./component-server-
|
|
1
|
+
import { n as __exportAll, t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
|
+
import { n as init_base_server, t as BaseServer } from "./base-server-CSkyjEaY.mjs";
|
|
3
|
+
import { n as init_server$1, t as Server } from "./server-BmPKs8oM.mjs";
|
|
4
|
+
import { n as init_component_server, t as ComponentServer } from "./component-server-DAbIyIPI.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/server/server-factory.ts
|
|
7
7
|
var ServerFactory;
|
|
@@ -85,4 +85,4 @@ var init_server = __esmMin((() => {
|
|
|
85
85
|
|
|
86
86
|
//#endregion
|
|
87
87
|
export { init_server_factory as i, server_exports as n, ServerFactory as r, init_server as t };
|
|
88
|
-
//# sourceMappingURL=server-
|
|
88
|
+
//# sourceMappingURL=server-Cbd3Ia51.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-
|
|
1
|
+
{"version":3,"file":"server-Cbd3Ia51.mjs","names":[],"sources":["../src/server/server-factory.ts","../src/server/index.ts"],"sourcesContent":["import type { Route, NestedRoute } from \"../types\";\nimport type {\n ComponentRoute,\n NestedComponentRoute,\n} from \"../types/component-route\";\nimport { Server } from \"../server\";\nimport { ComponentServer } from \"./component-server\";\n\n/**\n * 服务器工厂类\n * 用于创建和管理不同类型的服务器\n */\nexport class ServerFactory {\n private servers: Map<string, Server | ComponentServer> = new Map();\n\n /**\n * 创建标准REST API服务器\n */\n createRestServer(routes: (Route | NestedRoute)[]): Server {\n const server = new Server(routes);\n this.servers.set(\"rest\", server);\n return server;\n }\n\n /**\n * 创建组件服务器\n */\n createComponentServer(\n routes: (ComponentRoute | NestedComponentRoute)[],\n ): ComponentServer {\n const server = new ComponentServer(routes);\n this.servers.set(\"component\", server);\n return server;\n }\n\n /**\n * 获取指定类型的服务器\n */\n getServer(type: \"rest\" | \"component\"): Server | ComponentServer | undefined {\n return this.servers.get(type);\n }\n\n /**\n * 获取所有服务器\n */\n getAllServers(): Map<string, Server | ComponentServer> {\n return this.servers;\n }\n\n /**\n * 移除指定类型的服务器\n */\n removeServer(type: string): boolean {\n return this.servers.delete(type);\n }\n\n /**\n * 清除所有服务器\n */\n clearServers(): void {\n this.servers.clear();\n }\n\n /**\n * 获取服务器状态信息\n */\n getServerStatus(): Record<string, { type: string; routes: number }> {\n const status: Record<string, { type: string; routes: number }> = {};\n\n for (const [name, server] of this.servers) {\n if (server instanceof Server) {\n status[name] = {\n type: \"REST API\",\n routes: (server as any).routes?.length || 0,\n };\n } else if (server instanceof ComponentServer) {\n status[name] = {\n type: \"Component\",\n routes: (server as any).routes?.length || 0,\n };\n }\n }\n\n return status;\n }\n}\n","/**\n * 服务器模块导出\n */\n\n// 主服务器类\nexport { Server } from \"./server\";\n\n// 组件服务器 (SSR)\nexport { ComponentServer } from \"./component-server\";\n\n// 服务器工厂\nexport { ServerFactory } from \"./server-factory\";\n\n// 基类 (仅用于扩展)\nexport { BaseServer } from \"./base-server\";\n"],"mappings":";;;;;;;;cAKmC;wBACkB;CAMxC,gBAAb,MAA2B;EACzB,AAAQ,0BAAiD,IAAI,KAAK;;;;EAKlE,iBAAiB,QAAyC;GACxD,MAAM,SAAS,IAAI,OAAO,OAAO;AACjC,QAAK,QAAQ,IAAI,QAAQ,OAAO;AAChC,UAAO;;;;;EAMT,sBACE,QACiB;GACjB,MAAM,SAAS,IAAI,gBAAgB,OAAO;AAC1C,QAAK,QAAQ,IAAI,aAAa,OAAO;AACrC,UAAO;;;;;EAMT,UAAU,MAAkE;AAC1E,UAAO,KAAK,QAAQ,IAAI,KAAK;;;;;EAM/B,gBAAuD;AACrD,UAAO,KAAK;;;;;EAMd,aAAa,MAAuB;AAClC,UAAO,KAAK,QAAQ,OAAO,KAAK;;;;;EAMlC,eAAqB;AACnB,QAAK,QAAQ,OAAO;;;;;EAMtB,kBAAoE;GAClE,MAAM,SAA2D,EAAE;AAEnE,QAAK,MAAM,CAAC,MAAM,WAAW,KAAK,QAChC,KAAI,kBAAkB,OACpB,QAAO,QAAQ;IACb,MAAM;IACN,QAAS,OAAe,QAAQ,UAAU;IAC3C;YACQ,kBAAkB,gBAC3B,QAAO,QAAQ;IACb,MAAM;IACN,QAAS,OAAe,QAAQ,UAAU;IAC3C;AAIL,UAAO;;;;;;;;;;;;;;gBC9EuB;wBAGmB;sBAGJ;mBAGN"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as Method, l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-
|
|
2
|
-
import { t as BaseServer } from "./base-server-
|
|
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";
|
|
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-
|
|
60
|
+
//# sourceMappingURL=server-D9gjszHe.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as RouteSchema, t as HandlerContext } from "./schema-
|
|
1
|
+
import { i as RouteSchema, t as HandlerContext } from "./schema-CPQudJpE.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-
|
|
65
|
+
//# sourceMappingURL=sse-BMM6KTfy.d.mts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as parseCookies, l as parseHeaders, u as parseQuery } from "./parsers-
|
|
2
|
-
import { a as validateAllSchemas, i as precompileSchemas } from "./validators-
|
|
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";
|
|
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-
|
|
87
|
+
//# sourceMappingURL=sse-BT5yyLgX.mjs.map
|