hono 4.13.13 → 5.0.0-rc.1

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 (516) hide show
  1. package/README.md +2 -2
  2. package/dist/client/fetch-result-please.js +0 -22
  3. package/dist/client/utils.js +0 -7
  4. package/dist/{types/compose.d.ts → compose.d.ts} +5 -3
  5. package/dist/compose.js +18 -31
  6. package/dist/context/constants.d.ts +3 -0
  7. package/dist/context/constants.js +4 -0
  8. package/dist/{types/context.d.ts → context.d.ts} +56 -15
  9. package/dist/context.js +83 -277
  10. package/dist/helper/accepts/accepts.js +0 -13
  11. package/dist/helper/css/common.js +0 -10
  12. package/dist/helper/css/index.js +0 -38
  13. package/dist/{types/helper → helper}/dev/index.d.ts +5 -2
  14. package/dist/helper/dev/index.js +3 -3
  15. package/dist/helper/factory/define-handler.d.ts +150 -0
  16. package/dist/helper/factory/define-handler.js +117 -0
  17. package/dist/{types/helper → helper}/factory/index.d.ts +30 -1
  18. package/dist/helper/factory/index.js +7 -7
  19. package/dist/helper/html/index.js +0 -4
  20. package/dist/helper/proxy/index.js +0 -49
  21. package/dist/helper/route/index.js +0 -90
  22. package/dist/{types/helper → helper}/ssg/middleware.d.ts +0 -6
  23. package/dist/helper/ssg/middleware.js +1 -34
  24. package/dist/helper/ssg/plugins.js +0 -24
  25. package/dist/{types/helper → helper}/ssg/ssg.d.ts +0 -12
  26. package/dist/helper/ssg/ssg.js +0 -18
  27. package/dist/helper/ssg/utils.js +0 -5
  28. package/dist/helper/testing/index.js +0 -4
  29. package/dist/helper/websocket/index.js +0 -6
  30. package/dist/{types/hono-base.d.ts → hono-base.d.ts} +47 -95
  31. package/dist/hono-base.js +63 -228
  32. package/dist/{types/hono.d.ts → hono.d.ts} +1 -1
  33. package/dist/hono.js +0 -13
  34. package/dist/http-exception.js +0 -36
  35. package/dist/index.js +0 -15
  36. package/dist/jsx/components.js +0 -5
  37. package/dist/jsx/context.js +0 -34
  38. package/dist/jsx/dom/client.js +0 -14
  39. package/dist/jsx/dom/css.js +0 -34
  40. package/dist/jsx/dom/hooks/index.js +0 -21
  41. package/dist/jsx/dom/index.js +0 -4
  42. package/dist/jsx/dom/server.js +0 -12
  43. package/dist/jsx/index.js +0 -4
  44. package/dist/jsx/streaming.js +0 -26
  45. package/dist/{types/middleware → middleware}/basic-auth/index.d.ts +4 -3
  46. package/dist/middleware/basic-auth/index.js +0 -49
  47. package/dist/{types/middleware → middleware}/bearer-auth/index.d.ts +4 -27
  48. package/dist/middleware/bearer-auth/index.js +3 -39
  49. package/dist/middleware/body-limit/index.js +0 -32
  50. package/dist/middleware/cache/index.js +0 -31
  51. package/dist/middleware/combine/index.js +0 -80
  52. package/dist/middleware/compress/index.js +0 -24
  53. package/dist/middleware/context-storage/index.js +0 -35
  54. package/dist/middleware/cors/index.js +0 -39
  55. package/dist/middleware/csrf/index.js +0 -62
  56. package/dist/middleware/etag/index.js +0 -29
  57. package/dist/middleware/ip-restriction/index.js +0 -41
  58. package/dist/middleware/jsx-renderer/index.js +0 -58
  59. package/dist/middleware/jwk/jwk.js +0 -31
  60. package/dist/middleware/jwt/jwt.js +0 -32
  61. package/dist/middleware/language/language.js +0 -60
  62. package/dist/middleware/logger/index.js +6 -24
  63. package/dist/middleware/method-not-allowed/index.js +1 -36
  64. package/dist/middleware/method-override/index.js +0 -25
  65. package/dist/middleware/mount/index.js +0 -32
  66. package/dist/middleware/powered-by/index.js +0 -15
  67. package/dist/middleware/pretty-json/index.js +0 -18
  68. package/dist/middleware/request-id/request-id.js +0 -22
  69. package/dist/middleware/secure-headers/secure-headers.js +0 -32
  70. package/dist/{types/middleware → middleware}/serve-static/index.d.ts +0 -4
  71. package/dist/middleware/serve-static/index.js +0 -3
  72. package/dist/middleware/serve-static/path.js +0 -4
  73. package/dist/middleware/timeout/index.js +0 -22
  74. package/dist/middleware/timing/timing.js +0 -95
  75. package/dist/middleware/trailing-slash/index.js +0 -50
  76. package/dist/{types/preset → preset}/quick.d.ts +1 -1
  77. package/dist/preset/quick.js +0 -4
  78. package/dist/{types/preset → preset}/tiny.d.ts +1 -1
  79. package/dist/preset/tiny.js +0 -4
  80. package/dist/{types/request.d.ts → request.d.ts} +3 -48
  81. package/dist/request.js +0 -205
  82. package/dist/router/linear-router/router.js +19 -13
  83. package/dist/router/pattern-router/router.js +3 -3
  84. package/dist/router/reg-exp-router/node.js +9 -11
  85. package/dist/router/reg-exp-router/trie.js +0 -5
  86. package/dist/router/trie-router/node.js +5 -5
  87. package/dist/router.js +0 -19
  88. package/dist/{types/types.d.ts → types.d.ts} +33 -2
  89. package/dist/utils/body.js +0 -30
  90. package/dist/utils/buffer.d.ts +11 -0
  91. package/dist/utils/buffer.js +1 -12
  92. package/dist/utils/color.d.ts +16 -0
  93. package/dist/utils/color.js +4 -33
  94. package/dist/utils/compress.js +0 -7
  95. package/dist/utils/concurrent.js +0 -4
  96. package/dist/utils/constants.js +0 -3
  97. package/dist/utils/cookie.js +0 -4
  98. package/dist/utils/encode.js +0 -4
  99. package/dist/utils/handler.js +0 -4
  100. package/dist/utils/html.js +0 -4
  101. package/dist/{types/utils → utils}/http-status.d.ts +1 -9
  102. package/dist/utils/ipaddr.js +0 -39
  103. package/dist/utils/jwt/index.js +0 -4
  104. package/dist/utils/jwt/jwa.js +0 -5
  105. package/dist/utils/jwt/jws.js +0 -5
  106. package/dist/utils/jwt/jwt.js +0 -5
  107. package/dist/utils/jwt/types.js +0 -4
  108. package/dist/utils/jwt/utf8.js +0 -4
  109. package/dist/utils/mime.js +0 -4
  110. package/dist/utils/stream.js +0 -14
  111. package/dist/{types/utils → utils}/url.d.ts +0 -5
  112. package/dist/utils/url.js +1 -30
  113. package/dist/{types/validator → validator}/validator.d.ts +5 -0
  114. package/dist/validator/validator.js +42 -49
  115. package/package.json +142 -488
  116. package/dist/adapter/aws-lambda/conninfo.js +0 -43
  117. package/dist/adapter/aws-lambda/handler.js +0 -342
  118. package/dist/adapter/aws-lambda/index.js +0 -3
  119. package/dist/adapter/aws-lambda/types.js +0 -1
  120. package/dist/adapter/bun/conninfo.js +0 -22
  121. package/dist/adapter/bun/index.js +0 -6
  122. package/dist/adapter/bun/serve-static.js +0 -30
  123. package/dist/adapter/bun/server.js +0 -11
  124. package/dist/adapter/bun/ssg.js +0 -27
  125. package/dist/adapter/bun/websocket.js +0 -66
  126. package/dist/adapter/cloudflare-pages/conninfo.js +0 -24
  127. package/dist/adapter/cloudflare-pages/handler.js +0 -64
  128. package/dist/adapter/cloudflare-pages/index.js +0 -3
  129. package/dist/adapter/cloudflare-workers/conninfo.js +0 -7
  130. package/dist/adapter/cloudflare-workers/index.js +0 -4
  131. package/dist/adapter/cloudflare-workers/serve-static-module.js +0 -7
  132. package/dist/adapter/cloudflare-workers/serve-static.js +0 -28
  133. package/dist/adapter/cloudflare-workers/utils.js +0 -22
  134. package/dist/adapter/cloudflare-workers/websocket.js +0 -33
  135. package/dist/adapter/deno/conninfo.js +0 -17
  136. package/dist/adapter/deno/deno.d.js +0 -1
  137. package/dist/adapter/deno/index.js +0 -5
  138. package/dist/adapter/deno/serve-static.js +0 -35
  139. package/dist/adapter/deno/ssg.js +0 -29
  140. package/dist/adapter/deno/websocket.js +0 -32
  141. package/dist/adapter/lambda-edge/conninfo.js +0 -7
  142. package/dist/adapter/lambda-edge/handler.js +0 -111
  143. package/dist/adapter/lambda-edge/index.js +0 -3
  144. package/dist/adapter/netlify/conninfo.js +0 -24
  145. package/dist/adapter/netlify/handler.js +0 -11
  146. package/dist/adapter/netlify/index.js +0 -3
  147. package/dist/adapter/netlify/mod.js +0 -3
  148. package/dist/adapter/service-worker/handler.js +0 -16
  149. package/dist/adapter/service-worker/index.js +0 -25
  150. package/dist/adapter/service-worker/types.js +0 -1
  151. package/dist/adapter/vercel/conninfo.js +0 -7
  152. package/dist/adapter/vercel/handler.js +0 -9
  153. package/dist/adapter/vercel/index.js +0 -3
  154. package/dist/cjs/_virtual/_rolldown/runtime.js +0 -33
  155. package/dist/cjs/adapter/aws-lambda/conninfo.js +0 -44
  156. package/dist/cjs/adapter/aws-lambda/handler.js +0 -352
  157. package/dist/cjs/adapter/aws-lambda/index.js +0 -7
  158. package/dist/cjs/adapter/aws-lambda/types.js +0 -0
  159. package/dist/cjs/adapter/bun/conninfo.js +0 -23
  160. package/dist/cjs/adapter/bun/index.js +0 -14
  161. package/dist/cjs/adapter/bun/serve-static.js +0 -31
  162. package/dist/cjs/adapter/bun/server.js +0 -12
  163. package/dist/cjs/adapter/bun/ssg.js +0 -29
  164. package/dist/cjs/adapter/bun/websocket.js +0 -70
  165. package/dist/cjs/adapter/cloudflare-pages/conninfo.js +0 -25
  166. package/dist/cjs/adapter/cloudflare-pages/handler.js +0 -67
  167. package/dist/cjs/adapter/cloudflare-pages/index.js +0 -7
  168. package/dist/cjs/adapter/cloudflare-workers/conninfo.js +0 -8
  169. package/dist/cjs/adapter/cloudflare-workers/index.js +0 -7
  170. package/dist/cjs/adapter/cloudflare-workers/serve-static-module.js +0 -8
  171. package/dist/cjs/adapter/cloudflare-workers/serve-static.js +0 -29
  172. package/dist/cjs/adapter/cloudflare-workers/utils.js +0 -23
  173. package/dist/cjs/adapter/cloudflare-workers/websocket.js +0 -34
  174. package/dist/cjs/adapter/deno/conninfo.js +0 -18
  175. package/dist/cjs/adapter/deno/deno.d.js +0 -0
  176. package/dist/cjs/adapter/deno/index.js +0 -10
  177. package/dist/cjs/adapter/deno/serve-static.js +0 -36
  178. package/dist/cjs/adapter/deno/ssg.js +0 -31
  179. package/dist/cjs/adapter/deno/websocket.js +0 -33
  180. package/dist/cjs/adapter/lambda-edge/conninfo.js +0 -8
  181. package/dist/cjs/adapter/lambda-edge/handler.js +0 -116
  182. package/dist/cjs/adapter/lambda-edge/index.js +0 -5
  183. package/dist/cjs/adapter/netlify/conninfo.js +0 -25
  184. package/dist/cjs/adapter/netlify/handler.js +0 -12
  185. package/dist/cjs/adapter/netlify/index.js +0 -5
  186. package/dist/cjs/adapter/netlify/mod.js +0 -5
  187. package/dist/cjs/adapter/service-worker/handler.js +0 -17
  188. package/dist/cjs/adapter/service-worker/index.js +0 -27
  189. package/dist/cjs/adapter/service-worker/types.js +0 -0
  190. package/dist/cjs/adapter/vercel/conninfo.js +0 -8
  191. package/dist/cjs/adapter/vercel/handler.js +0 -10
  192. package/dist/cjs/adapter/vercel/index.js +0 -5
  193. package/dist/cjs/client/client.js +0 -145
  194. package/dist/cjs/client/fetch-result-please.js +0 -67
  195. package/dist/cjs/client/index.js +0 -7
  196. package/dist/cjs/client/types.js +0 -0
  197. package/dist/cjs/client/utils.js +0 -70
  198. package/dist/cjs/compose.js +0 -51
  199. package/dist/cjs/context.js +0 -383
  200. package/dist/cjs/helper/accepts/accepts.js +0 -54
  201. package/dist/cjs/helper/accepts/index.js +0 -3
  202. package/dist/cjs/helper/adapter/index.js +0 -41
  203. package/dist/cjs/helper/conninfo/index.js +0 -0
  204. package/dist/cjs/helper/conninfo/types.js +0 -0
  205. package/dist/cjs/helper/cookie/index.js +0 -89
  206. package/dist/cjs/helper/css/common.js +0 -194
  207. package/dist/cjs/helper/css/index.js +0 -142
  208. package/dist/cjs/helper/dev/index.js +0 -53
  209. package/dist/cjs/helper/factory/index.js +0 -33
  210. package/dist/cjs/helper/html/index.js +0 -34
  211. package/dist/cjs/helper/proxy/index.js +0 -122
  212. package/dist/cjs/helper/route/index.js +0 -128
  213. package/dist/cjs/helper/ssg/index.js +0 -19
  214. package/dist/cjs/helper/ssg/middleware.js +0 -65
  215. package/dist/cjs/helper/ssg/plugins.js +0 -68
  216. package/dist/cjs/helper/ssg/ssg.js +0 -220
  217. package/dist/cjs/helper/ssg/utils.js +0 -70
  218. package/dist/cjs/helper/streaming/index.js +0 -8
  219. package/dist/cjs/helper/streaming/sse.js +0 -59
  220. package/dist/cjs/helper/streaming/stream.js +0 -26
  221. package/dist/cjs/helper/streaming/text.js +0 -12
  222. package/dist/cjs/helper/streaming/utils.js +0 -16
  223. package/dist/cjs/helper/testing/index.js +0 -18
  224. package/dist/cjs/helper/websocket/index.js +0 -56
  225. package/dist/cjs/hono-base.js +0 -351
  226. package/dist/cjs/hono.js +0 -29
  227. package/dist/cjs/http-exception.js +0 -56
  228. package/dist/cjs/index.js +0 -22
  229. package/dist/cjs/jsx/base.js +0 -266
  230. package/dist/cjs/jsx/children.js +0 -19
  231. package/dist/cjs/jsx/components.js +0 -147
  232. package/dist/cjs/jsx/constants.js +0 -15
  233. package/dist/cjs/jsx/context.js +0 -170
  234. package/dist/cjs/jsx/dom/client.js +0 -56
  235. package/dist/cjs/jsx/dom/components.js +0 -26
  236. package/dist/cjs/jsx/dom/context.js +0 -43
  237. package/dist/cjs/jsx/dom/css.js +0 -153
  238. package/dist/cjs/jsx/dom/hooks/index.js +0 -65
  239. package/dist/cjs/jsx/dom/index.js +0 -122
  240. package/dist/cjs/jsx/dom/intrinsic-element/components.js +0 -306
  241. package/dist/cjs/jsx/dom/jsx-dev-runtime.js +0 -17
  242. package/dist/cjs/jsx/dom/jsx-runtime.js +0 -5
  243. package/dist/cjs/jsx/dom/render.js +0 -525
  244. package/dist/cjs/jsx/dom/server.js +0 -44
  245. package/dist/cjs/jsx/dom/utils.js +0 -9
  246. package/dist/cjs/jsx/hooks/index.js +0 -280
  247. package/dist/cjs/jsx/index.js +0 -89
  248. package/dist/cjs/jsx/intrinsic-element/common.js +0 -27
  249. package/dist/cjs/jsx/intrinsic-element/components.js +0 -138
  250. package/dist/cjs/jsx/intrinsic-elements.js +0 -0
  251. package/dist/cjs/jsx/jsx-dev-runtime.js +0 -16
  252. package/dist/cjs/jsx/jsx-runtime.js +0 -37
  253. package/dist/cjs/jsx/streaming.js +0 -135
  254. package/dist/cjs/jsx/types.js +0 -0
  255. package/dist/cjs/jsx/utils.js +0 -116
  256. package/dist/cjs/middleware/basic-auth/index.js +0 -100
  257. package/dist/cjs/middleware/bearer-auth/index.js +0 -97
  258. package/dist/cjs/middleware/body-limit/index.js +0 -69
  259. package/dist/cjs/middleware/cache/index.js +0 -173
  260. package/dist/cjs/middleware/combine/index.js +0 -141
  261. package/dist/cjs/middleware/compress/index.js +0 -82
  262. package/dist/cjs/middleware/context-storage/index.js +0 -55
  263. package/dist/cjs/middleware/cors/index.js +0 -109
  264. package/dist/cjs/middleware/csrf/index.js +0 -106
  265. package/dist/cjs/middleware/etag/digest.js +0 -62
  266. package/dist/cjs/middleware/etag/index.js +0 -79
  267. package/dist/cjs/middleware/ip-restriction/index.js +0 -168
  268. package/dist/cjs/middleware/jsx-renderer/index.js +0 -104
  269. package/dist/cjs/middleware/jwk/index.js +0 -3
  270. package/dist/cjs/middleware/jwk/jwk.js +0 -122
  271. package/dist/cjs/middleware/jwt/index.js +0 -9
  272. package/dist/cjs/middleware/jwt/jwt.js +0 -124
  273. package/dist/cjs/middleware/language/index.js +0 -7
  274. package/dist/cjs/middleware/language/language.js +0 -208
  275. package/dist/cjs/middleware/logger/index.js +0 -51
  276. package/dist/cjs/middleware/method-not-allowed/index.js +0 -84
  277. package/dist/cjs/middleware/method-override/index.js +0 -105
  278. package/dist/cjs/middleware/mount/index.js +0 -71
  279. package/dist/cjs/middleware/powered-by/index.js +0 -25
  280. package/dist/cjs/middleware/pretty-json/index.js +0 -41
  281. package/dist/cjs/middleware/request-id/index.js +0 -3
  282. package/dist/cjs/middleware/request-id/request-id.js +0 -35
  283. package/dist/cjs/middleware/secure-headers/index.js +0 -4
  284. package/dist/cjs/middleware/secure-headers/permissions-policy.js +0 -0
  285. package/dist/cjs/middleware/secure-headers/secure-headers.js +0 -166
  286. package/dist/cjs/middleware/serve-static/index.js +0 -62
  287. package/dist/cjs/middleware/serve-static/path.js +0 -17
  288. package/dist/cjs/middleware/timeout/index.js +0 -42
  289. package/dist/cjs/middleware/timing/index.js +0 -7
  290. package/dist/cjs/middleware/timing/timing.js +0 -189
  291. package/dist/cjs/middleware/trailing-slash/index.js +0 -89
  292. package/dist/cjs/package.json +0 -3
  293. package/dist/cjs/preset/quick.js +0 -19
  294. package/dist/cjs/preset/tiny.js +0 -16
  295. package/dist/cjs/request/constants.js +0 -5
  296. package/dist/cjs/request.js +0 -337
  297. package/dist/cjs/router/linear-router/index.js +0 -3
  298. package/dist/cjs/router/linear-router/router.js +0 -97
  299. package/dist/cjs/router/pattern-router/index.js +0 -3
  300. package/dist/cjs/router/pattern-router/router.js +0 -42
  301. package/dist/cjs/router/reg-exp-router/index.js +0 -7
  302. package/dist/cjs/router/reg-exp-router/matcher.js +0 -21
  303. package/dist/cjs/router/reg-exp-router/node.js +0 -96
  304. package/dist/cjs/router/reg-exp-router/prepared-router.js +0 -97
  305. package/dist/cjs/router/reg-exp-router/router.js +0 -102
  306. package/dist/cjs/router/reg-exp-router/trie.js +0 -74
  307. package/dist/cjs/router/smart-router/index.js +0 -3
  308. package/dist/cjs/router/smart-router/router.js +0 -50
  309. package/dist/cjs/router/trie-router/index.js +0 -3
  310. package/dist/cjs/router/trie-router/node.js +0 -135
  311. package/dist/cjs/router/trie-router/router.js +0 -16
  312. package/dist/cjs/router/utils.js +0 -5
  313. package/dist/cjs/router.js +0 -40
  314. package/dist/cjs/types.js +0 -5
  315. package/dist/cjs/utils/accept.js +0 -194
  316. package/dist/cjs/utils/basic-auth.js +0 -21
  317. package/dist/cjs/utils/body.js +0 -97
  318. package/dist/cjs/utils/buffer.js +0 -55
  319. package/dist/cjs/utils/color.js +0 -39
  320. package/dist/cjs/utils/compress.js +0 -12
  321. package/dist/cjs/utils/concurrent.js +0 -31
  322. package/dist/cjs/utils/constants.js +0 -8
  323. package/dist/cjs/utils/cookie.js +0 -129
  324. package/dist/cjs/utils/crypto.js +0 -38
  325. package/dist/cjs/utils/encode.js +0 -37
  326. package/dist/cjs/utils/filepath.js +0 -27
  327. package/dist/cjs/utils/handler.js +0 -14
  328. package/dist/cjs/utils/headers.js +0 -0
  329. package/dist/cjs/utils/html.js +0 -109
  330. package/dist/cjs/utils/http-status.js +0 -0
  331. package/dist/cjs/utils/ipaddr.js +0 -247
  332. package/dist/cjs/utils/jwt/index.js +0 -15
  333. package/dist/cjs/utils/jwt/jwa.js +0 -25
  334. package/dist/cjs/utils/jwt/jws.js +0 -135
  335. package/dist/cjs/utils/jwt/jwt.js +0 -136
  336. package/dist/cjs/utils/jwt/types.js +0 -124
  337. package/dist/cjs/utils/jwt/utf8.js +0 -11
  338. package/dist/cjs/utils/mime.js +0 -80
  339. package/dist/cjs/utils/stream.js +0 -89
  340. package/dist/cjs/utils/types.js +0 -0
  341. package/dist/cjs/utils/url.js +0 -215
  342. package/dist/cjs/validator/index.js +0 -3
  343. package/dist/cjs/validator/utils.js +0 -0
  344. package/dist/cjs/validator/validator.js +0 -65
  345. package/dist/types/adapter/aws-lambda/conninfo.d.ts +0 -30
  346. package/dist/types/adapter/aws-lambda/handler.d.ts +0 -230
  347. package/dist/types/adapter/aws-lambda/index.d.ts +0 -4
  348. package/dist/types/adapter/aws-lambda/types.d.ts +0 -183
  349. package/dist/types/adapter/bun/conninfo.d.ts +0 -10
  350. package/dist/types/adapter/bun/index.d.ts +0 -6
  351. package/dist/types/adapter/bun/serve-static.d.ts +0 -8
  352. package/dist/types/adapter/bun/server.d.ts +0 -11
  353. package/dist/types/adapter/bun/ssg.d.ts +0 -17
  354. package/dist/types/adapter/bun/websocket.d.ts +0 -54
  355. package/dist/types/adapter/cloudflare-pages/conninfo.d.ts +0 -24
  356. package/dist/types/adapter/cloudflare-pages/handler.d.ts +0 -45
  357. package/dist/types/adapter/cloudflare-pages/index.d.ts +0 -3
  358. package/dist/types/adapter/cloudflare-workers/conninfo.d.ts +0 -7
  359. package/dist/types/adapter/cloudflare-workers/index.d.ts +0 -4
  360. package/dist/types/adapter/cloudflare-workers/serve-static-module.d.ts +0 -7
  361. package/dist/types/adapter/cloudflare-workers/serve-static.d.ts +0 -21
  362. package/dist/types/adapter/cloudflare-workers/utils.d.ts +0 -13
  363. package/dist/types/adapter/cloudflare-workers/websocket.d.ts +0 -7
  364. package/dist/types/adapter/deno/conninfo.d.ts +0 -10
  365. package/dist/types/adapter/deno/deno.d.ts +0 -1
  366. package/dist/types/adapter/deno/index.d.ts +0 -5
  367. package/dist/types/adapter/deno/serve-static.d.ts +0 -8
  368. package/dist/types/adapter/deno/ssg.d.ts +0 -17
  369. package/dist/types/adapter/deno/websocket.d.ts +0 -7
  370. package/dist/types/adapter/lambda-edge/conninfo.d.ts +0 -7
  371. package/dist/types/adapter/lambda-edge/handler.d.ts +0 -113
  372. package/dist/types/adapter/lambda-edge/index.d.ts +0 -3
  373. package/dist/types/adapter/netlify/conninfo.d.ts +0 -24
  374. package/dist/types/adapter/netlify/handler.d.ts +0 -7
  375. package/dist/types/adapter/netlify/index.d.ts +0 -3
  376. package/dist/types/adapter/netlify/mod.d.ts +0 -3
  377. package/dist/types/adapter/service-worker/handler.d.ts +0 -18
  378. package/dist/types/adapter/service-worker/index.d.ts +0 -26
  379. package/dist/types/adapter/service-worker/types.d.ts +0 -17
  380. package/dist/types/adapter/vercel/conninfo.d.ts +0 -7
  381. package/dist/types/adapter/vercel/handler.d.ts +0 -7
  382. package/dist/types/adapter/vercel/index.d.ts +0 -3
  383. package/dist/types/package.json +0 -3
  384. package/dist/types/utils/buffer.d.ts +0 -19
  385. package/dist/types/utils/color.d.ts +0 -23
  386. package/dist/{types/client → client}/client.d.ts +0 -0
  387. package/dist/{types/client → client}/fetch-result-please.d.ts +0 -0
  388. package/dist/{types/client → client}/index.d.ts +0 -0
  389. package/dist/{types/client → client}/types.d.ts +1 -1
  390. /package/dist/{types/client → client}/utils.d.ts +0 -0
  391. /package/dist/{types/helper → helper}/accepts/accepts.d.ts +0 -0
  392. /package/dist/{types/helper → helper}/accepts/index.d.ts +0 -0
  393. /package/dist/{types/helper → helper}/adapter/index.d.ts +0 -0
  394. /package/dist/{types/helper → helper}/conninfo/index.d.ts +0 -0
  395. /package/dist/{types/helper → helper}/conninfo/types.d.ts +0 -0
  396. /package/dist/{types/helper → helper}/cookie/index.d.ts +0 -0
  397. /package/dist/{types/helper → helper}/css/common.d.ts +0 -0
  398. /package/dist/{types/helper → helper}/css/index.d.ts +0 -0
  399. /package/dist/{types/helper → helper}/html/index.d.ts +0 -0
  400. /package/dist/{types/helper → helper}/proxy/index.d.ts +0 -0
  401. /package/dist/{types/helper → helper}/route/index.d.ts +0 -0
  402. /package/dist/{types/helper → helper}/ssg/index.d.ts +0 -0
  403. /package/dist/{types/helper → helper}/ssg/plugins.d.ts +0 -0
  404. /package/dist/{types/helper → helper}/ssg/utils.d.ts +0 -0
  405. /package/dist/{types/helper → helper}/streaming/index.d.ts +0 -0
  406. /package/dist/{types/helper → helper}/streaming/sse.d.ts +0 -0
  407. /package/dist/{types/helper → helper}/streaming/stream.d.ts +0 -0
  408. /package/dist/{types/helper → helper}/streaming/text.d.ts +0 -0
  409. /package/dist/{types/helper → helper}/streaming/utils.d.ts +0 -0
  410. /package/dist/{types/helper → helper}/testing/index.d.ts +0 -0
  411. /package/dist/{types/helper → helper}/websocket/index.d.ts +0 -0
  412. /package/dist/{types/http-exception.d.ts → http-exception.d.ts} +0 -0
  413. /package/dist/{types/index.d.ts → index.d.ts} +0 -0
  414. /package/dist/{types/jsx → jsx}/base.d.ts +0 -0
  415. /package/dist/{types/jsx → jsx}/children.d.ts +0 -0
  416. /package/dist/{types/jsx → jsx}/components.d.ts +0 -0
  417. /package/dist/{types/jsx → jsx}/constants.d.ts +0 -0
  418. /package/dist/{types/jsx → jsx}/context.d.ts +0 -0
  419. /package/dist/{types/jsx → jsx}/dom/client.d.ts +0 -0
  420. /package/dist/{types/jsx → jsx}/dom/components.d.ts +0 -0
  421. /package/dist/{types/jsx → jsx}/dom/context.d.ts +0 -0
  422. /package/dist/{types/jsx → jsx}/dom/css.d.ts +0 -0
  423. /package/dist/{types/jsx → jsx}/dom/hooks/index.d.ts +0 -0
  424. /package/dist/{types/jsx → jsx}/dom/index.d.ts +0 -0
  425. /package/dist/{types/jsx → jsx}/dom/intrinsic-element/components.d.ts +0 -0
  426. /package/dist/{types/jsx → jsx}/dom/jsx-dev-runtime.d.ts +0 -0
  427. /package/dist/{types/jsx → jsx}/dom/jsx-runtime.d.ts +0 -0
  428. /package/dist/{types/jsx → jsx}/dom/render.d.ts +0 -0
  429. /package/dist/{types/jsx → jsx}/dom/server.d.ts +0 -0
  430. /package/dist/{types/jsx → jsx}/dom/utils.d.ts +0 -0
  431. /package/dist/{types/jsx → jsx}/hooks/index.d.ts +0 -0
  432. /package/dist/{types/jsx → jsx}/index.d.ts +0 -0
  433. /package/dist/{types/jsx → jsx}/intrinsic-element/common.d.ts +0 -0
  434. /package/dist/{types/jsx → jsx}/intrinsic-element/components.d.ts +0 -0
  435. /package/dist/{types/jsx → jsx}/intrinsic-elements.d.ts +0 -0
  436. /package/dist/{types/jsx → jsx}/jsx-dev-runtime.d.ts +0 -0
  437. /package/dist/{types/jsx → jsx}/jsx-runtime.d.ts +0 -0
  438. /package/dist/{types/jsx → jsx}/streaming.d.ts +0 -0
  439. /package/dist/{types/jsx → jsx}/types.d.ts +0 -0
  440. /package/dist/{types/jsx → jsx}/utils.d.ts +0 -0
  441. /package/dist/{types/middleware → middleware}/body-limit/index.d.ts +0 -0
  442. /package/dist/{types/middleware → middleware}/cache/index.d.ts +0 -0
  443. /package/dist/{types/middleware → middleware}/combine/index.d.ts +0 -0
  444. /package/dist/{types/middleware → middleware}/compress/index.d.ts +0 -0
  445. /package/dist/{types/middleware → middleware}/context-storage/index.d.ts +0 -0
  446. /package/dist/{types/middleware → middleware}/cors/index.d.ts +0 -0
  447. /package/dist/{types/middleware → middleware}/csrf/index.d.ts +0 -0
  448. /package/dist/{types/middleware → middleware}/etag/digest.d.ts +0 -0
  449. /package/dist/{types/middleware → middleware}/etag/index.d.ts +0 -0
  450. /package/dist/{types/middleware → middleware}/ip-restriction/index.d.ts +0 -0
  451. /package/dist/{types/middleware → middleware}/jsx-renderer/index.d.ts +0 -0
  452. /package/dist/{types/middleware → middleware}/jwk/index.d.ts +0 -0
  453. /package/dist/{types/middleware → middleware}/jwk/jwk.d.ts +0 -0
  454. /package/dist/{types/middleware → middleware}/jwt/index.d.ts +0 -0
  455. /package/dist/{types/middleware → middleware}/jwt/jwt.d.ts +0 -0
  456. /package/dist/{types/middleware → middleware}/language/index.d.ts +0 -0
  457. /package/dist/{types/middleware → middleware}/language/language.d.ts +0 -0
  458. /package/dist/{types/middleware → middleware}/logger/index.d.ts +0 -0
  459. /package/dist/{types/middleware → middleware}/method-not-allowed/index.d.ts +0 -0
  460. /package/dist/{types/middleware → middleware}/method-override/index.d.ts +0 -0
  461. /package/dist/{types/middleware → middleware}/mount/index.d.ts +0 -0
  462. /package/dist/{types/middleware → middleware}/powered-by/index.d.ts +0 -0
  463. /package/dist/{types/middleware → middleware}/pretty-json/index.d.ts +0 -0
  464. /package/dist/{types/middleware → middleware}/request-id/index.d.ts +0 -0
  465. /package/dist/{types/middleware → middleware}/request-id/request-id.d.ts +0 -0
  466. /package/dist/{types/middleware → middleware}/secure-headers/index.d.ts +0 -0
  467. /package/dist/{types/middleware → middleware}/secure-headers/permissions-policy.d.ts +0 -0
  468. /package/dist/{types/middleware → middleware}/secure-headers/secure-headers.d.ts +0 -0
  469. /package/dist/{types/middleware → middleware}/serve-static/path.d.ts +0 -0
  470. /package/dist/{types/middleware → middleware}/timeout/index.d.ts +0 -0
  471. /package/dist/{types/middleware → middleware}/timing/index.d.ts +0 -0
  472. /package/dist/{types/middleware → middleware}/timing/timing.d.ts +0 -0
  473. /package/dist/{types/middleware → middleware}/trailing-slash/index.d.ts +0 -0
  474. /package/dist/{types/request → request}/constants.d.ts +0 -0
  475. /package/dist/{types/router → router}/linear-router/index.d.ts +0 -0
  476. /package/dist/{types/router → router}/linear-router/router.d.ts +0 -0
  477. /package/dist/{types/router → router}/pattern-router/index.d.ts +0 -0
  478. /package/dist/{types/router → router}/pattern-router/router.d.ts +0 -0
  479. /package/dist/{types/router → router}/reg-exp-router/index.d.ts +0 -0
  480. /package/dist/{types/router → router}/reg-exp-router/matcher.d.ts +0 -0
  481. /package/dist/{types/router → router}/reg-exp-router/node.d.ts +0 -0
  482. /package/dist/{types/router → router}/reg-exp-router/prepared-router.d.ts +0 -0
  483. /package/dist/{types/router → router}/reg-exp-router/router.d.ts +0 -0
  484. /package/dist/{types/router → router}/reg-exp-router/trie.d.ts +0 -0
  485. /package/dist/{types/router → router}/smart-router/index.d.ts +0 -0
  486. /package/dist/{types/router → router}/smart-router/router.d.ts +0 -0
  487. /package/dist/{types/router → router}/trie-router/index.d.ts +0 -0
  488. /package/dist/{types/router → router}/trie-router/node.d.ts +0 -0
  489. /package/dist/{types/router → router}/trie-router/router.d.ts +0 -0
  490. /package/dist/{types/router → router}/utils.d.ts +0 -0
  491. /package/dist/{types/router.d.ts → router.d.ts} +0 -0
  492. /package/dist/{types/utils → utils}/accept.d.ts +0 -0
  493. /package/dist/{types/utils → utils}/basic-auth.d.ts +0 -0
  494. /package/dist/{types/utils → utils}/body.d.ts +0 -0
  495. /package/dist/{types/utils → utils}/compress.d.ts +0 -0
  496. /package/dist/{types/utils → utils}/concurrent.d.ts +0 -0
  497. /package/dist/{types/utils → utils}/constants.d.ts +0 -0
  498. /package/dist/{types/utils → utils}/cookie.d.ts +0 -0
  499. /package/dist/{types/utils → utils}/crypto.d.ts +0 -0
  500. /package/dist/{types/utils → utils}/encode.d.ts +0 -0
  501. /package/dist/{types/utils → utils}/filepath.d.ts +0 -0
  502. /package/dist/{types/utils → utils}/handler.d.ts +0 -0
  503. /package/dist/{types/utils → utils}/headers.d.ts +0 -0
  504. /package/dist/{types/utils → utils}/html.d.ts +0 -0
  505. /package/dist/{types/utils → utils}/ipaddr.d.ts +0 -0
  506. /package/dist/{types/utils → utils}/jwt/index.d.ts +0 -0
  507. /package/dist/{types/utils → utils}/jwt/jwa.d.ts +0 -0
  508. /package/dist/{types/utils → utils}/jwt/jws.d.ts +0 -0
  509. /package/dist/{types/utils → utils}/jwt/jwt.d.ts +0 -0
  510. /package/dist/{types/utils → utils}/jwt/types.d.ts +0 -0
  511. /package/dist/{types/utils → utils}/jwt/utf8.d.ts +0 -0
  512. /package/dist/{types/utils → utils}/mime.d.ts +0 -0
  513. /package/dist/{types/utils → utils}/stream.d.ts +0 -0
  514. /package/dist/{types/utils → utils}/types.d.ts +0 -0
  515. /package/dist/{types/validator → validator}/index.d.ts +0 -0
  516. /package/dist/{types/validator → validator}/utils.d.ts +0 -0
