ts-procedures 7.3.0 → 8.0.0

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 (325) hide show
  1. package/README.md +65 -3
  2. package/agent_config/claude-code/agents/ts-procedures-architect.md +6 -8
  3. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +30 -33
  4. package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +104 -53
  5. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +205 -232
  6. package/agent_config/claude-code/skills/ts-procedures/patterns.md +80 -153
  7. package/agent_config/claude-code/skills/ts-procedures-review/SKILL.md +1 -1
  8. package/agent_config/claude-code/skills/ts-procedures-review/checklist.md +4 -5
  9. package/agent_config/claude-code/skills/ts-procedures-scaffold/SKILL.md +4 -7
  10. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono.md +223 -0
  11. package/agent_config/copilot/copilot-instructions.md +34 -48
  12. package/agent_config/cursor/cursorrules +34 -48
  13. package/build/client/call.js +4 -1
  14. package/build/client/call.js.map +1 -1
  15. package/build/client/call.test.js +23 -0
  16. package/build/client/call.test.js.map +1 -1
  17. package/build/client/fetch-adapter.js +3 -1
  18. package/build/client/fetch-adapter.js.map +1 -1
  19. package/build/client/fetch-adapter.test.js +11 -1
  20. package/build/client/fetch-adapter.test.js.map +1 -1
  21. package/build/client/index.test.js +7 -7
  22. package/build/client/index.test.js.map +1 -1
  23. package/build/client/request-builder.d.ts +1 -1
  24. package/build/client/request-builder.js +2 -2
  25. package/build/client/request-builder.js.map +1 -1
  26. package/build/client/stream.js +13 -2
  27. package/build/client/stream.js.map +1 -1
  28. package/build/client/stream.test.js +32 -7
  29. package/build/client/stream.test.js.map +1 -1
  30. package/build/client/typed-error-dispatch.test.js +8 -92
  31. package/build/client/typed-error-dispatch.test.js.map +1 -1
  32. package/build/client/types.d.ts +21 -3
  33. package/build/codegen/bin/cli.js +0 -0
  34. package/build/codegen/e2e.test.js +87 -23
  35. package/build/codegen/e2e.test.js.map +1 -1
  36. package/build/codegen/emit-errors.integration.test.js +1 -1
  37. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  38. package/build/codegen/emit-scope.js +308 -47
  39. package/build/codegen/emit-scope.js.map +1 -1
  40. package/build/codegen/emit-scope.test.js +363 -110
  41. package/build/codegen/emit-scope.test.js.map +1 -1
  42. package/build/codegen/pipeline.test.js +7 -7
  43. package/build/codegen/pipeline.test.js.map +1 -1
  44. package/build/codegen/resolve-envelope.js +1 -1
  45. package/build/codegen/resolve-envelope.js.map +1 -1
  46. package/build/codegen/resolve-envelope.test.js +5 -5
  47. package/build/codegen/resolve-envelope.test.js.map +1 -1
  48. package/build/codegen/targets/_shared/route-slots.d.ts +8 -3
  49. package/build/codegen/targets/_shared/route-slots.js +49 -8
  50. package/build/codegen/targets/_shared/route-slots.js.map +1 -1
  51. package/build/codegen/targets/_shared/route-slots.test.js +99 -26
  52. package/build/codegen/targets/_shared/route-slots.test.js.map +1 -1
  53. package/build/codegen/targets/kotlin/emit-route-kotlin.test.js +88 -17
  54. package/build/codegen/targets/kotlin/emit-route-kotlin.test.js.map +1 -1
  55. package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js +9 -6
  56. package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js.map +1 -1
  57. package/build/codegen/targets/kotlin/integration.test.js +6 -0
  58. package/build/codegen/targets/kotlin/integration.test.js.map +1 -1
  59. package/build/codegen/targets/swift/access-level.test.js +8 -11
  60. package/build/codegen/targets/swift/access-level.test.js.map +1 -1
  61. package/build/codegen/targets/swift/emit-route-swift.test.js +91 -20
  62. package/build/codegen/targets/swift/emit-route-swift.test.js.map +1 -1
  63. package/build/codegen/targets/swift/emit-scope-swift.test.js +12 -9
  64. package/build/codegen/targets/swift/emit-scope-swift.test.js.map +1 -1
  65. package/build/codegen/targets/swift/integration.test.js +6 -0
  66. package/build/codegen/targets/swift/integration.test.js.map +1 -1
  67. package/build/create-http-stream.d.ts +58 -0
  68. package/build/create-http-stream.js +122 -0
  69. package/build/create-http-stream.js.map +1 -0
  70. package/build/create-http-stream.test.js +88 -0
  71. package/build/create-http-stream.test.js.map +1 -0
  72. package/build/create-http.d.ts +49 -0
  73. package/build/create-http.js +108 -0
  74. package/build/create-http.js.map +1 -0
  75. package/build/create-http.test.js +137 -0
  76. package/build/create-http.test.js.map +1 -0
  77. package/build/create-stream.d.ts +35 -0
  78. package/build/create-stream.js +123 -0
  79. package/build/create-stream.js.map +1 -0
  80. package/build/create-stream.test.js +428 -0
  81. package/build/create-stream.test.js.map +1 -0
  82. package/build/create.d.ts +28 -0
  83. package/build/create.js +82 -0
  84. package/build/create.js.map +1 -0
  85. package/build/create.test.js +483 -0
  86. package/build/create.test.js.map +1 -0
  87. package/build/exports.d.ts +2 -0
  88. package/build/implementations/http/astro/index.test.js +20 -12
  89. package/build/implementations/http/astro/index.test.js.map +1 -1
  90. package/build/implementations/http/doc-registry.js +1 -1
  91. package/build/implementations/http/doc-registry.js.map +1 -1
  92. package/build/implementations/http/doc-registry.test.js +36 -5
  93. package/build/implementations/http/doc-registry.test.js.map +1 -1
  94. package/build/implementations/http/error-dispatch.d.ts +76 -0
  95. package/build/implementations/http/error-dispatch.js +77 -0
  96. package/build/implementations/http/error-dispatch.js.map +1 -0
  97. package/build/implementations/http/error-dispatch.test.js +254 -0
  98. package/build/implementations/http/error-dispatch.test.js.map +1 -0
  99. package/build/implementations/http/error-taxonomy.d.ts +5 -5
  100. package/build/implementations/http/hono/docs/http-doc.d.ts +6 -0
  101. package/build/implementations/http/hono/docs/http-doc.js +42 -0
  102. package/build/implementations/http/hono/docs/http-doc.js.map +1 -0
  103. package/build/implementations/http/hono/docs/http-stream-doc.d.ts +6 -0
  104. package/build/implementations/http/hono/docs/http-stream-doc.js +40 -0
  105. package/build/implementations/http/hono/docs/http-stream-doc.js.map +1 -0
  106. package/build/implementations/http/hono/docs/rpc-doc.d.ts +6 -0
  107. package/build/implementations/http/hono/docs/rpc-doc.js +24 -0
  108. package/build/implementations/http/hono/docs/rpc-doc.js.map +1 -0
  109. package/build/implementations/http/hono/docs/stream-doc.d.ts +6 -0
  110. package/build/implementations/http/hono/docs/stream-doc.js +42 -0
  111. package/build/implementations/http/hono/docs/stream-doc.js.map +1 -0
  112. package/build/implementations/http/hono/handlers/http-stream.d.ts +10 -0
  113. package/build/implementations/http/hono/handlers/http-stream.js +123 -0
  114. package/build/implementations/http/hono/handlers/http-stream.js.map +1 -0
  115. package/build/implementations/http/hono/handlers/http-stream.test.js +128 -0
  116. package/build/implementations/http/hono/handlers/http-stream.test.js.map +1 -0
  117. package/build/implementations/http/hono/handlers/http.d.ts +10 -0
  118. package/build/implementations/http/hono/handlers/http.js +115 -0
  119. package/build/implementations/http/hono/handlers/http.js.map +1 -0
  120. package/build/implementations/http/hono/handlers/http.test.js +118 -0
  121. package/build/implementations/http/hono/handlers/http.test.js.map +1 -0
  122. package/build/implementations/http/hono/handlers/rpc.d.ts +11 -0
  123. package/build/implementations/http/hono/handlers/rpc.js +32 -0
  124. package/build/implementations/http/hono/handlers/rpc.js.map +1 -0
  125. package/build/implementations/http/hono/handlers/rpc.test.js +73 -0
  126. package/build/implementations/http/hono/handlers/rpc.test.js.map +1 -0
  127. package/build/implementations/http/hono/handlers/stream.d.ts +23 -0
  128. package/build/implementations/http/hono/handlers/stream.js +147 -0
  129. package/build/implementations/http/hono/handlers/stream.js.map +1 -0
  130. package/build/implementations/http/hono/handlers/stream.test.d.ts +1 -0
  131. package/build/implementations/http/hono/handlers/stream.test.js +177 -0
  132. package/build/implementations/http/hono/handlers/stream.test.js.map +1 -0
  133. package/build/implementations/http/hono/index.d.ts +57 -0
  134. package/build/implementations/http/hono/index.js +149 -0
  135. package/build/implementations/http/hono/index.js.map +1 -0
  136. package/build/implementations/http/hono/index.test.d.ts +1 -0
  137. package/build/implementations/http/hono/index.test.js +274 -0
  138. package/build/implementations/http/hono/index.test.js.map +1 -0
  139. package/build/implementations/http/hono/path.d.ts +17 -0
  140. package/build/implementations/http/hono/path.js +39 -0
  141. package/build/implementations/http/hono/path.js.map +1 -0
  142. package/build/implementations/http/hono/path.test.d.ts +1 -0
  143. package/build/implementations/http/hono/path.test.js +83 -0
  144. package/build/implementations/http/hono/path.test.js.map +1 -0
  145. package/build/implementations/http/hono/types.d.ts +51 -0
  146. package/build/implementations/http/hono/types.js.map +1 -0
  147. package/build/implementations/http/on-request-error.test.js +6 -96
  148. package/build/implementations/http/on-request-error.test.js.map +1 -1
  149. package/build/implementations/http/route-errors.test.js +11 -59
  150. package/build/implementations/http/route-errors.test.js.map +1 -1
  151. package/build/implementations/types.d.ts +43 -9
  152. package/build/index.d.ts +124 -124
  153. package/build/index.js +10 -221
  154. package/build/index.js.map +1 -1
  155. package/build/index.test.js +20 -919
  156. package/build/index.test.js.map +1 -1
  157. package/build/migration.test.d.ts +1 -0
  158. package/build/migration.test.js +34 -0
  159. package/build/migration.test.js.map +1 -0
  160. package/build/schema/compute-schema.d.ts +11 -3
  161. package/build/schema/compute-schema.js +13 -7
  162. package/build/schema/compute-schema.js.map +1 -1
  163. package/build/schema/parser.d.ts +11 -3
  164. package/build/schema/parser.js +49 -9
  165. package/build/schema/parser.js.map +1 -1
  166. package/build/stack-utils.js +8 -0
  167. package/build/stack-utils.js.map +1 -1
  168. package/build/types.d.ts +142 -0
  169. package/build/types.js.map +1 -0
  170. package/docs/astro-adapter.md +5 -5
  171. package/docs/core.md +15 -17
  172. package/docs/http-integrations.md +83 -170
  173. package/docs/streaming.md +3 -60
  174. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +2 -7
  175. package/docs/superpowers/plans/2026-05-08-create-http.md +3355 -0
  176. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +3365 -0
  177. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +1 -3
  178. package/docs/superpowers/specs/2026-05-08-create-http-design.md +409 -0
  179. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +411 -0
  180. package/package.json +4 -22
  181. package/src/client/call.test.ts +26 -0
  182. package/src/client/call.ts +4 -1
  183. package/src/client/fetch-adapter.test.ts +14 -1
  184. package/src/client/fetch-adapter.ts +3 -1
  185. package/src/client/index.test.ts +7 -7
  186. package/src/client/request-builder.ts +2 -2
  187. package/src/client/stream.test.ts +39 -7
  188. package/src/client/stream.ts +16 -2
  189. package/src/client/typed-error-dispatch.test.ts +7 -97
  190. package/src/client/types.ts +21 -3
  191. package/src/codegen/__fixtures__/users-envelope.json +119 -38
  192. package/src/codegen/e2e.test.ts +98 -24
  193. package/src/codegen/emit-errors.integration.test.ts +1 -1
  194. package/src/codegen/emit-scope.test.ts +395 -110
  195. package/src/codegen/emit-scope.ts +350 -55
  196. package/src/codegen/pipeline.test.ts +7 -7
  197. package/src/codegen/resolve-envelope.test.ts +5 -5
  198. package/src/codegen/resolve-envelope.ts +1 -1
  199. package/src/codegen/targets/_shared/route-slots.test.ts +109 -26
  200. package/src/codegen/targets/_shared/route-slots.ts +48 -11
  201. package/src/codegen/targets/kotlin/__fixtures__/users-golden.kt +73 -0
  202. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +100 -17
  203. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +9 -6
  204. package/src/codegen/targets/kotlin/integration.test.ts +19 -0
  205. package/src/codegen/targets/swift/__fixtures__/users-golden.swift +79 -0
  206. package/src/codegen/targets/swift/access-level.test.ts +8 -11
  207. package/src/codegen/targets/swift/emit-route-swift.test.ts +103 -20
  208. package/src/codegen/targets/swift/emit-scope-swift.test.ts +12 -9
  209. package/src/codegen/targets/swift/integration.test.ts +17 -0
  210. package/src/create-http-stream.test.ts +97 -0
  211. package/src/create-http-stream.ts +191 -0
  212. package/src/create-http.test.ts +163 -0
  213. package/src/create-http.ts +211 -0
  214. package/src/create-stream.test.ts +565 -0
  215. package/src/create-stream.ts +228 -0
  216. package/src/create.test.ts +658 -0
  217. package/src/create.ts +172 -0
  218. package/src/exports.ts +2 -0
  219. package/src/implementations/http/README.md +135 -95
  220. package/src/implementations/http/astro/README.md +4 -5
  221. package/src/implementations/http/astro/index.test.ts +25 -18
  222. package/src/implementations/http/doc-registry.test.ts +42 -5
  223. package/src/implementations/http/doc-registry.ts +1 -1
  224. package/src/implementations/http/error-dispatch.test.ts +283 -0
  225. package/src/implementations/http/error-dispatch.ts +176 -0
  226. package/src/implementations/http/error-taxonomy.ts +5 -5
  227. package/src/implementations/http/hono/docs/http-doc.ts +43 -0
  228. package/src/implementations/http/hono/docs/http-stream-doc.ts +44 -0
  229. package/src/implementations/http/hono/docs/rpc-doc.ts +34 -0
  230. package/src/implementations/http/hono/docs/stream-doc.ts +53 -0
  231. package/src/implementations/http/hono/handlers/http-stream.test.ts +150 -0
  232. package/src/implementations/http/hono/handlers/http-stream.ts +152 -0
  233. package/src/implementations/http/hono/handlers/http.test.ts +130 -0
  234. package/src/implementations/http/hono/handlers/http.ts +147 -0
  235. package/src/implementations/http/hono/handlers/rpc.test.ts +81 -0
  236. package/src/implementations/http/hono/handlers/rpc.ts +54 -0
  237. package/src/implementations/http/hono/handlers/stream.test.ts +198 -0
  238. package/src/implementations/http/hono/handlers/stream.ts +208 -0
  239. package/src/implementations/http/hono/index.test.ts +329 -0
  240. package/src/implementations/http/hono/index.ts +204 -0
  241. package/src/implementations/http/hono/path.test.ts +96 -0
  242. package/src/implementations/http/hono/path.ts +59 -0
  243. package/src/implementations/http/hono/types.ts +93 -0
  244. package/src/implementations/http/on-request-error.test.ts +10 -116
  245. package/src/implementations/http/route-errors.test.ts +11 -77
  246. package/src/implementations/types.ts +44 -9
  247. package/src/index.test.ts +22 -1249
  248. package/src/index.ts +49 -485
  249. package/src/migration.test.ts +48 -0
  250. package/src/schema/compute-schema.ts +26 -12
  251. package/src/schema/parser.ts +62 -12
  252. package/src/stack-utils.ts +8 -0
  253. package/src/types.ts +133 -0
  254. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/express-rpc.md +0 -137
  255. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-api.md +0 -173
  256. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-rpc.md +0 -142
  257. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-stream.md +0 -147
  258. package/build/implementations/http/express-rpc/error-taxonomy.test.js +0 -83
  259. package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +0 -1
  260. package/build/implementations/http/express-rpc/index.d.ts +0 -125
  261. package/build/implementations/http/express-rpc/index.js +0 -216
  262. package/build/implementations/http/express-rpc/index.js.map +0 -1
  263. package/build/implementations/http/express-rpc/index.test.js +0 -684
  264. package/build/implementations/http/express-rpc/index.test.js.map +0 -1
  265. package/build/implementations/http/express-rpc/types.d.ts +0 -11
  266. package/build/implementations/http/express-rpc/types.js.map +0 -1
  267. package/build/implementations/http/hono-api/error-taxonomy.test.js +0 -137
  268. package/build/implementations/http/hono-api/error-taxonomy.test.js.map +0 -1
  269. package/build/implementations/http/hono-api/index.d.ts +0 -151
  270. package/build/implementations/http/hono-api/index.js +0 -344
  271. package/build/implementations/http/hono-api/index.js.map +0 -1
  272. package/build/implementations/http/hono-api/index.test.js +0 -992
  273. package/build/implementations/http/hono-api/index.test.js.map +0 -1
  274. package/build/implementations/http/hono-api/types.d.ts +0 -13
  275. package/build/implementations/http/hono-api/types.js.map +0 -1
  276. package/build/implementations/http/hono-rpc/error-taxonomy.test.js +0 -64
  277. package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +0 -1
  278. package/build/implementations/http/hono-rpc/index.d.ts +0 -130
  279. package/build/implementations/http/hono-rpc/index.js +0 -209
  280. package/build/implementations/http/hono-rpc/index.js.map +0 -1
  281. package/build/implementations/http/hono-rpc/index.test.js +0 -828
  282. package/build/implementations/http/hono-rpc/index.test.js.map +0 -1
  283. package/build/implementations/http/hono-rpc/types.d.ts +0 -11
  284. package/build/implementations/http/hono-rpc/types.js +0 -2
  285. package/build/implementations/http/hono-rpc/types.js.map +0 -1
  286. package/build/implementations/http/hono-stream/error-taxonomy.test.js +0 -159
  287. package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +0 -1
  288. package/build/implementations/http/hono-stream/index.d.ts +0 -171
  289. package/build/implementations/http/hono-stream/index.js +0 -415
  290. package/build/implementations/http/hono-stream/index.js.map +0 -1
  291. package/build/implementations/http/hono-stream/index.test.js +0 -1383
  292. package/build/implementations/http/hono-stream/index.test.js.map +0 -1
  293. package/build/implementations/http/hono-stream/types.d.ts +0 -15
  294. package/build/implementations/http/hono-stream/types.js +0 -2
  295. package/build/implementations/http/hono-stream/types.js.map +0 -1
  296. package/src/implementations/http/express-rpc/README.md +0 -280
  297. package/src/implementations/http/express-rpc/error-taxonomy.test.ts +0 -103
  298. package/src/implementations/http/express-rpc/index.test.ts +0 -957
  299. package/src/implementations/http/express-rpc/index.ts +0 -327
  300. package/src/implementations/http/express-rpc/types.ts +0 -16
  301. package/src/implementations/http/hono-api/README.md +0 -284
  302. package/src/implementations/http/hono-api/error-taxonomy.test.ts +0 -179
  303. package/src/implementations/http/hono-api/index.test.ts +0 -1341
  304. package/src/implementations/http/hono-api/index.ts +0 -519
  305. package/src/implementations/http/hono-api/types.ts +0 -16
  306. package/src/implementations/http/hono-rpc/README.md +0 -357
  307. package/src/implementations/http/hono-rpc/error-taxonomy.test.ts +0 -82
  308. package/src/implementations/http/hono-rpc/index.test.ts +0 -1107
  309. package/src/implementations/http/hono-rpc/index.ts +0 -320
  310. package/src/implementations/http/hono-rpc/types.ts +0 -16
  311. package/src/implementations/http/hono-stream/README.md +0 -559
  312. package/src/implementations/http/hono-stream/error-taxonomy.test.ts +0 -178
  313. package/src/implementations/http/hono-stream/index.test.ts +0 -1804
  314. package/src/implementations/http/hono-stream/index.ts +0 -622
  315. package/src/implementations/http/hono-stream/types.ts +0 -20
  316. /package/build/{implementations/http/express-rpc/error-taxonomy.test.d.ts → create-http-stream.test.d.ts} +0 -0
  317. /package/build/{implementations/http/express-rpc/index.test.d.ts → create-http.test.d.ts} +0 -0
  318. /package/build/{implementations/http/hono-api/error-taxonomy.test.d.ts → create-stream.test.d.ts} +0 -0
  319. /package/build/{implementations/http/hono-api/index.test.d.ts → create.test.d.ts} +0 -0
  320. /package/build/implementations/http/{hono-rpc/error-taxonomy.test.d.ts → error-dispatch.test.d.ts} +0 -0
  321. /package/build/implementations/http/{hono-rpc/index.test.d.ts → hono/handlers/http-stream.test.d.ts} +0 -0
  322. /package/build/implementations/http/{hono-stream/error-taxonomy.test.d.ts → hono/handlers/http.test.d.ts} +0 -0
  323. /package/build/implementations/http/{hono-stream/index.test.d.ts → hono/handlers/rpc.test.d.ts} +0 -0
  324. /package/build/implementations/http/{express-rpc → hono}/types.js +0 -0
  325. /package/build/{implementations/http/hono-api/types.js → types.js} +0 -0
