vafast 0.4.2 → 0.4.3

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 (306) hide show
  1. package/README.md +6 -10
  2. package/dist/auth/{token.d.ts → token.d.mts} +21 -19
  3. package/dist/auth/token.mjs +105 -0
  4. package/dist/auth/token.mjs.map +1 -0
  5. package/dist/base-server-Bq4_lJWK.mjs +113 -0
  6. package/dist/base-server-Bq4_lJWK.mjs.map +1 -0
  7. package/dist/base-server-Gakrozqk.d.mts +40 -0
  8. package/dist/base64url-BY-HBSpL.d.mts +6 -0
  9. package/dist/base64url-DLDOeXsk.mjs +13 -0
  10. package/dist/base64url-DLDOeXsk.mjs.map +1 -0
  11. package/dist/chunk-67U6L5Jh.mjs +37 -0
  12. package/dist/component-route-BYV_X1rA.d.mts +31 -0
  13. package/dist/component-route-Do2yyYTi.mjs +1 -0
  14. package/dist/component-router-DXUXLp1R.mjs +33 -0
  15. package/dist/component-router-DXUXLp1R.mjs.map +1 -0
  16. package/dist/component-server-ARXvZJUQ.mjs +124 -0
  17. package/dist/component-server-ARXvZJUQ.mjs.map +1 -0
  18. package/dist/component-server-BOz4Q-Qt.d.mts +38 -0
  19. package/dist/create-handler-CbSoroA1.mjs +166 -0
  20. package/dist/create-handler-CbSoroA1.mjs.map +1 -0
  21. package/dist/{utils/create-handler.d.ts → create-handler-Dtt0xv6g.d.mts} +24 -24
  22. package/dist/{defineRoute.d.ts → defineRoute.d.mts} +20 -17
  23. package/dist/defineRoute.mjs +93 -0
  24. package/dist/defineRoute.mjs.map +1 -0
  25. package/dist/dependency-manager-CPkwMI7J.mjs +61 -0
  26. package/dist/dependency-manager-CPkwMI7J.mjs.map +1 -0
  27. package/dist/dependency-manager-Dbug5INp.d.mts +27 -0
  28. package/dist/formats-BSqJWCsG.d.mts +42 -0
  29. package/dist/go-await-B-KP-K8x.mjs +33 -0
  30. package/dist/go-await-B-KP-K8x.mjs.map +1 -0
  31. package/dist/{utils/go-await.d.ts → go-await-CqPx9dVQ.d.mts} +4 -2
  32. package/dist/handle-BhpqNgGf.mjs +30 -0
  33. package/dist/handle-BhpqNgGf.mjs.map +1 -0
  34. package/dist/{utils/handle.d.ts → handle-DOidKTI-.d.mts} +8 -6
  35. package/dist/html-renderer-C3LKTLme.d.mts +22 -0
  36. package/dist/{utils/html-renderer.js → html-renderer-CJ3B2Hft.mjs} +34 -29
  37. package/dist/html-renderer-CJ3B2Hft.mjs.map +1 -0
  38. package/dist/index-DFsQyT61.d.mts +48 -0
  39. package/dist/index-DXJd7-2Z.d.mts +1 -0
  40. package/dist/index.d.mts +35 -0
  41. package/dist/index.mjs +42 -0
  42. package/dist/index.mjs.map +1 -0
  43. package/dist/middleware/{auth.d.ts → auth.d.mts} +12 -8
  44. package/dist/middleware/auth.mjs +98 -0
  45. package/dist/middleware/auth.mjs.map +1 -0
  46. package/dist/middleware/authMiddleware.d.mts +9 -0
  47. package/dist/middleware/authMiddleware.mjs +19 -0
  48. package/dist/middleware/authMiddleware.mjs.map +1 -0
  49. package/dist/middleware/{component-renderer.d.ts → component-renderer.d.mts} +3 -1
  50. package/dist/middleware/component-renderer.mjs +119 -0
  51. package/dist/middleware/component-renderer.mjs.map +1 -0
  52. package/dist/middleware/{component-router.d.ts → component-router.d.mts} +5 -4
  53. package/dist/middleware/component-router.mjs +4 -0
  54. package/dist/middleware/cors.d.mts +16 -0
  55. package/dist/middleware/cors.mjs +38 -0
  56. package/dist/middleware/cors.mjs.map +1 -0
  57. package/dist/middleware/rateLimit.d.mts +14 -0
  58. package/dist/middleware/rateLimit.mjs +34 -0
  59. package/dist/middleware/rateLimit.mjs.map +1 -0
  60. package/dist/middleware-3ShRJyd1.mjs +59 -0
  61. package/dist/middleware-3ShRJyd1.mjs.map +1 -0
  62. package/dist/middleware.d.mts +25 -0
  63. package/dist/middleware.mjs +4 -0
  64. package/dist/monitoring/index.d.mts +33 -0
  65. package/dist/monitoring/index.mjs +27 -0
  66. package/dist/monitoring/index.mjs.map +1 -0
  67. package/dist/monitoring/native-monitor.d.mts +48 -0
  68. package/dist/monitoring/native-monitor.mjs +154 -0
  69. package/dist/monitoring/native-monitor.mjs.map +1 -0
  70. package/dist/monitoring/types.d.mts +150 -0
  71. package/dist/monitoring/types.mjs +1 -0
  72. package/dist/node-server/index.d.mts +4 -0
  73. package/dist/node-server/index.mjs +5 -0
  74. package/dist/node-server/{request.d.ts → request.d.mts} +4 -6
  75. package/dist/node-server/request.mjs +3 -0
  76. package/dist/node-server/{response.d.ts → response.d.mts} +4 -6
  77. package/dist/node-server/response.mjs +3 -0
  78. package/dist/node-server/serve.d.mts +2 -0
  79. package/dist/node-server/serve.mjs +4 -0
  80. package/dist/{utils/parsers.d.ts → parsers-CodQFP1Z.d.mts} +10 -8
  81. package/dist/parsers-ROIZWSGI.mjs +168 -0
  82. package/dist/parsers-ROIZWSGI.mjs.map +1 -0
  83. package/dist/path-matcher-CXMJ-IrG.mjs +62 -0
  84. package/dist/path-matcher-CXMJ-IrG.mjs.map +1 -0
  85. package/dist/radix-tree-BWmhTLhT.mjs +157 -0
  86. package/dist/radix-tree-BWmhTLhT.mjs.map +1 -0
  87. package/dist/request-B2BkUecT.mjs +133 -0
  88. package/dist/request-B2BkUecT.mjs.map +1 -0
  89. package/dist/request-validator-Dyqng-H_.mjs +77 -0
  90. package/dist/request-validator-Dyqng-H_.mjs.map +1 -0
  91. package/dist/request-validator-u2Ccj3_x.d.mts +67 -0
  92. package/dist/response-BhFKEphr.mjs +72 -0
  93. package/dist/response-BhFKEphr.mjs.map +1 -0
  94. package/dist/response-CSKW5hsS.mjs +97 -0
  95. package/dist/response-CSKW5hsS.mjs.map +1 -0
  96. package/dist/{utils/response.d.ts → response-CUyV5FIm.d.mts} +4 -2
  97. package/dist/route-BRR15b-p.mjs +11 -0
  98. package/dist/route-BRR15b-p.mjs.map +1 -0
  99. package/dist/route-BqmWCG4e.d.mts +44 -0
  100. package/dist/route-registry-AlkDgbcE.mjs +225 -0
  101. package/dist/route-registry-AlkDgbcE.mjs.map +1 -0
  102. package/dist/route-registry-ykzRmaHB.d.mts +176 -0
  103. package/dist/router/index.d.mts +5 -0
  104. package/dist/router/index.mjs +10 -0
  105. package/dist/router/index.mjs.map +1 -0
  106. package/dist/router/radix-tree.d.mts +60 -0
  107. package/dist/router/radix-tree.mjs +4 -0
  108. package/dist/router-BOeVQrjz.mjs +71 -0
  109. package/dist/router-BOeVQrjz.mjs.map +1 -0
  110. package/dist/{router.d.ts → router.d.mts} +6 -7
  111. package/dist/router.mjs +4 -0
  112. package/dist/schema-CVuttFSw.d.mts +81 -0
  113. package/dist/schema-CbAaktsZ.mjs +1 -0
  114. package/dist/serve-BQQ2JzIH.d.mts +69 -0
  115. package/dist/serve-MRGGK7-q.mjs +107 -0
  116. package/dist/serve-MRGGK7-q.mjs.map +1 -0
  117. package/dist/serve.d.mts +2 -0
  118. package/dist/serve.mjs +4 -0
  119. package/dist/server/base-server.d.mts +4 -0
  120. package/dist/server/base-server.mjs +4 -0
  121. package/dist/server/component-server.d.mts +5 -0
  122. package/dist/server/component-server.mjs +5 -0
  123. package/dist/server/index.d.mts +7 -0
  124. package/dist/server/index.mjs +8 -0
  125. package/dist/server/server-factory.d.mts +7 -0
  126. package/dist/server/server-factory.mjs +6 -0
  127. package/dist/server/server.d.mts +5 -0
  128. package/dist/server/server.mjs +4 -0
  129. package/dist/server-B0nzGCG5.mjs +88 -0
  130. package/dist/server-B0nzGCG5.mjs.map +1 -0
  131. package/dist/server-C8WCshmG.mjs +137 -0
  132. package/dist/server-C8WCshmG.mjs.map +1 -0
  133. package/dist/server-Drc2kSxp.d.mts +60 -0
  134. package/dist/sse-BOd2pvUK.d.mts +65 -0
  135. package/dist/sse-US5D9mgE.mjs +87 -0
  136. package/dist/sse-US5D9mgE.mjs.map +1 -0
  137. package/dist/types/component-route.d.mts +2 -0
  138. package/dist/types/component-route.mjs +1 -0
  139. package/dist/types/index.d.mts +6 -0
  140. package/dist/types/index.mjs +3 -0
  141. package/dist/types/route.d.mts +2 -0
  142. package/dist/types/route.mjs +3 -0
  143. package/dist/types/schema.d.mts +2 -0
  144. package/dist/types/schema.mjs +1 -0
  145. package/dist/types/types.d.mts +2 -0
  146. package/dist/types/types.mjs +1 -0
  147. package/dist/{types/types.d.ts → types-Cb7_2VSt.d.mts} +27 -25
  148. package/dist/utils/base64url.d.mts +2 -0
  149. package/dist/utils/base64url.mjs +3 -0
  150. package/dist/utils/create-handler.d.mts +3 -0
  151. package/dist/utils/create-handler.mjs +5 -0
  152. package/dist/utils/dependency-manager.d.mts +2 -0
  153. package/dist/utils/dependency-manager.mjs +4 -0
  154. package/dist/utils/formats.d.mts +2 -0
  155. package/dist/utils/formats.mjs +129 -0
  156. package/dist/utils/formats.mjs.map +1 -0
  157. package/dist/utils/go-await.d.mts +2 -0
  158. package/dist/utils/go-await.mjs +3 -0
  159. package/dist/utils/handle.d.mts +2 -0
  160. package/dist/utils/handle.mjs +4 -0
  161. package/dist/utils/html-renderer.d.mts +2 -0
  162. package/dist/utils/html-renderer.mjs +4 -0
  163. package/dist/utils/index.d.mts +16 -0
  164. package/dist/utils/index.mjs +23 -0
  165. package/dist/utils/index.mjs.map +1 -0
  166. package/dist/utils/parsers.d.mts +2 -0
  167. package/dist/utils/parsers.mjs +3 -0
  168. package/dist/utils/path-matcher.d.mts +27 -0
  169. package/dist/utils/path-matcher.mjs +4 -0
  170. package/dist/utils/request-validator.d.mts +3 -0
  171. package/dist/utils/request-validator.mjs +5 -0
  172. package/dist/utils/response.d.mts +2 -0
  173. package/dist/utils/response.mjs +4 -0
  174. package/dist/utils/route-registry.d.mts +4 -0
  175. package/dist/utils/route-registry.mjs +4 -0
  176. package/dist/utils/sse.d.mts +3 -0
  177. package/dist/utils/sse.mjs +5 -0
  178. package/dist/utils/validators/validators.d.mts +2 -0
  179. package/dist/utils/validators/validators.mjs +3 -0
  180. package/dist/validators-C0eZyxPh.d.mts +67 -0
  181. package/dist/validators-CbCLj0Rc.mjs +112 -0
  182. package/dist/validators-CbCLj0Rc.mjs.map +1 -0
  183. package/package.json +16 -18
  184. package/dist/auth/token.js +0 -131
  185. package/dist/auth/token.js.map +0 -1
  186. package/dist/defineRoute.js +0 -37
  187. package/dist/defineRoute.js.map +0 -1
  188. package/dist/index.d.ts +0 -32
  189. package/dist/index.js +0 -2578
  190. package/dist/index.js.map +0 -1
  191. package/dist/middleware/auth.js +0 -205
  192. package/dist/middleware/auth.js.map +0 -1
  193. package/dist/middleware/authMiddleware.d.ts +0 -5
  194. package/dist/middleware/authMiddleware.js +0 -57
  195. package/dist/middleware/authMiddleware.js.map +0 -1
  196. package/dist/middleware/component-renderer.js +0 -139
  197. package/dist/middleware/component-renderer.js.map +0 -1
  198. package/dist/middleware/component-router.js +0 -36
  199. package/dist/middleware/component-router.js.map +0 -1
  200. package/dist/middleware/cors.d.ts +0 -12
  201. package/dist/middleware/cors.js +0 -43
  202. package/dist/middleware/cors.js.map +0 -1
  203. package/dist/middleware/rateLimit.d.ts +0 -10
  204. package/dist/middleware/rateLimit.js +0 -49
  205. package/dist/middleware/rateLimit.js.map +0 -1
  206. package/dist/middleware.d.ts +0 -21
  207. package/dist/middleware.js +0 -102
  208. package/dist/middleware.js.map +0 -1
  209. package/dist/monitoring/index.d.ts +0 -36
  210. package/dist/monitoring/index.js +0 -1487
  211. package/dist/monitoring/index.js.map +0 -1
  212. package/dist/monitoring/native-monitor.d.ts +0 -44
  213. package/dist/monitoring/native-monitor.js +0 -1454
  214. package/dist/monitoring/native-monitor.js.map +0 -1
  215. package/dist/monitoring/types.d.ts +0 -148
  216. package/dist/monitoring/types.js +0 -8
  217. package/dist/monitoring/types.js.map +0 -1
  218. package/dist/node-server/index.d.ts +0 -4
  219. package/dist/node-server/index.js +0 -298
  220. package/dist/node-server/index.js.map +0 -1
  221. package/dist/node-server/request.js +0 -125
  222. package/dist/node-server/request.js.map +0 -1
  223. package/dist/node-server/response.js +0 -76
  224. package/dist/node-server/response.js.map +0 -1
  225. package/dist/node-server/serve.d.ts +0 -71
  226. package/dist/node-server/serve.js +0 -281
  227. package/dist/node-server/serve.js.map +0 -1
  228. package/dist/router/index.d.ts +0 -3
  229. package/dist/router/index.js +0 -232
  230. package/dist/router/index.js.map +0 -1
  231. package/dist/router/radix-tree.d.ts +0 -66
  232. package/dist/router/radix-tree.js +0 -190
  233. package/dist/router/radix-tree.js.map +0 -1
  234. package/dist/router.js +0 -44
  235. package/dist/router.js.map +0 -1
  236. package/dist/serve.d.ts +0 -2
  237. package/dist/serve.js +0 -281
  238. package/dist/serve.js.map +0 -1
  239. package/dist/server/base-server.d.ts +0 -37
  240. package/dist/server/base-server.js +0 -134
  241. package/dist/server/base-server.js.map +0 -1
  242. package/dist/server/component-server.d.ts +0 -37
  243. package/dist/server/component-server.js +0 -488
  244. package/dist/server/component-server.js.map +0 -1
  245. package/dist/server/index.d.ts +0 -8
  246. package/dist/server/index.js +0 -1159
  247. package/dist/server/index.js.map +0 -1
  248. package/dist/server/server-factory.d.ts +0 -48
  249. package/dist/server/server-factory.js +0 -1156
  250. package/dist/server/server-factory.js.map +0 -1
  251. package/dist/server/server.d.ts +0 -64
  252. package/dist/server/server.js +0 -737
  253. package/dist/server/server.js.map +0 -1
  254. package/dist/types/component-route.d.ts +0 -29
  255. package/dist/types/component-route.js +0 -1
  256. package/dist/types/component-route.js.map +0 -1
  257. package/dist/types/index.d.ts +0 -5
  258. package/dist/types/index.js +0 -21
  259. package/dist/types/index.js.map +0 -1
  260. package/dist/types/route.d.ts +0 -42
  261. package/dist/types/route.js +0 -12
  262. package/dist/types/route.js.map +0 -1
  263. package/dist/types/schema.d.ts +0 -79
  264. package/dist/types/schema.js +0 -10
  265. package/dist/types/schema.js.map +0 -1
  266. package/dist/types/types.js +0 -1
  267. package/dist/types/types.js.map +0 -1
  268. package/dist/utils/base64url.d.ts +0 -4
  269. package/dist/utils/base64url.js +0 -14
  270. package/dist/utils/base64url.js.map +0 -1
  271. package/dist/utils/create-handler.js +0 -299
  272. package/dist/utils/create-handler.js.map +0 -1
  273. package/dist/utils/dependency-manager.d.ts +0 -25
  274. package/dist/utils/dependency-manager.js +0 -71
  275. package/dist/utils/dependency-manager.js.map +0 -1
  276. package/dist/utils/formats.d.ts +0 -40
  277. package/dist/utils/formats.js +0 -116
  278. package/dist/utils/formats.js.map +0 -1
  279. package/dist/utils/go-await.js +0 -16
  280. package/dist/utils/go-await.js.map +0 -1
  281. package/dist/utils/handle.js +0 -48
  282. package/dist/utils/handle.js.map +0 -1
  283. package/dist/utils/html-renderer.d.ts +0 -20
  284. package/dist/utils/html-renderer.js.map +0 -1
  285. package/dist/utils/index.d.ts +0 -16
  286. package/dist/utils/index.js +0 -1038
  287. package/dist/utils/index.js.map +0 -1
  288. package/dist/utils/parsers.js +0 -160
  289. package/dist/utils/parsers.js.map +0 -1
  290. package/dist/utils/path-matcher.d.ts +0 -25
  291. package/dist/utils/path-matcher.js +0 -73
  292. package/dist/utils/path-matcher.js.map +0 -1
  293. package/dist/utils/request-validator.d.ts +0 -66
  294. package/dist/utils/request-validator.js +0 -158
  295. package/dist/utils/request-validator.js.map +0 -1
  296. package/dist/utils/response.js +0 -102
  297. package/dist/utils/response.js.map +0 -1
  298. package/dist/utils/route-registry.d.ts +0 -195
  299. package/dist/utils/route-registry.js +0 -152
  300. package/dist/utils/route-registry.js.map +0 -1
  301. package/dist/utils/sse.d.ts +0 -87
  302. package/dist/utils/sse.js +0 -181
  303. package/dist/utils/sse.js.map +0 -1
  304. package/dist/utils/validators/validators.d.ts +0 -76
  305. package/dist/utils/validators/validators.js +0 -97
  306. package/dist/utils/validators/validators.js.map +0 -1