@@ -0,0 +1,150 @@
1
+ import { ContentfulStatusCode } from "../../utils/http-status.js";
2
+ import { JSONParsed } from "../../utils/types.js";
3
+ import { Env, FormValue, Handler, IntersectNonAnyTypes, MiddlewareHandler, TypedResponse, ValidationTargets } from "../../types.js";
4
+ import { Context } from "../../context.js";
5
+ import { HtmlEscaped } from "../../utils/html.js";
6
+ import { InferInput } from "../../validator/utils.js";
7
+ //#region src/helper/factory/define-handler.d.ts
8
+ type StandardSchemaIssue = {
9
+ readonly message: string;
10
+ readonly path?: ReadonlyArray<PropertyKey | {
11
+ readonly key: PropertyKey;
12
+ }> | undefined;
13
+ };
14
+ type StandardSchemaResult<Output> = {
15
+ readonly value: Output;
16
+ readonly issues?: undefined;
17
+ } | {
18
+ readonly issues: ReadonlyArray<StandardSchemaIssue>;
19
+ };
20
+ /**
21
+ * The part of the Standard Schema interface used by `defineHandler()`.
22
+ * @see {@link https://standardschema.dev/}
23
+ */
24
+ export type StandardSchema<Input = unknown, Output = Input> = {
25
+ readonly '~standard': {
26
+ readonly validate: (value: unknown) => StandardSchemaResult<Output> | Promise<StandardSchemaResult<Output>>;
27
+ readonly types?: {
28
+ readonly input: Input;
29
+ readonly output: Output;
30
+ } | undefined;
31
+ };
32
+ };
33
+ type AnyStandardSchema = StandardSchema<any, any>;
34
+ type AnyResponse = Response | TypedResponse<any, any, any>;
35
+ /**
36
+ * A Standard Schema or a validation function for `Value`.
37
+ * `T` is the schema itself, or the output of the function. It is `never` when not specified.
38
+ */
39
+ type Validation<Value, T> = (T & AnyStandardSchema) | ((value: Value, c: Context<any, any, any>) => T | Promise<T>);
40
+ type ResponseValidation<In, Out> = (Out & StandardSchema<In, any>) | ((value: In, c: Context<any, any, any>) => Out | Promise<Out>);
41
+ /**
42
+ * A Response the handler can return. A JSON Response by `c.json()` is not accepted,
43
+ * because it bypasses the response validation. Return the value instead.
44
+ */
45
+ type NonJSONResponse = Response & {
46
+ readonly _format?: 'text' | 'redirect' | 'body';
47
+ };
48
+ type InputOf<T> = T extends StandardSchema<infer I, any> ? I : Exclude<T, AnyResponse>;
49
+ type OutputOf<T> = T extends StandardSchema<any, infer O> ? O : Exclude<T, AnyResponse>;
50
+ type RequestTarget = keyof ValidationTargets;
51
+ type Targets = { [K in RequestTarget]: unknown; };
52
+ type ValidatedTarget<T extends Targets> = { [K in RequestTarget]: [T[K]] extends [never] ? never : K; }[RequestTarget];
53
+ type ValidatedInput<T extends Targets> = {
54
+ in: { [K in ValidatedTarget<T>]: K extends 'json' ? InputOf<T[K]> : InferInput<InputOf<T[K]>, K, FormValue>; };
55
+ out: { [K in ValidatedTarget<T>]: OutputOf<T[K]>; };
56
+ };
57
+ /** The validated values, passed to the handler as the second argument */
58
+ type HandlerInput<T extends Targets> = { [K in ValidatedTarget<T>]: OutputOf<T[K]>; };
59
+ type JSONResponseOf<T> = Response & TypedResponse<JSONParsed<T>, ContentfulStatusCode, 'json'>;
60
+ /** The Response that `toResponse()` converts a returned value to */
61
+ type ConvertedResponse<R> = [unknown] extends [R] ? Response : R extends AnyResponse ? R : R extends null | undefined | void ? Response & TypedResponse<null, 204, 'body'> : R extends string | HtmlEscaped ? Response : JSONResponseOf<R>;
62
+ type AnyMiddleware = MiddlewareHandler<any, any, any>;
63
+ type MiddlewareEnvs<M extends AnyMiddleware[]> = { [K in keyof M]: M[K] extends MiddlewareHandler<infer ME, any, any> ? ME : never; };
64
+ /**
65
+ * An issue in the failure response. `path` is dot-joined, e.g. `user.email`.
66
+ * The input value is not included.
67
+ */
68
+ export type ValidationIssue = {
69
+ message: string;
70
+ path?: string;
71
+ };
72
+ /** The issues of one validation target in the failure response */
73
+ export type ValidationFailure = {
74
+ slot: RequestTarget | 'response';
75
+ issues: ValidationIssue[];
76
+ };
77
+ type ValidatedHandlerOptions<Param, Query, Header, Cookie, Form, Json, ResponseIn, ResponseOut> = {
78
+ param?: Validation<ValidationTargets['param'], Param>;
79
+ query?: Validation<ValidationTargets['query'], Query>;
80
+ header?: Validation<ValidationTargets['header'], Header>;
81
+ cookie?: Validation<ValidationTargets['cookie'], Cookie>;
82
+ form?: Validation<ValidationTargets['form'], Form>;
83
+ json?: Validation<ValidationTargets['json'], Json>;
84
+ response?: ResponseValidation<ResponseIn, ResponseOut>;
85
+ };
86
+ type ValidatedHandler<E extends Env, P extends string, T extends Targets, ResponseOut, R> = Handler<E, P, ValidatedInput<T>, Promise<[ResponseOut] extends [never] ? ConvertedResponse<Awaited<R>> : JSONResponseOf<OutputOf<ResponseOut>>>>;
87
+ export interface DefineHandler<E extends Env, P extends string> {
88
+ /**
89
+ * Defines a handler, with middleware before it. The returned value is converted to a Response.
90
+ */
91
+ <E2 extends Env = E, P2 extends string = P, M extends AnyMiddleware[] = [], R = unknown>(...args: [...middleware: M, handler: (c: Context<IntersectNonAnyTypes<[E2, ...MiddlewareEnvs<M>]>, P2>) => R]): Handler<E2, P2, {}, Promise<ConvertedResponse<Awaited<R>>>>;
92
+ /**
93
+ * Defines a handler with request and response validation, with middleware before it.
94
+ */
95
+ <Param = never, Query = never, Header = never, Cookie = never, Form = never, Json = never, ResponseIn = unknown, ResponseOut = never, T extends Targets = {
96
+ param: Param;
97
+ query: Query;
98
+ header: Header;
99
+ cookie: Cookie;
100
+ form: Form;
101
+ json: Json;
102
+ }>(options: ValidatedHandlerOptions<Param, Query, Header, Cookie, Form, Json, ResponseIn, ResponseOut>): <E2 extends Env = E, P2 extends string = P, M extends AnyMiddleware[] = [], R extends ResponseIn | NonJSONResponse | Promise<ResponseIn | NonJSONResponse> = ResponseIn>(...args: [...middleware: M, handler: (c: Context<IntersectNonAnyTypes<[E2, ...MiddlewareEnvs<M>]>, P2, ValidatedInput<T>>, input: HandlerInput<T>) => R]) => ValidatedHandler<E2, P2, T, ResponseOut, R>;
103
+ }
104
+ /**
105
+ * `defineHandler()` defines a handler. A value returned from the handler is converted to a
106
+ * Response: an object is returned as JSON, a string or JSX as HTML, and `null` or `undefined`
107
+ * as `204 No Content`. A `Response` is returned as is. The status is set with `c.status()`, and
108
+ * it is not in the types. Return `c.json()` to have the status in the types.
109
+ *
110
+ * With options, each request target (`param`, `query`, `json`, `form`, `header`, `cookie`)
111
+ * is validated before the handler runs. The validated values are passed to the handler as
112
+ * the second argument, and are also available through `c.req.valid()`.
113
+ * A value returned from the handler is validated with `response` and returned as JSON.
114
+ *
115
+ * Each validation accepts a Standard Schema or a validation function.
116
+ * When a Standard Schema fails, an `HTTPException` is thrown with status 400 for the request
117
+ * and 500 for the response, so `onError` can handle it. Its `res` is a JSON response of
118
+ * `{ error, issues }`, and its `cause` is `{ issues }` with the raw Standard Schema issues.
119
+ *
120
+ * Middleware passed before the handler runs first, around the validation. Its Env flows into
121
+ * the handler, so `c.get()` is typed. Otherwise, use `createFactory<Env>().defineHandler`, or
122
+ * pass the Env and the path as type arguments.
123
+ *
124
+ * @see {@link https://hono.dev/docs/helpers/factory#definehandler}
125
+ *
126
+ * @experimental
127
+ * `defineHandler()` is an experimental feature.
128
+ * The API might be changed.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * app.get('/ping', defineHandler(() => ({ pong: true })))
133
+ * app.get('/me', defineHandler(auth, (c) => c.get('user')))
134
+ *
135
+ * app.post(
136
+ * '/users/:id',
137
+ * defineHandler({
138
+ * param: ParamSchema,
139
+ * json: BodySchema,
140
+ * response: UserSchema,
141
+ * })(async (c, { param, json }) => {
142
+ * c.status(201)
143
+ * return { id: param.id, ...json }
144
+ * })
145
+ * )
146
+ * ```
147
+ */
148
+ export declare const defineHandler: DefineHandler<any, any>;
149
+ //#endregion
150
+ export {};
@@ -0,0 +1,117 @@
1
+ import { HTTPException } from "../../http-exception.js";
2
+ import { getValidationTarget } from "../../validator/validator.js";
3
+ //#region src/helper/factory/define-handler.ts
4
+ const requestTargets = [
5
+ "param",
6
+ "query",
7
+ "header",
8
+ "cookie",
9
+ "form",
10
+ "json"
11
+ ];
12
+ const isStandardSchema = (v) => (typeof v === "object" || typeof v === "function") && v !== null && "~standard" in v;
13
+ const toValidationIssues = (issues) => issues.map(({ message, path }) => path ? {
14
+ message,
15
+ path: path.map((p) => String(typeof p === "object" ? p.key : p)).join(".")
16
+ } : { message });
17
+ const toValidator = (target, v) => isStandardSchema(v) ? {
18
+ target,
19
+ schema: v["~standard"].validate
20
+ } : {
21
+ target,
22
+ fn: v
23
+ };
24
+ const toResponse = (c, result) => {
25
+ if (result instanceof Response) return result;
26
+ if (result === null || result === void 0) return c.body(null, 204);
27
+ return typeof result === "string" || result.isEscaped ? c.html(result) : c.json(result);
28
+ };
29
+ const defineHandler = ((...args) => {
30
+ if (typeof args[0] === "function") return compose(args, async (c) => toResponse(c, await args[args.length - 1](c)));
31
+ const options = args[0];
32
+ const validators = requestTargets.filter((target) => options[target]).map((target) => toValidator(target, options[target]));
33
+ const response = options.response && toValidator("json", options.response);
34
+ return (...args) => {
35
+ const handler = args[args.length - 1];
36
+ const run = async (c) => {
37
+ const input = {};
38
+ const failures = [];
39
+ const issues = [];
40
+ for (const { target, schema, fn } of validators) {
41
+ let value = getValidationTarget(c, target);
42
+ if (value instanceof Promise) value = await value;
43
+ if (schema) {
44
+ let result = schema(value);
45
+ if (result instanceof Promise) result = await result;
46
+ if (result.issues) {
47
+ failures.push({
48
+ slot: target,
49
+ issues: toValidationIssues(result.issues)
50
+ });
51
+ issues.push({
52
+ slot: target,
53
+ issues: result.issues
54
+ });
55
+ continue;
56
+ }
57
+ value = result.value;
58
+ } else {
59
+ value = fn(value, c);
60
+ if (value instanceof Promise) value = await value;
61
+ if (value instanceof Response) return value;
62
+ }
63
+ c.req.addValidatedData(target, value);
64
+ input[target] = value;
65
+ }
66
+ if (failures.length) throw new HTTPException(400, {
67
+ res: c.json({
68
+ error: "Validation failed",
69
+ issues: failures
70
+ }, 400),
71
+ cause: { issues }
72
+ });
73
+ let result = handler(c, input);
74
+ if (result instanceof Promise) result = await result;
75
+ if (result instanceof Response) return result;
76
+ if (response) {
77
+ if (response.schema) {
78
+ let validated = response.schema(result);
79
+ if (validated instanceof Promise) validated = await validated;
80
+ if (validated.issues) throw new HTTPException(500, {
81
+ res: c.json({ error: "Response validation failed" }, 500),
82
+ cause: { issues: [{
83
+ slot: "response",
84
+ issues: validated.issues
85
+ }] }
86
+ });
87
+ result = validated.value;
88
+ } else {
89
+ result = response.fn(result, c);
90
+ if (result instanceof Promise) result = await result;
91
+ if (result instanceof Response) return result;
92
+ }
93
+ return c.json(result);
94
+ }
95
+ return toResponse(c, result);
96
+ };
97
+ return Object.assign(compose(args, run), { validations: options });
98
+ };
99
+ });
100
+ const compose = (args, run) => {
101
+ const middleware = args.slice(0, -1);
102
+ if (!middleware.length) return run;
103
+ return async (c) => {
104
+ const dispatch = async (i) => {
105
+ if (i === middleware.length) {
106
+ c.res = await run(c);
107
+ return;
108
+ }
109
+ const res = await middleware[i](c, () => dispatch(i + 1));
110
+ if (res) c.res = res;
111
+ };
112
+ await dispatch(0);
113
+ return c.res;
114
+ };
115
+ };
116
+ //#endregion
117
+ export { defineHandler };
@@ -1,6 +1,7 @@
1
- import { HonoOptions } from "../../hono-base.js";
2
1
  import { Env, H, HandlerResponse, Input, IntersectNonAnyTypes, MiddlewareHandler } from "../../types.js";
