ts-procedures 7.3.0 → 8.1.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 (332) 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 +418 -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 +351 -55
  39. package/build/codegen/emit-scope.js.map +1 -1
  40. package/build/codegen/emit-scope.test.js +540 -110
  41. package/build/codegen/emit-scope.test.js.map +1 -1
  42. package/build/codegen/emit-types.d.ts +6 -2
  43. package/build/codegen/emit-types.js +81 -20
  44. package/build/codegen/emit-types.js.map +1 -1
  45. package/build/codegen/emit-types.test.js +70 -1
  46. package/build/codegen/emit-types.test.js.map +1 -1
  47. package/build/codegen/pipeline.test.js +7 -7
  48. package/build/codegen/pipeline.test.js.map +1 -1
  49. package/build/codegen/resolve-envelope.js +1 -1
  50. package/build/codegen/resolve-envelope.js.map +1 -1
  51. package/build/codegen/resolve-envelope.test.js +5 -5
  52. package/build/codegen/resolve-envelope.test.js.map +1 -1
  53. package/build/codegen/targets/_shared/route-slots.d.ts +8 -3
  54. package/build/codegen/targets/_shared/route-slots.js +49 -8
  55. package/build/codegen/targets/_shared/route-slots.js.map +1 -1
  56. package/build/codegen/targets/_shared/route-slots.test.js +99 -26
  57. package/build/codegen/targets/_shared/route-slots.test.js.map +1 -1
  58. package/build/codegen/targets/kotlin/emit-route-kotlin.test.js +88 -17
  59. package/build/codegen/targets/kotlin/emit-route-kotlin.test.js.map +1 -1
  60. package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js +9 -6
  61. package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js.map +1 -1
  62. package/build/codegen/targets/kotlin/integration.test.js +6 -0
  63. package/build/codegen/targets/kotlin/integration.test.js.map +1 -1
  64. package/build/codegen/targets/swift/access-level.test.js +8 -11
  65. package/build/codegen/targets/swift/access-level.test.js.map +1 -1
  66. package/build/codegen/targets/swift/emit-route-swift.test.js +91 -20
  67. package/build/codegen/targets/swift/emit-route-swift.test.js.map +1 -1
  68. package/build/codegen/targets/swift/emit-scope-swift.test.js +12 -9
  69. package/build/codegen/targets/swift/emit-scope-swift.test.js.map +1 -1
  70. package/build/codegen/targets/swift/integration.test.js +6 -0
  71. package/build/codegen/targets/swift/integration.test.js.map +1 -1
  72. package/build/create-http-stream.d.ts +58 -0
  73. package/build/create-http-stream.js +122 -0
  74. package/build/create-http-stream.js.map +1 -0
  75. package/build/create-http-stream.test.js +88 -0
  76. package/build/create-http-stream.test.js.map +1 -0
  77. package/build/create-http.d.ts +49 -0
  78. package/build/create-http.js +108 -0
  79. package/build/create-http.js.map +1 -0
  80. package/build/create-http.test.js +137 -0
  81. package/build/create-http.test.js.map +1 -0
  82. package/build/create-stream.d.ts +35 -0
  83. package/build/create-stream.js +123 -0
  84. package/build/create-stream.js.map +1 -0
  85. package/build/create-stream.test.js +428 -0
  86. package/build/create-stream.test.js.map +1 -0
  87. package/build/create.d.ts +28 -0
  88. package/build/create.js +82 -0
  89. package/build/create.js.map +1 -0
  90. package/build/create.test.js +483 -0
  91. package/build/create.test.js.map +1 -0
  92. package/build/exports.d.ts +2 -0
  93. package/build/implementations/http/astro/index.test.js +20 -12
  94. package/build/implementations/http/astro/index.test.js.map +1 -1
  95. package/build/implementations/http/doc-registry.js +1 -1
  96. package/build/implementations/http/doc-registry.js.map +1 -1
  97. package/build/implementations/http/doc-registry.test.js +36 -5
  98. package/build/implementations/http/doc-registry.test.js.map +1 -1
  99. package/build/implementations/http/error-dispatch.d.ts +76 -0
  100. package/build/implementations/http/error-dispatch.js +77 -0
  101. package/build/implementations/http/error-dispatch.js.map +1 -0
  102. package/build/implementations/http/error-dispatch.test.js +254 -0
  103. package/build/implementations/http/error-dispatch.test.js.map +1 -0
  104. package/build/implementations/http/error-taxonomy.d.ts +5 -5
  105. package/build/implementations/http/hono/docs/http-doc.d.ts +6 -0
  106. package/build/implementations/http/hono/docs/http-doc.js +42 -0
  107. package/build/implementations/http/hono/docs/http-doc.js.map +1 -0
  108. package/build/implementations/http/hono/docs/http-stream-doc.d.ts +6 -0
  109. package/build/implementations/http/hono/docs/http-stream-doc.js +40 -0
  110. package/build/implementations/http/hono/docs/http-stream-doc.js.map +1 -0
  111. package/build/implementations/http/hono/docs/rpc-doc.d.ts +6 -0
  112. package/build/implementations/http/hono/docs/rpc-doc.js +24 -0
  113. package/build/implementations/http/hono/docs/rpc-doc.js.map +1 -0
  114. package/build/implementations/http/hono/docs/stream-doc.d.ts +6 -0
  115. package/build/implementations/http/hono/docs/stream-doc.js +42 -0
  116. package/build/implementations/http/hono/docs/stream-doc.js.map +1 -0
  117. package/build/implementations/http/hono/handlers/http-stream.d.ts +10 -0
  118. package/build/implementations/http/hono/handlers/http-stream.js +123 -0
  119. package/build/implementations/http/hono/handlers/http-stream.js.map +1 -0
  120. package/build/implementations/http/hono/handlers/http-stream.test.js +128 -0
  121. package/build/implementations/http/hono/handlers/http-stream.test.js.map +1 -0
  122. package/build/implementations/http/hono/handlers/http.d.ts +10 -0
  123. package/build/implementations/http/hono/handlers/http.js +115 -0
  124. package/build/implementations/http/hono/handlers/http.js.map +1 -0
  125. package/build/implementations/http/hono/handlers/http.test.js +118 -0
  126. package/build/implementations/http/hono/handlers/http.test.js.map +1 -0
  127. package/build/implementations/http/hono/handlers/rpc.d.ts +11 -0
  128. package/build/implementations/http/hono/handlers/rpc.js +32 -0
  129. package/build/implementations/http/hono/handlers/rpc.js.map +1 -0
  130. package/build/implementations/http/hono/handlers/rpc.test.js +73 -0
  131. package/build/implementations/http/hono/handlers/rpc.test.js.map +1 -0
  132. package/build/implementations/http/hono/handlers/stream.d.ts +23 -0
  133. package/build/implementations/http/hono/handlers/stream.js +147 -0
  134. package/build/implementations/http/hono/handlers/stream.js.map +1 -0
  135. package/build/implementations/http/hono/handlers/stream.test.d.ts +1 -0
  136. package/build/implementations/http/hono/handlers/stream.test.js +177 -0
  137. package/build/implementations/http/hono/handlers/stream.test.js.map +1 -0
  138. package/build/implementations/http/hono/index.d.ts +57 -0
  139. package/build/implementations/http/hono/index.js +149 -0
  140. package/build/implementations/http/hono/index.js.map +1 -0
  141. package/build/implementations/http/hono/index.test.d.ts +1 -0
  142. package/build/implementations/http/hono/index.test.js +274 -0
  143. package/build/implementations/http/hono/index.test.js.map +1 -0
  144. package/build/implementations/http/hono/path.d.ts +17 -0
  145. package/build/implementations/http/hono/path.js +39 -0
  146. package/build/implementations/http/hono/path.js.map +1 -0
  147. package/build/implementations/http/hono/path.test.d.ts +1 -0
  148. package/build/implementations/http/hono/path.test.js +83 -0
  149. package/build/implementations/http/hono/path.test.js.map +1 -0
  150. package/build/implementations/http/hono/types.d.ts +51 -0
  151. package/build/implementations/http/hono/types.js.map +1 -0
  152. package/build/implementations/http/on-request-error.test.js +6 -96
  153. package/build/implementations/http/on-request-error.test.js.map +1 -1
  154. package/build/implementations/http/route-errors.test.js +11 -59
  155. package/build/implementations/http/route-errors.test.js.map +1 -1
  156. package/build/implementations/types.d.ts +43 -9
  157. package/build/index.d.ts +124 -124
  158. package/build/index.js +10 -221
  159. package/build/index.js.map +1 -1
  160. package/build/index.test.js +20 -919
  161. package/build/index.test.js.map +1 -1
  162. package/build/migration.test.d.ts +1 -0
  163. package/build/migration.test.js +34 -0
  164. package/build/migration.test.js.map +1 -0
  165. package/build/schema/compute-schema.d.ts +11 -3
  166. package/build/schema/compute-schema.js +13 -7
  167. package/build/schema/compute-schema.js.map +1 -1
  168. package/build/schema/parser.d.ts +11 -3
  169. package/build/schema/parser.js +49 -9
  170. package/build/schema/parser.js.map +1 -1
  171. package/build/stack-utils.js +8 -0
  172. package/build/stack-utils.js.map +1 -1
  173. package/build/types.d.ts +142 -0
  174. package/build/types.js.map +1 -0
  175. package/docs/astro-adapter.md +5 -5
  176. package/docs/core.md +15 -17
  177. package/docs/http-integrations.md +83 -170
  178. package/docs/streaming.md +3 -60
  179. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +2 -7
  180. package/docs/superpowers/plans/2026-05-08-create-http.md +3355 -0
  181. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +3365 -0
  182. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +1 -3
  183. package/docs/superpowers/specs/2026-05-08-create-http-design.md +409 -0
  184. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +411 -0
  185. package/package.json +4 -22
  186. package/src/client/call.test.ts +26 -0
  187. package/src/client/call.ts +4 -1
  188. package/src/client/fetch-adapter.test.ts +14 -1
  189. package/src/client/fetch-adapter.ts +3 -1
  190. package/src/client/index.test.ts +7 -7
  191. package/src/client/request-builder.ts +2 -2
  192. package/src/client/stream.test.ts +39 -7
  193. package/src/client/stream.ts +16 -2
  194. package/src/client/typed-error-dispatch.test.ts +7 -97
  195. package/src/client/types.ts +21 -3
  196. package/src/codegen/__fixtures__/users-envelope.json +119 -38
  197. package/src/codegen/e2e.test.ts +452 -24
  198. package/src/codegen/emit-errors.integration.test.ts +1 -1
  199. package/src/codegen/emit-scope.test.ts +581 -110
  200. package/src/codegen/emit-scope.ts +390 -61
  201. package/src/codegen/emit-types.test.ts +73 -1
  202. package/src/codegen/emit-types.ts +82 -21
  203. package/src/codegen/pipeline.test.ts +7 -7
  204. package/src/codegen/resolve-envelope.test.ts +5 -5
  205. package/src/codegen/resolve-envelope.ts +1 -1
  206. package/src/codegen/targets/_shared/route-slots.test.ts +109 -26
  207. package/src/codegen/targets/_shared/route-slots.ts +48 -11
  208. package/src/codegen/targets/kotlin/__fixtures__/users-golden.kt +73 -0
  209. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +100 -17
  210. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +9 -6
  211. package/src/codegen/targets/kotlin/integration.test.ts +19 -0
  212. package/src/codegen/targets/swift/__fixtures__/users-golden.swift +79 -0
  213. package/src/codegen/targets/swift/access-level.test.ts +8 -11
  214. package/src/codegen/targets/swift/emit-route-swift.test.ts +103 -20
  215. package/src/codegen/targets/swift/emit-scope-swift.test.ts +12 -9
  216. package/src/codegen/targets/swift/integration.test.ts +17 -0
  217. package/src/create-http-stream.test.ts +97 -0
  218. package/src/create-http-stream.ts +191 -0
  219. package/src/create-http.test.ts +163 -0
  220. package/src/create-http.ts +211 -0
  221. package/src/create-stream.test.ts +565 -0
  222. package/src/create-stream.ts +228 -0
  223. package/src/create.test.ts +658 -0
  224. package/src/create.ts +172 -0
  225. package/src/exports.ts +2 -0
  226. package/src/implementations/http/README.md +135 -95
  227. package/src/implementations/http/astro/README.md +4 -5
  228. package/src/implementations/http/astro/index.test.ts +25 -18
  229. package/src/implementations/http/doc-registry.test.ts +42 -5
  230. package/src/implementations/http/doc-registry.ts +1 -1
  231. package/src/implementations/http/error-dispatch.test.ts +283 -0
  232. package/src/implementations/http/error-dispatch.ts +176 -0
  233. package/src/implementations/http/error-taxonomy.ts +5 -5
  234. package/src/implementations/http/hono/docs/http-doc.ts +43 -0
  235. package/src/implementations/http/hono/docs/http-stream-doc.ts +44 -0
  236. package/src/implementations/http/hono/docs/rpc-doc.ts +34 -0
  237. package/src/implementations/http/hono/docs/stream-doc.ts +53 -0
  238. package/src/implementations/http/hono/handlers/http-stream.test.ts +150 -0
  239. package/src/implementations/http/hono/handlers/http-stream.ts +152 -0
  240. package/src/implementations/http/hono/handlers/http.test.ts +130 -0
  241. package/src/implementations/http/hono/handlers/http.ts +147 -0
  242. package/src/implementations/http/hono/handlers/rpc.test.ts +81 -0
  243. package/src/implementations/http/hono/handlers/rpc.ts +54 -0
  244. package/src/implementations/http/hono/handlers/stream.test.ts +198 -0
  245. package/src/implementations/http/hono/handlers/stream.ts +208 -0
  246. package/src/implementations/http/hono/index.test.ts +329 -0
  247. package/src/implementations/http/hono/index.ts +204 -0
  248. package/src/implementations/http/hono/path.test.ts +96 -0
  249. package/src/implementations/http/hono/path.ts +59 -0
  250. package/src/implementations/http/hono/types.ts +93 -0
  251. package/src/implementations/http/on-request-error.test.ts +10 -116
  252. package/src/implementations/http/route-errors.test.ts +11 -77
  253. package/src/implementations/types.ts +44 -9
  254. package/src/index.test.ts +22 -1249
  255. package/src/index.ts +49 -485
  256. package/src/migration.test.ts +48 -0
  257. package/src/schema/compute-schema.ts +26 -12
  258. package/src/schema/parser.ts +62 -12
  259. package/src/stack-utils.ts +8 -0
  260. package/src/types.ts +133 -0
  261. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/express-rpc.md +0 -137
  262. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-api.md +0 -173
  263. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-rpc.md +0 -142
  264. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-stream.md +0 -147
  265. package/build/implementations/http/express-rpc/error-taxonomy.test.js +0 -83
  266. package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +0 -1
  267. package/build/implementations/http/express-rpc/index.d.ts +0 -125
  268. package/build/implementations/http/express-rpc/index.js +0 -216
  269. package/build/implementations/http/express-rpc/index.js.map +0 -1
  270. package/build/implementations/http/express-rpc/index.test.js +0 -684
  271. package/build/implementations/http/express-rpc/index.test.js.map +0 -1
  272. package/build/implementations/http/express-rpc/types.d.ts +0 -11
  273. package/build/implementations/http/express-rpc/types.js.map +0 -1
  274. package/build/implementations/http/hono-api/error-taxonomy.test.js +0 -137
  275. package/build/implementations/http/hono-api/error-taxonomy.test.js.map +0 -1
  276. package/build/implementations/http/hono-api/index.d.ts +0 -151
  277. package/build/implementations/http/hono-api/index.js +0 -344
  278. package/build/implementations/http/hono-api/index.js.map +0 -1
  279. package/build/implementations/http/hono-api/index.test.js +0 -992
  280. package/build/implementations/http/hono-api/index.test.js.map +0 -1
  281. package/build/implementations/http/hono-api/types.d.ts +0 -13
  282. package/build/implementations/http/hono-api/types.js.map +0 -1
  283. package/build/implementations/http/hono-rpc/error-taxonomy.test.js +0 -64
  284. package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +0 -1
  285. package/build/implementations/http/hono-rpc/index.d.ts +0 -130
  286. package/build/implementations/http/hono-rpc/index.js +0 -209
  287. package/build/implementations/http/hono-rpc/index.js.map +0 -1
  288. package/build/implementations/http/hono-rpc/index.test.js +0 -828
  289. package/build/implementations/http/hono-rpc/index.test.js.map +0 -1
  290. package/build/implementations/http/hono-rpc/types.d.ts +0 -11
  291. package/build/implementations/http/hono-rpc/types.js +0 -2
  292. package/build/implementations/http/hono-rpc/types.js.map +0 -1
  293. package/build/implementations/http/hono-stream/error-taxonomy.test.js +0 -159
  294. package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +0 -1
  295. package/build/implementations/http/hono-stream/index.d.ts +0 -171
  296. package/build/implementations/http/hono-stream/index.js +0 -415
  297. package/build/implementations/http/hono-stream/index.js.map +0 -1
  298. package/build/implementations/http/hono-stream/index.test.js +0 -1383
  299. package/build/implementations/http/hono-stream/index.test.js.map +0 -1
  300. package/build/implementations/http/hono-stream/types.d.ts +0 -15
  301. package/build/implementations/http/hono-stream/types.js +0 -2
  302. package/build/implementations/http/hono-stream/types.js.map +0 -1
  303. package/src/implementations/http/express-rpc/README.md +0 -280
  304. package/src/implementations/http/express-rpc/error-taxonomy.test.ts +0 -103
  305. package/src/implementations/http/express-rpc/index.test.ts +0 -957
  306. package/src/implementations/http/express-rpc/index.ts +0 -327
  307. package/src/implementations/http/express-rpc/types.ts +0 -16
  308. package/src/implementations/http/hono-api/README.md +0 -284
  309. package/src/implementations/http/hono-api/error-taxonomy.test.ts +0 -179
  310. package/src/implementations/http/hono-api/index.test.ts +0 -1341
  311. package/src/implementations/http/hono-api/index.ts +0 -519
  312. package/src/implementations/http/hono-api/types.ts +0 -16
  313. package/src/implementations/http/hono-rpc/README.md +0 -357
  314. package/src/implementations/http/hono-rpc/error-taxonomy.test.ts +0 -82
  315. package/src/implementations/http/hono-rpc/index.test.ts +0 -1107
  316. package/src/implementations/http/hono-rpc/index.ts +0 -320
  317. package/src/implementations/http/hono-rpc/types.ts +0 -16
  318. package/src/implementations/http/hono-stream/README.md +0 -559
  319. package/src/implementations/http/hono-stream/error-taxonomy.test.ts +0 -178
  320. package/src/implementations/http/hono-stream/index.test.ts +0 -1804
  321. package/src/implementations/http/hono-stream/index.ts +0 -622
  322. package/src/implementations/http/hono-stream/types.ts +0 -20
  323. /package/build/{implementations/http/express-rpc/error-taxonomy.test.d.ts → create-http-stream.test.d.ts} +0 -0
  324. /package/build/{implementations/http/express-rpc/index.test.d.ts → create-http.test.d.ts} +0 -0
  325. /package/build/{implementations/http/hono-api/error-taxonomy.test.d.ts → create-stream.test.d.ts} +0 -0
  326. /package/build/{implementations/http/hono-api/index.test.d.ts → create.test.d.ts} +0 -0
  327. /package/build/implementations/http/{hono-rpc/error-taxonomy.test.d.ts → error-dispatch.test.d.ts} +0 -0
  328. /package/build/implementations/http/{hono-rpc/index.test.d.ts → hono/handlers/http-stream.test.d.ts} +0 -0
  329. /package/build/implementations/http/{hono-stream/error-taxonomy.test.d.ts → hono/handlers/http.test.d.ts} +0 -0
  330. /package/build/implementations/http/{hono-stream/index.test.d.ts → hono/handlers/rpc.test.d.ts} +0 -0
  331. /package/build/implementations/http/{express-rpc → hono}/types.js +0 -0
  332. /package/build/{implementations/http/hono-api/types.js → types.js} +0 -0