@@ -0,0 +1,274 @@
1
+ import { describe, expect, test, vi } from 'vitest';
2
+ import { Hono } from 'hono';
3
+ import { Type } from 'typebox';
4
+ import { Procedures } from '../../../index.js';
5
+ import { HonoAppBuilder } from './index.js';
6
+ import { defineErrorTaxonomy } from '../error-taxonomy.js';
7
+ import { DocRegistry } from '../doc-registry.js';
8
+ describe('HonoAppBuilder — public surface', () => {
9
+ test('constructor with no args', () => {
10
+ const b = new HonoAppBuilder();
11
+ expect(b.app).toBeInstanceOf(Hono);
12
+ expect(b.docs).toEqual([]);
13
+ expect(b.skippedProcedures).toEqual([]);
14
+ });
15
+ test('constructor accepts existing Hono app', () => {
16
+ const custom = new Hono();
17
+ const b = new HonoAppBuilder({ app: custom });
18
+ expect(b.app).toBe(custom);
19
+ });
20
+ test('register is chainable', () => {
21
+ const b = new HonoAppBuilder();
22
+ const P = Procedures();
23
+ const result = b.register(P, () => ({}));
24
+ expect(result).toBe(b);
25
+ });
26
+ test('docs is lazily computed before build()', () => {
27
+ const b = new HonoAppBuilder();
28
+ const P = Procedures();
29
+ P.Create('A', { scope: 's', version: 1 }, async () => ({}));
30
+ b.register(P, () => ({}));
31
+ const docs1 = b.docs;
32
+ expect(docs1).toHaveLength(1);
33
+ expect(docs1[0].kind).toBe('rpc');
34
+ // Calling docs again returns the same cached array reference
35
+ expect(b.docs).toBe(docs1);
36
+ });
37
+ test('docs reads after build() return the same content', () => {
38
+ const b = new HonoAppBuilder();
39
+ const P = Procedures();
40
+ P.Create('A', { scope: 's', version: 1 }, async () => ({}));
41
+ b.register(P, () => ({}));
42
+ b.build();
43
+ expect(b.docs).toHaveLength(1);
44
+ });
45
+ });
46
+ describe('HonoAppBuilder — mixed-kind dispatch', () => {
47
+ test('one factory with all four kinds mounts each at the correct path', async () => {
48
+ const P = Procedures();
49
+ P.Create('Echo', { scope: 'rpc', version: 1 }, async (_ctx, p) => p);
50
+ P.CreateStream('Tail', { scope: 'rpc', version: 1 }, async function* () { yield 1; });
51
+ P.CreateHttp('GetUser', {
52
+ path: '/users/:id',
53
+ method: 'get',
54
+ schema: {
55
+ req: { pathParams: Type.Object({ id: Type.String() }) },
56
+ res: { body: Type.Object({ id: Type.String() }) },
57
+ },
58
+ }, async () => ({ id: '1' }));
59
+ P.CreateHttpStream('Watch', {
60
+ path: '/watch', method: 'get',
61
+ schema: { yield: Type.String() },
62
+ }, (async function* () { yield 'tick'; }));
63
+ const app = new HonoAppBuilder()
64
+ .register(P, () => ({ uid: 'u1' }))
65
+ .build();
66
+ const rpc = await app.request('/rpc/echo/1', { method: 'POST', body: '{}', headers: { 'Content-Type': 'application/json' } });
67
+ expect(rpc.status).toBe(200);
68
+ const stream = await app.request('/rpc/tail/1', { method: 'POST', body: '{}', headers: { 'Content-Type': 'application/json' } });
69
+ expect(stream.status).toBe(200);
70
+ await stream.text();
71
+ const http = await app.request('/users/1');
72
+ expect(http.status).toBe(200);
73
+ const httpStream = await app.request('/watch');
74
+ expect(httpStream.status).toBe(200);
75
+ await httpStream.text();
76
+ });
77
+ test('toDocEnvelope produces same shape as DocRegistry.toJSON', () => {
78
+ const P = Procedures();
79
+ P.Create('Echo', { scope: 'e', version: 1 }, async () => ({}));
80
+ const errors = defineErrorTaxonomy({});
81
+ const builder = new HonoAppBuilder({ pathPrefix: '/api', errors });
82
+ builder.register(P, () => ({}));
83
+ builder.build();
84
+ const builderEnvelope = builder.toDocEnvelope({ basePath: '/api', errors });
85
+ const registryEnvelope = new DocRegistry({ basePath: '/api', errors }).from(builder).toJSON();
86
+ expect(builderEnvelope.basePath).toBe(registryEnvelope.basePath);
87
+ expect(builderEnvelope.routes).toEqual(registryEnvelope.routes);
88
+ expect(builderEnvelope.errors.map(e => e.name).sort()).toEqual(registryEnvelope.errors.map(e => e.name).sort());
89
+ });
90
+ test('toDocEnvelope filter and transform options work', () => {
91
+ const P = Procedures();
92
+ P.Create('A', { scope: 's', version: 1 }, async () => ({}));
93
+ P.Create('B', { scope: 's', version: 1 }, async () => ({}));
94
+ const builder = new HonoAppBuilder().register(P, () => ({}));
95
+ const onlyA = builder.toDocEnvelope({ filter: r => r.name === 'A' });
96
+ expect(onlyA.routes).toHaveLength(1);
97
+ expect(onlyA.routes[0].name).toBe('A');
98
+ const tagged = builder.toDocEnvelope({
99
+ transform: env => ({ ...env, tagged: true }),
100
+ });
101
+ expect(tagged.tagged).toBe(true);
102
+ });
103
+ test('makeRoutePath static is exposed', () => {
104
+ const P = Procedures();
105
+ P.Create('GetUser', { scope: 'users', version: 1 }, async () => ({}));
106
+ const proc = P.getProcedure('GetUser');
107
+ expect(HonoAppBuilder.makeRoutePath({ procedure: proc })).toBe('/users/get-user/1');
108
+ });
109
+ });
110
+ describe('HonoAppBuilder — factoryContext variants', () => {
111
+ test('factoryContext as a static object is forwarded into ctx', async () => {
112
+ const P = Procedures();
113
+ P.Create('GetRequestId', { scope: 'get-request-id', version: 1 }, async (ctx) => ({
114
+ id: ctx.requestId,
115
+ }));
116
+ const app = new HonoAppBuilder()
117
+ .register(P, { requestId: 'req-123' })
118
+ .build();
119
+ const res = await app.request('/get-request-id/get-request-id/1', {
120
+ method: 'POST',
121
+ headers: { 'Content-Type': 'application/json' },
122
+ body: JSON.stringify({}),
123
+ });
124
+ expect(await res.json()).toEqual({ id: 'req-123' });
125
+ });
126
+ test('factoryContext as an async function is awaited and result reaches handler', async () => {
127
+ const factoryContext = vi.fn(async () => ({ requestId: 'req-456' }));
128
+ const P = Procedures();
129
+ P.Create('GetRequestId', { scope: 'get-request-id', version: 1 }, async (ctx) => ({
130
+ id: ctx.requestId,
131
+ }));
132
+ const app = new HonoAppBuilder().register(P, factoryContext).build();
133
+ const res = await app.request('/get-request-id/get-request-id/1', {
134
+ method: 'POST',
135
+ headers: { 'Content-Type': 'application/json' },
136
+ body: JSON.stringify({}),
137
+ });
138
+ expect(factoryContext).toHaveBeenCalledTimes(1);
139
+ expect(await res.json()).toEqual({ id: 'req-456' });
140
+ });
141
+ test('factoryContext rejection flows through dispatchPreStreamError → 500', async () => {
142
+ const P = Procedures();
143
+ P.Create('GetRequestId', { scope: 'get-request-id', version: 1 }, async (ctx) => ({
144
+ id: ctx.requestId,
145
+ }));
146
+ const app = new HonoAppBuilder()
147
+ .register(P, async () => {
148
+ throw new Error('context-load-failed');
149
+ })
150
+ .build();
151
+ const res = await app.request('/get-request-id/get-request-id/1', {
152
+ method: 'POST',
153
+ headers: { 'Content-Type': 'application/json' },
154
+ body: JSON.stringify({}),
155
+ });
156
+ expect(res.status).toBe(500);
157
+ const body = await res.json();
158
+ expect(body.error).toContain('context-load-failed');
159
+ });
160
+ test('factoryContext function receives Hono Context with req.header access', async () => {
161
+ const factoryContext = vi.fn((c) => ({
162
+ authHeader: c.req.header('authorization'),
163
+ }));
164
+ const P = Procedures();
165
+ P.Create('GetAuth', { scope: 'get-auth', version: 1 }, async (ctx) => ({
166
+ auth: ctx.authHeader,
167
+ }));
168
+ const app = new HonoAppBuilder().register(P, factoryContext).build();
169
+ const res = await app.request('/get-auth/get-auth/1', {
170
+ method: 'POST',
171
+ headers: {
172
+ 'Content-Type': 'application/json',
173
+ Authorization: 'Bearer token123',
174
+ },
175
+ body: JSON.stringify({}),
176
+ });
177
+ expect(factoryContext).toHaveBeenCalledTimes(1);
178
+ expect(factoryContext.mock.calls[0][0]).toHaveProperty('req');
179
+ expect(await res.json()).toEqual({ auth: 'Bearer token123' });
180
+ });
181
+ });
182
+ describe('HonoAppBuilder — extendProcedureDoc discriminated union per kind', () => {
183
+ test('rpc: base.kind === "rpc" and returned object is merged into doc', () => {
184
+ const extend = vi.fn(({ base }) => ({
185
+ summary: `RPC: ${base.kind}`,
186
+ tags: ['rpc'],
187
+ }));
188
+ const P = Procedures();
189
+ P.Create('GetUser', { scope: 'users', version: 1 }, async () => ({}));
190
+ const builder = new HonoAppBuilder().register(P, () => ({}), { extendProcedureDoc: extend });
191
+ builder.build();
192
+ expect(extend).toHaveBeenCalledTimes(1);
193
+ expect(extend.mock.calls[0][0].base.kind).toBe('rpc');
194
+ const doc = builder.docs[0];
195
+ expect(doc.summary).toBe('RPC: rpc');
196
+ expect(doc.tags).toEqual(['rpc']);
197
+ });
198
+ test('api (http): base.kind === "api" and returned object is merged into doc', () => {
199
+ const extend = vi.fn(({ base }) => ({
200
+ summary: `API: ${base.kind}`,
201
+ tags: ['api'],
202
+ }));
203
+ const P = Procedures();
204
+ P.CreateHttp('GetUser', {
205
+ path: '/users/:id',
206
+ method: 'get',
207
+ schema: {
208
+ req: { pathParams: Type.Object({ id: Type.String() }) },
209
+ res: { body: Type.Object({ id: Type.String() }) },
210
+ },
211
+ }, async () => ({ id: '1' }));
212
+ const builder = new HonoAppBuilder().register(P, () => ({}), { extendProcedureDoc: extend });
213
+ builder.build();
214
+ expect(extend).toHaveBeenCalledTimes(1);
215
+ expect(extend.mock.calls[0][0].base.kind).toBe('api');
216
+ const doc = builder.docs[0];
217
+ expect(doc.summary).toBe('API: api');
218
+ expect(doc.tags).toEqual(['api']);
219
+ });
220
+ test('rpc-stream: base.kind === "stream" and returned object is merged into doc', () => {
221
+ const extend = vi.fn(({ base }) => ({
222
+ summary: `Stream: ${base.kind}`,
223
+ tags: ['stream'],
224
+ }));
225
+ const P = Procedures();
226
+ P.CreateStream('Tail', { scope: 'rpc', version: 1 }, async function* () {
227
+ yield 1;
228
+ });
229
+ const builder = new HonoAppBuilder().register(P, () => ({}), { extendProcedureDoc: extend });
230
+ builder.build();
231
+ expect(extend).toHaveBeenCalledTimes(1);
232
+ expect(extend.mock.calls[0][0].base.kind).toBe('stream');
233
+ const doc = builder.docs[0];
234
+ expect(doc.summary).toBe('Stream: stream');
235
+ expect(doc.tags).toEqual(['stream']);
236
+ });
237
+ test('http-stream: base.kind === "http-stream" and returned object is merged into doc', () => {
238
+ const extend = vi.fn(({ base }) => ({
239
+ summary: `HTTP-Stream: ${base.kind}`,
240
+ tags: ['http-stream'],
241
+ }));
242
+ const P = Procedures();
243
+ P.CreateHttpStream('Watch', { path: '/watch', method: 'get', schema: { yield: Type.String() } }, (async function* () {
244
+ yield 'tick';
245
+ }));
246
+ const builder = new HonoAppBuilder().register(P, () => ({}), { extendProcedureDoc: extend });
247
+ builder.build();
248
+ expect(extend).toHaveBeenCalledTimes(1);
249
+ expect(extend.mock.calls[0][0].base.kind).toBe('http-stream');
250
+ const doc = builder.docs[0];
251
+ expect(doc.summary).toBe('HTTP-Stream: http-stream');
252
+ expect(doc.tags).toEqual(['http-stream']);
253
+ });
254
+ });
255
+ describe('HonoAppBuilder — per-factory streamMode override', () => {
256
+ test('register options.streamMode overrides stream.defaultStreamMode', async () => {
257
+ const P = Procedures();
258
+ P.CreateStream('Test', { scope: 'test', version: 1 }, async function* () {
259
+ yield { ok: true };
260
+ });
261
+ const app = new HonoAppBuilder({ stream: { defaultStreamMode: 'sse' } })
262
+ .register(P, () => ({}), { streamMode: 'text' })
263
+ .build();
264
+ const res = await app.request('/test/test/1', {
265
+ method: 'POST',
266
+ headers: { 'Content-Type': 'application/json' },
267
+ body: '{}',
268
+ });
269
+ expect(res.headers.get('content-type')).toContain('text/plain');
270
+ // Drain the response so the stream lifecycle completes cleanly.
271
+ await res.text();
272
+ });
273
+ });
274
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { TProcedureRegistration, TStreamProcedureRegistration, THttpProcedureRegistration, THttpStreamProcedureRegistration } from '../../../types.js';
2
+ export type AnyProcedureRegistration = TProcedureRegistration | TStreamProcedureRegistration | THttpProcedureRegistration<any> | THttpStreamProcedureRegistration<any>;
3
+ /**
4
+ * Resolves the full route path for any procedure kind.
5
+ *
6
+ * - `rpc` / `rpc-stream`: `{prefix}/{kebab(scope)}/{kebab(name)}/{version}`
7
+ * - `http` / `http-stream`: `{prefix}{config.path}` (path-as-given, prefix normalized)
8
+ */
9
+ export declare function makeRoutePath({ procedure, prefix, }: {
10
+ procedure: AnyProcedureRegistration;
11
+ prefix?: string;
12
+ }): string;
13
+ /**
14
+ * Combines a developer-supplied path with an optional prefix. Both are
15
+ * normalized to begin with a single `/`.
16
+ */
17
+ export declare function resolveFullPath(procedurePath: string, prefix?: string): string;
@@ -0,0 +1,39 @@
1
+ import { kebabCase } from 'es-toolkit/string';
2
+ import { castArray } from 'es-toolkit/compat';
3
+ function normalizePrefix(prefix) {
4
+ if (!prefix)
5
+ return '';
6
+ return prefix.startsWith('/') ? prefix : `/${prefix}`;
7
+ }
8
+ /**
9
+ * Resolves the full route path for any procedure kind.
10
+ *
11
+ * - `rpc` / `rpc-stream`: `{prefix}/{kebab(scope)}/{kebab(name)}/{version}`
12
+ * - `http` / `http-stream`: `{prefix}{config.path}` (path-as-given, prefix normalized)
13
+ */
14
+ export function makeRoutePath({ procedure, prefix, }) {
15
+ const normalizedPrefix = normalizePrefix(prefix);
16
+ switch (procedure.kind) {
17
+ case 'rpc':
18
+ case 'rpc-stream': {
19
+ const cfg = procedure.config;
20
+ const scopeSegments = castArray(cfg.scope).map(kebabCase).join('/');
21
+ return `${normalizedPrefix}/${scopeSegments}/${kebabCase(procedure.name)}/${String(cfg.version).trim()}`;
22
+ }
23
+ case 'http':
24
+ case 'http-stream': {
25
+ const cfg = procedure.config;
26
+ return resolveFullPath(cfg.path, prefix);
27
+ }
28
+ }
29
+ }
30
+ /**
31
+ * Combines a developer-supplied path with an optional prefix. Both are
32
+ * normalized to begin with a single `/`.
33
+ */
34
+ export function resolveFullPath(procedurePath, prefix) {
35
+ const normalizedPrefix = normalizePrefix(prefix);
36
+ const normalizedPath = procedurePath.startsWith('/') ? procedurePath : `/${procedurePath}`;
37
+ return `${normalizedPrefix}${normalizedPath}`;
38
+ }
39
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAc7C,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACtB,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAA;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,EACT,MAAM,GAIP;IACC,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IAEhD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,KAAK,CAAC;QACX,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,GAAG,GAAG,SAAS,CAAC,MAAuD,CAAA;YAC7E,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnE,OAAO,GAAG,gBAAgB,IAAI,aAAa,IAAI,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;QAC1G,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,GAAG,GAAG,SAAS,CAAC,MAA0B,CAAA;YAChD,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqB,EAAE,MAAe;IACpE,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAA;IAC1F,OAAO,GAAG,gBAAgB,GAAG,cAAc,EAAE,CAAA;AAC/C,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,83 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { makeRoutePath, resolveFullPath } from './path.js';
3
+ describe('makeRoutePath', () => {
4
+ test('rpc: scope/name/version with kebab-case', () => {
5
+ const proc = {
6
+ name: 'GetUser',
7
+ kind: 'rpc',
8
+ config: { scope: 'users', version: 1 },
9
+ handler: async () => undefined,
10
+ };
11
+ expect(makeRoutePath({ procedure: proc })).toBe('/users/get-user/1');
12
+ });
13
+ test('rpc: array scope joined with /', () => {
14
+ const proc = {
15
+ name: 'List',
16
+ kind: 'rpc',
17
+ config: { scope: ['UserModule', 'admin'], version: 2 },
18
+ handler: async () => undefined,
19
+ };
20
+ expect(makeRoutePath({ procedure: proc })).toBe('/user-module/admin/list/2');
21
+ });
22
+ test('rpc: pathPrefix is normalized (leading slash inserted)', () => {
23
+ const proc = {
24
+ name: 'Echo',
25
+ kind: 'rpc',
26
+ config: { scope: 'echo', version: 1 },
27
+ handler: async () => undefined,
28
+ };
29
+ expect(makeRoutePath({ procedure: proc, prefix: 'api/v1' })).toBe('/api/v1/echo/echo/1');
30
+ });
31
+ test('rpc-stream: same shape as rpc', () => {
32
+ const proc = {
33
+ name: 'Tail',
34
+ kind: 'rpc-stream',
35
+ isStream: true,
36
+ config: { scope: 'logs', version: 1 },
37
+ handler: async function* () { },
38
+ };
39
+ expect(makeRoutePath({ procedure: proc, prefix: '/api' })).toBe('/api/logs/tail/1');
40
+ });
41
+ test('http: prepends prefix to config.path', () => {
42
+ const proc = {
43
+ name: 'GetUser',
44
+ kind: 'http',
45
+ config: { path: '/users/:id', method: 'get' },
46
+ handler: async () => undefined,
47
+ };
48
+ expect(makeRoutePath({ procedure: proc, prefix: '/api/v1' })).toBe('/api/v1/users/:id');
49
+ });
50
+ test('http: leading slash on path is preserved (not duplicated)', () => {
51
+ const proc = {
52
+ name: 'Get',
53
+ kind: 'http',
54
+ config: { path: 'users', method: 'get' },
55
+ handler: async () => undefined,
56
+ };
57
+ expect(makeRoutePath({ procedure: proc, prefix: '/api' })).toBe('/api/users');
58
+ });
59
+ test('http-stream: same shape as http', () => {
60
+ const proc = {
61
+ name: 'TailLogs',
62
+ kind: 'http-stream',
63
+ config: { path: '/logs/tail', method: 'get' },
64
+ handler: async () => ({ stream: (async function* () { })(), initialHeaders: undefined }),
65
+ };
66
+ expect(makeRoutePath({ procedure: proc })).toBe('/logs/tail');
67
+ });
68
+ });
69
+ describe('resolveFullPath', () => {
70
+ test('combines prefix and path', () => {
71
+ expect(resolveFullPath('/users', '/api/v1')).toBe('/api/v1/users');
72
+ });
73
+ test('normalizes prefix without leading slash', () => {
74
+ expect(resolveFullPath('/users', 'api')).toBe('/api/users');
75
+ });
76
+ test('normalizes path without leading slash', () => {
77
+ expect(resolveFullPath('users', '/api')).toBe('/api/users');
78
+ });
79
+ test('no prefix', () => {
80
+ expect(resolveFullPath('/users')).toBe('/users');
81
+ });
82
+ });
83
+ //# sourceMappingURL=path.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.test.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono/path.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { Context, Hono } from 'hono';
2
+ import type { ErrorTaxonomy, UnknownErrorConfig } from '../error-taxonomy.js';
3
+ import type { AnyProcedureRegistration, OnRequestErrorObserver, OnMidStreamError, PreStreamOnError } from '../error-dispatch.js';
4
+ import type { ProceduresFactory, ExtractContext, StreamMode, AnyHttpRouteDoc, RPCHttpRouteDoc, APIHttpRouteDoc, StreamHttpRouteDoc, HttpStreamRouteDoc } from '../../types.js';
5
+ import type { TProcedureRegistration, TStreamProcedureRegistration, THttpProcedureRegistration, THttpStreamProcedureRegistration } from '../../../types.js';
6
+ export type { AnyProcedureRegistration } from '../error-dispatch.js';
7
+ /** Default query parser using URLSearchParams. */
8
+ export type QueryParser = (queryString: string) => Record<string, unknown>;
9
+ export type OnRequestErrorContext = {
10
+ err: unknown;
11
+ procedure: AnyProcedureRegistration;
12
+ raw: Context;
13
+ };
14
+ export type ExtendProcedureDoc = (params: {
15
+ base: RPCHttpRouteDoc | APIHttpRouteDoc | StreamHttpRouteDoc | HttpStreamRouteDoc;
16
+ procedure: AnyProcedureRegistration;
17
+ }) => Record<string, unknown>;
18
+ export type HonoFactoryItem<TFactory extends ProceduresFactory = ProceduresFactory> = {
19
+ factory: TFactory;
20
+ factoryContext: ExtractContext<TFactory> | ((c: Context) => ExtractContext<TFactory> | Promise<ExtractContext<TFactory>>);
21
+ streamMode?: StreamMode;
22
+ extendProcedureDoc?: ExtendProcedureDoc;
23
+ };
24
+ export type HonoAppBuilderConfig<TStreamErrorData = unknown> = {
25
+ /** Existing Hono app. If omitted, a new instance is created. */
26
+ app?: Hono;
27
+ /** Path prefix applied to every route across all kinds. */
28
+ pathPrefix?: string;
29
+ errors?: ErrorTaxonomy;
30
+ unknownError?: UnknownErrorConfig;
31
+ onError?: PreStreamOnError;
32
+ /** Cross-cutting observer — fires for every caught error before dispatch. */
33
+ onRequestError?: OnRequestErrorObserver;
34
+ onRequestStart?: (c: Context) => void;
35
+ onRequestEnd?: (c: Context) => void;
36
+ rpc?: {
37
+ onSuccess?: (procedure: TProcedureRegistration, c: Context) => void;
38
+ };
39
+ api?: {
40
+ queryParser?: QueryParser;
41
+ onSuccess?: (procedure: THttpProcedureRegistration<any>, c: Context) => void;
42
+ };
43
+ stream?: {
44
+ /** Default for both rpc-stream and http-stream. */
45
+ defaultStreamMode?: StreamMode;
46
+ onStreamStart?: (procedure: TStreamProcedureRegistration | THttpStreamProcedureRegistration<any>, c: Context, streamMode: StreamMode) => void;
47
+ onStreamEnd?: (procedure: TStreamProcedureRegistration | THttpStreamProcedureRegistration<any>, c: Context, streamMode: StreamMode) => void;
48
+ onMidStreamError?: OnMidStreamError<TStreamErrorData>;
49
+ };
50
+ };
51
+ export type DocAccumulator = AnyHttpRouteDoc[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono/types.ts"],"names":[],"mappings":""}
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Cross-builder tests for the `onRequestError` observer hook.
4
4
  *
5
- * Invariants verified once per builder:
5
+ * Invariants verified per builder:
6
6
  * 1. Fires exactly once for every caught error.
7
7
  * 2. Runs BEFORE dispatch (taxonomy / onError / hard default).
8
8
  * 3. Is awaited — async observer work completes before the response is sent.
@@ -12,75 +12,16 @@
12
12
  * path still produces a response.
13
13
  */
14
14
  import { describe, expect, test, vi } from 'vitest';
15
- import request from 'supertest';
16
15
  import { Type } from 'typebox';
17
16
  import { Procedures } from '../../index.js';
18
- import { HonoAPIAppBuilder } from './hono-api/index.js';
19
- import { HonoRPCAppBuilder } from './hono-rpc/index.js';
20
- import { ExpressRPCAppBuilder } from './express-rpc/index.js';
21
- import { HonoStreamAppBuilder } from './hono-stream/index.js';
22
- describe('onRequestError — HonoAPIAppBuilder', () => {
23
- function boomApp(config) {
24
- const API = Procedures();
25
- API.Create('Boom', { path: '/boom', method: 'get', schema: { returnType: Type.Object({}) } }, async () => {
26
- throw new TypeError('boom');
27
- });
28
- return new HonoAPIAppBuilder(config).register(API, () => ({})).build();
29
- }
30
- test('fires exactly once and before dispatch', async () => {
31
- const order = [];
32
- const onRequestError = vi.fn(() => {
33
- order.push('observer');
34
- });
35
- const onError = vi.fn((_p, c) => {
36
- order.push('onError');
37
- return c.json({ handled: true }, 418);
38
- });
39
- const app = boomApp({ onRequestError, onError });
40
- await app.request('/boom');
41
- expect(onRequestError).toHaveBeenCalledTimes(1);
42
- expect(order).toEqual(['observer', 'onError']);
43
- });
44
- test('is awaited — async work completes before response is sent', async () => {
45
- const log = [];
46
- const onRequestError = async () => {
47
- await new Promise((r) => setTimeout(r, 5));
48
- log.push('observer-done');
49
- };
50
- const app = boomApp({
51
- onRequestError,
52
- onError: (_p, c) => {
53
- log.push('onError-called');
54
- return c.json({ ok: true }, 500);
55
- },
56
- });
57
- await app.request('/boom');
58
- expect(log).toEqual(['observer-done', 'onError-called']);
59
- });
60
- test('observer-thrown errors are swallowed — dispatch still produces a response', async () => {
61
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
62
- const app = boomApp({
63
- onRequestError: () => {
64
- throw new Error('observer exploded');
65
- },
66
- });
67
- const res = await app.request('/boom');
68
- expect(res.status).toBe(500);
69
- consoleSpy.mockRestore();
70
- });
71
- test('omitting observer preserves existing behavior', async () => {
72
- const app = boomApp({ onError: (_p, c) => c.json({ ok: true }, 418) });
73
- const res = await app.request('/boom');
74
- expect(res.status).toBe(418);
75
- });
76
- });
77
- describe('onRequestError — HonoRPCAppBuilder', () => {
17
+ import { HonoAppBuilder } from './hono/index.js';
18
+ describe('onRequestError HonoAppBuilder (rpc kind)', () => {
78
19
  function boomApp(config) {
79
20
  const RPC = Procedures();
80
21
  RPC.Create('Boom', { scope: 'test', version: 1, schema: { params: Type.Object({}) } }, async () => {
81
22
  throw new TypeError('boom');
82
23
  });
83
- return new HonoRPCAppBuilder(config).register(RPC, () => ({})).build();
24
+ return new HonoAppBuilder(config).register(RPC, () => ({})).build();
84
25
  }
85
26
  test('fires once; runs before onError', async () => {
86
27
  const order = [];
@@ -108,44 +49,13 @@ describe('onRequestError — HonoRPCAppBuilder', () => {
108
49
  consoleSpy.mockRestore();
109
50
  });
110
51
  });
111
- describe('onRequestError — ExpressRPCAppBuilder', () => {
112
- function boomApp(config) {
113
- const RPC = Procedures();
114
- RPC.Create('Boom', { scope: 'test', version: 1, schema: { params: Type.Object({}) } }, async () => {
115
- throw new TypeError('boom');
116
- });
117
- return new ExpressRPCAppBuilder(config).register(RPC, () => ({})).build();
118
- }
119
- test('fires once; raw is { req, res }', async () => {
120
- let rawSeen;
121
- const app = boomApp({
122
- onRequestError: (ctx) => {
123
- rawSeen = ctx.raw;
124
- },
125
- });
126
- await request(app).post('/test/boom/1').send({});
127
- expect(rawSeen.req).toBeDefined();
128
- expect(rawSeen.res).toBeDefined();
129
- });
130
- test('observer throws are swallowed', async () => {
131
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
132
- const app = boomApp({
133
- onRequestError: () => {
134
- throw new Error('observer bug');
135
- },
136
- });
137
- const res = await request(app).post('/test/boom/1').send({});
138
- expect(res.status).toBe(500);
139
- consoleSpy.mockRestore();
140
- });
141
- });
142
- describe('onRequestError — HonoStreamAppBuilder (pre-stream)', () => {
52
+ describe('onRequestError — HonoAppBuilder (rpc-stream pre-stream)', () => {
143
53
  function boomApp(config) {
144
54
  const RPC = Procedures();
145
55
  RPC.CreateStream('Stream', { scope: 'test', version: 1 }, async function* () {
146
56
  yield { ok: true };
147
57
  });
148
- return new HonoStreamAppBuilder(config)
58
+ return new HonoAppBuilder(config)
149
59
  .register(RPC, () => {
150
60
  throw new TypeError('context failed');
151
61
  })