vafast 0.4.1 → 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 -23
  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 -2575
  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 -1484
  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 -1451
  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 -229
  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 -41
  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 -1156
  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 -1153
  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 -734
  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
@@ -1,1484 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __esm = (fn, res) => function __init() {
6
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
- };
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
-
22
- // src/router.ts
23
- function flattenNestedRoutes(routes) {
24
- const flattened = [];
25
- function processRoute(route, parentPath = "", parentMiddleware = []) {
26
- const currentPath = normalizePath(parentPath + route.path);
27
- const currentMiddleware = [
28
- ...parentMiddleware,
29
- ...route.middleware || []
30
- ];
31
- if ("method" in route && "handler" in route) {
32
- const leafRoute = route;
33
- flattened.push({
34
- ...leafRoute,
35
- fullPath: currentPath,
36
- middlewareChain: currentMiddleware
37
- });
38
- } else if ("children" in route && route.children) {
39
- for (const child of route.children) {
40
- processRoute(child, currentPath, currentMiddleware);
41
- }
42
- }
43
- }
44
- for (const route of routes) {
45
- processRoute(route);
46
- }
47
- return flattened;
48
- }
49
- function normalizePath(path) {
50
- let normalized = decodeURIComponent(path);
51
- normalized = normalized.replace(/\/+/g, "/");
52
- if (normalized === "") return "/";
53
- if (normalized !== "/" && normalized.endsWith("/")) {
54
- normalized = normalized.slice(0, -1);
55
- }
56
- return normalized;
57
- }
58
- var init_router = __esm({
59
- "src/router.ts"() {
60
- "use strict";
61
- }
62
- });
63
-
64
- // src/utils/response.ts
65
- function json(data, status = 200, headers = {}) {
66
- const body = JSON.stringify(data);
67
- if (Object.keys(headers).length === 0) {
68
- return new Response(body, {
69
- status,
70
- headers: { "Content-Type": "application/json" }
71
- });
72
- }
73
- const h = new Headers({
74
- "Content-Type": "application/json",
75
- ...headers
76
- });
77
- return new Response(body, {
78
- status,
79
- headers: h
80
- });
81
- }
82
- function mapResponse(response) {
83
- if (response instanceof Response) return response;
84
- switch (response?.constructor?.name) {
85
- case "String":
86
- return new Response(response, { headers: TEXT_HEADERS });
87
- case "Object":
88
- case "Array":
89
- return new Response(JSON.stringify(response), { headers: JSON_HEADERS });
90
- case "Number":
91
- case "Boolean":
92
- return new Response(String(response), { headers: TEXT_HEADERS });
93
- case void 0:
94
- return new Response(null, { status: 204 });
95
- case "ReadableStream":
96
- return new Response(response);
97
- case "Blob":
98
- return new Response(response);
99
- case "ArrayBuffer":
100
- return new Response(response);
101
- case "Uint8Array":
102
- return new Response(response);
103
- default:
104
- if (response instanceof Promise) {
105
- return response.then(mapResponse);
106
- }
107
- return new Response(JSON.stringify(response), { headers: JSON_HEADERS });
108
- }
109
- }
110
- var JSON_HEADERS, TEXT_HEADERS;
111
- var init_response = __esm({
112
- "src/utils/response.ts"() {
113
- "use strict";
114
- JSON_HEADERS = { "Content-Type": "application/json" };
115
- TEXT_HEADERS = { "Content-Type": "text/plain" };
116
- }
117
- });
118
-
119
- // src/middleware.ts
120
- function composeMiddleware(middleware, finalHandler) {
121
- const all = [errorHandler, ...middleware];
122
- return function composedHandler(req) {
123
- let i = -1;
124
- const dispatch = (index) => {
125
- if (index <= i)
126
- return Promise.reject(new Error("next() called multiple times"));
127
- i = index;
128
- if (index < all.length) {
129
- const mw = all[index];
130
- return Promise.resolve(mw(req, () => dispatch(index + 1)));
131
- }
132
- return Promise.resolve(finalHandler(req)).then(mapResponse);
133
- };
134
- return dispatch(0);
135
- };
136
- }
137
- var VafastError, errorHandler;
138
- var init_middleware = __esm({
139
- "src/middleware.ts"() {
140
- "use strict";
141
- init_response();
142
- VafastError = class extends Error {
143
- status;
144
- type;
145
- expose;
146
- constructor(message, options = {}) {
147
- super(message);
148
- this.name = "VafastError";
149
- this.status = options.status ?? 500;
150
- this.type = options.type ?? "internal_error";
151
- this.expose = options.expose ?? false;
152
- if (options.cause) this.cause = options.cause;
153
- }
154
- };
155
- errorHandler = async (req, next) => {
156
- try {
157
- return await next();
158
- } catch (err) {
159
- console.error("\u672A\u5904\u7406\u7684\u9519\u8BEF:", err);
160
- if (err instanceof VafastError) {
161
- return json(
162
- {
163
- error: err.type,
164
- message: err.expose ? err.message : "\u53D1\u751F\u4E86\u4E00\u4E2A\u9519\u8BEF"
165
- },
166
- err.status
167
- );
168
- }
169
- return json({ error: "internal_error", message: "\u51FA\u73B0\u4E86\u4E00\u4E9B\u95EE\u9898" }, 500);
170
- }
171
- };
172
- }
173
- });
174
-
175
- // src/server/base-server.ts
176
- var BaseServer;
177
- var init_base_server = __esm({
178
- "src/server/base-server.ts"() {
179
- "use strict";
180
- BaseServer = class {
181
- globalMiddleware = [];
182
- use(mw) {
183
- this.globalMiddleware.push(mw);
184
- }
185
- /**
186
- * 打印扁平化后的路由信息,用于调试
187
- */
188
- logFlattenedRoutes(routes, type = "\u8DEF\u7531") {
189
- console.log(`\u{1F680} \u6241\u5E73\u5316\u540E\u7684${type}:`);
190
- for (const route of routes) {
191
- const method = route.method || "GET";
192
- const path = route.fullPath || route.path;
193
- console.log(` ${method} ${path}`);
194
- if (route.middlewareChain && route.middlewareChain.length > 0) {
195
- console.log(` \u4E2D\u95F4\u4EF6\u94FE: ${route.middlewareChain.length} \u4E2A`);
196
- }
197
- }
198
- console.log("");
199
- }
200
- /**
201
- * 检测路由冲突
202
- * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突
203
- */
204
- detectRouteConflicts(routes) {
205
- const pathGroups = /* @__PURE__ */ new Map();
206
- for (const route of routes) {
207
- const path = route.fullPath || route.path;
208
- const method = route.method || "GET";
209
- if (!pathGroups.has(path)) {
210
- pathGroups.set(path, []);
211
- }
212
- pathGroups.get(path).push({ ...route, method });
213
- }
214
- for (const [path, routeList] of pathGroups) {
215
- if (routeList.length > 1) {
216
- const methods = routeList.map((r) => r.method);
217
- const uniqueMethods = [...new Set(methods)];
218
- if (uniqueMethods.length === 1) {
219
- console.warn(
220
- `\u26A0\uFE0F \u8DEF\u7531\u51B2\u7A81: ${uniqueMethods[0]} ${path} \u5B9A\u4E49\u4E86 ${routeList.length} \u6B21`
221
- );
222
- routeList.forEach((route, index) => {
223
- console.warn(` ${index + 1}. ${route.method} ${path}`);
224
- });
225
- } else {
226
- console.log(`\u2139\uFE0F \u8DEF\u5F84 ${path} \u652F\u6301\u65B9\u6CD5: ${uniqueMethods.join(", ")}`);
227
- }
228
- }
229
- }
230
- this.detectDynamicRouteConflicts(routes);
231
- }
232
- /**
233
- * 检测动态路由的潜在冲突
234
- */
235
- detectDynamicRouteConflicts(routes) {
236
- const dynamicRoutes = routes.filter((r) => {
237
- const path = r.fullPath || r.path;
238
- return path.includes(":") || path.includes("*");
239
- });
240
- for (let i = 0; i < dynamicRoutes.length; i++) {
241
- for (let j = i + 1; j < dynamicRoutes.length; j++) {
242
- const route1 = dynamicRoutes[i];
243
- const route2 = dynamicRoutes[j];
244
- const method1 = route1.method || "GET";
245
- const method2 = route2.method || "GET";
246
- if (method1 === method2) {
247
- const path1 = route1.fullPath || route1.path;
248
- const path2 = route2.fullPath || route2.path;
249
- if (this.pathsMayConflict(path1, path2)) {
250
- console.warn(
251
- `\u26A0\uFE0F \u6F5C\u5728\u8DEF\u7531\u51B2\u7A81: ${method1} ${path1} \u53EF\u80FD\u4E0E ${path2} \u51B2\u7A81`
252
- );
253
- }
254
- }
255
- }
256
- }
257
- }
258
- /**
259
- * 判断两个路径是否可能冲突
260
- */
261
- pathsMayConflict(path1, path2) {
262
- const parts1 = path1.split("/").filter(Boolean);
263
- const parts2 = path2.split("/").filter(Boolean);
264
- if (parts1.length !== parts2.length) return false;
265
- for (let i = 0; i < parts1.length; i++) {
266
- const p1 = parts1[i];
267
- const p2 = parts2[i];
268
- if (!p1.startsWith(":") && !p1.startsWith("*") && !p2.startsWith(":") && !p2.startsWith("*") && p1 !== p2) {
269
- return false;
270
- }
271
- if (p1 === "*" && p2.startsWith(":") || p2 === "*" && p1.startsWith(":")) {
272
- return true;
273
- }
274
- }
275
- return false;
276
- }
277
- /**
278
- * 路径匹配
279
- */
280
- matchPath(pattern, path) {
281
- const patternParts = pattern.split("/").filter(Boolean);
282
- const pathParts = path.split("/").filter(Boolean);
283
- if (patternParts.length !== pathParts.length) {
284
- return false;
285
- }
286
- for (let i = 0; i < patternParts.length; i++) {
287
- if (patternParts[i] !== pathParts[i] && !patternParts[i].startsWith(":")) {
288
- return false;
289
- }
290
- }
291
- return true;
292
- }
293
- /**
294
- * 提取路径参数
295
- */
296
- extractParams(pattern, path) {
297
- const params = {};
298
- const patternParts = pattern.split("/").filter(Boolean);
299
- const pathParts = path.split("/").filter(Boolean);
300
- for (let i = 0; i < patternParts.length; i++) {
301
- if (patternParts[i].startsWith(":")) {
302
- const paramName = patternParts[i].slice(1);
303
- params[paramName] = pathParts[i];
304
- }
305
- }
306
- return params;
307
- }
308
- };
309
- }
310
- });
311
-
312
- // src/router/radix-tree.ts
313
- var RadixRouter;
314
- var init_radix_tree = __esm({
315
- "src/router/radix-tree.ts"() {
316
- "use strict";
317
- RadixRouter = class {
318
- root;
319
- constructor() {
320
- this.root = this.createNode("");
321
- }
322
- createNode(path) {
323
- return {
324
- path,
325
- children: /* @__PURE__ */ Object.create(null),
326
- handlers: /* @__PURE__ */ Object.create(null)
327
- };
328
- }
329
- /** 分割路径 */
330
- splitPath(path) {
331
- return path.split("/").filter(Boolean);
332
- }
333
- /** 编译器函数 - 用于预编译中间件链 */
334
- compiler;
335
- /** 设置中间件编译器 */
336
- setCompiler(compiler) {
337
- this.compiler = compiler;
338
- }
339
- /** 注册路由 */
340
- register(method, pattern, handler, middleware = []) {
341
- const segments = this.splitPath(pattern);
342
- let node = this.root;
343
- for (const segment of segments) {
344
- const firstChar = segment[0];
345
- if (firstChar === ":") {
346
- if (!node.paramChild) {
347
- node.paramChild = this.createNode(segment);
348
- node.paramChild.paramName = segment.substring(1);
349
- }
350
- node = node.paramChild;
351
- } else if (firstChar === "*") {
352
- if (!node.wildcardChild) {
353
- node.wildcardChild = this.createNode(segment);
354
- node.wildcardChild.paramName = segment.length > 1 ? segment.substring(1) : "*";
355
- }
356
- node = node.wildcardChild;
357
- break;
358
- } else {
359
- if (!node.children[segment]) {
360
- node.children[segment] = this.createNode(segment);
361
- }
362
- node = node.children[segment];
363
- }
364
- }
365
- const routeHandler = { handler, middleware };
366
- if (this.compiler && middleware.length === 0) {
367
- routeHandler.compiled = this.compiler([], handler);
368
- }
369
- node.handlers[method] = routeHandler;
370
- }
371
- /** 预编译所有路由(在添加全局中间件后调用) */
372
- precompileAll(globalMiddleware) {
373
- if (!this.compiler) return;
374
- this.precompileNode(this.root, globalMiddleware);
375
- }
376
- precompileNode(node, globalMiddleware) {
377
- for (const method in node.handlers) {
378
- const routeHandler = node.handlers[method];
379
- if (routeHandler) {
380
- const allMiddleware = [...globalMiddleware, ...routeHandler.middleware];
381
- routeHandler.compiled = this.compiler(
382
- allMiddleware,
383
- routeHandler.handler
384
- );
385
- }
386
- }
387
- for (const key in node.children) {
388
- this.precompileNode(node.children[key], globalMiddleware);
389
- }
390
- if (node.paramChild) {
391
- this.precompileNode(node.paramChild, globalMiddleware);
392
- }
393
- if (node.wildcardChild) {
394
- this.precompileNode(node.wildcardChild, globalMiddleware);
395
- }
396
- }
397
- /** 匹配路由 */
398
- match(method, path) {
399
- const segments = this.splitPath(path);
400
- const params = /* @__PURE__ */ Object.create(null);
401
- const node = this.matchNode(this.root, segments, 0, params);
402
- if (!node) return null;
403
- const routeHandler = node.handlers[method];
404
- if (!routeHandler) return null;
405
- return {
406
- handler: routeHandler.handler,
407
- middleware: routeHandler.middleware,
408
- params,
409
- compiled: routeHandler.compiled
410
- };
411
- }
412
- /** 递归匹配节点 (优先级: 静态 > 动态参数 > 通配符) */
413
- matchNode(node, segments, index, params) {
414
- if (index === segments.length) {
415
- for (const method in node.handlers) {
416
- if (node.handlers[method]) return node;
417
- }
418
- return null;
419
- }
420
- const segment = segments[index];
421
- const staticChild = node.children[segment];
422
- if (staticChild) {
423
- const result = this.matchNode(staticChild, segments, index + 1, params);
424
- if (result) return result;
425
- }
426
- if (node.paramChild) {
427
- const paramName = node.paramChild.paramName;
428
- const oldValue = params[paramName];
429
- params[paramName] = segment;
430
- const result = this.matchNode(
431
- node.paramChild,
432
- segments,
433
- index + 1,
434
- params
435
- );
436
- if (result) return result;
437
- if (oldValue === void 0) {
438
- delete params[paramName];
439
- } else {
440
- params[paramName] = oldValue;
441
- }
442
- }
443
- if (node.wildcardChild) {
444
- params[node.wildcardChild.paramName || "*"] = segments.slice(index).join("/");
445
- return node.wildcardChild;
446
- }
447
- return null;
448
- }
449
- /** 获取路径允许的 HTTP 方法 */
450
- getAllowedMethods(path) {
451
- const segments = this.splitPath(path);
452
- const node = this.findNode(segments);
453
- if (!node) return [];
454
- const methods = [];
455
- for (const method in node.handlers) {
456
- if (node.handlers[method]) {
457
- methods.push(method);
458
- }
459
- }
460
- return methods;
461
- }
462
- /** 查找节点(不提取参数) */
463
- findNode(segments) {
464
- let node = this.root;
465
- for (const segment of segments) {
466
- if (node.children[segment]) {
467
- node = node.children[segment];
468
- } else if (node.paramChild) {
469
- node = node.paramChild;
470
- } else if (node.wildcardChild) {
471
- return node.wildcardChild;
472
- } else {
473
- return null;
474
- }
475
- }
476
- return node;
477
- }
478
- /** 获取所有已注册的路由 */
479
- getRoutes() {
480
- const routes = [];
481
- this.collectRoutes(this.root, "", routes);
482
- return routes;
483
- }
484
- collectRoutes(node, prefix, routes) {
485
- const currentPath = prefix + (node.path ? "/" + node.path : "");
486
- for (const method in node.handlers) {
487
- if (node.handlers[method]) {
488
- routes.push({ method, path: currentPath || "/" });
489
- }
490
- }
491
- for (const key in node.children) {
492
- this.collectRoutes(node.children[key], currentPath, routes);
493
- }
494
- if (node.paramChild) {
495
- this.collectRoutes(node.paramChild, currentPath, routes);
496
- }
497
- if (node.wildcardChild) {
498
- this.collectRoutes(node.wildcardChild, currentPath, routes);
499
- }
500
- }
501
- };
502
- }
503
- });
504
-
505
- // src/utils/route-registry.ts
506
- function setGlobalRegistry(registry) {
507
- globalRegistry = registry;
508
- }
509
- var RouteRegistry, globalRegistry;
510
- var init_route_registry = __esm({
511
- "src/utils/route-registry.ts"() {
512
- "use strict";
513
- RouteRegistry = class {
514
- /** 所有路由元信息 */
515
- routes = [];
516
- /** 路由映射表:METHOD:fullPath -> RouteMeta */
517
- routeMap = /* @__PURE__ */ new Map();
518
- /** 分类映射表:category -> RouteMeta[] */
519
- categoryMap = /* @__PURE__ */ new Map();
520
- constructor(routes) {
521
- this.buildRegistry(routes);
522
- }
523
- /**
524
- * 构建注册表
525
- */
526
- buildRegistry(routes) {
527
- for (const route of routes) {
528
- const meta = {
529
- method: route.method,
530
- path: route.path,
531
- fullPath: route.fullPath,
532
- name: route.name,
533
- description: route.description
534
- };
535
- for (const key of Object.keys(route)) {
536
- if (!["method", "path", "fullPath", "name", "description", "handler", "middleware", "middlewareChain"].includes(key)) {
537
- meta[key] = route[key];
538
- }
539
- }
540
- this.routes.push(meta);
541
- this.routeMap.set(`${route.method}:${route.fullPath}`, meta);
542
- const category = this.extractCategory(route.fullPath);
543
- if (!this.categoryMap.has(category)) {
544
- this.categoryMap.set(category, []);
545
- }
546
- this.categoryMap.get(category).push(meta);
547
- }
548
- }
549
- /**
550
- * 提取分类(第一段路径)
551
- */
552
- extractCategory(path) {
553
- const segments = path.split("/").filter(Boolean);
554
- return segments[0] || "root";
555
- }
556
- // ============================================
557
- // 查询接口
558
- // ============================================
559
- /**
560
- * 获取所有路由元信息
561
- */
562
- getAll() {
563
- return [...this.routes];
564
- }
565
- /**
566
- * 按 method + path 查询路由
567
- */
568
- get(method, path) {
569
- return this.routeMap.get(`${method}:${path}`);
570
- }
571
- /**
572
- * 检查路由是否存在
573
- */
574
- has(method, path) {
575
- return this.routeMap.has(`${method}:${path}`);
576
- }
577
- /**
578
- * 按分类获取路由
579
- */
580
- getByCategory(category) {
581
- return this.categoryMap.get(category) || [];
582
- }
583
- /**
584
- * 获取所有分类
585
- */
586
- getCategories() {
587
- return Array.from(this.categoryMap.keys()).sort();
588
- }
589
- /**
590
- * 筛选有特定字段的路由
591
- *
592
- * @example
593
- * ```typescript
594
- * // 获取所有配置了 webhook 的路由
595
- * const webhookRoutes = registry.filter('webhook')
596
- * ```
597
- */
598
- filter(field) {
599
- return this.routes.filter((r) => field in r && r[field] !== void 0);
600
- }
601
- /**
602
- * 按条件筛选路由
603
- *
604
- * @example
605
- * ```typescript
606
- * // 获取所有 POST 请求
607
- * const postRoutes = registry.filterBy(r => r.method === 'POST')
608
- * ```
609
- */
610
- filterBy(predicate) {
611
- return this.routes.filter(predicate);
612
- }
613
- /**
614
- * 获取路由数量
615
- */
616
- get size() {
617
- return this.routes.length;
618
- }
619
- /**
620
- * 遍历所有路由
621
- */
622
- forEach(callback) {
623
- this.routes.forEach(callback);
624
- }
625
- /**
626
- * 映射所有路由
627
- */
628
- map(callback) {
629
- return this.routes.map(callback);
630
- }
631
- };
632
- globalRegistry = null;
633
- }
634
- });
635
-
636
- // src/server/server.ts
637
- var Server;
638
- var init_server = __esm({
639
- "src/server/server.ts"() {
640
- "use strict";
641
- init_router();
642
- init_middleware();
643
- init_response();
644
- init_base_server();
645
- init_radix_tree();
646
- init_route_registry();
647
- Server = class extends BaseServer {
648
- router;
649
- routes;
650
- /** 是否已预编译 */
651
- isCompiled = false;
652
- /** 预编译时的全局中间件数量 */
653
- compiledWithMiddlewareCount = 0;
654
- constructor(routes = []) {
655
- super();
656
- this.router = new RadixRouter();
657
- this.routes = [];
658
- this.router.setCompiler(
659
- (middleware, handler) => composeMiddleware(middleware, handler)
660
- );
661
- if (routes.length > 0) {
662
- this.registerRoutes(routes);
663
- }
664
- }
665
- /**
666
- * 预编译所有路由处理链
667
- * 在添加所有路由和全局中间件后调用,可提升运行时性能
668
- */
669
- compile() {
670
- this.router.precompileAll(this.globalMiddleware);
671
- this.isCompiled = true;
672
- this.compiledWithMiddlewareCount = this.globalMiddleware.length;
673
- return this;
674
- }
675
- registerRoutes(routes) {
676
- const flattened = flattenNestedRoutes(routes);
677
- this.routes.push(...flattened);
678
- for (const route of flattened) {
679
- this.router.register(
680
- route.method,
681
- route.fullPath,
682
- route.handler,
683
- route.middlewareChain || []
684
- );
685
- }
686
- this.detectRouteConflicts(flattened);
687
- this.logFlattenedRoutes(flattened);
688
- if (this.globalMiddleware.length === 0 && !this.isCompiled) {
689
- this.compile();
690
- }
691
- setGlobalRegistry(new RouteRegistry(this.routes));
692
- }
693
- /** 快速提取 pathname */
694
- extractPathname(url) {
695
- let start = url.indexOf("://");
696
- start = start === -1 ? 0 : start + 3;
697
- const pathStart = url.indexOf("/", start);
698
- if (pathStart === -1) return "/";
699
- let end = url.indexOf("?", pathStart);
700
- if (end === -1) end = url.indexOf("#", pathStart);
701
- if (end === -1) end = url.length;
702
- return url.substring(pathStart, end) || "/";
703
- }
704
- /** 生成 404/405 响应 */
705
- createErrorResponse(method, pathname) {
706
- const allowedMethods = this.router.getAllowedMethods(pathname);
707
- if (allowedMethods.length > 0) {
708
- return json(
709
- {
710
- success: false,
711
- error: "Method Not Allowed",
712
- message: `Method ${method} not allowed for this endpoint`,
713
- allowedMethods
714
- },
715
- 405,
716
- { Allow: allowedMethods.join(", ") }
717
- );
718
- }
719
- return json({ success: false, error: "Not Found" }, 404);
720
- }
721
- /** 处理请求 */
722
- fetch = async (req) => {
723
- const pathname = this.extractPathname(req.url);
724
- const method = req.method;
725
- const match = this.router.match(method, pathname);
726
- if (match) {
727
- req.params = match.params;
728
- if (match.compiled && this.globalMiddleware.length === this.compiledWithMiddlewareCount) {
729
- return match.compiled(req);
730
- }
731
- const allMiddleware = [...this.globalMiddleware, ...match.middleware];
732
- const handler = composeMiddleware(allMiddleware, match.handler);
733
- return handler(req);
734
- }
735
- if (method === "OPTIONS") {
736
- const allowedMethods = this.router.getAllowedMethods(pathname);
737
- if (allowedMethods.length > 0) {
738
- const anyMatch = this.router.match(
739
- allowedMethods[0],
740
- pathname
741
- );
742
- const routeMiddleware = anyMatch?.middleware || [];
743
- const allMiddleware = [...this.globalMiddleware, ...routeMiddleware];
744
- const optionsHandler = () => new Response(null, {
745
- status: 204,
746
- headers: { Allow: allowedMethods.join(", ") }
747
- });
748
- const handler = composeMiddleware(allMiddleware, optionsHandler);
749
- return handler(req);
750
- }
751
- }
752
- if (this.globalMiddleware.length > 0) {
753
- const handler = composeMiddleware(
754
- this.globalMiddleware,
755
- () => this.createErrorResponse(method, pathname)
756
- );
757
- return handler(req);
758
- }
759
- return this.createErrorResponse(method, pathname);
760
- };
761
- addRoute(route) {
762
- const flattenedRoute = {
763
- ...route,
764
- fullPath: route.path,
765
- middlewareChain: route.middleware || []
766
- };
767
- this.routes.push(flattenedRoute);
768
- this.router.register(
769
- route.method,
770
- route.path,
771
- route.handler,
772
- route.middleware || []
773
- );
774
- }
775
- addRoutes(routes) {
776
- this.registerRoutes(routes);
777
- }
778
- getRoutes() {
779
- return this.router.getRoutes();
780
- }
781
- /**
782
- * 获取完整的路由元信息(不含 handler 和 middleware)
783
- *
784
- * 用于 API 文档生成、Webhook 事件注册、权限检查等场景
785
- *
786
- * @example
787
- * ```typescript
788
- * const routes = server.getRoutesWithMeta()
789
- * for (const route of routes) {
790
- * console.log(route.fullPath, route.name, route.description)
791
- * }
792
- * ```
793
- */
794
- getRoutesWithMeta() {
795
- return this.routes;
796
- }
797
- };
798
- }
799
- });
800
-
801
- // src/middleware/component-router.ts
802
- function flattenComponentRoutes(routes) {
803
- const flattened = [];
804
- function processRoute(route, parentPath = "", parentMiddleware = []) {
805
- const currentPath = parentPath + route.path;
806
- const currentMiddleware = [
807
- ...parentMiddleware,
808
- ...route.middleware || []
809
- ];
810
- if ("component" in route) {
811
- flattened.push({
812
- ...route,
813
- fullPath: currentPath,
814
- middlewareChain: currentMiddleware
815
- });
816
- } else if ("children" in route && route.children) {
817
- for (const child of route.children) {
818
- processRoute(child, currentPath, currentMiddleware);
819
- }
820
- }
821
- }
822
- for (const route of routes) {
823
- processRoute(route);
824
- }
825
- return flattened;
826
- }
827
- var init_component_router = __esm({
828
- "src/middleware/component-router.ts"() {
829
- "use strict";
830
- }
831
- });
832
-
833
- // src/utils/path-matcher.ts
834
- var PathMatcher;
835
- var init_path_matcher = __esm({
836
- "src/utils/path-matcher.ts"() {
837
- "use strict";
838
- PathMatcher = class {
839
- /**
840
- * 路径匹配
841
- */
842
- static matchPath(pattern, path) {
843
- const patternParts = pattern.split("/").filter(Boolean);
844
- const pathParts = path.split("/").filter(Boolean);
845
- if (patternParts.length !== pathParts.length) {
846
- return false;
847
- }
848
- for (let i = 0; i < patternParts.length; i++) {
849
- if (patternParts[i] !== pathParts[i] && !patternParts[i].startsWith(":")) {
850
- return false;
851
- }
852
- }
853
- return true;
854
- }
855
- /**
856
- * 提取路径参数
857
- */
858
- static extractParams(pattern, path) {
859
- const params = {};
860
- const patternParts = pattern.split("/").filter(Boolean);
861
- const pathParts = path.split("/").filter(Boolean);
862
- for (let i = 0; i < patternParts.length; i++) {
863
- if (patternParts[i].startsWith(":")) {
864
- const paramName = patternParts[i].slice(1);
865
- params[paramName] = pathParts[i];
866
- }
867
- }
868
- return params;
869
- }
870
- /**
871
- * 计算路径特异性分数
872
- * 用于路由排序:静态 > 动态(:param) > 通配符(*)
873
- */
874
- static calculatePathScore(path) {
875
- const parts = path.split("/").filter(Boolean);
876
- let score = 0;
877
- for (const p of parts) {
878
- if (p === "*")
879
- score += 1;
880
- else if (p.startsWith(":"))
881
- score += 2;
882
- else score += 3;
883
- }
884
- return score * 10 + parts.length;
885
- }
886
- /**
887
- * 判断两个路径是否可能冲突
888
- */
889
- static pathsMayConflict(path1, path2) {
890
- const parts1 = path1.split("/").filter(Boolean);
891
- const parts2 = path2.split("/").filter(Boolean);
892
- if (parts1.length !== parts2.length) return false;
893
- for (let i = 0; i < parts1.length; i++) {
894
- const p1 = parts1[i];
895
- const p2 = parts2[i];
896
- if (!p1.startsWith(":") && !p1.startsWith("*") && !p2.startsWith(":") && !p2.startsWith("*") && p1 !== p2) {
897
- return false;
898
- }
899
- if (p1 === "*" && p2.startsWith(":") || p2 === "*" && p1.startsWith(":")) {
900
- return true;
901
- }
902
- }
903
- return false;
904
- }
905
- };
906
- }
907
- });
908
-
909
- // src/utils/html-renderer.ts
910
- var HtmlRenderer;
911
- var init_html_renderer = __esm({
912
- "src/utils/html-renderer.ts"() {
913
- "use strict";
914
- HtmlRenderer = class {
915
- /**
916
- * 生成基础HTML模板
917
- */
918
- static generateBaseHtml(content, context, clientScriptPath = "/client.js") {
919
- return `
920
- <!doctype html>
921
- <html>
922
- <head>
923
- <meta charset="utf-8">
924
- <title>Vafast SSR App</title>
925
- <meta name="viewport" content="width=device-width, initial-scale=1">
926
- </head>
927
- <body>
928
- <div id="app">${content}</div>
929
- <script>
930
- window.__ROUTE_INFO__ = {
931
- params: ${JSON.stringify(context.params || {})},
932
- query: ${JSON.stringify(context.query || {})},
933
- pathname: '${context.pathname}'
934
- };
935
- </script>
936
- <script type="module" src="${clientScriptPath}"></script>
937
- </body>
938
- </html>
939
- `;
940
- }
941
- /**
942
- * 生成Vue组件HTML
943
- */
944
- static generateVueHtml(content, context, clientScriptPath = "/client.js") {
945
- return this.generateBaseHtml(content, context, clientScriptPath);
946
- }
947
- /**
948
- * 生成React组件HTML
949
- */
950
- static generateReactHtml(content, context, clientScriptPath = "/client.js") {
951
- return `
952
- <!doctype html>
953
- <html>
954
- <head>
955
- <meta charset="utf-8">
956
- <title>Vafast SSR App</title>
957
- <meta name="viewport" content="width=device-width, initial-scale=1">
958
- </head>
959
- <body>
960
- <div id="root">${content}</div>
961
- <script>
962
- window.__ROUTE_INFO__ = {
963
- params: ${JSON.stringify(context.params || {})},
964
- query: ${JSON.stringify(context.query || {})},
965
- pathname: '${context.pathname}'
966
- };
967
- </script>
968
- <script type="module" src="${clientScriptPath}"></script>
969
- </body>
970
- </html>
971
- `;
972
- }
973
- };
974
- }
975
- });
976
-
977
- // src/utils/dependency-manager.ts
978
- var DependencyManager;
979
- var init_dependency_manager = __esm({
980
- "src/utils/dependency-manager.ts"() {
981
- "use strict";
982
- DependencyManager = class {
983
- dependencyCache = /* @__PURE__ */ new Map();
984
- /**
985
- * 按需获取框架依赖
986
- */
987
- async getFrameworkDeps(framework) {
988
- if (this.dependencyCache.has(framework)) {
989
- return this.dependencyCache.get(framework);
990
- }
991
- console.log(`\u{1F4E6} \u6309\u9700\u52A0\u8F7D ${framework} \u4F9D\u8D56...`);
992
- try {
993
- let deps;
994
- switch (framework) {
995
- case "vue":
996
- deps = await Promise.all([
997
- import("vue"),
998
- import("@vue/server-renderer")
999
- ]);
1000
- break;
1001
- case "react":
1002
- deps = await Promise.all([
1003
- import("react"),
1004
- import("react-dom/server")
1005
- ]);
1006
- break;
1007
- default:
1008
- throw new Error(`\u4E0D\u652F\u6301\u7684\u6846\u67B6: ${framework}`);
1009
- }
1010
- this.dependencyCache.set(framework, deps);
1011
- console.log(`\u2705 ${framework} \u4F9D\u8D56\u52A0\u8F7D\u5B8C\u6210`);
1012
- return deps;
1013
- } catch (error) {
1014
- console.error(`\u274C ${framework} \u4F9D\u8D56\u52A0\u8F7D\u5931\u8D25:`, error);
1015
- throw error;
1016
- }
1017
- }
1018
- /**
1019
- * 检测组件类型
1020
- */
1021
- detectComponentType(component) {
1022
- if (component.render && typeof component.render === "function") {
1023
- return "vue";
1024
- }
1025
- if (component.$$typeof) {
1026
- return "react";
1027
- }
1028
- return "vue";
1029
- }
1030
- /**
1031
- * 清除缓存
1032
- */
1033
- clearCache() {
1034
- this.dependencyCache.clear();
1035
- console.log("\u{1F9F9} \u4F9D\u8D56\u7F13\u5B58\u5DF2\u6E05\u9664");
1036
- }
1037
- /**
1038
- * 获取缓存状态
1039
- */
1040
- getCacheStatus() {
1041
- const status = {};
1042
- for (const [framework] of this.dependencyCache) {
1043
- status[framework] = true;
1044
- }
1045
- return status;
1046
- }
1047
- };
1048
- }
1049
- });
1050
-
1051
- // src/server/component-server.ts
1052
- var ComponentServer;
1053
- var init_component_server = __esm({
1054
- "src/server/component-server.ts"() {
1055
- "use strict";
1056
- init_component_router();
1057
- init_base_server();
1058
- init_path_matcher();
1059
- init_html_renderer();
1060
- init_dependency_manager();
1061
- ComponentServer = class extends BaseServer {
1062
- routes;
1063
- dependencyManager;
1064
- constructor(routes) {
1065
- super();
1066
- this.routes = flattenComponentRoutes(routes);
1067
- this.dependencyManager = new DependencyManager();
1068
- this.detectRouteConflicts(this.routes);
1069
- this.logFlattenedRoutes(this.routes, "\u7EC4\u4EF6\u8DEF\u7531");
1070
- console.log("\u{1F680} \u4F9D\u8D56\u6309\u9700\u52A0\u8F7D\uFF0C\u670D\u52A1\u5668\u542F\u52A8\u5B8C\u6210");
1071
- }
1072
- /**
1073
- * 处理请求
1074
- */
1075
- async fetch(req) {
1076
- const url = new URL(req.url);
1077
- const pathname = url.pathname;
1078
- const method = req.method;
1079
- if (method !== "GET") {
1080
- return new Response("Method Not Allowed", { status: 405 });
1081
- }
1082
- let matchedRoute = null;
1083
- for (const route of this.routes) {
1084
- if (PathMatcher.matchPath(route.fullPath, pathname)) {
1085
- matchedRoute = route;
1086
- break;
1087
- }
1088
- }
1089
- if (!matchedRoute) {
1090
- return new Response("Not Found", { status: 404 });
1091
- }
1092
- try {
1093
- const context = {
1094
- req,
1095
- params: PathMatcher.extractParams(matchedRoute.fullPath, pathname),
1096
- query: Object.fromEntries(url.searchParams),
1097
- pathname
1098
- };
1099
- return await this.executeMiddlewareChain(
1100
- matchedRoute.middlewareChain,
1101
- context,
1102
- matchedRoute.component
1103
- );
1104
- } catch (error) {
1105
- console.error("\u7EC4\u4EF6\u6E32\u67D3\u5931\u8D25:", error);
1106
- return new Response("Internal Server Error", { status: 500 });
1107
- }
1108
- }
1109
- /**
1110
- * 执行中间件链
1111
- */
1112
- async executeMiddlewareChain(middlewareChain, context, componentImport) {
1113
- const renderComponent = async () => {
1114
- const componentModule = await componentImport();
1115
- const component = componentModule.default || componentModule;
1116
- const componentType = this.dependencyManager.detectComponentType(component);
1117
- const deps = await this.dependencyManager.getFrameworkDeps(componentType);
1118
- if (componentType === "vue") {
1119
- return await this.renderVueComponent(component, context, deps);
1120
- } else if (componentType === "react") {
1121
- return await this.renderReactComponent(component, context, deps);
1122
- } else {
1123
- throw new Error(`\u4E0D\u652F\u6301\u7684\u7EC4\u4EF6\u7C7B\u578B: ${componentType}`);
1124
- }
1125
- };
1126
- let index = 0;
1127
- const next = async () => {
1128
- if (index >= middlewareChain.length) {
1129
- return await renderComponent();
1130
- }
1131
- const middleware = middlewareChain[index++];
1132
- return await middleware(context.req, next);
1133
- };
1134
- return await next();
1135
- }
1136
- /**
1137
- * 渲染 Vue 组件
1138
- */
1139
- async renderVueComponent(component, context, deps) {
1140
- try {
1141
- const [vue, renderer] = deps;
1142
- const app = vue.createSSRApp(component);
1143
- app.provide("routeInfo", {
1144
- params: context.params || {},
1145
- query: context.query || {},
1146
- pathname: context.pathname
1147
- });
1148
- const html = await renderer.renderToString(app);
1149
- const fullHtml = HtmlRenderer.generateVueHtml(html, context);
1150
- return new Response(fullHtml, {
1151
- headers: { "Content-Type": "text/html; charset=utf-8" }
1152
- });
1153
- } catch (error) {
1154
- console.error("Vue \u7EC4\u4EF6\u6E32\u67D3\u5931\u8D25:", error);
1155
- return new Response("Vue Component Render Error", { status: 500 });
1156
- }
1157
- }
1158
- /**
1159
- * 渲染 React 组件
1160
- */
1161
- async renderReactComponent(component, context, deps) {
1162
- try {
1163
- const [react, renderer] = deps;
1164
- const content = react.createElement(component, {
1165
- req: context.req,
1166
- params: context.params || {},
1167
- query: context.query || {}
1168
- });
1169
- const html = renderer.renderToString(content);
1170
- const fullHtml = HtmlRenderer.generateReactHtml(html, context);
1171
- return new Response(fullHtml, {
1172
- headers: { "Content-Type": "text/html; charset=utf-8" }
1173
- });
1174
- } catch (error) {
1175
- console.error("React \u7EC4\u4EF6\u6E32\u67D3\u5931\u8D25:", error);
1176
- return new Response("React Component Render Error", { status: 500 });
1177
- }
1178
- }
1179
- /**
1180
- * 获取依赖管理器(用于外部访问)
1181
- */
1182
- getDependencyManager() {
1183
- return this.dependencyManager;
1184
- }
1185
- };
1186
- }
1187
- });
1188
-
1189
- // src/server/server-factory.ts
1190
- var ServerFactory;
1191
- var init_server_factory = __esm({
1192
- "src/server/server-factory.ts"() {
1193
- "use strict";
1194
- init_server2();
1195
- init_component_server();
1196
- ServerFactory = class {
1197
- servers = /* @__PURE__ */ new Map();
1198
- /**
1199
- * 创建标准REST API服务器
1200
- */
1201
- createRestServer(routes) {
1202
- const server = new Server(routes);
1203
- this.servers.set("rest", server);
1204
- return server;
1205
- }
1206
- /**
1207
- * 创建组件服务器
1208
- */
1209
- createComponentServer(routes) {
1210
- const server = new ComponentServer(routes);
1211
- this.servers.set("component", server);
1212
- return server;
1213
- }
1214
- /**
1215
- * 获取指定类型的服务器
1216
- */
1217
- getServer(type) {
1218
- return this.servers.get(type);
1219
- }
1220
- /**
1221
- * 获取所有服务器
1222
- */
1223
- getAllServers() {
1224
- return this.servers;
1225
- }
1226
- /**
1227
- * 移除指定类型的服务器
1228
- */
1229
- removeServer(type) {
1230
- return this.servers.delete(type);
1231
- }
1232
- /**
1233
- * 清除所有服务器
1234
- */
1235
- clearServers() {
1236
- this.servers.clear();
1237
- }
1238
- /**
1239
- * 获取服务器状态信息
1240
- */
1241
- getServerStatus() {
1242
- const status = {};
1243
- for (const [name, server] of this.servers) {
1244
- if (server instanceof Server) {
1245
- status[name] = {
1246
- type: "REST API",
1247
- routes: server.routes?.length || 0
1248
- };
1249
- } else if (server instanceof ComponentServer) {
1250
- status[name] = {
1251
- type: "Component",
1252
- routes: server.routes?.length || 0
1253
- };
1254
- }
1255
- }
1256
- return status;
1257
- }
1258
- };
1259
- }
1260
- });
1261
-
1262
- // src/server/index.ts
1263
- var server_exports = {};
1264
- __export(server_exports, {
1265
- BaseServer: () => BaseServer,
1266
- ComponentServer: () => ComponentServer,
1267
- Server: () => Server,
1268
- ServerFactory: () => ServerFactory
1269
- });
1270
- var init_server2 = __esm({
1271
- "src/server/index.ts"() {
1272
- "use strict";
1273
- init_server();
1274
- init_component_server();
1275
- init_server_factory();
1276
- init_base_server();
1277
- }
1278
- });
1279
-
1280
- // src/monitoring/native-monitor.ts
1281
- var NativeMonitor = class {
1282
- config;
1283
- metrics = [];
1284
- isEnabled = false;
1285
- constructor(config = {}) {
1286
- this.config = {
1287
- enabled: true,
1288
- console: true,
1289
- slowThreshold: 1e3,
1290
- errorThreshold: 0.05,
1291
- tags: { framework: "vafast" },
1292
- ...config
1293
- };
1294
- this.isEnabled = this.config.enabled ?? true;
1295
- if (this.isEnabled && this.config.console) {
1296
- console.log("\u2705 \u539F\u751F\u76D1\u63A7\u5DF2\u542F\u7528");
1297
- console.log(`\u{1F4CA} \u76D1\u63A7\u914D\u7F6E:`, {
1298
- \u6162\u8BF7\u6C42\u9608\u503C: `${this.config.slowThreshold}ms`,
1299
- \u9519\u8BEF\u7387\u9608\u503C: `${(this.config.errorThreshold * 100).toFixed(1)}%`,
1300
- \u6807\u7B7E: this.config.tags
1301
- });
1302
- }
1303
- }
1304
- // 记录监控指标
1305
- recordMetrics(metrics) {
1306
- if (!this.isEnabled) return;
1307
- this.metrics.push(metrics);
1308
- if (this.metrics.length > 1e3) {
1309
- this.metrics = this.metrics.slice(-1e3);
1310
- }
1311
- if (this.config.console) {
1312
- const status = metrics.statusCode < 400 ? "\u2705" : "\u274C";
1313
- const timeColor = metrics.totalTime > this.config.slowThreshold ? "\u{1F40C}" : "\u26A1";
1314
- console.log(
1315
- `${status} ${metrics.method} ${metrics.path} - ${metrics.statusCode} (${timeColor} ${metrics.totalTime.toFixed(2)}ms)`
1316
- );
1317
- if (metrics.totalTime > this.config.slowThreshold) {
1318
- console.warn(
1319
- `\u{1F40C} \u6162\u8BF7\u6C42\u8B66\u544A: ${metrics.path} \u8017\u65F6 ${metrics.totalTime.toFixed(
1320
- 2
1321
- )}ms`
1322
- );
1323
- }
1324
- }
1325
- }
1326
- // 获取监控状态
1327
- getStatus() {
1328
- if (!this.isEnabled) {
1329
- return { enabled: false, message: "\u76D1\u63A7\u672A\u542F\u7528" };
1330
- }
1331
- const totalRequests = this.metrics.length;
1332
- const successfulRequests = this.metrics.filter(
1333
- (m) => m.statusCode < 400
1334
- ).length;
1335
- const failedRequests = totalRequests - successfulRequests;
1336
- const avgResponseTime = totalRequests > 0 ? this.metrics.reduce((sum, m) => sum + m.totalTime, 0) / totalRequests : 0;
1337
- return {
1338
- enabled: true,
1339
- totalRequests,
1340
- successfulRequests,
1341
- failedRequests,
1342
- errorRate: totalRequests > 0 ? failedRequests / totalRequests : 0,
1343
- avgResponseTime: avgResponseTime.toFixed(2) + "ms",
1344
- memoryUsage: this.getMemoryUsage(),
1345
- recentRequests: this.metrics.slice(-5)
1346
- };
1347
- }
1348
- // 获取监控指标
1349
- getMetrics() {
1350
- return this.metrics;
1351
- }
1352
- // 重置监控数据
1353
- reset() {
1354
- this.metrics = [];
1355
- console.log("\u{1F504} \u76D1\u63A7\u6570\u636E\u5DF2\u91CD\u7F6E");
1356
- }
1357
- // 获取内存使用情况
1358
- getMemoryUsage() {
1359
- if (typeof process !== "undefined" && process.memoryUsage) {
1360
- const mem = process.memoryUsage();
1361
- return {
1362
- heapUsed: (mem.heapUsed / 1024 / 1024).toFixed(2) + "MB",
1363
- heapTotal: (mem.heapTotal / 1024 / 1024).toFixed(2) + "MB",
1364
- external: (mem.external / 1024 / 1024).toFixed(2) + "MB"
1365
- };
1366
- }
1367
- return { message: "\u5185\u5B58\u4FE1\u606F\u4E0D\u53EF\u7528" };
1368
- }
1369
- };
1370
- function withMonitoring(server, config = {}) {
1371
- const monitor = new NativeMonitor(config);
1372
- const originalFetch = server.fetch.bind(server);
1373
- const monitoredFetch = async (req) => {
1374
- const startTime = performance.now();
1375
- const requestId = `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
1376
- const { pathname } = new URL(req.url);
1377
- const method = req.method;
1378
- try {
1379
- const response = await originalFetch(req);
1380
- const totalTime = performance.now() - startTime;
1381
- monitor.recordMetrics({
1382
- requestId,
1383
- method,
1384
- path: pathname,
1385
- statusCode: response.status,
1386
- totalTime,
1387
- timestamp: Date.now(),
1388
- memoryUsage: (() => {
1389
- if (typeof process !== "undefined" && process.memoryUsage) {
1390
- const mem = process.memoryUsage();
1391
- return {
1392
- heapUsed: mem.heapUsed,
1393
- heapTotal: mem.heapTotal
1394
- };
1395
- }
1396
- return { heapUsed: 0, heapTotal: 0 };
1397
- })()
1398
- });
1399
- return response;
1400
- } catch (error) {
1401
- const totalTime = performance.now() - startTime;
1402
- monitor.recordMetrics({
1403
- requestId,
1404
- method,
1405
- path: pathname,
1406
- statusCode: 500,
1407
- totalTime,
1408
- timestamp: Date.now(),
1409
- memoryUsage: (() => {
1410
- if (typeof process !== "undefined" && process.memoryUsage) {
1411
- const mem = process.memoryUsage();
1412
- return {
1413
- heapUsed: mem.heapUsed,
1414
- heapTotal: mem.heapTotal
1415
- };
1416
- }
1417
- return { heapUsed: 0, heapTotal: 0 };
1418
- })()
1419
- });
1420
- throw error;
1421
- }
1422
- };
1423
- const monitoredServer = {
1424
- ...server,
1425
- fetch: monitoredFetch,
1426
- // 监控方法
1427
- getMonitoringStatus: () => monitor.getStatus(),
1428
- getMonitoringMetrics: () => monitor.getMetrics(),
1429
- resetMonitoring: () => monitor.reset()
1430
- };
1431
- return monitoredServer;
1432
- }
1433
- function createMonitoredServer(routes, config) {
1434
- const { Server: Server2 } = (init_server2(), __toCommonJS(server_exports));
1435
- const server = new Server2(routes);
1436
- return withMonitoring(server, config);
1437
- }
1438
-
1439
- // src/monitoring/index.ts
1440
- var defaultMonitoringConfig = {
1441
- enabled: true,
1442
- console: true,
1443
- slowThreshold: 1e3,
1444
- // 1秒
1445
- errorThreshold: 0.05,
1446
- // 5%
1447
- tags: {
1448
- framework: "vafast",
1449
- version: "2.0.0"
1450
- }
1451
- };
1452
- function createMonitoringConfig(config = {}) {
1453
- return { ...defaultMonitoringConfig, ...config };
1454
- }
1455
- export {
1456
- createMonitoredServer,
1457
- createMonitoringConfig,
1458
- defaultMonitoringConfig,
1459
- withMonitoring
1460
- };
1461
- /**
1462
- * 性能监控系统类型定义
1463
- *
1464
- * @author Framework Team
1465
- * @version 1.0.0
1466
- * @license MIT
1467
- */
1468
- /**
1469
- * 原生监控装饰器
1470
- *
1471
- * 通过装饰器模式为 Server 添加监控能力,完全不入侵原类
1472
- *
1473
- * @author Framework Team
1474
- * @version 2.0.0
1475
- * @license MIT
1476
- */
1477
- /**
1478
- * 原生监控系统入口
1479
- *
1480
- * @author Framework Team
1481
- * @version 2.0.0
1482
- * @license MIT
1483
- */
1484
- //# sourceMappingURL=index.js.map