2
+ import { HonoOptions } from "../../hono-base.js";
3
3
  import { Hono } from "../../hono.js";
4
+ import { DefineHandler, StandardSchema, ValidationFailure, ValidationIssue, defineHandler } from "./define-handler.js";
4
5
  //#region src/helper/factory/index.d.ts
5
6
  type InitApp<E extends Env = Env> = (app: Hono<E>) => void;
6
7
  export interface CreateHandlersInterface<E extends Env, P extends string> {
@@ -23,13 +24,41 @@ export declare class Factory<E extends Env = Env, P extends string = string> {
23
24
  defaultAppOptions?: HonoOptions<E>;
24
25
  });
25
26
  createApp: (options?: HonoOptions<E>) => Hono<E>;
27
+ defineMiddleware: <I extends Input = {}, R extends HandlerResponse<any> | void = void>(middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>) => MiddlewareHandler<E, P, I, R extends void ? Response : R>;
28
+ defineHandler: DefineHandler<E, P>;
29
+ /**
30
+ * @deprecated Use `defineMiddleware()` instead. It will be removed in the next major version.
31
+ */
26
32
  createMiddleware: <I extends Input = {}, R extends HandlerResponse<any> | void = void>(middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>) => MiddlewareHandler<E, P, I, R extends void ? Response : R>;
