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 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/formats.ts"],"sourcesContent":["/**\n * TypeBox Format 验证器\n *\n * 内置常用的 format 验证,对标 Zod 的内置验证\n * 框架启动时自动注册\n *\n * @version 1.0.0\n */\n\nimport { FormatRegistry } from \"@sinclair/typebox\";\n\n// ============== 正则表达式 ==============\n\n// 邮箱 (RFC 5322 简化版)\nconst EMAIL_REGEX = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\n// UUID v4\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n// UUID 任意版本\nconst UUID_ANY_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n// CUID\nconst CUID_REGEX = /^c[^\\s-]{8,}$/i;\n\n// CUID2\nconst CUID2_REGEX = /^[0-9a-z]+$/;\n\n// ULID\nconst ULID_REGEX = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n\n// NanoID (默认 21 字符)\nconst NANOID_REGEX = /^[A-Za-z0-9_-]{21}$/;\n\n// URL\nconst URL_REGEX = /^https?:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b[-a-zA-Z0-9()@:%_+.~#?&/=]*$/;\n\n// IPv4\nconst IPV4_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n\n// IPv6 (简化版)\nconst IPV6_REGEX = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$/;\n\n// CIDR (IPv4)\nconst CIDR_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\/(?:3[0-2]|[12]?[0-9])$/;\n\n// 日期 (YYYY-MM-DD)\nconst DATE_REGEX = /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$/;\n\n// 时间 (HH:mm:ss 或 HH:mm:ss.SSS)\nconst TIME_REGEX = /^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.\\d{1,3})?$/;\n\n// ISO 日期时间\nconst DATE_TIME_REGEX = /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.\\d{1,3})?(?:Z|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$/;\n\n// ISO 8601 Duration (P1Y2M3DT4H5M6S)\nconst DURATION_REGEX = /^P(?:\\d+Y)?(?:\\d+M)?(?:\\d+W)?(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$/;\n\n// Hostname (RFC 1123)\nconst HOSTNAME_REGEX = /^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\.)*(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$/;\n\n// 手机号 (中国大陆)\nconst PHONE_CN_REGEX = /^1[3-9]\\d{9}$/;\n\n// 手机号 (国际格式 E.164)\nconst PHONE_E164_REGEX = /^\\+[1-9]\\d{6,14}$/;\n\n// MongoDB ObjectId\nconst OBJECTID_REGEX = /^[0-9a-fA-F]{24}$/;\n\n// 十六进制颜色\nconst HEX_COLOR_REGEX = /^#(?:[0-9a-fA-F]{3}){1,2}$/;\n\n// RGB/RGBA 颜色\nconst RGB_COLOR_REGEX = /^rgba?\\(\\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\s*,\\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\s*,\\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\\s*,\\s*(?:0|1|0?\\.\\d+))?\\s*\\)$/;\n\n// Base64\nconst BASE64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\n\n// Base64 URL Safe\nconst BASE64URL_REGEX = /^[A-Za-z0-9_-]+$/;\n\n// JWT (3 部分 base64url)\nconst JWT_REGEX = /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/;\n\n// Emoji (简化检测)\nconst EMOJI_REGEX = /^[\\p{Emoji}]+$/u;\n\n// Slug (URL 友好字符串)\nconst SLUG_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n// Semver (语义化版本)\nconst SEMVER_REGEX = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n// 信用卡号 (Luhn 算法验证)\nfunction isValidCreditCard(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length < 13 || digits.length > 19) return false;\n\n let sum = 0;\n let isEven = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = parseInt(digits[i], 10);\n if (isEven) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n isEven = !isEven;\n }\n return sum % 10 === 0;\n}\n\n// ============== Format 注册 ==============\n\nlet isRegistered = false;\n\n/**\n * 注册所有内置 format 验证器\n * 框架自动调用,也可手动调用\n */\nexport function registerFormats(): void {\n if (isRegistered) return;\n isRegistered = true;\n\n // === 字符串标识符 ===\n FormatRegistry.Set(\"email\", (v) => EMAIL_REGEX.test(v));\n FormatRegistry.Set(\"uuid\", (v) => UUID_REGEX.test(v));\n FormatRegistry.Set(\"uuid-any\", (v) => UUID_ANY_REGEX.test(v));\n FormatRegistry.Set(\"cuid\", (v) => CUID_REGEX.test(v));\n FormatRegistry.Set(\"cuid2\", (v) => CUID2_REGEX.test(v) && v.length >= 1);\n FormatRegistry.Set(\"ulid\", (v) => ULID_REGEX.test(v));\n FormatRegistry.Set(\"nanoid\", (v) => NANOID_REGEX.test(v));\n FormatRegistry.Set(\"objectid\", (v) => OBJECTID_REGEX.test(v));\n FormatRegistry.Set(\"slug\", (v) => SLUG_REGEX.test(v));\n\n // === 网络相关 ===\n FormatRegistry.Set(\"url\", (v) => URL_REGEX.test(v));\n FormatRegistry.Set(\"uri\", (v) => URL_REGEX.test(v)); // 别名\n FormatRegistry.Set(\"ipv4\", (v) => IPV4_REGEX.test(v));\n FormatRegistry.Set(\"ipv6\", (v) => IPV6_REGEX.test(v));\n FormatRegistry.Set(\"ip\", (v) => IPV4_REGEX.test(v) || IPV6_REGEX.test(v));\n FormatRegistry.Set(\"cidr\", (v) => CIDR_REGEX.test(v));\n FormatRegistry.Set(\"hostname\", (v) => HOSTNAME_REGEX.test(v));\n\n // === 日期时间 ===\n FormatRegistry.Set(\"date\", (v) => DATE_REGEX.test(v));\n FormatRegistry.Set(\"time\", (v) => TIME_REGEX.test(v));\n FormatRegistry.Set(\"date-time\", (v) => DATE_TIME_REGEX.test(v));\n FormatRegistry.Set(\"datetime\", (v) => DATE_TIME_REGEX.test(v)); // 别名\n FormatRegistry.Set(\"duration\", (v) => DURATION_REGEX.test(v));\n\n // === 手机号 ===\n FormatRegistry.Set(\"phone\", (v) => PHONE_CN_REGEX.test(v)); // 中国大陆\n FormatRegistry.Set(\"phone-cn\", (v) => PHONE_CN_REGEX.test(v));\n FormatRegistry.Set(\"phone-e164\", (v) => PHONE_E164_REGEX.test(v)); // 国际\n\n // === 编码格式 ===\n FormatRegistry.Set(\"base64\", (v) => BASE64_REGEX.test(v));\n FormatRegistry.Set(\"base64url\", (v) => BASE64URL_REGEX.test(v));\n FormatRegistry.Set(\"jwt\", (v) => JWT_REGEX.test(v));\n\n // === 颜色 ===\n FormatRegistry.Set(\"hex-color\", (v) => HEX_COLOR_REGEX.test(v));\n FormatRegistry.Set(\"rgb-color\", (v) => RGB_COLOR_REGEX.test(v));\n FormatRegistry.Set(\n \"color\",\n (v) => HEX_COLOR_REGEX.test(v) || RGB_COLOR_REGEX.test(v),\n );\n\n // === 其他 ===\n FormatRegistry.Set(\"emoji\", (v) => EMOJI_REGEX.test(v));\n FormatRegistry.Set(\"semver\", (v) => SEMVER_REGEX.test(v));\n FormatRegistry.Set(\"credit-card\", isValidCreditCard);\n}\n\n/**\n * 自定义注册 format\n */\nexport function registerFormat(\n name: string,\n validator: (value: string) => boolean,\n): void {\n FormatRegistry.Set(name, validator);\n}\n\n/**\n * 检查 format 是否已注册\n */\nexport function hasFormat(name: string): boolean {\n return FormatRegistry.Has(name);\n}\n\n// 导出正则(供外部使用)\nexport const Patterns = {\n EMAIL: EMAIL_REGEX,\n UUID: UUID_REGEX,\n URL: URL_REGEX,\n IPV4: IPV4_REGEX,\n IPV6: IPV6_REGEX,\n DATE: DATE_REGEX,\n TIME: TIME_REGEX,\n DATE_TIME: DATE_TIME_REGEX,\n PHONE_CN: PHONE_CN_REGEX,\n PHONE_E164: PHONE_E164_REGEX,\n OBJECTID: OBJECTID_REGEX,\n HEX_COLOR: HEX_COLOR_REGEX,\n SLUG: SLUG_REGEX,\n SEMVER: SEMVER_REGEX,\n JWT: JWT_REGEX,\n} as const;\n\n"],"mappings":"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","names":[]}
@@ -1,16 +0,0 @@
1
- // src/utils/go-await.ts
2
- function goAwait(promise) {
3
- return promise.then((data) => [null, data]).catch((err) => [err instanceof Error ? err : new Error(String(err)), void 0]);
4
- }
5
- export {
6
- goAwait
7
- };
8
- /**
9
- * Go 风格的错误处理工具
10
- * 将 Promise 转换为 [Error | null, T | undefined] 格式
11
- *
12
- * @author Framework Team
13
- * @version 1.0.0
14
- * @license MIT
15
- */
16
- //# sourceMappingURL=go-await.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/go-await.ts"],"sourcesContent":["/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @author Framework Team\n * @version 1.0.0\n * @license MIT\n */\n\n/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @param promise 要处理的 Promise\n * @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果\n *\n * @example\n * ```typescript\n * const [error, result] = await goAwait(someAsyncFunction());\n * if (error) {\n * console.error(\"操作失败:\", error);\n * } else {\n * console.log(\"操作成功:\", result);\n * }\n * ```\n */\nexport function goAwait<T>(\n promise: Promise<T>,\n): Promise<[Error | null, T | undefined]> {\n return promise\n .then<[null, T]>((data) => [null, data])\n .catch<\n [Error, undefined]\n >((err) => [err instanceof Error ? err : new Error(String(err)), undefined]);\n}\n"],"mappings":";AA0BO,SAAS,QACd,SACwC;AACxC,SAAO,QACJ,KAAgB,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,EACtC,MAEC,CAAC,QAAQ,CAAC,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG,MAAS,CAAC;AAC/E;","names":[]}
@@ -1,48 +0,0 @@
1
- // src/utils/parsers.ts
2
- import qs from "qs";
3
- import cookie from "cookie";
4
- function parseCookies(req) {
5
- const cookieHeader = req.headers.get("cookie");
6
- if (!cookieHeader) return {};
7
- try {
8
- const parsed = cookie.parse(cookieHeader);
9
- const result = {};
10
- for (const [key, value] of Object.entries(parsed)) {
11
- if (value !== void 0 && value !== null) {
12
- result[key] = value;
13
- }
14
- }
15
- return result;
16
- } catch {
17
- return {};
18
- }
19
- }
20
-
21
- // src/utils/handle.ts
22
- function getCookie(req, key) {
23
- const cookies = parseCookies(req);
24
- return cookies[key] || null;
25
- }
26
- function setCookie(key, value, options = {}) {
27
- let cookie2 = `${key}=${encodeURIComponent(value)}`;
28
- if (options.path) cookie2 += `; Path=${options.path}`;
29
- if (options.httpOnly) cookie2 += `; HttpOnly`;
30
- if (options.secure) cookie2 += `; Secure`;
31
- if (options.maxAge) cookie2 += `; Max-Age=${options.maxAge}`;
32
- return cookie2;
33
- }
34
- function setLocals(req, extras) {
35
- const target = req;
36
- target.__locals = { ...target.__locals ?? {}, ...extras };
37
- }
38
- function getLocals(req) {
39
- const target = req;
40
- return target.__locals ?? {};
41
- }
42
- export {
43
- getCookie,
44
- getLocals,
45
- setCookie,
46
- setLocals
47
- };
48
- //# sourceMappingURL=handle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/parsers.ts","../../src/utils/handle.ts"],"sourcesContent":["// src/parsers.ts\nimport qs from \"qs\";\nimport cookie from \"cookie\";\n\n// 文件信息接口\nexport interface FileInfo {\n name: string;\n type: string;\n size: number;\n data: ArrayBuffer;\n}\n\n// 表单数据接口\nexport interface FormData {\n fields: Record<string, string>;\n files: Record<string, FileInfo>;\n}\n\n/**\n * 简化的请求体解析函数\n * 优先简洁性,处理最常见的场景\n */\nexport async function parseBody(req: Request): Promise<unknown> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await req.json();\n }\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const text = await req.text();\n return Object.fromEntries(new URLSearchParams(text));\n }\n return await req.text(); // fallback\n}\n\n/**\n * 解析 multipart/form-data 格式\n * 支持文件上传和普通表单字段\n */\nasync function parseMultipartFormData(req: Request): Promise<FormData> {\n const formData = await req.formData();\n const result: FormData = {\n fields: {},\n files: {},\n };\n\n for (const [key, value] of formData.entries()) {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"type\" in value &&\n \"size\" in value\n ) {\n // 处理文件\n const file = value as any;\n const arrayBuffer = await file.arrayBuffer();\n result.files[key] = {\n name: file.name,\n type: file.type,\n size: file.size,\n data: arrayBuffer,\n };\n } else {\n // 处理普通字段\n result.fields[key] = value as string;\n }\n }\n\n return result;\n}\n\n/**\n * 解析请求体为特定类型\n * 提供类型安全的解析方法\n */\nexport async function parseBodyAs<T>(req: Request): Promise<T> {\n const body = await parseBody(req);\n return body as T;\n}\n\n/**\n * 解析请求体为表单数据\n * 专门用于处理 multipart/form-data\n */\nexport async function parseFormData(req: Request): Promise<FormData> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n return await parseMultipartFormData(req);\n}\n\n/**\n * 解析请求体为文件\n * 专门用于处理文件上传\n */\nexport async function parseFile(req: Request): Promise<FileInfo> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n const formData = await parseMultipartFormData(req);\n const fileKeys = Object.keys(formData.files);\n\n if (fileKeys.length === 0) {\n throw new Error(\"请求中没有文件\");\n }\n\n if (fileKeys.length > 1) {\n throw new Error(\"请求中包含多个文件,请使用 parseFormData\");\n }\n\n return formData.files[fileKeys[0]];\n}\n\n/**\n * 快速提取 query string(避免创建 URL 对象)\n */\nfunction extractQueryString(url: string): string {\n const qIndex = url.indexOf(\"?\");\n if (qIndex === -1) return \"\";\n\n const hashIndex = url.indexOf(\"#\", qIndex);\n return hashIndex === -1\n ? url.substring(qIndex + 1)\n : url.substring(qIndex + 1, hashIndex);\n}\n\n/** 获取查询字符串,直接返回对象 */\nexport function parseQuery(req: Request): Record<string, unknown> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n return qs.parse(queryString);\n}\n\n/**\n * 快速解析简单查询字符串(不支持嵌套,但更快)\n * 适用于简单的 key=value&key2=value2 场景\n */\nexport function parseQueryFast(req: Request): Record<string, string> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n result[decodeURIComponent(pair)] = \"\";\n } else {\n const key = decodeURIComponent(pair.substring(0, eqIndex));\n const value = decodeURIComponent(pair.substring(eqIndex + 1));\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/** 解析请求头,返回对象 */\nexport function parseHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = Object.create(null);\n req.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n\n/**\n * 获取单个请求头(避免解析全部)\n */\nexport function getHeader(req: Request, name: string): string | null {\n return req.headers.get(name);\n}\n\n/** 使用cookie库解析Cookie,保证可靠性 */\nexport function parseCookies(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n try {\n const parsed = cookie.parse(cookieHeader);\n // 过滤掉undefined和null值\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * 快速解析 Cookie(简化版,不使用外部库)\n * 适用于简单的 cookie 场景\n */\nexport function parseCookiesFast(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n const key = trimmed.substring(0, eqIndex).trim();\n const value = trimmed.substring(eqIndex + 1).trim();\n // 移除引号\n result[key] =\n value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return result;\n}\n\n/**\n * 获取单个 Cookie 值(避免解析全部)\n */\nexport function getCookie(req: Request, name: string): string | null {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return null;\n\n const prefix = `${name}=`;\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n if (trimmed.startsWith(prefix)) {\n const value = trimmed.substring(prefix.length).trim();\n return value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return null;\n}\n","import { parseCookies } from \"./parsers\";\n\n/** 获取单个 Cookie 值 */\nexport function getCookie(req: Request, key: string): string | null {\n const cookies = parseCookies(req);\n return cookies[key] || null;\n}\n\n/** 生成 Set-Cookie 头 */\nexport function setCookie(\n key: string,\n value: string,\n options: {\n path?: string;\n httpOnly?: boolean;\n maxAge?: number;\n secure?: boolean;\n } = {},\n): string {\n let cookie = `${key}=${encodeURIComponent(value)}`;\n\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.httpOnly) cookie += `; HttpOnly`;\n if (options.secure) cookie += `; Secure`;\n if (options.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n\n return cookie;\n}\n\n// 提供给中间件写入\"局部上下文\"的工具函数\nexport function setLocals<T extends object>(req: Request, extras: T) {\n const target = req as unknown as Record<string, unknown>;\n target.__locals = { ...((target.__locals as object) ?? {}), ...extras };\n}\n\n// 获取中间件注入的局部上下文\nexport function getLocals<T extends object>(req: Request): T {\n const target = req as unknown as Record<string, unknown>;\n return (target.__locals ?? {}) as T;\n}\n"],"mappings":";AACA,OAAO,QAAQ;AACf,OAAO,YAAY;AAmLZ,SAAS,aAAa,KAAsC;AACjE,QAAM,eAAe,IAAI,QAAQ,IAAI,QAAQ;AAC7C,MAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,MAAI;AACF,UAAM,SAAS,OAAO,MAAM,YAAY;AAExC,UAAM,SAAiC,CAAC;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;ACnMO,SAAS,UAAU,KAAc,KAA4B;AAClE,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,QAAQ,GAAG,KAAK;AACzB;AAGO,SAAS,UACd,KACA,OACA,UAKI,CAAC,GACG;AACR,MAAIA,UAAS,GAAG,GAAG,IAAI,mBAAmB,KAAK,CAAC;AAEhD,MAAI,QAAQ,KAAM,CAAAA,WAAU,UAAU,QAAQ,IAAI;AAClD,MAAI,QAAQ,SAAU,CAAAA,WAAU;AAChC,MAAI,QAAQ,OAAQ,CAAAA,WAAU;AAC9B,MAAI,QAAQ,OAAQ,CAAAA,WAAU,aAAa,QAAQ,MAAM;AAEzD,SAAOA;AACT;AAGO,SAAS,UAA4B,KAAc,QAAW;AACnE,QAAM,SAAS;AACf,SAAO,WAAW,EAAE,GAAK,OAAO,YAAuB,CAAC,GAAI,GAAG,OAAO;AACxE;AAGO,SAAS,UAA4B,KAAiB;AAC3D,QAAM,SAAS;AACf,SAAQ,OAAO,YAAY,CAAC;AAC9B;","names":["cookie"]}
@@ -1,20 +0,0 @@
1
- /**
2
- * HTML渲染工具类
3
- * 提供统一的HTML模板生成功能
4
- */
5
- declare class HtmlRenderer {
6
- /**
7
- * 生成基础HTML模板
8
- */
9
- static generateBaseHtml(content: string, context: any, clientScriptPath?: string): string;
10
- /**
11
- * 生成Vue组件HTML
12
- */
13
- static generateVueHtml(content: string, context: any, clientScriptPath?: string): string;
14
- /**
15
- * 生成React组件HTML
16
- */
17
- static generateReactHtml(content: string, context: any, clientScriptPath?: string): string;
18
- }
19
-
20
- export { HtmlRenderer };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/html-renderer.ts"],"sourcesContent":["/**\n * HTML渲染工具类\n * 提供统一的HTML模板生成功能\n */\nexport class HtmlRenderer {\n /**\n * 生成基础HTML模板\n */\n static generateBaseHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"app\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n\n /**\n * 生成Vue组件HTML\n */\n static generateVueHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return this.generateBaseHtml(content, context, clientScriptPath);\n }\n\n /**\n * 生成React组件HTML\n */\n static generateReactHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"root\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n}\n"],"mappings":";AAIO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAIxB,OAAO,iBACL,SACA,SACA,mBAA2B,cACnB;AACR,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASe,OAAO;AAAA;AAAA;AAAA,wBAGT,KAAK,UAAU,QAAQ,UAAU,CAAC,CAAC,CAAC;AAAA,uBACrC,KAAK,UAAU,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,2BAC/B,QAAQ,QAAQ;AAAA;AAAA;AAAA,uCAGJ,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIrD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBACL,SACA,SACA,mBAA2B,cACnB;AACR,WAAO,KAAK,iBAAiB,SAAS,SAAS,gBAAgB;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBACL,SACA,SACA,mBAA2B,cACnB;AACR,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BASgB,OAAO;AAAA;AAAA;AAAA,wBAGV,KAAK,UAAU,QAAQ,UAAU,CAAC,CAAC,CAAC;AAAA,uBACrC,KAAK,UAAU,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,2BAC/B,QAAQ,QAAQ;AAAA;AAAA;AAAA,uCAGJ,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIrD;AACF;","names":[]}
@@ -1,16 +0,0 @@
1
- export { InferableHandler, createHandler, createHandlerWithExtra, simpleHandler } from './create-handler.js';
2
- export { getCookie, getHeader, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast } from './parsers.js';
3
- export { empty, html, json, redirect, stream, text } from './response.js';
4
- export { goAwait } from './go-await.js';
5
- export { base64urlDecode, base64urlEncode } from './base64url.js';
6
- export { getLocals, setLocals } from './handle.js';
7
- export { createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest } from './request-validator.js';
8
- export { HtmlRenderer } from './html-renderer.js';
9
- export { DependencyManager } from './dependency-manager.js';
10
- export { SchemaConfig, ValidationError, ValidationResult, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow } from './validators/validators.js';
11
- export { Patterns, hasFormat, registerFormat, registerFormats } from './formats.js';
12
- export { SSEEvent, SSEHandler, SSEMarker, createSSEHandler } from './sse.js';
13
- export { RouteMeta, RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry } from './route-registry.js';
14
- import '../types/schema.js';
15
- import '@sinclair/typebox';
16
- import '../types/types.js';