package/src/index.ts CHANGED
@@ -1,72 +1,29 @@
1
- import {
2
- ProcedureError,
3
- ProcedureValidationError,
4
- ProcedureYieldValidationError,
5
- } from './errors.js'
6
- import { computeSchema } from './schema/compute-schema.js'
7
- import { Prettify, TJSONSchema, TSchemaLib } from './schema/types.js'
8
- import { captureDefinitionInfo } from './stack-utils.js'
9
-
10
- export type TNoContextProvided = unknown
11
-
12
- export type TLocalContext = {
13
- error: (message: string, meta?: object) => ProcedureError
14
- signal?: AbortSignal
15
- }
1
+ import { Prettify, TJSONSchema } from './schema/types.js'
2
+ import { makeCreate } from './create.js'
3
+ import { makeCreateStream } from './create-stream.js'
4
+ import { makeCreateHttp } from './create-http.js'
5
+ import { makeCreateHttpStream } from './create-http-stream.js'
6
+
7
+ export {
8
+ type TNoContextProvided,
9
+ type TLocalContext,
10
+ type TStreamContext,
11
+ type ProcedureKind,
12
+ type TProcedureRegistration,
13
+ type TStreamProcedureRegistration,
14
+ type THttpProcedureRegistration,
15
+ type THttpStreamProcedureRegistration,
16
+ type TBuilderConfig,
17
+ } from './types.js'
16
18
 