33
+ /**
34
+ * @deprecated Use `defineHandler()` instead. It will be removed in the next major version.
35
+ * Pass the middleware before the handler:
36
+ * `defineHandler(auth, (c) => ...)`.
37
+ */
27
38
  createHandlers: CreateHandlersInterface<E, P>;
28
39
  }
29
40
  export declare const createFactory: <E extends Env = Env, P extends string = string>(init?: {
30
41
  initApp?: InitApp<E>;
31
42
  defaultAppOptions?: HonoOptions<E>;
32
43
  }) => Factory<E, P>;
44
+ /**
45
+ * `defineMiddleware()` defines a middleware with the types.
46
+ *
47
+ * @see {@link https://hono.dev/docs/helpers/factory#definemiddleware}
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * const auth = defineMiddleware<{ Variables: { user: User } }>(async (c, next) => {
52
+ * c.set('user', await getUser(c))
53
+ * await next()
54
+ * })
55
+ * ```
56
+ */
57
+ export declare const defineMiddleware: <E extends Env = any, P extends string = string, I extends Input = {}, R extends HandlerResponse<any> | void = void>(middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>) => MiddlewareHandler<E, P, I, R extends void ? Response : R>;
58
+ /**
59
+ * @deprecated Use `defineMiddleware()` instead. It will be removed in the next major version.
60
+ */
33
61
  export declare const createMiddleware: <E extends Env = any, P extends string = string, I extends Input = {}, R extends HandlerResponse<any> | void = void>(middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>) => MiddlewareHandler<E, P, I, R extends void ? Response : R>;
