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
package/README.md CHANGED
@@ -115,7 +115,7 @@ export default app;
115
115
 
116
116
  **Vafast 完整示例:**
117
117
  ```typescript
118
- import { Server, VafastError, createHandler } from 'vafast';
118
+ import { Server, createHandler, err } from 'vafast';
119
119
  import type { Route } from 'vafast';
120
120
 
121
121
  const routes: Route[] = [
@@ -125,11 +125,7 @@ const routes: Route[] = [
125
125
  handler: createHandler((ctx) => {
126
126
  const name = ctx.query.name;
127
127
  if (!name) {
128
- throw new VafastError('Missing name', {
129
- status: 400,
130
- type: 'bad_request',
131
- expose: true, // 控制是否暴露给客户端
132
- });
128
+ throw err.badRequest('Missing name'); // ✨ 简洁!
133
129
  }
134
130
  return `Hello, ${name}`;
135
131
  }),
@@ -138,10 +134,10 @@ const routes: Route[] = [
138
134
 
139
135
  const server = new Server(routes);
140
136
  export default { fetch: server.fetch };
141
- // 错误响应: { type: 'bad_request', message: 'Missing name' }
137
+ // 错误响应: { error: 'BAD_REQUEST', message: 'Missing name' }
142
138
  ```
143
139
 
144
- **对比:VafastError 有统一的 `type` + `status` + `expose` 契约。**
140
+ **对比:Vafast `err()` 函数提供语义化的错误 API,统一的响应格式。**
145
141
 
146
142
  ### 组合优于约定 — 显式优于隐式
147
143
 
@@ -339,6 +335,45 @@ export default { fetch: server.fetch };" > index.ts && bun index.ts
339
335
  - 🧩 **灵活中间件系统** - 可组合的中间件架构
340
336
  - 📦 **零配置** - 开箱即用,无需复杂配置
341
337
 
338
+ ### 返回值与错误处理
339
+
340
+ Vafast 提供简洁、对称的响应 API:
341
+
342
+ ```typescript
343
+ import { createHandler, json, err } from 'vafast';
344
+
345
+ // ==================== 成功响应 ====================
346
+ return user // 200 + JSON(自动转换)
347
+ return json(user, 201) // 201 Created
348
+ return json(user, 200, { // 自定义头部
349
+ 'X-Request-Id': 'abc123'
350
+ })
351
+ return 'Hello' // 200 + text/plain
352
+ return new Response(...) // 完全控制
353
+
354
+ // ==================== 错误响应 ====================
355
+ throw err.badRequest('参数错误') // 400
356
+ throw err.unauthorized('请先登录') // 401
357
+ throw err.forbidden('无权限') // 403
358
+ throw err.notFound('用户不存在') // 404
359
+ throw err.conflict('用户名已存在') // 409
360
+ throw err.internal('服务器错误') // 500
361
+ throw err('自定义错误', 422, 'CUSTOM_TYPE') // 自定义
362
+ ```
363
+
364
+ **API 速查表:**
365
+
366
+ | 场景 | 写法 | 结果 |
367
+ |------|------|------|
368
+ | 查询成功 | `return data` | 200 + JSON |
369
+ | 创建成功 | `return json(data, 201)` | 201 + JSON |
370
+ | 参数错误 | `throw err.badRequest()` | 400 |
371
+ | 未授权 | `throw err.unauthorized()` | 401 |
372
+ | 禁止访问 | `throw err.forbidden()` | 403 |
373
+ | 未找到 | `throw err.notFound()` | 404 |
374
+ | 资源冲突 | `throw err.conflict()` | 409 |
375
+ | 服务器错误 | `throw err.internal()` | 500 |
376
+
342
377
  ### 类型安全的路由
343
378
 
344
379
  ```typescript
@@ -567,6 +602,33 @@ const categories = registry.getCategories(); // ['auth', 'users']
567
602
  | `map(callback)` | 映射所有路由 |
568
603
  | `size` | 路由数量 |
569
604
 
605
+ ## 📊 内置监控
606
+
607
+ 零依赖的性能监控,一行代码启用:
608
+
609
+ ```typescript
610
+ import { Server } from 'vafast';
611
+ import { withMonitoring } from 'vafast/monitoring';
612
+
613
+ const server = new Server(routes);
614
+ const monitored = withMonitoring(server, {
615
+ slowThreshold: 500,
616
+ excludePaths: ['/health']
617
+ });
618
+
619
+ // 获取监控状态
620
+ const status = monitored.getMonitoringStatus();
621
+ console.log(`P99: ${status.p99}ms, RPS: ${status.rps}`);
622
+ ```
623
+
624
+ **特性:**
625
+ - P50/P95/P99 百分位数
626
+ - 时间窗口统计(1分钟/5分钟/1小时)
627
+ - RPS 计算、状态码分布
628
+ - 按路径统计、内存监控
629
+ - 采样率控制、路径排除
630
+ - 自定义回调(onRequest/onSlowRequest)
631
+
570
632
  ## 🔧 运行时支持
571
633
 
572
634
  ```typescript