17
- export type TStreamContext = TLocalContext & {
18
- signal: AbortSignal
19
- }
20
-
21
- export type TProcedureRegistration<TContext = unknown, TExtendedConfig = unknown> = {
22
- name: string
23
- isStream?: false
24
- config: {
25
- description?: string
26
- schema?: {
27
- params?: TJSONSchema
28
- returnType?: TJSONSchema
29
- input?: Record<string, TJSONSchema>
30
- }
31
- validation?: {
32
- params?: (params: any) => { errors?: any[] }
33
- input?: Record<string, (value: any) => { errors?: any[] }>
34
- }
35
- } & TExtendedConfig
36
-
37
- handler: (ctx: TContext, params?: any) => Promise<any>
38
- }
39
-
40
- export type TStreamProcedureRegistration<TContext = unknown, TExtendedConfig = unknown> = {
41
- name: string
42
- isStream: true
43
- config: {
44
- description?: string
45
- schema?: {
46
- params?: TJSONSchema
47
- yieldType?: TJSONSchema
48
- returnType?: TJSONSchema
49
- input?: Record<string, TJSONSchema>
50
- }
51
- validation?: {
52
- params?: (params: any) => { errors?: any[] }
53
- yield?: (value: any) => { errors?: any[] }
54
- input?: Record<string, (value: any) => { errors?: any[] }>
55
- }
56
- } & TExtendedConfig
57
-
58
- handler: (ctx: TContext, params?: any) => AsyncGenerator<any, any, unknown>
59
- }
60
-
61
- export type TBuilderConfig = {
62
- /**
63
- * The default is to validate schema inputs at runtime, to disable pass `true` for this property.
64
- *
65
- * @Note: this is not recommended for public unknown data, only use for internal procedure
66
- * factories with type-checking build steps.
67
- */
68
- noRuntimeValidation?: true
69
- }
19
+ import {
20
+ TNoContextProvided,
21
+ TBuilderConfig,
22
+ TProcedureRegistration,
23
+ TStreamProcedureRegistration,
24
+ THttpProcedureRegistration,
25
+ THttpStreamProcedureRegistration,
26
+ } from './types.js'
70
27
 