34
62
  //#endregion
63
+ export { type StandardSchema, type ValidationFailure, type ValidationIssue, defineHandler };
35
64
  export {};
@@ -1,9 +1,6 @@
1
1
  import { Hono } from "../../hono.js";
2
+ import { defineHandler } from "./define-handler.js";
2
3
  //#region src/helper/factory/index.ts
3
- /**
4
- * @module
5
- * Factory Helper for Hono.
6
- */
7
4
  var Factory = class {
8
5
  initApp;
9
6
  #defaultAppOptions;
@@ -19,12 +16,15 @@ var Factory = class {
19
16
  if (this.initApp) this.initApp(app);
20
17
  return app;
21
18
  };
22
- createMiddleware = (middleware) => middleware;
19
+ defineMiddleware = (middleware) => middleware;
20
+ defineHandler = defineHandler;
21
+ createMiddleware = this.defineMiddleware;
23
22
  createHandlers = (...handlers) => {
24
23
  return handlers.filter((handler) => handler !== void 0);
25
24
  };
26
25
  };
27
26
  const createFactory = (init) => new Factory(init);
28
- const createMiddleware = (middleware) => middleware;
27
+ const defineMiddleware = (middleware) => middleware;
28
+ const createMiddleware = defineMiddleware;
29
29
  //#endregion