package/README.md CHANGED
@@ -274,8 +274,7 @@ export default { fetch: server.fetch };
274
274
 
275
275
  **Node.js 完整示例:**
276
276
  ```typescript
277
- import { Server, createHandler } from 'vafast';
278
- import { serve } from '@vafast/node-server';
277
+ import { Server, createHandler, serve } from 'vafast';
279
278
 
280
279
  const server = new Server([
281
280
  { method: 'GET', path: '/', handler: createHandler(() => 'Hello Node!') }
@@ -570,21 +569,18 @@ const categories = registry.getCategories(); // ['auth', 'users']
570
569
 
571
570
  ## 🔧 运行时支持
572
571
 
573
- ### Bun
574
-
575
572
  ```typescript
576
- export default { port: 3000, fetch: server.fetch };
573
+ import { serve } from 'vafast';
574
+ serve({ fetch: server.fetch, port: 3000 });
577
575
  ```
578
576
 
579
- ### Node.js
577
+ > 💡 `serve` 函数兼容 Bun 和 Node.js,代码无需修改即可跨运行时
580
578
 
579
+ **Bun 原生写法(仅限 Bun):**
581
580
  ```typescript
582
- import { serve } from '@vafast/node-server';
583
- serve({ fetch: server.fetch, port: 3000 });
581
+ export default { port: 3000, fetch: server.fetch };
584
582
  ```
585
583
 
586
- > 💡 两种运行时使用相同的 API,代码可无缝迁移
587
-
588
584
  ## 📚 文档
589
585
 
590
586
  ### 入门
@@ -1,25 +1,26 @@
1
+ //#region src/auth/token.d.ts
1
2
  interface TokenPayload {
2
- [key: string]: any;
3
- exp?: number;
4
- iat?: number;
5
- sub?: string;
6
- aud?: string;
7
- iss?: string;
3
+ [key: string]: any;
4
+ exp?: number;
5
+ iat?: number;
6
+ sub?: string;
7
+ aud?: string;
8
+ iss?: string;
8
9
  }
9
10
  interface TokenResult {
10
- payload: TokenPayload;
11
- token: string;
12
- expiresAt: number;
11
+ payload: TokenPayload;
12
+ token: string;
13
+ expiresAt: number;
13
14
  }
14
15
  interface TokenOptions {
15
- expiresIn?: number;
16
- issuer?: string;
17
- audience?: string;
18
- subject?: string;
16
+ expiresIn?: number;
17
+ issuer?: string;
18
+ audience?: string;
19
+ subject?: string;
19
20
  }
20
21
  declare class TokenError extends Error {
21
- code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD";
22
- constructor(message: string, code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD");
22
+ code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD";
23
+ constructor(message: string, code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD");
23
24
  }
24
25
  /** 生成令牌 */
25
26
  declare function generateToken(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<TokenResult>;
@@ -35,8 +36,9 @@ declare function getTokenTimeRemaining(token: string): number;
35
36
  declare function refreshToken(token: string, secret: string, options?: TokenOptions): Promise<TokenResult | null>;
36
37
  /** 创建访问令牌和刷新令牌对 */
37
38
  declare function createTokenPair(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<{
38
- accessToken: TokenResult;
39
- refreshToken: TokenResult;
39
+ accessToken: TokenResult;
40
+ refreshToken: TokenResult;
40
41
  }>;
41
-
42
- export { TokenError, type TokenOptions, type TokenPayload, type TokenResult, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken };
42
+ //#endregion
43
+ export { TokenError, TokenOptions, TokenPayload, TokenResult, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken };
44
+ //# sourceMappingURL=token.d.mts.map
@@ -0,0 +1,105 @@
1
+ import { n as base64urlEncode, t as base64urlDecode } from "../base64url-DLDOeXsk.mjs";
2
+
3
+ //#region src/auth/token.ts
4
+ var TokenError = class extends Error {
5
+ constructor(message, code) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = "TokenError";
9
+ }
10
+ };
11
+ const encoder = new TextEncoder();
12
+ /** 使用 HMAC-SHA256 进行签名 */
13
+ async function sign(data, secret) {
14
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), {
15
+ name: "HMAC",
16
+ hash: "SHA-256"
17
+ }, false, ["sign"]);
18
+ const signature = await crypto.subtle.sign("HMAC", key, encoder.encode(data));
19
+ return btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(signature))));
20
+ }
21
+ /** 生成令牌 */
22
+ async function generateToken(payload, secret, options = {}) {
23
+ const { expiresIn = 3600, issuer, audience, subject } = options;
24
+ const now = Math.floor(Date.now() / 1e3);
25
+ const tokenPayload = {
26
+ ...payload,
27
+ iat: now,
28
+ exp: now + expiresIn
29
+ };
30
+ if (issuer) tokenPayload.iss = issuer;
31
+ if (audience) tokenPayload.aud = audience;
32
+ if (subject) tokenPayload.sub = subject;
33
+ const data = base64urlEncode(JSON.stringify(tokenPayload));
34
+ return {
35
+ payload: tokenPayload,
36
+ token: `${data}.${base64urlEncode(await sign(data, secret))}`,
37
+ expiresAt: tokenPayload.exp * 1e3
38
+ };
39
+ }
40
+ /** 验证令牌 */
41
+ async function verifyToken(token, secret) {
42
+ try {
43
+ const [data, sig] = token.split(".");
44
+ if (!data || !sig) throw new TokenError("令牌格式无效", "MALFORMED_TOKEN");
45
+ if (sig !== base64urlEncode(await sign(data, secret))) throw new TokenError("令牌签名无效", "INVALID_SIGNATURE");
46
+ const payload = JSON.parse(base64urlDecode(data));
47
+ if (payload.exp && Date.now() / 1e3 > payload.exp) throw new TokenError("令牌已过期", "EXPIRED_TOKEN");
48
+ return payload;
49
+ } catch (error) {
50
+ if (error instanceof TokenError) throw error;
51
+ throw new TokenError("令牌验证失败", "INVALID_TOKEN");
52
+ }
53
+ }
54
+ /** 解析令牌(不验证签名) */
55
+ function parseToken(token) {
56
+ try {
57
+ const [data] = token.split(".");
58
+ if (!data) return null;
59
+ return JSON.parse(base64urlDecode(data));
60
+ } catch {
61
+ return null;
62
+ }
63
+ }
64
+ /** 检查令牌是否过期 */
65
+ function isTokenExpired(token) {
66
+ const payload = parseToken(token);
67
+ if (!payload || !payload.exp) return true;
68
+ return Date.now() / 1e3 > payload.exp;
69
+ }
70
+ /** 获取令牌剩余有效时间(秒) */
71
+ function getTokenTimeRemaining(token) {
72
+ const payload = parseToken(token);
73
+ if (!payload || !payload.exp) return 0;
74
+ const remaining = payload.exp - Date.now() / 1e3;
75
+ return Math.max(0, Math.floor(remaining));
76
+ }
77
+ /** 刷新令牌 */
78
+ async function refreshToken(token, secret, options = {}) {
79
+ try {
80
+ const payload = await verifyToken(token, secret);
81
+ if (!payload) return null;
82
+ const { exp, iat, ...cleanPayload } = payload;
83
+ await new Promise((resolve) => setTimeout(resolve, 10));
84
+ return await generateToken(cleanPayload, secret, options);
85
+ } catch {
86
+ return null;
87
+ }
88
+ }
89
+ /** 创建访问令牌和刷新令牌对 */
90
+ async function createTokenPair(payload, secret, options = {}) {
91
+ return {
92
+ accessToken: await generateToken(payload, secret, {
93
+ ...options,
94
+ expiresIn: options.expiresIn || 3600
95
+ }),
96
+ refreshToken: await generateToken(payload, secret, {
97
+ ...options,
98
+ expiresIn: 168 * 3600
99
+ })
100
+ };
101
+ }
102
+
103
+ //#endregion
104
+ export { TokenError, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken };
105
+ //# sourceMappingURL=token.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.mjs","names":[],"sources":["../../src/auth/token.ts"],"sourcesContent":["// src/auth/token.ts\nimport { base64urlEncode, base64urlDecode } from \"../utils/base64url\";\n\n// 类型定义\nexport interface TokenPayload {\n [key: string]: any;\n exp?: number; // 过期时间戳\n iat?: number; // 签发时间戳\n sub?: string; // 主题(通常是用户ID)\n aud?: string; // 受众\n iss?: string; // 签发者\n}\n\nexport interface TokenResult {\n payload: TokenPayload;\n token: string;\n expiresAt: number;\n}\n\nexport interface TokenOptions {\n expiresIn?: number; // 过期时间(秒)\n issuer?: string; // 签发者\n audience?: string; // 受众\n subject?: string; // 主题\n}\n\nexport class TokenError extends Error {\n constructor(\n message: string,\n public code:\n | \"INVALID_TOKEN\"\n | \"EXPIRED_TOKEN\"\n | \"INVALID_SIGNATURE\"\n | \"MALFORMED_TOKEN\"\n | \"INVALID_PAYLOAD\",\n ) {\n super(message);\n this.name = \"TokenError\";\n }\n}\n\nconst encoder = new TextEncoder();\n\n/** 使用 HMAC-SHA256 进行签名 */\nasync function sign(data: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n\n const signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(data));\n return btoa(\n String.fromCharCode.apply(null, Array.from(new Uint8Array(signature))),\n );\n}\n\n/** 生成令牌 */\nexport async function generateToken(\n payload: TokenPayload,\n secret: string,\n options: TokenOptions = {},\n): Promise<TokenResult> {\n const { expiresIn = 3600, issuer, audience, subject } = options;\n\n // 创建令牌载荷,强制使用当前时间\n const now = Math.floor(Date.now() / 1000);\n const tokenPayload: TokenPayload = {\n ...payload,\n iat: now,\n exp: now + expiresIn,\n };\n\n // 添加可选字段\n if (issuer) tokenPayload.iss = issuer;\n if (audience) tokenPayload.aud = audience;\n if (subject) tokenPayload.sub = subject;\n\n const data = base64urlEncode(JSON.stringify(tokenPayload));\n const sig = await sign(data, secret);\n const token = `${data}.${base64urlEncode(sig)}`;\n\n return {\n payload: tokenPayload,\n token,\n expiresAt: tokenPayload.exp! * 1000, // 转换为毫秒\n };\n}\n\n/** 验证令牌 */\nexport async function verifyToken(\n token: string,\n secret: string,\n): Promise<TokenPayload | null> {\n try {\n const [data, sig] = token.split(\".\");\n if (!data || !sig) {\n throw new TokenError(\"令牌格式无效\", \"MALFORMED_TOKEN\");\n }\n\n const expectedSig = await sign(data, secret);\n const expected = base64urlEncode(expectedSig);\n\n if (sig !== expected) {\n throw new TokenError(\"令牌签名无效\", \"INVALID_SIGNATURE\");\n }\n\n const payload = JSON.parse(base64urlDecode(data)) as TokenPayload;\n\n // 检查过期时间\n if (payload.exp && Date.now() / 1000 > payload.exp) {\n throw new TokenError(\"令牌已过期\", \"EXPIRED_TOKEN\");\n }\n\n return payload;\n } catch (error) {\n if (error instanceof TokenError) {\n throw error;\n }\n throw new TokenError(\"令牌验证失败\", \"INVALID_TOKEN\");\n }\n}\n\n/** 解析令牌(不验证签名) */\nexport function parseToken(token: string): TokenPayload | null {\n try {\n const [data] = token.split(\".\");\n if (!data) return null;\n\n return JSON.parse(base64urlDecode(data));\n } catch {\n return null;\n }\n}\n\n/** 检查令牌是否过期 */\nexport function isTokenExpired(token: string): boolean {\n const payload = parseToken(token);\n if (!payload || !payload.exp) return true;\n\n return Date.now() / 1000 > payload.exp;\n}\n\n/** 获取令牌剩余有效时间(秒) */\nexport function getTokenTimeRemaining(token: string): number {\n const payload = parseToken(token);\n if (!payload || !payload.exp) return 0;\n\n const remaining = payload.exp - Date.now() / 1000;\n return Math.max(0, Math.floor(remaining));\n}\n\n/** 刷新令牌 */\nexport async function refreshToken(\n token: string,\n secret: string,\n options: TokenOptions = {},\n): Promise<TokenResult | null> {\n try {\n const payload = await verifyToken(token, secret);\n if (!payload) return null;\n\n // 移除时间相关字段,重新生成\n const { exp, iat, ...cleanPayload } = payload;\n\n // 添加延迟确保时间戳不同\n await new Promise((resolve) => setTimeout(resolve, 10));\n\n return await generateToken(cleanPayload, secret, options);\n } catch {\n return null;\n }\n}\n\n/** 创建访问令牌和刷新令牌对 */\nexport async function createTokenPair(\n payload: TokenPayload,\n secret: string,\n options: TokenOptions = {},\n): Promise<{\n accessToken: TokenResult;\n refreshToken: TokenResult;\n}> {\n const accessToken = await generateToken(payload, secret, {\n ...options,\n expiresIn: options.expiresIn || 3600, // 1小时\n });\n\n const refreshToken = await generateToken(payload, secret, {\n ...options,\n expiresIn: 7 * 24 * 3600, // 7天\n });\n\n return { accessToken, refreshToken };\n}\n"],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import { t as __esmMin } from "./chunk-67U6L5Jh.mjs";
2
+
3
+ //#region src/server/base-server.ts
4
+ var BaseServer;
5
+ var init_base_server = __esmMin((() => {
6
+ 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
+
111
+ //#endregion
112
+ export { init_base_server as n, BaseServer as t };
113
+ //# sourceMappingURL=base-server-Bq4_lJWK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-server-Bq4_lJWK.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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"}
@@ -0,0 +1,40 @@
1
+ import { o as Middleware } from "./types-Cb7_2VSt.mjs";
2
+
3
+ //#region src/server/base-server.d.ts
4
+
5
+ /**
6
+ * 服务器基类
7
+ * 包含所有服务器类型的公共逻辑
8
+ */
9
+ declare abstract class BaseServer {
10
+ protected globalMiddleware: Middleware[];
11
+ use(mw: Middleware): void;
12
+ /**
13
+ * 打印扁平化后的路由信息,用于调试
14
+ */
15
+ protected logFlattenedRoutes(routes: any[], type?: string): void;
16
+ /**
17
+ * 检测路由冲突
18
+ * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突
19
+ */
20
+ protected detectRouteConflicts(routes: any[]): void;
21
+ /**
22
+ * 检测动态路由的潜在冲突
23
+ */
24
+ private detectDynamicRouteConflicts;
25
+ /**
26
+ * 判断两个路径是否可能冲突
27
+ */
28
+ private pathsMayConflict;
29
+ /**
30
+ * 路径匹配
31
+ */
32
+ protected matchPath(pattern: string, path: string): boolean;
33
+ /**
34
+ * 提取路径参数
35
+ */
36
+ protected extractParams(pattern: string, path: string): Record<string, string>;
37
+ }
38
+ //#endregion
39
+ export { BaseServer as t };
40
+ //# sourceMappingURL=base-server-Gakrozqk.d.mts.map
@@ -0,0 +1,6 @@
1
+ //#region src/utils/base64url.d.ts
2
+ declare function base64urlEncode(str: string): string;
3
+ declare function base64urlDecode(str: string): string;
4
+ //#endregion
5
+ export { base64urlEncode as n, base64urlDecode as t };
6
+ //# sourceMappingURL=base64url-BY-HBSpL.d.mts.map
@@ -0,0 +1,13 @@
1
+ //#region src/utils/base64url.ts
2
+ function base64urlEncode(str) {
3
+ return btoa(str).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
4
+ }
5
+ function base64urlDecode(str) {
6
+ const pad = str.length % 4 === 0 ? "" : "=".repeat(4 - str.length % 4);
7
+ const base64 = str.replace(/-/g, "+").replace(/_/g, "/") + pad;
8
+ return atob(base64);
9
+ }
10
+
11
+ //#endregion
12
+ export { base64urlEncode as n, base64urlDecode as t };
13
+ //# sourceMappingURL=base64url-DLDOeXsk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url-DLDOeXsk.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"}
@@ -0,0 +1,37 @@
1
+ //#region rolldown:runtime
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
7
+ var __exportAll = (all, symbols) => {
8
+ let target = {};
9
+ for (var name in all) {
10
+ __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: true
13
+ });
14
+ }
15
+ if (symbols) {
16
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
17
+ }
18
+ return target;
19
+ };
20
+ var __copyProps = (to, from, except, desc) => {
21
+ if (from && typeof from === "object" || typeof from === "function") {
22
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
23
+ key = keys[i];
24
+ if (!__hasOwnProp.call(to, key) && key !== except) {
25
+ __defProp(to, key, {
26
+ get: ((k) => from[k]).bind(null, key),
27
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
28
+ });
29
+ }
30
+ }
31
+ }
32
+ return to;
33
+ };
34
+ var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
+
36
+ //#endregion
37
+ export { __exportAll as n, __toCommonJS as r, __esmMin as t };
@@ -0,0 +1,31 @@
1
+ import { a as Middleware } from "./route-BqmWCG4e.mjs";
2
+
3
+ //#region src/types/component-route.d.ts
4
+
5
+ /**
6
+ * 组件路由配置
7
+ * 支持声明式的组件关联
8
+ */
9
+ interface ComponentRoute {
10
+ path: string;
11
+ component: () => Promise<any>;
12
+ middleware?: Middleware[];
13
+ }
14
+ /**
15
+ * 嵌套组件路由配置
16
+ */
17
+ interface NestedComponentRoute {
18
+ path: string;
19
+ middleware?: Middleware[];
20
+ children?: (ComponentRoute | NestedComponentRoute)[];
21
+ }
22
+ /**
23
+ * 扁平化后的组件路由
24
+ */
25
+ interface FlattenedComponentRoute extends ComponentRoute {
26
+ fullPath: string;
27
+ middlewareChain: Middleware[];
28
+ }
29
+ //#endregion
30
+ export { FlattenedComponentRoute as n, NestedComponentRoute as r, ComponentRoute as t };
31
+ //# sourceMappingURL=component-route-BYV_X1rA.d.mts.map
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,33 @@
1
+ import { t as __esmMin } from "./chunk-67U6L5Jh.mjs";
2
+
3
+ //#region src/middleware/component-router.ts
4
+ /**
5
+ * 扁平化嵌套组件路由
6
+ */
7
+ function flattenComponentRoutes(routes) {
8
+ const flattened = [];
9
+ function processRoute(route, parentPath = "", parentMiddleware = []) {
10
+ const currentPath = parentPath + route.path;
11
+ const currentMiddleware = [...parentMiddleware, ...route.middleware || []];
12
+ if ("component" in route) flattened.push({
13
+ ...route,
14
+ fullPath: currentPath,
15
+ middlewareChain: currentMiddleware
16
+ });
17
+ else if ("children" in route && route.children) for (const child of route.children) processRoute(child, currentPath, currentMiddleware);
18
+ }
19
+ for (const route of routes) processRoute(route);
20
+ return flattened;
21
+ }
22
+ var componentRouter;
23
+ var init_component_router = __esmMin((() => {
24
+ componentRouter = () => {
25
+ return async (req, next) => {
26
+ return next();
27
+ };
28
+ };
29
+ }));
30
+
31
+ //#endregion
32
+ export { flattenComponentRoutes as n, init_component_router as r, componentRouter as t };
33
+ //# sourceMappingURL=component-router-DXUXLp1R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-router-DXUXLp1R.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"}
@@ -0,0 +1,124 @@
1
+ import { t as __esmMin } from "./chunk-67U6L5Jh.mjs";
2
+ import { n as init_base_server, t as BaseServer } from "./base-server-Bq4_lJWK.mjs";
3
+ import { n as flattenComponentRoutes, r as init_component_router } from "./component-router-DXUXLp1R.mjs";
4
+ import { n as init_path_matcher, t as PathMatcher } from "./path-matcher-CXMJ-IrG.mjs";
5
+ import { n as init_html_renderer, t as HtmlRenderer } from "./html-renderer-CJ3B2Hft.mjs";
6
+ import { n as init_dependency_manager, t as DependencyManager } from "./dependency-manager-CPkwMI7J.mjs";
7
+
8
+ //#region src/server/component-server.ts
9
+ var ComponentServer;
10
+ var init_component_server = __esmMin((() => {
11
+ init_component_router();
12
+ init_base_server();
13
+ init_path_matcher();
14
+ init_html_renderer();
15
+ init_dependency_manager();
16
+ ComponentServer = class extends BaseServer {
17
+ routes;
18
+ dependencyManager;
19
+ constructor(routes) {
20
+ super();
21
+ this.routes = flattenComponentRoutes(routes);
22
+ this.dependencyManager = new DependencyManager();
23
+ this.detectRouteConflicts(this.routes);
24
+ this.logFlattenedRoutes(this.routes, "组件路由");
25
+ console.log("🚀 依赖按需加载,服务器启动完成");
26
+ }
27
+ /**
28
+ * 处理请求
29
+ */
30
+ async fetch(req) {
31
+ const url = new URL(req.url);
32
+ const pathname = url.pathname;
33
+ if (req.method !== "GET") return new Response("Method Not Allowed", { status: 405 });
34
+ let matchedRoute = null;
35
+ for (const route of this.routes) if (PathMatcher.matchPath(route.fullPath, pathname)) {
36
+ matchedRoute = route;
37
+ break;
38
+ }
39
+ if (!matchedRoute) return new Response("Not Found", { status: 404 });
40
+ try {
41
+ const context = {
42
+ req,
43
+ params: PathMatcher.extractParams(matchedRoute.fullPath, pathname),
44
+ query: Object.fromEntries(url.searchParams),
45
+ pathname
46
+ };
47
+ return await this.executeMiddlewareChain(matchedRoute.middlewareChain, context, matchedRoute.component);
48
+ } catch (error) {
49
+ console.error("组件渲染失败:", error);
50
+ return new Response("Internal Server Error", { status: 500 });
51
+ }
52
+ }
53
+ /**
54
+ * 执行中间件链
55
+ */
56
+ async executeMiddlewareChain(middlewareChain, context, componentImport) {
57
+ const renderComponent = async () => {
58
+ const componentModule = await componentImport();
59
+ const component = componentModule.default || componentModule;
60
+ const componentType = this.dependencyManager.detectComponentType(component);
61
+ const deps = await this.dependencyManager.getFrameworkDeps(componentType);
62
+ if (componentType === "vue") return await this.renderVueComponent(component, context, deps);
63
+ else if (componentType === "react") return await this.renderReactComponent(component, context, deps);
64
+ else throw new Error(`不支持的组件类型: ${componentType}`);
65
+ };
66
+ let index = 0;
67
+ const next = async () => {
68
+ if (index >= middlewareChain.length) return await renderComponent();
69
+ const middleware = middlewareChain[index++];
70
+ return await middleware(context.req, next);
71
+ };
72
+ return await next();
73
+ }
74
+ /**
75
+ * 渲染 Vue 组件
76
+ */
77
+ async renderVueComponent(component, context, deps) {
78
+ try {
79
+ const [vue, renderer] = deps;
80
+ const app = vue.createSSRApp(component);
81
+ app.provide("routeInfo", {
82
+ params: context.params || {},
83
+ query: context.query || {},
84
+ pathname: context.pathname
85
+ });
86
+ const html = await renderer.renderToString(app);
87
+ const fullHtml = HtmlRenderer.generateVueHtml(html, context);
88
+ return new Response(fullHtml, { headers: { "Content-Type": "text/html; charset=utf-8" } });
89
+ } catch (error) {
90
+ console.error("Vue 组件渲染失败:", error);
91
+ return new Response("Vue Component Render Error", { status: 500 });
92
+ }
93
+ }
94
+ /**
95
+ * 渲染 React 组件
96
+ */
97
+ async renderReactComponent(component, context, deps) {
98
+ try {
99
+ const [react, renderer] = deps;
100
+ const content = react.createElement(component, {
101
+ req: context.req,
102
+ params: context.params || {},
103
+ query: context.query || {}
104
+ });
105
+ const html = renderer.renderToString(content);
106
+ const fullHtml = HtmlRenderer.generateReactHtml(html, context);
107
+ return new Response(fullHtml, { headers: { "Content-Type": "text/html; charset=utf-8" } });
108
+ } catch (error) {
109
+ console.error("React 组件渲染失败:", error);
110
+ return new Response("React Component Render Error", { status: 500 });
111
+ }
112
+ }
113
+ /**
114
+ * 获取依赖管理器(用于外部访问)
115
+ */
116
+ getDependencyManager() {
117
+ return this.dependencyManager;
118
+ }
119
+ };
120
+ }));
121
+
122
+ //#endregion
123
+ export { init_component_server as n, ComponentServer as t };
124
+ //# sourceMappingURL=component-server-ARXvZJUQ.mjs.map