71
28
  export function Procedures<TContext = TNoContextProvided, TExtendedConfig = unknown>(
72
29
  /**
@@ -74,30 +31,23 @@ export function Procedures<TContext = TNoContextProvided, TExtendedConfig = unkn
74
31
  */
75
32
  builder?: {
76
33
  config?: TBuilderConfig
34
+ /**
35
+ * Called once per registered procedure. Receives the full registration
36
+ * object for any of the four procedure kinds:
37
+ * - `TProcedureRegistration` (Create)
38
+ * - `TStreamProcedureRegistration` (CreateStream)
39
+ * - `THttpProcedureRegistration` (CreateHttp)
40
+ * - `THttpStreamProcedureRegistration` (CreateHttpStream)
41
+ *
42
+ * Use the `kind` discriminant to narrow to the specific shape.
43
+ */
77
44
  onCreate?: (
78
- procedure: Prettify<{
79
- name: string
80
- isStream?: boolean
81
- handler:
82
- | ((ctx: Prettify<TContext>, params?: any) => Promise<any>)
83
- | ((ctx: Prettify<TContext>, params?: any) => AsyncGenerator<any, any, unknown>)
84
- config: Prettify<
85
- {
86
- description?: string
87
- schema?: {
88
- params?: TJSONSchema
89
- yieldType?: TJSONSchema
90
- returnType?: TJSONSchema
91
- input?: Record<string, TJSONSchema>
92
- }
93
- validation?: {
94
- params?: (params: any) => { errors?: any[] }
95
- yield?: (value: any) => { errors?: any[] }
96
- input?: Record<string, (value: any) => { errors?: any[] }>
97
- }
98
- } & TExtendedConfig
99
- >
100
- }>
45
+ procedure: Prettify<
46
+ | TProcedureRegistration<TContext, TExtendedConfig>
47
+ | TStreamProcedureRegistration<TContext, TExtendedConfig>
48
+ | THttpProcedureRegistration<TContext>
49
+ | THttpStreamProcedureRegistration<TContext>
50
+ >
101
51
  ) => void
102
52
  }
103
53
  ) {
@@ -105,402 +55,14 @@ export function Procedures<TContext = TNoContextProvided, TExtendedConfig = unkn
105
55
  string,
106
56
  | TProcedureRegistration<TContext, TExtendedConfig>
107
57
  | TStreamProcedureRegistration<TContext, TExtendedConfig>
58
+ | THttpProcedureRegistration<TContext>
59
+ | THttpStreamProcedureRegistration<TContext>
108
60
  > = new Map()
109
61
 
110
- function Create<
111
- TName extends string,
112
- TParams,
113
- TReturnType,
114
- TInput extends Record<string, unknown> | undefined = undefined,
115
- >(
116
- name: TName,
117
- config: {
118
- description?: string
119
- schema?: {
120
- params?: TParams
121
- returnType?: TReturnType
122
- input?: TInput
123
- }
124
- } & TExtendedConfig,
125
- handler: (
126
- ctx: Prettify<TContext & TLocalContext>,
127
- params: TInput extends Record<string, unknown>
128
- ? Prettify<{ [K in keyof TInput]: TSchemaLib<TInput[K]> }>
129
- : TSchemaLib<TParams>
130
- ) => Promise<TSchemaLib<TReturnType>>
131
- ) {
132
- // Capture definition location as first action
133
- const definitionInfo = captureDefinitionInfo()
134
-
135
- // BEFORE computeSchema - fail fast on duplicate
136
- if (procedures.has(name)) {
137
- throw new Error(`Procedure with name ${name} is already registered`)
138
- }
139
-
140
- const { jsonSchema, validations } = computeSchema(name, config.schema, definitionInfo)
141
-
142
- // Create error factory once at registration time (outside handler)
143
- const errorFactory = (message: string, meta?: object) => {
144
- return new ProcedureError(name, message, meta, definitionInfo)
145
- }
146
-
147
- const registeredProcedure = {
148
- name,
149
- config: {
150
- // ctx: config.hook, ??? why was this here
151
- ...config,
152
- description: config.description,
153
- schema: jsonSchema,
154
- validation: {
155
- params: validations.params,
156
- ...(validations.input && { input: validations.input }),
157
- },
158
- },
159
-
160
- handler: async (ctx: Prettify<TContext>, params: TSchemaLib<TParams>) => {
161
- try {
162
- // Skip validation if caller has already validated (e.g., HonoStreamAppBuilder) or if builder config dictates noRuntimeValidation
163
- const skipValidation =
164
- (ctx as { isPrevalidated?: boolean }).isPrevalidated ||
165
- builder?.config?.noRuntimeValidation
166
-
167
- if (validations?.params && !skipValidation) {
168
- const { errors } = validations.params(params)
169
-
170
- if (errors) {
171
- throw new ProcedureValidationError(
172
- name,
173
- `Validation error for ${name}`,
174
- errors,
175
- definitionInfo
176
- )
177
- }
178
- }
179
-
180
- // Validate each input channel independently for better error messages.
181
- // Double validation (per-channel + merged) is intentional for developer experience;
182
- // the cost is negligible — revisit if validation becomes a performance bottleneck.
183
- if (validations?.input && !skipValidation) {
184
- for (const [channel, validator] of Object.entries(validations.input)) {
185
- const channelValue = (params as Record<string, unknown>)?.[channel]
186
- const { errors } = validator(channelValue)
187
-
188
- if (errors) {
189
- throw new ProcedureValidationError(
190
- name,
191
- `Validation error for ${name} in input.${channel}`,
192
- errors,
193
- definitionInfo
194
- )
195
- }
196
- }
197
- }
198
-
199
- const localCtx: TLocalContext = {
200
- error: errorFactory, // Reuse pre-created factory
201
- }
202
-
203
- // params is correctly typed at the public API boundary via conditional type;
204
- // cast here because TS cannot narrow conditional generics inside implementations
205
- return await handler(
206
- {
207
- ...ctx,
208
- ...localCtx,
209
- } as Prettify<TContext & TLocalContext>,
210
- params as any
211
- )
212
- } catch (error: any) {
213
- if (error instanceof ProcedureError) {
214
- throw error
215
- } else {
216
- const err = new ProcedureError(
217
- name,
218
- `Error in handler for ${name} - ${error?.message}`,
219
- undefined,
220
- definitionInfo
221
- )
222
- err.cause = error // Preserve original error
223
- // Preserve original stack but append definition info
224
- if (error.stack && definitionInfo.definedAt) {
225
- const { file, line, column } = definitionInfo.definedAt
226
- err.stack =
227
- error.stack +
228
- `\n--- Procedure "${name}" defined at ---\n at ${file}:${line}:${column}`
229
- } else if (error.stack) {
230
- err.stack = error.stack
231
- }
232
- throw err
233
- }
234
- }
235
- },
236
- }
237
-
238
- procedures.set(name, registeredProcedure)
239
-
240
- if (builder?.onCreate) {
241
- builder.onCreate(registeredProcedure)
242
- }
243
-
244
- const info = {
245
- name,
246
- ...registeredProcedure.config,
247
- }
248
-
249
- // return so can be called directly (ie: int/unit tests)
250
- return {
251
- [name]: registeredProcedure.handler,
252
- procedure: registeredProcedure.handler,
253
- info,
254
- } as {
255
- [K in TName]: (
256
- ctx: Prettify<TContext>,
257
- params: TInput extends Record<string, unknown>
258
- ? Prettify<{ [K in keyof TInput]: TSchemaLib<TInput[K]> }>
259
- : TSchemaLib<TParams>
260
- ) => Promise<TSchemaLib<TReturnType>>
261
- } & {
262
- procedure: (
263
- ctx: Prettify<TContext>,
264
- params: TInput extends Record<string, unknown>
265
- ? Prettify<{ [K in keyof TInput]: TSchemaLib<TInput[K]> }>
266
- : TSchemaLib<TParams>
267
- ) => Promise<TSchemaLib<TReturnType>>
268
- info: {
269
- name: TName
270
- description?: string
271
- schema: {
272
- params?: TParams
273
- returnType?: TReturnType
274
- input?: TInput
275
- }
276
- validation?: {
277
- params?: (params: any) => { errors?: any[] }
278
- input?: Record<string, (value: any) => { errors?: any[] }>
279
- }
280
- } & TExtendedConfig
281
- }
282
- }
283
-
284
- function CreateStream<
285
- TName extends string,
286
- TParams,
287
- TYieldType,
288
- TReturnType = void,
289
- TInput extends Record<string, unknown> | undefined = undefined,
290
- >(
291
- name: TName,
292
- config: {
293
- description?: string
294
- schema?: {
295
- params?: TParams
296
- yieldType?: TYieldType
297
- returnType?: TReturnType
298
- input?: TInput
299
- }
300
- validateYields?: boolean
301
- } & TExtendedConfig,
302
- handler: (
303
- ctx: Prettify<TContext & TStreamContext>,
304
- params: TInput extends Record<string, unknown>
305
- ? Prettify<{ [K in keyof TInput]: TSchemaLib<TInput[K]> }>
306
- : TSchemaLib<TParams>
307
- ) => AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
308
- ) {
309
- // Capture definition location as first action
310
- const definitionInfo = captureDefinitionInfo()
311
-
312
- // BEFORE computeSchema - fail fast on duplicate
313
- if (procedures.has(name)) {
314
- throw new Error(`Procedure with name ${name} is already registered`)
315
- }
316
-
317
- const { jsonSchema, validations } = computeSchema(name, config.schema, definitionInfo)
318
-
319
- // Create error factory once at registration time (outside handler)
320
- const errorFactory = (message: string, meta?: object) => {
321
- return new ProcedureError(name, message, meta, definitionInfo)
322
- }
323
-
324
- const validateYields = config.validateYields ?? false
325
-
326
- const registeredProcedure: TStreamProcedureRegistration<TContext, TExtendedConfig> = {
327
- name,
328
- isStream: true,
329
- config: {
330
- ...config,
331
- description: config.description,
332
- schema: jsonSchema,
333
- validation: {
334
- params: validations.params,
335
- yield: validations.yield,
336
- ...(validations.input && { input: validations.input }),
337
- },
338
- },
339
-
340
- handler: async function* wrappedHandler(
341
- ctx: Prettify<TContext>,
342
- params: TSchemaLib<TParams>
343
- ) {
344
- // Create abort controller for this stream
345
- const abortController = new AbortController()
346
-
347
- // Skip validation if caller has already validated (e.g., HonoStreamAppBuilder) or if builder config dictates noRuntimeValidation
348
- const skipValidation =
349
- (ctx as { isPrevalidated?: boolean }).isPrevalidated ||
350
- builder?.config?.noRuntimeValidation
351
-
352
- if (validations?.params && !skipValidation) {
353
- const { errors } = validations.params(params)
354
-
355
- if (errors) {
356
- throw new ProcedureValidationError(
357
- name,
358
- `Validation error for ${name}`,
359
- errors,
360
- definitionInfo
361
- )
362
- }
363
- }
364
-
365
- // Validate each input channel independently (see Create for rationale)
366
- if (validations?.input && !skipValidation) {
367
- for (const [channel, validator] of Object.entries(validations.input)) {
368
- const channelValue = (params as Record<string, unknown>)?.[channel]
369
- const { errors } = validator(channelValue)
370
-
371
- if (errors) {
372
- throw new ProcedureValidationError(
373
- name,
374
- `Validation error for ${name} in input.${channel}`,
375
- errors,
376
- definitionInfo
377
- )
378
- }
379
- }
380
- }
381
-
382
- // Combine with external signal (e.g., from HTTP request) if provided
383
- const incomingSignal = (ctx as { signal?: AbortSignal }).signal
384
- const signal = incomingSignal
385
- ? AbortSignal.any([incomingSignal, abortController.signal])
386
- : abortController.signal
387
-
388
- const streamCtx: TStreamContext = {
389
- error: errorFactory,
390
- signal,
391
- }
392
-
393
- // params is correctly typed at the public API boundary via conditional type;
394
- // cast here because TS cannot narrow conditional generics inside implementations
395
- const userGenerator = handler(
396
- {
397
- ...ctx,
398
- ...streamCtx,
399
- } as Prettify<TContext & TStreamContext>,
400
- params as any
401
- )
402
-
403
- const userIterator = userGenerator[Symbol.asyncIterator]()
404
- try {
405
- let userIterResult = await userIterator.next()
406
-
407
- while (!userIterResult.done) {
408
- const value = userIterResult.value
409
-
410
- // Only validate if explicitly enabled via validateYields: true
411
- if (validateYields && validations.yield) {
412
- const { errors } = validations.yield(value)
413
- if (errors) {
414
- throw new ProcedureYieldValidationError(
415
- name,
416
- `Yield validation error for ${name}`,
417
- errors,
418
- definitionInfo
419
- )
420
- }
421
- }
422
-
423
- yield value
424
- userIterResult = await userIterator.next()
425
- }
426
-
427
- // Propagate the generator's return value so consumers (e.g. HonoStreamAppBuilder)
428
- // can send it as a special 'return' SSE event
429
- return userIterResult.value
430
- } catch (error: any) {
431
- // Preserve the original error class so HTTP builders' taxonomies and
432
- // `onMidStreamError` callbacks see the actual thrown type — boxing
433
- // user-defined errors inside ProcedureError defeats route-declared
434
- // typed-error dispatch on the client. Augment the stack trace in
435
- // place with the procedure's definition site when available.
436
- if (definitionInfo.definedAt && error && typeof error.stack === 'string') {
437
- const { file, line, column } = definitionInfo.definedAt
438
- error.stack = `${error.stack}\n--- Procedure "${name}" defined at ---\n at ${file}:${line}:${column}`
439
- }
440
- throw error
441
- } finally {
442
- // Propagate `.return()` to the user generator so its `finally`
443
- // blocks (and any `signal`-driven cleanup) run when the consumer
444
- // closes the stream early. No-op when iteration already completed.
445
- try {
446
- await userIterator.return?.(undefined)
447
- } catch {
448
- // Swallow — cleanup must not mask the primary error path
449
- }
450
- abortController.abort('stream-completed')
451
- }
452
- } as (ctx: TContext, params?: any) => AsyncGenerator<any, any, unknown>,
453
- }
454
-
455
- procedures.set(name, registeredProcedure)
456
-
457
- if (builder?.onCreate) {
458
- builder.onCreate(registeredProcedure)
459
- }
460
-
461
- const info = {
462
- name,
463
- isStream: true as const,
464
- ...registeredProcedure.config,
465
- }
466
-
467
- // return so can be called directly (ie: int/unit tests)
468
- return {
469
- [name]: registeredProcedure.handler,
470
- procedure: registeredProcedure.handler,
471
- info,
472
- } as {
473
- [K in TName]: (
474
- ctx: Prettify<TContext>,
475
- params: TInput extends Record<string, unknown>
476
- ? Prettify<{ [K in keyof TInput]: TSchemaLib<TInput[K]> }>
477
- : TSchemaLib<TParams>
478
- ) => AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
479
- } & {
480
- procedure: (
481
- ctx: Prettify<TContext>,
482
- params: TInput extends Record<string, unknown>
483
- ? Prettify<{ [K in keyof TInput]: TSchemaLib<TInput[K]> }>
484
- : TSchemaLib<TParams>
485
- ) => AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
486
- info: {
487
- name: TName
488
- isStream: true
489
- description?: string
490
- schema: {
491
- params?: TParams
492
- yieldType?: TYieldType
493
- returnType?: TReturnType
494
- input?: TInput
495
- }
496
- validation?: {
497
- params?: (params: any) => { errors?: any[] }
498
- yield?: (value: any) => { errors?: any[] }
499
- input?: Record<string, (value: any) => { errors?: any[] }>
500
- }
501
- } & TExtendedConfig
502
- }
503
- }
62
+ const Create = makeCreate<TContext, TExtendedConfig>(procedures, builder)
63
+ const CreateStream = makeCreateStream<TContext, TExtendedConfig>(procedures, builder)
64
+ const CreateHttp = makeCreateHttp<TContext>(procedures, builder)
65
+ const CreateHttpStream = makeCreateHttpStream<TContext>(procedures, builder)
504
66
 
505
67
  return {
506
68
  /**
@@ -533,5 +95,7 @@ export function Procedures<TContext = TNoContextProvided, TExtendedConfig = unkn
533
95
 
534
96
  Create,
535
97
  CreateStream,
98
+ CreateHttp,
99
+ CreateHttpStream,
536
100
  }
537
101
  }
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { Procedures } from './index.js'
3
+ import { ProcedureRegistrationError } from './errors.js'
4
+ import { Type } from 'typebox'
5
+
6
+ describe('v7 → v8 migration errors', () => {
7
+ it('rejects schema.input on Create with v8 message', () => {
8
+ const procs = Procedures()
9
+ expect(() =>
10
+ procs.Create('Legacy', { schema: { input: { body: Type.Object({}) } } } as any, async () => undefined)
11
+ ).toThrow(ProcedureRegistrationError)
12
+ expect(() =>
13
+ procs.Create('Legacy2', { schema: { input: { body: Type.Object({}) } } } as any, async () => undefined)
14
+ ).toThrow(/schema.input was removed in v8/)
15
+ })
16
+
17
+ it('rejects schema.input on CreateStream with v8 message', () => {
18
+ const procs = Procedures()
19
+ expect(() =>
20
+ procs.CreateStream('Legacy', {
21
+ schema: { input: { body: Type.Object({}) }, yieldType: Type.Number() } as any,
22
+ }, async function* () {})
23
+ ).toThrow(/schema.input was removed in v8/)
24
+ })
25
+ })
26
+
27
+ describe('HTTP fields rejected on RPC creators', () => {
28
+ const HTTP_FIELDS = ['path', 'method', 'req', 'res', 'successStatus'] as const
29
+
30
+ for (const field of HTTP_FIELDS) {
31
+ it(`Create rejects ${field}`, () => {
32
+ const procs = Procedures()
33
+ expect(() =>
34
+ procs.Create('Foo', { [field]: 'x', schema: { params: Type.Object({}) } } as any, async () => undefined)
35
+ ).toThrow(/HTTP fields require CreateHttp/)
36
+ })
37
+
38
+ it(`CreateStream rejects ${field}`, () => {
39
+ const procs = Procedures()
40
+ expect(() =>
41
+ procs.CreateStream('Bar', {
42
+ [field]: 'x',
43
+ schema: { params: Type.Object({}), yieldType: Type.Number() },
44
+ } as any, async function* () {})
45
+ ).toThrow(/HTTP fields require CreateHttp/)
46
+ })
47
+ }
48
+ })
@@ -17,7 +17,8 @@ export function computeSchema<TParamsSchemaType, TReturnTypeSchemaType, TYieldTy
17
17
  params?: TParamsSchemaType
18
18
  returnType?: TReturnTypeSchemaType
19
19
  yieldType?: TYieldTypeSchemaType
20
- input?: Record<string, unknown>
20
+ req?: Record<string, unknown>
21
+ res?: { body?: unknown; headers?: unknown }
21
22
  },
22
23
  // Used for error stack trace details
23
24
  definitionInfo?: DefinitionInfo
@@ -26,44 +27,56 @@ export function computeSchema<TParamsSchemaType, TReturnTypeSchemaType, TYieldTy
26
27
  params?: TJSONSchema
27
28
  returnType?: TJSONSchema
28
29
  yieldType?: TJSONSchema
29
- input?: Record<string, TJSONSchema>
30
+ req?: Record<string, TJSONSchema>
31
+ res?: { body?: TJSONSchema; headers?: TJSONSchema }
30
32
  }
31
33
  validations: {
32
34
  params?: (params?: any) => { errors?: TSchemaValidationError[] }
33
35
  yield?: (value?: any) => { errors?: TSchemaValidationError[] }
34
- input?: Record<string, (value?: any) => { errors?: TSchemaValidationError[] }>
36
+ req?: Record<string, (value?: any) => { errors?: TSchemaValidationError[] }>
35
37
  }
36
38
  } {
37
39
  const jsonSchema: {
38
40
  params?: TJSONSchema
39
41
  returnType?: TJSONSchema
40
42
  yieldType?: TJSONSchema
41
- input?: Record<string, TJSONSchema>
43
+ req?: Record<string, TJSONSchema>
44
+ res?: { body?: TJSONSchema; headers?: TJSONSchema }
42
45
  } = {
43
46
  params: undefined,
44
47
  returnType: undefined,
45
48
  yieldType: undefined,
46
- input: undefined,
49
+ req: undefined,
50
+ res: undefined,
47
51
  }
48
52
 
49
53
  const validations: {
50
54
  params?: (params?: any) => { errors?: TSchemaValidationError[] }
51
55
  yield?: (value?: any) => { errors?: TSchemaValidationError[] }
52
- input?: Record<string, (value?: any) => { errors?: TSchemaValidationError[] }>
56
+ req?: Record<string, (value?: any) => { errors?: TSchemaValidationError[] }>
53
57
  } = {}
54
58
 
55
- // Mutual exclusivity: params and input cannot both be defined
56
- if (schema?.params && schema?.input) {
59
+ // Migration guard: schema.input was removed in v8
60
+ if (schema && 'input' in schema && (schema as any).input !== undefined) {
57
61
  throw new ProcedureRegistrationError(
58
62
  name,
59
- `schema.params and schema.input are mutually exclusive for procedure "${name}". Use schema.params for flat input or schema.input for structured multi-channel input.`,
63
+ `schema.input was removed in v8. Use CreateHttp / CreateHttpStream for per-channel HTTP validation. Procedure: "${name}".`,
64
+ definitionInfo,
65
+ )
66
+ }
67
+
68
+ // Mutual exclusivity: params and req cannot both be defined
69
+ if (schema?.params && schema?.req) {
70
+ throw new ProcedureRegistrationError(
71
+ name,
72
+ `schema.params and schema.req are mutually exclusive for procedure "${name}". Use schema.params for RPC procedures or schema.req for HTTP procedures.`,
60
73
  definitionInfo
61
74
  )
62
75
  }
63
76
 
64
77
  if (schema) {
65
78
  const {
66
- jsonSchema: { params, returnType, yieldType, input },
79
+ jsonSchema: { params, returnType, yieldType, req, res },
67
80
  validation,
68
81
  } = schemaParser(schema, (errors) => {
69
82
  throw new ProcedureRegistrationError(
@@ -78,10 +91,11 @@ export function computeSchema<TParamsSchemaType, TReturnTypeSchemaType, TYieldTy
78
91
  jsonSchema.params = params
79
92
  jsonSchema.returnType = returnType
80
93
  jsonSchema.yieldType = yieldType
81
- jsonSchema.input = input
94
+ jsonSchema.req = req
95
+ jsonSchema.res = res
82
96
  validations.params = validation.params
83
97
  validations.yield = validation.yield
84
- validations.input = validation.input
98
+ validations.req = validation.req
85
99
  }
86
100
 
87
101
  return { jsonSchema, validations }