@@ -0,0 +1,112 @@
1
+ //#region src/server/base-server.ts
2
+ /**
3
+ * 服务器基类
4
+ * 包含所有服务器类型的公共逻辑
5
+ */
6
+ var BaseServer = class {
7
+ globalMiddleware = [];
8
+ use(mw) {
9
+ this.globalMiddleware.push(mw);
10
+ }
11
+ /**
12
+ * 打印扁平化后的路由信息,用于调试
13
+ */
14
+ logFlattenedRoutes(routes, type = "路由") {
15
+ console.log(`🚀 扁平化后的${type}:`);
16
+ for (const route of routes) {
17
+ const method = route.method || "GET";
18
+ const path = route.fullPath || route.path;
19
+ console.log(` ${method} ${path}`);
20
+ if (route.middlewareChain && route.middlewareChain.length > 0) console.log(` 中间件链: ${route.middlewareChain.length} 个`);
21
+ }
22
+ console.log("");
23
+ }
24
+ /**
25
+ * 检测路由冲突
26
+ * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突
27
+ */
28
+ detectRouteConflicts(routes) {
29
+ const pathGroups = /* @__PURE__ */ new Map();
30
+ for (const route of routes) {
31
+ const path = route.fullPath || route.path;
32
+ const method = route.method || "GET";
33
+ if (!pathGroups.has(path)) pathGroups.set(path, []);
34
+ pathGroups.get(path).push({
35
+ ...route,
36
+ method
37
+ });
38
+ }
39
+ for (const [path, routeList] of pathGroups) if (routeList.length > 1) {
40
+ const methods = routeList.map((r) => r.method);
41
+ const uniqueMethods = [...new Set(methods)];
42
+ if (uniqueMethods.length === 1) {
43
+ console.warn(`⚠️ 路由冲突: ${uniqueMethods[0]} ${path} 定义了 ${routeList.length} 次`);
44
+ routeList.forEach((route, index) => {
45
+ console.warn(` ${index + 1}. ${route.method} ${path}`);
46
+ });
47
+ } else console.log(`ℹ️ 路径 ${path} 支持方法: ${uniqueMethods.join(", ")}`);
48
+ }
49
+ this.detectDynamicRouteConflicts(routes);
50
+ }
51
+ /**
52
+ * 检测动态路由的潜在冲突
53
+ */
54
+ detectDynamicRouteConflicts(routes) {
55
+ const dynamicRoutes = routes.filter((r) => {
56
+ const path = r.fullPath || r.path;
57
+ return path.includes(":") || path.includes("*");
58
+ });
59
+ for (let i = 0; i < dynamicRoutes.length; i++) for (let j = i + 1; j < dynamicRoutes.length; j++) {
60
+ const route1 = dynamicRoutes[i];
61
+ const route2 = dynamicRoutes[j];
62
+ const method1 = route1.method || "GET";
63
+ if (method1 === (route2.method || "GET")) {
64
+ const path1 = route1.fullPath || route1.path;
65
+ const path2 = route2.fullPath || route2.path;
66
+ if (this.pathsMayConflict(path1, path2)) console.warn(`⚠️ 潜在路由冲突: ${method1} ${path1} 可能与 ${path2} 冲突`);
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * 判断两个路径是否可能冲突
72
+ */
73
+ pathsMayConflict(path1, path2) {
74
+ const parts1 = path1.split("/").filter(Boolean);
75
+ const parts2 = path2.split("/").filter(Boolean);
76
+ if (parts1.length !== parts2.length) return false;
77
+ for (let i = 0; i < parts1.length; i++) {
78
+ const p1 = parts1[i];
79
+ const p2 = parts2[i];
80
+ if (!p1.startsWith(":") && !p1.startsWith("*") && !p2.startsWith(":") && !p2.startsWith("*") && p1 !== p2) return false;
81
+ if (p1 === "*" && p2.startsWith(":") || p2 === "*" && p1.startsWith(":")) return true;
82
+ }
83
+ return false;
84
+ }
85
+ /**
86
+ * 路径匹配
87
+ */
88
+ matchPath(pattern, path) {
89
+ const patternParts = pattern.split("/").filter(Boolean);
90
+ const pathParts = path.split("/").filter(Boolean);
91
+ if (patternParts.length !== pathParts.length) return false;
92
+ for (let i = 0; i < patternParts.length; i++) if (patternParts[i] !== pathParts[i] && !patternParts[i].startsWith(":")) return false;
93
+ return true;
94
+ }
95
+ /**
96
+ * 提取路径参数
97
+ */
98
+ extractParams(pattern, path) {
99
+ const params = {};
100
+ const patternParts = pattern.split("/").filter(Boolean);
101
+ const pathParts = path.split("/").filter(Boolean);
102
+ for (let i = 0; i < patternParts.length; i++) if (patternParts[i].startsWith(":")) {
103
+ const paramName = patternParts[i].slice(1);
104
+ params[paramName] = pathParts[i];
105
+ }
106
+ return params;
107
+ }
108
+ };
109
+
110
+ //#endregion
111
+ export { BaseServer as t };
112
+ //# sourceMappingURL=base-server-B7MYJNsl.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-server-DMhpmq5v.mjs","names":[],"sources":["../src/server/base-server.ts"],"sourcesContent":["import type { Middleware } from \"../types\";\n\n/**\n * 服务器基类\n * 包含所有服务器类型的公共逻辑\n */\nexport abstract class BaseServer {\n protected globalMiddleware: Middleware[] = [];\n\n use(mw: Middleware) {\n this.globalMiddleware.push(mw);\n }\n\n /**\n * 打印扁平化后的路由信息,用于调试\n */\n protected logFlattenedRoutes(routes: any[], type: string = \"路由\"): void {\n console.log(`🚀 扁平化后的${type}:`);\n for (const route of routes) {\n const method = route.method || \"GET\";\n const path = route.fullPath || route.path;\n console.log(` ${method} ${path}`);\n if (route.middlewareChain && route.middlewareChain.length > 0) {\n console.log(` 中间件链: ${route.middlewareChain.length} 个`);\n }\n }\n console.log(\"\");\n }\n\n /**\n * 检测路由冲突\n * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突\n */\n protected detectRouteConflicts(routes: any[]): void {\n const pathGroups = new Map<string, any[]>();\n\n // 按路径分组\n for (const route of routes) {\n const path = route.fullPath || route.path;\n const method = route.method || \"GET\";\n if (!pathGroups.has(path)) {\n pathGroups.set(path, []);\n }\n pathGroups.get(path)!.push({ ...route, method });\n }\n\n // 检查冲突\n for (const [path, routeList] of pathGroups) {\n if (routeList.length > 1) {\n const methods = routeList.map((r) => r.method);\n const uniqueMethods = [...new Set(methods)];\n\n if (uniqueMethods.length === 1) {\n // 相同路径、相同方法 - 这是冲突!\n console.warn(\n `⚠️ 路由冲突: ${uniqueMethods[0]} ${path} 定义了 ${routeList.length} 次`,\n );\n routeList.forEach((route, index) => {\n console.warn(` ${index + 1}. ${route.method} ${path}`);\n });\n } else {\n // 相同路径、不同方法 - 这是正常的\n console.log(`ℹ️ 路径 ${path} 支持方法: ${uniqueMethods.join(\", \")}`);\n }\n }\n }\n\n // 检查潜在的路径冲突(动态路由可能冲突)\n this.detectDynamicRouteConflicts(routes);\n }\n\n /**\n * 检测动态路由的潜在冲突\n */\n private detectDynamicRouteConflicts(routes: any[]): void {\n const dynamicRoutes = routes.filter((r) => {\n const path = r.fullPath || r.path;\n return path.includes(\":\") || path.includes(\"*\");\n });\n\n for (let i = 0; i < dynamicRoutes.length; i++) {\n for (let j = i + 1; j < dynamicRoutes.length; j++) {\n const route1 = dynamicRoutes[i];\n const route2 = dynamicRoutes[j];\n const method1 = route1.method || \"GET\";\n const method2 = route2.method || \"GET\";\n\n if (method1 === method2) {\n const path1 = route1.fullPath || route1.path;\n const path2 = route2.fullPath || route2.path;\n // 检查路径是否可能冲突\n if (this.pathsMayConflict(path1, path2)) {\n console.warn(\n `⚠️ 潜在路由冲突: ${method1} ${path1} 可能与 ${path2} 冲突`,\n );\n }\n }\n }\n }\n }\n\n /**\n * 判断两个路径是否可能冲突\n */\n private pathsMayConflict(path1: string, path2: string): boolean {\n const parts1 = path1.split(\"/\").filter(Boolean);\n const parts2 = path2.split(\"/\").filter(Boolean);\n\n if (parts1.length !== parts2.length) return false;\n\n for (let i = 0; i < parts1.length; i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // 如果两个部分都是静态的且不同,则不会冲突\n if (\n !p1.startsWith(\":\") &&\n !p1.startsWith(\"*\") &&\n !p2.startsWith(\":\") &&\n !p2.startsWith(\"*\") &&\n p1 !== p2\n ) {\n return false;\n }\n\n // 如果一个是通配符,另一个是动态参数,可能冲突\n if (\n (p1 === \"*\" && p2.startsWith(\":\")) ||\n (p2 === \"*\" && p1.startsWith(\":\"))\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * 路径匹配\n */\n protected matchPath(pattern: string, path: string): boolean {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return false;\n }\n\n for (let i = 0; i < patternParts.length; i++) {\n if (\n patternParts[i] !== pathParts[i] &&\n !patternParts[i].startsWith(\":\")\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 提取路径参数\n */\n protected extractParams(\n pattern: string,\n path: string,\n ): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(\":\")) {\n const paramName = patternParts[i].slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base-server-B7MYJNsl.mjs","names":[],"sources":["../src/server/base-server.ts"],"sourcesContent":["import type { Middleware } from \"../types\";\n\n/**\n * 服务器基类\n * 包含所有服务器类型的公共逻辑\n */\nexport abstract class BaseServer {\n protected globalMiddleware: Middleware[] = [];\n\n use(mw: Middleware) {\n this.globalMiddleware.push(mw);\n }\n\n /**\n * 打印扁平化后的路由信息,用于调试\n */\n protected logFlattenedRoutes(routes: any[], type: string = \"路由\"): void {\n console.log(`🚀 扁平化后的${type}:`);\n for (const route of routes) {\n const method = route.method || \"GET\";\n const path = route.fullPath || route.path;\n console.log(` ${method} ${path}`);\n if (route.middlewareChain && route.middlewareChain.length > 0) {\n console.log(` 中间件链: ${route.middlewareChain.length} 个`);\n }\n }\n console.log(\"\");\n }\n\n /**\n * 检测路由冲突\n * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突\n */\n protected detectRouteConflicts(routes: any[]): void {\n const pathGroups = new Map<string, any[]>();\n\n // 按路径分组\n for (const route of routes) {\n const path = route.fullPath || route.path;\n const method = route.method || \"GET\";\n if (!pathGroups.has(path)) {\n pathGroups.set(path, []);\n }\n pathGroups.get(path)!.push({ ...route, method });\n }\n\n // 检查冲突\n for (const [path, routeList] of pathGroups) {\n if (routeList.length > 1) {\n const methods = routeList.map((r) => r.method);\n const uniqueMethods = [...new Set(methods)];\n\n if (uniqueMethods.length === 1) {\n // 相同路径、相同方法 - 这是冲突!\n console.warn(\n `⚠️ 路由冲突: ${uniqueMethods[0]} ${path} 定义了 ${routeList.length} 次`,\n );\n routeList.forEach((route, index) => {\n console.warn(` ${index + 1}. ${route.method} ${path}`);\n });\n } else {\n // 相同路径、不同方法 - 这是正常的\n console.log(`ℹ️ 路径 ${path} 支持方法: ${uniqueMethods.join(\", \")}`);\n }\n }\n }\n\n // 检查潜在的路径冲突(动态路由可能冲突)\n this.detectDynamicRouteConflicts(routes);\n }\n\n /**\n * 检测动态路由的潜在冲突\n */\n private detectDynamicRouteConflicts(routes: any[]): void {\n const dynamicRoutes = routes.filter((r) => {\n const path = r.fullPath || r.path;\n return path.includes(\":\") || path.includes(\"*\");\n });\n\n for (let i = 0; i < dynamicRoutes.length; i++) {\n for (let j = i + 1; j < dynamicRoutes.length; j++) {\n const route1 = dynamicRoutes[i];\n const route2 = dynamicRoutes[j];\n const method1 = route1.method || \"GET\";\n const method2 = route2.method || \"GET\";\n\n if (method1 === method2) {\n const path1 = route1.fullPath || route1.path;\n const path2 = route2.fullPath || route2.path;\n // 检查路径是否可能冲突\n if (this.pathsMayConflict(path1, path2)) {\n console.warn(\n `⚠️ 潜在路由冲突: ${method1} ${path1} 可能与 ${path2} 冲突`,\n );\n }\n }\n }\n }\n }\n\n /**\n * 判断两个路径是否可能冲突\n */\n private pathsMayConflict(path1: string, path2: string): boolean {\n const parts1 = path1.split(\"/\").filter(Boolean);\n const parts2 = path2.split(\"/\").filter(Boolean);\n\n if (parts1.length !== parts2.length) return false;\n\n for (let i = 0; i < parts1.length; i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // 如果两个部分都是静态的且不同,则不会冲突\n if (\n !p1.startsWith(\":\") &&\n !p1.startsWith(\"*\") &&\n !p2.startsWith(\":\") &&\n !p2.startsWith(\"*\") &&\n p1 !== p2\n ) {\n return false;\n }\n\n // 如果一个是通配符,另一个是动态参数,可能冲突\n if (\n (p1 === \"*\" && p2.startsWith(\":\")) ||\n (p2 === \"*\" && p1.startsWith(\":\"))\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * 路径匹配\n */\n protected matchPath(pattern: string, path: string): boolean {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return false;\n }\n\n for (let i = 0; i < patternParts.length; i++) {\n if (\n patternParts[i] !== pathParts[i] &&\n !patternParts[i].startsWith(\":\")\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 提取路径参数\n */\n protected extractParams(\n pattern: string,\n path: string,\n ): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(\":\")) {\n const paramName = patternParts[i].slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { o as Middleware } from "./types-mpeSaHdI.mjs";
1
+ import { o as Middleware } from "./types-D1PUFkda.mjs";
2
2
 
3
3
  //#region src/server/base-server.d.ts
4
4
 
@@ -37,4 +37,4 @@ declare abstract class BaseServer {
37
37
  }
38
38
  //#endregion
39
39
  export { BaseServer as t };
40
- //# sourceMappingURL=base-server-CtA1bZSg.d.mts.map
40
+ //# sourceMappingURL=base-server-DLxtulAO.d.mts.map
@@ -10,4 +10,4 @@ function base64urlDecode(str) {
10
10
 
11
11
  //#endregion
12
12
  export { base64urlEncode as n, base64urlDecode as t };
13
- //# sourceMappingURL=base64url-DUtluDF0.mjs.map
13
+ //# sourceMappingURL=base64url-C2zopQdH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"base64url-DUtluDF0.mjs","names":[],"sources":["../src/utils/base64url.ts"],"sourcesContent":["export function base64urlEncode(str: string): string {\n return btoa(str)\n .replace(/=/g, \"\") // ✅ 删除填充\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\");\n}\n\nexport function base64urlDecode(str: string): string {\n const pad = str.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (str.length % 4));\n const base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\") + pad;\n return atob(base64);\n}\n"],"mappings":";AAAA,SAAgB,gBAAgB,KAAqB;AACnD,QAAO,KAAK,IAAI,CACb,QAAQ,MAAM,GAAG,CACjB,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,IAAI;;AAGxB,SAAgB,gBAAgB,KAAqB;CACnD,MAAM,MAAM,IAAI,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,IAAK,IAAI,SAAS,EAAG;CACxE,MAAM,SAAS,IAAI,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,GAAG;AAC3D,QAAO,KAAK,OAAO"}
1
+ {"version":3,"file":"base64url-C2zopQdH.mjs","names":[],"sources":["../src/utils/base64url.ts"],"sourcesContent":["export function base64urlEncode(str: string): string {\n return btoa(str)\n .replace(/=/g, \"\") // ✅ 删除填充\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\");\n}\n\nexport function base64urlDecode(str: string): string {\n const pad = str.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (str.length % 4));\n const base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\") + pad;\n return atob(base64);\n}\n"],"mappings":";AAAA,SAAgB,gBAAgB,KAAqB;AACnD,QAAO,KAAK,IAAI,CACb,QAAQ,MAAM,GAAG,CACjB,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,IAAI;;AAGxB,SAAgB,gBAAgB,KAAqB;CACnD,MAAM,MAAM,IAAI,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,IAAK,IAAI,SAAS,EAAG;CACxE,MAAM,SAAS,IAAI,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,GAAG;AAC3D,QAAO,KAAK,OAAO"}
@@ -3,4 +3,4 @@ declare function base64urlEncode(str: string): string;
3
3
  declare function base64urlDecode(str: string): string;
4
4
  //#endregion
5
5
  export { base64urlEncode as n, base64urlDecode as t };
6
- //# sourceMappingURL=base64url-0N9uQPjZ.d.mts.map
6
+ //# sourceMappingURL=base64url-Dwi2Afhc.d.mts.map
@@ -1,4 +1,4 @@
1
- import { a as Middleware } from "./route-CUbNpSwz.mjs";
1
+ import { a as Middleware } from "./route-6A7umH7b.mjs";
2
2
 
3
3
  //#region src/types/component-route.d.ts
4
4
 
@@ -28,4 +28,4 @@ interface FlattenedComponentRoute extends ComponentRoute {
28
28
  }
29
29
  //#endregion
30
30
  export { FlattenedComponentRoute as n, NestedComponentRoute as r, ComponentRoute as t };
31
- //# sourceMappingURL=component-route-DF5feXJI.d.mts.map
31
+ //# sourceMappingURL=component-route-nrrO0iSI.d.mts.map
@@ -1,5 +1,3 @@
1
- import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
2
-
3
1
  //#region src/middleware/component-router.ts
4
2
  /**
5
3
  * 扁平化嵌套组件路由
@@ -19,15 +17,16 @@ function flattenComponentRoutes(routes) {
19
17
  for (const route of routes) processRoute(route);
20
18
  return flattened;
21
19
  }
22
- var componentRouter;
23
- var init_component_router = __esmMin((() => {
24
- componentRouter = () => {
25
- return async (req, next) => {
26
- return next();
27
- };
20
+ /**
21
+ * 组件路由处理器中间件
22
+ * 自动检测组件类型并应用相应的渲染器
23
+ */
24
+ const componentRouter = () => {
25
+ return async (req, next) => {
26
+ return next();
28
27
  };
29
- }));
28
+ };
30
29
 
31
30
  //#endregion
32
- export { flattenComponentRoutes as n, init_component_router as r, componentRouter as t };
33
- //# sourceMappingURL=component-router-uSylkByf.mjs.map
31
+ export { flattenComponentRoutes as n, componentRouter as t };
32
+ //# sourceMappingURL=component-router-RwPL20vN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-router-uSylkByf.mjs","names":[],"sources":["../src/middleware/component-router.ts"],"sourcesContent":["import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { vueRenderer, reactRenderer } from \"./component-renderer\";\n\n/**\n * 扁平化嵌套组件路由\n */\nexport function flattenComponentRoutes(\n routes: (ComponentRoute | NestedComponentRoute)[],\n): FlattenedComponentRoute[] {\n const flattened: FlattenedComponentRoute[] = [];\n\n function processRoute(\n route: ComponentRoute | NestedComponentRoute,\n parentPath: string = \"\",\n parentMiddleware: any[] = [],\n ) {\n const currentPath = parentPath + route.path;\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n\n if (\"component\" in route) {\n // 这是一个组件路由\n flattened.push({\n ...route,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n });\n } else if (\"children\" in route && route.children) {\n // 这是一个嵌套路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 组件路由处理器中间件\n * 自动检测组件类型并应用相应的渲染器\n */\nexport const componentRouter = () => {\n return async (req: Request, next: () => Promise<Response>) => {\n // 这里可以添加组件路由的自动处理逻辑\n // 比如自动检测组件类型,应用相应的渲染器\n return next();\n };\n};\n"],"mappings":";;;;;;AAUA,SAAgB,uBACd,QAC2B;CAC3B,MAAM,YAAuC,EAAE;CAE/C,SAAS,aACP,OACA,aAAqB,IACrB,mBAA0B,EAAE,EAC5B;EACA,MAAM,cAAc,aAAa,MAAM;EACvC,MAAM,oBAAoB,CACxB,GAAG,kBACH,GAAI,MAAM,cAAc,EAAE,CAC3B;AAED,MAAI,eAAe,MAEjB,WAAU,KAAK;GACb,GAAG;GACH,UAAU;GACV,iBAAiB;GAClB,CAAC;WACO,cAAc,SAAS,MAAM,SAEtC,MAAK,MAAM,SAAS,MAAM,SACxB,cAAa,OAAO,aAAa,kBAAkB;;AAKzD,MAAK,MAAM,SAAS,OAClB,cAAa,MAAM;AAGrB,QAAO;;;;CAOI,wBAAwB;AACnC,SAAO,OAAO,KAAc,SAAkC;AAG5D,UAAO,MAAM"}
1
+ {"version":3,"file":"component-router-RwPL20vN.mjs","names":[],"sources":["../src/middleware/component-router.ts"],"sourcesContent":["import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { vueRenderer, reactRenderer } from \"./component-renderer\";\n\n/**\n * 扁平化嵌套组件路由\n */\nexport function flattenComponentRoutes(\n routes: (ComponentRoute | NestedComponentRoute)[],\n): FlattenedComponentRoute[] {\n const flattened: FlattenedComponentRoute[] = [];\n\n function processRoute(\n route: ComponentRoute | NestedComponentRoute,\n parentPath: string = \"\",\n parentMiddleware: any[] = [],\n ) {\n const currentPath = parentPath + route.path;\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n\n if (\"component\" in route) {\n // 这是一个组件路由\n flattened.push({\n ...route,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n });\n } else if (\"children\" in route && route.children) {\n // 这是一个嵌套路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 组件路由处理器中间件\n * 自动检测组件类型并应用相应的渲染器\n */\nexport const componentRouter = () => {\n return async (req: Request, next: () => Promise<Response>) => {\n // 这里可以添加组件路由的自动处理逻辑\n // 比如自动检测组件类型,应用相应的渲染器\n return next();\n };\n};\n"],"mappings":";;;;AAUA,SAAgB,uBACd,QAC2B;CAC3B,MAAM,YAAuC,EAAE;CAE/C,SAAS,aACP,OACA,aAAqB,IACrB,mBAA0B,EAAE,EAC5B;EACA,MAAM,cAAc,aAAa,MAAM;EACvC,MAAM,oBAAoB,CACxB,GAAG,kBACH,GAAI,MAAM,cAAc,EAAE,CAC3B;AAED,MAAI,eAAe,MAEjB,WAAU,KAAK;GACb,GAAG;GACH,UAAU;GACV,iBAAiB;GAClB,CAAC;WACO,cAAc,SAAS,MAAM,SAEtC,MAAK,MAAM,SAAS,MAAM,SACxB,cAAa,OAAO,aAAa,kBAAkB;;AAKzD,MAAK,MAAM,SAAS,OAClB,cAAa,MAAM;AAGrB,QAAO;;;;;;AAOT,MAAa,wBAAwB;AACnC,QAAO,OAAO,KAAc,SAAkC;AAG5D,SAAO,MAAM"}
@@ -0,0 +1,119 @@
1
+ import { t as BaseServer } from "./base-server-B7MYJNsl.mjs";
2
+ import { n as flattenComponentRoutes } from "./component-router-RwPL20vN.mjs";
3
+ import { t as PathMatcher } from "./path-matcher-CGczAIl_.mjs";
4
+ import { t as HtmlRenderer } from "./html-renderer-DTtJ_Yic.mjs";
5
+ import { t as DependencyManager } from "./dependency-manager-DCmh7xFc.mjs";
6
+
7
+ //#region src/server/component-server.ts
8
+ /**
9
+ * 组件路由服务器
10
+ * 专门处理声明式组件路由
11
+ */
12
+ var ComponentServer = class extends BaseServer {
13
+ routes;
14
+ dependencyManager;
15
+ constructor(routes) {
16
+ super();
17
+ this.routes = flattenComponentRoutes(routes);
18
+ this.dependencyManager = new DependencyManager();
19
+ this.detectRouteConflicts(this.routes);
20
+ this.logFlattenedRoutes(this.routes, "组件路由");
21
+ console.log("🚀 依赖按需加载,服务器启动完成");
22
+ }
23
+ /**
24
+ * 处理请求
25
+ */
26
+ async fetch(req) {
27
+ const url = new URL(req.url);
28
+ const pathname = url.pathname;
29
+ if (req.method !== "GET") return new Response("Method Not Allowed", { status: 405 });
30
+ let matchedRoute = null;
31
+ for (const route of this.routes) if (PathMatcher.matchPath(route.fullPath, pathname)) {
32
+ matchedRoute = route;
33
+ break;
34
+ }
35
+ if (!matchedRoute) return new Response("Not Found", { status: 404 });
36
+ try {
37
+ const context = {
38
+ req,
39
+ params: PathMatcher.extractParams(matchedRoute.fullPath, pathname),
40
+ query: Object.fromEntries(url.searchParams),
41
+ pathname
42
+ };
43
+ return await this.executeMiddlewareChain(matchedRoute.middlewareChain, context, matchedRoute.component);
44
+ } catch (error) {
45
+ console.error("组件渲染失败:", error);
46
+ return new Response("Internal Server Error", { status: 500 });
47
+ }
48
+ }
49
+ /**
50
+ * 执行中间件链
51
+ */
52
+ async executeMiddlewareChain(middlewareChain, context, componentImport) {
53
+ const renderComponent = async () => {
54
+ const componentModule = await componentImport();
55
+ const component = componentModule.default || componentModule;
56
+ const componentType = this.dependencyManager.detectComponentType(component);
57
+ const deps = await this.dependencyManager.getFrameworkDeps(componentType);
58
+ if (componentType === "vue") return await this.renderVueComponent(component, context, deps);
59
+ else if (componentType === "react") return await this.renderReactComponent(component, context, deps);
60
+ else throw new Error(`不支持的组件类型: ${componentType}`);
61
+ };
62
+ let index = 0;
63
+ const next = async () => {
64
+ if (index >= middlewareChain.length) return await renderComponent();
65
+ const middleware = middlewareChain[index++];
66
+ return await middleware(context.req, next);
67
+ };
68
+ return await next();
69
+ }
70
+ /**
71
+ * 渲染 Vue 组件
72
+ */
73
+ async renderVueComponent(component, context, deps) {
74
+ try {
75
+ const [vue, renderer] = deps;
76
+ const app = vue.createSSRApp(component);
77
+ app.provide("routeInfo", {
78
+ params: context.params || {},
79
+ query: context.query || {},
80
+ pathname: context.pathname
81
+ });
82
+ const html = await renderer.renderToString(app);
83
+ const fullHtml = HtmlRenderer.generateVueHtml(html, context);
84
+ return new Response(fullHtml, { headers: { "Content-Type": "text/html; charset=utf-8" } });
85
+ } catch (error) {
86
+ console.error("Vue 组件渲染失败:", error);
87
+ return new Response("Vue Component Render Error", { status: 500 });
88
+ }
89
+ }
90
+ /**
91
+ * 渲染 React 组件
92
+ */
93
+ async renderReactComponent(component, context, deps) {
94
+ try {
95
+ const [react, renderer] = deps;
96
+ const content = react.createElement(component, {
97
+ req: context.req,
98
+ params: context.params || {},
99
+ query: context.query || {}
100
+ });
101
+ const html = renderer.renderToString(content);
102
+ const fullHtml = HtmlRenderer.generateReactHtml(html, context);
103
+ return new Response(fullHtml, { headers: { "Content-Type": "text/html; charset=utf-8" } });
104
+ } catch (error) {
105
+ console.error("React 组件渲染失败:", error);
106
+ return new Response("React Component Render Error", { status: 500 });
107
+ }
108
+ }
109
+ /**
110
+ * 获取依赖管理器(用于外部访问)
111
+ */
112
+ getDependencyManager() {
113
+ return this.dependencyManager;
114
+ }
115
+ };
116
+
117
+ //#endregion
118
+ export { ComponentServer as t };
119
+ //# sourceMappingURL=component-server-DomPJ_7S.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-server-DIgykV0F.mjs","names":[],"sources":["../src/server/component-server.ts"],"sourcesContent":["import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { flattenComponentRoutes } from \"../middleware/component-router\";\nimport { BaseServer } from \"./base-server\";\nimport { PathMatcher } from \"../utils/path-matcher\";\nimport { HtmlRenderer } from \"../utils/html-renderer\";\nimport { DependencyManager } from \"../utils/dependency-manager\";\n\n/**\n * 组件路由服务器\n * 专门处理声明式组件路由\n */\nexport class ComponentServer extends BaseServer {\n private routes: FlattenedComponentRoute[];\n private dependencyManager: DependencyManager;\n\n constructor(routes: (ComponentRoute | NestedComponentRoute)[]) {\n super();\n this.routes = flattenComponentRoutes(routes);\n this.dependencyManager = new DependencyManager();\n\n // 检测路由冲突\n this.detectRouteConflicts(this.routes);\n this.logFlattenedRoutes(this.routes, \"组件路由\");\n console.log(\"🚀 依赖按需加载,服务器启动完成\");\n }\n\n /**\n * 处理请求\n */\n async fetch(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const pathname = url.pathname;\n const method = req.method;\n\n // 只支持 GET 请求\n if (method !== \"GET\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // 查找匹配的路由\n let matchedRoute: FlattenedComponentRoute | null = null;\n for (const route of this.routes) {\n if (PathMatcher.matchPath(route.fullPath, pathname)) {\n matchedRoute = route;\n break;\n }\n }\n\n if (!matchedRoute) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n try {\n // 创建中间件上下文\n const context = {\n req,\n params: PathMatcher.extractParams(matchedRoute.fullPath, pathname),\n query: Object.fromEntries(url.searchParams),\n pathname,\n };\n\n // 执行中间件链,中间件会处理组件渲染\n return await this.executeMiddlewareChain(\n matchedRoute.middlewareChain,\n context,\n matchedRoute.component,\n );\n } catch (error) {\n console.error(\"组件渲染失败:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n }\n\n /**\n * 执行中间件链\n */\n private async executeMiddlewareChain(\n middlewareChain: any[],\n context: any,\n componentImport: () => Promise<any>,\n ): Promise<Response> {\n // 创建最终的渲染函数\n const renderComponent = async () => {\n const componentModule = await componentImport();\n const component = componentModule.default || componentModule;\n\n // 自动检测组件类型\n const componentType =\n this.dependencyManager.detectComponentType(component);\n\n // 按需加载依赖\n const deps = await this.dependencyManager.getFrameworkDeps(componentType);\n\n // 根据组件类型渲染\n if (componentType === \"vue\") {\n return await this.renderVueComponent(component, context, deps);\n } else if (componentType === \"react\") {\n return await this.renderReactComponent(component, context, deps);\n } else {\n throw new Error(`不支持的组件类型: ${componentType}`);\n }\n };\n\n // 执行中间件链\n let index = 0;\n const next = async (): Promise<Response> => {\n if (index >= middlewareChain.length) {\n return await renderComponent();\n }\n\n const middleware = middlewareChain[index++];\n return await middleware(context.req, next);\n };\n\n return await next();\n }\n\n /**\n * 渲染 Vue 组件\n */\n private async renderVueComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [vue, renderer] = deps;\n const app = vue.createSSRApp(component);\n\n // 提供路由信息\n app.provide(\"routeInfo\", {\n params: context.params || {},\n query: context.query || {},\n pathname: context.pathname,\n });\n\n const html = await renderer.renderToString(app);\n const fullHtml = HtmlRenderer.generateVueHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"Vue 组件渲染失败:\", error);\n return new Response(\"Vue Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 渲染 React 组件\n */\n private async renderReactComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [react, renderer] = deps;\n const content = react.createElement(component, {\n req: context.req,\n params: context.params || {},\n query: context.query || {},\n });\n\n const html = renderer.renderToString(content);\n const fullHtml = HtmlRenderer.generateReactHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"React 组件渲染失败:\", error);\n return new Response(\"React Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 获取依赖管理器(用于外部访问)\n */\n getDependencyManager(): DependencyManager {\n return this.dependencyManager;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"component-server-DomPJ_7S.mjs","names":[],"sources":["../src/server/component-server.ts"],"sourcesContent":["import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { flattenComponentRoutes } from \"../middleware/component-router\";\nimport { BaseServer } from \"./base-server\";\nimport { PathMatcher } from \"../utils/path-matcher\";\nimport { HtmlRenderer } from \"../utils/html-renderer\";\nimport { DependencyManager } from \"../utils/dependency-manager\";\n\n/**\n * 组件路由服务器\n * 专门处理声明式组件路由\n */\nexport class ComponentServer extends BaseServer {\n private routes: FlattenedComponentRoute[];\n private dependencyManager: DependencyManager;\n\n constructor(routes: (ComponentRoute | NestedComponentRoute)[]) {\n super();\n this.routes = flattenComponentRoutes(routes);\n this.dependencyManager = new DependencyManager();\n\n // 检测路由冲突\n this.detectRouteConflicts(this.routes);\n this.logFlattenedRoutes(this.routes, \"组件路由\");\n console.log(\"🚀 依赖按需加载,服务器启动完成\");\n }\n\n /**\n * 处理请求\n */\n async fetch(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const pathname = url.pathname;\n const method = req.method;\n\n // 只支持 GET 请求\n if (method !== \"GET\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // 查找匹配的路由\n let matchedRoute: FlattenedComponentRoute | null = null;\n for (const route of this.routes) {\n if (PathMatcher.matchPath(route.fullPath, pathname)) {\n matchedRoute = route;\n break;\n }\n }\n\n if (!matchedRoute) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n try {\n // 创建中间件上下文\n const context = {\n req,\n params: PathMatcher.extractParams(matchedRoute.fullPath, pathname),\n query: Object.fromEntries(url.searchParams),\n pathname,\n };\n\n // 执行中间件链,中间件会处理组件渲染\n return await this.executeMiddlewareChain(\n matchedRoute.middlewareChain,\n context,\n matchedRoute.component,\n );\n } catch (error) {\n console.error(\"组件渲染失败:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n }\n\n /**\n * 执行中间件链\n */\n private async executeMiddlewareChain(\n middlewareChain: any[],\n context: any,\n componentImport: () => Promise<any>,\n ): Promise<Response> {\n // 创建最终的渲染函数\n const renderComponent = async () => {\n const componentModule = await componentImport();\n const component = componentModule.default || componentModule;\n\n // 自动检测组件类型\n const componentType =\n this.dependencyManager.detectComponentType(component);\n\n // 按需加载依赖\n const deps = await this.dependencyManager.getFrameworkDeps(componentType);\n\n // 根据组件类型渲染\n if (componentType === \"vue\") {\n return await this.renderVueComponent(component, context, deps);\n } else if (componentType === \"react\") {\n return await this.renderReactComponent(component, context, deps);\n } else {\n throw new Error(`不支持的组件类型: ${componentType}`);\n }\n };\n\n // 执行中间件链\n let index = 0;\n const next = async (): Promise<Response> => {\n if (index >= middlewareChain.length) {\n return await renderComponent();\n }\n\n const middleware = middlewareChain[index++];\n return await middleware(context.req, next);\n };\n\n return await next();\n }\n\n /**\n * 渲染 Vue 组件\n */\n private async renderVueComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [vue, renderer] = deps;\n const app = vue.createSSRApp(component);\n\n // 提供路由信息\n app.provide(\"routeInfo\", {\n params: context.params || {},\n query: context.query || {},\n pathname: context.pathname,\n });\n\n const html = await renderer.renderToString(app);\n const fullHtml = HtmlRenderer.generateVueHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"Vue 组件渲染失败:\", error);\n return new Response(\"Vue Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 渲染 React 组件\n */\n private async renderReactComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [react, renderer] = deps;\n const content = react.createElement(component, {\n req: context.req,\n params: context.params || {},\n query: context.query || {},\n });\n\n const html = renderer.renderToString(content);\n const fullHtml = HtmlRenderer.generateReactHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"React 组件渲染失败:\", error);\n return new Response(\"React Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 获取依赖管理器(用于外部访问)\n */\n getDependencyManager(): DependencyManager {\n return this.dependencyManager;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { r as NestedComponentRoute, t as ComponentRoute } from "./component-route-DF5feXJI.mjs";
2
- import { t as BaseServer } from "./base-server-CtA1bZSg.mjs";
3
- import { t as DependencyManager } from "./dependency-manager-C_qZvkaw.mjs";
1
+ import { r as NestedComponentRoute, t as ComponentRoute } from "./component-route-nrrO0iSI.mjs";
2
+ import { t as BaseServer } from "./base-server-DLxtulAO.mjs";
3
+ import { t as DependencyManager } from "./dependency-manager-C3_7ic4h.mjs";
4
4
 
5
5
  //#region src/server/component-server.d.ts
6
6
 
@@ -35,4 +35,4 @@ declare class ComponentServer extends BaseServer {
35
35
  }
36
36
  //#endregion
37
37
  export { ComponentServer as t };
38
- //# sourceMappingURL=component-server-DvcPVnL4.d.mts.map
38
+ //# sourceMappingURL=component-server-JqpDC7wy.d.mts.map
@@ -1,4 +1,4 @@
1
- import { i as RouteSchema, n as HandlerContextWithExtra, t as HandlerContext } from "./schema-DOKg31ZX.mjs";
1
+ import { i as RouteSchema, n as HandlerContextWithExtra, t as HandlerContext } from "./schema-B6DFN5c2.mjs";
2
2
 
3
3
  //#region src/utils/create-handler.d.ts
4
4
  /**
@@ -84,4 +84,4 @@ declare function simpleHandler<R>(handler: (ctx: {
84
84
  }) => R | Promise<R>): (req: Request) => Promise<Response>;
85
85
  //#endregion
86
86
  export { simpleHandler as i, createHandler as n, createHandlerWithExtra as r, InferableHandler as t };
87
- //# sourceMappingURL=create-handler-DRcJRkx9.d.mts.map
87
+ //# sourceMappingURL=create-handler-DKw-sQOV.d.mts.map
@@ -1,10 +1,9 @@
1
- import { c as json, s as init_response } from "./middleware-CV5o-4wk.mjs";
2
- import { a as parseCookies, l as parseHeaders, r as parseBody, u as parseQuery } from "./parsers-BQ63b0YE.mjs";
3
- import { t as goAwait } from "./go-await-2Pzj4snS.mjs";
4
- import { a as validateAllSchemas, i as precompileSchemas } from "./validators-WXQ49LcR.mjs";
1
+ import { o as json } from "./middleware-CewKbtb4.mjs";
2
+ import { a as parseCookies, l as parseHeaders, r as parseBody, u as parseQuery } from "./parsers-DpH_mD0H.mjs";
3
+ import { t as goAwait } from "./go-await-C4ZdEUwY.mjs";
4
+ import { a as validateAllSchemas, i as precompileSchemas } from "./validators-DBkyw6BG.mjs";
5
5
 
6
6
  //#region src/utils/create-handler.ts
7
- init_response();
8
7
  /**
9
8
  * 自动响应转换
10
9
  * 将各种返回值类型转换为 Response 对象
@@ -163,4 +162,4 @@ function simpleHandler(handler) {
163
162
 
164
163
  //#endregion
165
164
  export { createHandlerWithExtra as n, simpleHandler as r, createHandler as t };
166
- //# sourceMappingURL=create-handler-IzOE24L5.mjs.map
165
+ //# sourceMappingURL=create-handler-RconAcAB.mjs.map