30
- export { Factory, createFactory, createMiddleware };
30
+ export { Factory, createFactory, createMiddleware, defineHandler, defineMiddleware };
@@ -1,9 +1,5 @@
1
1
  import { escapeToBuffer, raw, resolveCallbackSync, stringBufferToString } from "../../utils/html.js";
2
2
  //#region src/helper/html/index.ts
3
- /**
4
- * @module
5
- * html Helper for Hono.
6
- */
7
3
  const html = (strings, ...values) => {
8
4
  const buffer = [""];
9
5
  for (let i = 0, len = strings.length - 1; i < len; i++) {
@@ -1,9 +1,5 @@
1
1
  import { HTTPException } from "../../http-exception.js";
2
2
  //#region src/helper/proxy/index.ts
3
- /**
4
- * @module
5
- * Proxy Helper for Hono.
6
- */
7
3
  const hopByHopHeaders = [
8
4
  "connection",
9
5
  "keep-alive",
@@ -48,51 +44,6 @@ const preprocessRequestInit = (requestInit) => {
48
44
  requestInit.headers = headers;
49
45
  return requestInit;
50
46
  };
51
- /**
52
- * Fetch API wrapper for proxy.
53
- * The parameters and return value are the same as for `fetch` (except for the proxy-specific options).
54
- *
55
- * The "Accept-Encoding" header is replaced with an encoding that the current runtime can handle.
56
- * Unnecessary response headers are deleted and a Response object is returned that can be returned
57
- * as is as a response from the handler.
58
- *
59
- * @example
60
- * ```ts
61
- * app.get('/proxy/:path', (c) => {
62
- * return proxy(`http://${originServer}/${c.req.param('path')}`, {
63
- * headers: {
64
- * ...c.req.header(), // optional, specify only when forwarding all the request data (including credentials) is necessary.
65
- * 'X-Forwarded-For': '127.0.0.1',
66
- * 'X-Forwarded-Host': c.req.header('host'),
67
- * Authorization: undefined, // do not propagate request headers contained in c.req.header('Authorization')
68
- * },
69
- * }).then((res) => {
70
- * res.headers.delete('Set-Cookie')
71
- * return res
72
- * })
73
- * })
74
- *
75
- * app.all('/proxy/:path', (c) => {
76
- * return proxy(`http://${originServer}/${c.req.param('path')}`, {
77
- * ...c.req, // optional, specify only when forwarding all the request data (including credentials) is necessary.
78
- * headers: {
79
- * ...c.req.header(),
80
- * 'X-Forwarded-For': '127.0.0.1',
81
- * 'X-Forwarded-Host': c.req.header('host'),
82
- * Authorization: undefined, // do not propagate request headers contained in c.req.header('Authorization')
83
- * },
84
- * })
85
- * })
86
- *
87
- * // Strict RFC compliance mode (use only in trusted environments)
88
- * app.get('/internal-proxy/:path', (c) => {
89
- * return proxy(`http://${internalServer}/${c.req.param('path')}`, {
90
- * ...c.req,
91
- * strictConnectionProcessing: true,
92
- * })
93
- * })
94
- * ```
95
- */
96
47
  const proxy = async (input, proxyInit) => {
97
48
  const { raw, customFetch, strictConnectionProcessing = false, ...requestInit } = proxyInit instanceof Request ? { raw: proxyInit } : proxyInit ?? {};
98
49
  const req = new Request(input, {
@@ -1,99 +1,9 @@
1
1
  import { GET_MATCH_RESULT } from "../../request/constants.js";
2
2
  import { getPattern, splitRoutingPath } from "../../utils/url.js";
3
3
  //#region src/helper/route/index.ts
4
- /**
5
- * Get matched routes in the handler
6
- *
7
- * @param {Context} c - The context object
8
- * @returns An array of matched routes
9
- *
10
- * @example
11
- * ```ts
12
- * import { matchedRoutes } from 'hono/route'
13
- *
14
- * app.use('*', async function logger(c, next) {
15
- * await next()
16
- * matchedRoutes(c).forEach(({ handler, method, path }, i) => {
17
- * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')
18
- * console.log(
19
- * method,
20
- * ' ',
21
- * path,
22
- * ' '.repeat(Math.max(10 - path.length, 0)),
23
- * name,
24
- * i === c.req.routeIndex ? '<- respond from here' : ''
25
- * )
26
- * })
27
- * })
28
- * ```
29
- */
30
4
  const matchedRoutes = (c) => c.req[GET_MATCH_RESULT][0].map(([[, route]]) => route);
31
- /**
32
- * Get the route path registered within the handler
33
- *
34
- * @param {Context} c - The context object
35
- * @param {number} index - The index of the route from which to retrieve the path, similar to Array.prototype.at(), where a negative number is the index counted from the end of the matching route. Defaults to the current route index.
36
- * @returns The route path registered within the handler
37
- *
38
- * @example
39
- * ```ts
40
- * import { routePath } from 'hono/route'
41
- *
42
- * app.use('*', (c, next) => {
43
- * console.log(routePath(c)) // '*'
44
- * console.log(routePath(c, -1)) // '/posts/:id'
45
- * return next()
46
- * })
47
- *
48
- * app.get('/posts/:id', (c) => {
49
- * return c.text(routePath(c)) // '/posts/:id'
50
- * })
51
- * ```
52
- */
53
5
  const routePath = (c, index) => matchedRoutes(c).at(index ?? c.req.routeIndex)?.path ?? "";
54
- /**
55
- * Get the basePath of the as-is route specified by routing.
56
- *
57
- * @param {Context} c - The context object
58
- * @param {number} index - The index of the route from which to retrieve the path, similar to Array.prototype.at(), where a negative number is the index counted from the end of the matching route. Defaults to the current route index.
59
- * @returns The basePath of the as-is route specified by routing.
60
- *
61
- * @example
62
- * ```ts
63
- * import { baseRoutePath } from 'hono/route'
64
- *
65
- * const app = new Hono()
66
- *
67
- * const subApp = new Hono()
68
- * subApp.get('/posts/:id', (c) => {
69
- * return c.text(baseRoutePath(c)) // '/:sub'
70
- * })
71
- *
72
- * app.route('/:sub', subApp)
73
- * ```
74
- */
75
6
  const baseRoutePath = (c, index) => matchedRoutes(c).at(index ?? c.req.routeIndex)?.basePath ?? "";
76
- /**
77
- * Get the basePath with embedded parameters
78
- *
79
- * @param {Context} c - The context object
80
- * @param {number} index - The index of the route from which to retrieve the path, similar to Array.prototype.at(), where a negative number is the index counted from the end of the matching route. Defaults to the current route index.
81
- * @returns The basePath with embedded parameters.
82
- *
83
- * @example
84
- * ```ts
85
- * import { basePath } from 'hono/route'
86
- *
87
- * const app = new Hono()
88
- *
89
- * const subApp = new Hono()
90
- * subApp.get('/posts/:id', (c) => {
91
- * return c.text(basePath(c)) // '/requested-sub-app-path'
92
- * })
93
- *
94
- * app.route('/:sub', subApp)
95
- * ```
96
- */
97
7
  const basePathCacheMap = /* @__PURE__ */ new WeakMap();
98
8
  const basePath = (c, index) => {
99
9
  index ??= c.req.routeIndex;
@@ -3,12 +3,6 @@ import { Context } from "../../context.js";
3
3
  //#region src/helper/ssg/middleware.d.ts
4
4
  export declare const SSG_CONTEXT = "HONO_SSG_CONTEXT";
5
5
  export declare const X_HONO_DISABLE_SSG_HEADER_KEY = "x-hono-disable-ssg";
6
- /**
7
- * @deprecated
8
- * Use `X_HONO_DISABLE_SSG_HEADER_KEY` instead.
9
- * This constant will be removed in the next minor version.
10
- */
11
- export declare const SSG_DISABLED_RESPONSE: Response;
12
6
  interface SSGParam {
13
7
  [key: string]: string;
14
8
  }
@@ -2,24 +2,6 @@ import { isDynamicRoute } from "./utils.js";
2
2
  //#region src/helper/ssg/middleware.ts
3
3
  const SSG_CONTEXT = "HONO_SSG_CONTEXT";
4
4
  const X_HONO_DISABLE_SSG_HEADER_KEY = "x-hono-disable-ssg";
5
- /**
6
- * @deprecated
7
- * Use `X_HONO_DISABLE_SSG_HEADER_KEY` instead.
8
- * This constant will be removed in the next minor version.
9
- */
10
- const SSG_DISABLED_RESPONSE = (() => {
11
- try {
12
- return new Response("SSG is disabled", {
13
- status: 404,
14
- headers: { [X_HONO_DISABLE_SSG_HEADER_KEY]: "true" }
15
- });
16
- } catch {
17
- return null;
18
- }
19
- })();
20
- /**
21
- * Define SSG Route
22
- */
23
5
  const ssgParams = (params) => async (c, next) => {
24
6
  if (isDynamicRoute(c.req.path)) {
25
7
  c.req.raw.ssgParams = Array.isArray(params) ? params : await params(c);
@@ -27,17 +9,7 @@ const ssgParams = (params) => async (c, next) => {
27
9
  }
28
10
  await next();
29
11
  };
30
- /**
31
- * @experimental
32
- * `isSSGContext` is an experimental feature.
33
- * The API might be changed.
34
- */
35
12
  const isSSGContext = (c) => !!c.env?.[SSG_CONTEXT];
36
- /**
37
- * @experimental
38
- * `disableSSG` is an experimental feature.
39
- * The API might be changed.
40
- */
41
13
  const disableSSG = () => async function disableSSG(c, next) {
42
14
  if (isSSGContext(c)) {
43
15
  c.header(X_HONO_DISABLE_SSG_HEADER_KEY, "true");
@@ -45,14 +17,9 @@ const disableSSG = () => async function disableSSG(c, next) {
45
17
  }
46
18
  await next();
47
19
  };
48
- /**
49
- * @experimental
50
- * `onlySSG` is an experimental feature.
51
- * The API might be changed.
52
- */
53
20
  const onlySSG = () => async function onlySSG(c, next) {
54
21
  if (!isSSGContext(c)) return c.notFound();
55
22
  await next();
56
23
  };
57
24
  //#endregion
58
- export { SSG_CONTEXT, SSG_DISABLED_RESPONSE, X_HONO_DISABLE_SSG_HEADER_KEY, disableSSG, isSSGContext, onlySSG, ssgParams };
25
+ export { SSG_CONTEXT, X_HONO_DISABLE_SSG_HEADER_KEY, disableSSG, isSSGContext, onlySSG, ssgParams };
@@ -1,12 +1,5 @@
1
1
  import { html } from "../html/index.js";
2
2
  //#region src/helper/ssg/plugins.ts
3
- /**
4
- * The default plugin that defines the recommended behavior.
5
- *
6
- * @experimental
7
- * `defaultPlugin` is an experimental feature.
8
- * The API might be changed.
9
- */
10
3
  const defaultPlugin = () => {
11
4
  return { afterResponseHook: (res) => {
12
5
  if (res.status !== 200) return false;
@@ -31,23 +24,6 @@ const generateRedirectHtml = (location) => {
31
24
  </body>
32
25
  `.toString().replace(/\n/g, "");
33
26
  };
34
- /**
35
- * The redirect plugin that generates HTML redirect pages for HTTP redirect responses for status codes 301, 302, 303, 307 and 308.
36
- *
37
- * When used with `defaultPlugin`, place `redirectPlugin` before it, because `defaultPlugin` skips non-200 responses.
38
- *
39
- * ```ts
40
- * // ✅ Will work as expected
41
- * toSSG(app, fs, { plugins: [redirectPlugin(), defaultPlugin()] })
42
- *
43
- * // ❌ Will not work as expected
44
- * toSSG(app, fs, { plugins: [defaultPlugin(), redirectPlugin()] })
45
- * ```
46
- *
47
- * @experimental
48
- * `redirectPlugin` is an experimental feature.
49
- * The API might be changed.
50
- */
51
27
  const redirectPlugin = () => {
52
28
  return { afterResponseHook: (res) => {
53
29
  if (REDIRECT_STATUS_CODES.has(res.status)) {
@@ -37,18 +37,6 @@ export interface SSGPlugin {
37
37
  }
38
38
  export interface ToSSGOptions {
39
39
  dir?: string;
40
- /**
41
- * @deprecated Use plugins[].beforeRequestHook instead.
42
- */
43
- beforeRequestHook?: BeforeRequestHook | BeforeRequestHook[];
44
- /**
45
- * @deprecated Use plugins[].afterResponseHook instead.
46
- */
47
- afterResponseHook?: AfterResponseHook | AfterResponseHook[];
48
- /**
49
- * @deprecated Use plugins[].afterGenerateHook instead.
50
- */
51
- afterGenerateHook?: AfterGenerateHook | AfterGenerateHook[];
52
40
  concurrency?: number;
53
41
  extensionMap?: Record<string, string>;
54
42
  plugins?: SSGPlugin[];