ts-procedures 8.6.0 → 9.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 (627) hide show
  1. package/README.md +166 -101
  2. package/agent_config/claude-code/.claude-plugin/plugin.json +1 -1
  3. package/agent_config/claude-code/agents/ts-procedures-architect.md +11 -10
  4. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +25 -12
  5. package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +10 -12
  6. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +141 -45
  7. package/agent_config/claude-code/skills/ts-procedures/checklist.md +7 -6
  8. package/agent_config/claude-code/skills/ts-procedures/patterns.md +45 -6
  9. package/agent_config/claude-code/skills/ts-procedures/templates/client.md +1 -1
  10. package/agent_config/claude-code/skills/ts-procedures/templates/hono.md +1 -1
  11. package/agent_config/copilot/copilot-instructions.md +50 -33
  12. package/agent_config/cursor/cursorrules +50 -33
  13. package/build/adapters/astro/astro-context.js.map +1 -0
  14. package/build/adapters/astro/create-handler.js.map +1 -0
  15. package/build/adapters/astro/index.js.map +1 -0
  16. package/build/{implementations/http → adapters}/astro/index.test.js +1 -1
  17. package/build/adapters/astro/index.test.js.map +1 -0
  18. package/build/adapters/astro/rewrite-request.js.map +1 -0
  19. package/build/adapters/hono/envelope-parity.test.js +98 -0
  20. package/build/adapters/hono/envelope-parity.test.js.map +1 -0
  21. package/build/{implementations/http → adapters}/hono/handlers/http-stream.d.ts +1 -1
  22. package/build/adapters/hono/handlers/http-stream.js +55 -0
  23. package/build/adapters/hono/handlers/http-stream.js.map +1 -0
  24. package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.js +1 -1
  25. package/build/adapters/hono/handlers/http-stream.test.js.map +1 -0
  26. package/build/{implementations/http → adapters}/hono/handlers/http.d.ts +1 -1
  27. package/build/adapters/hono/handlers/http.js +50 -0
  28. package/build/adapters/hono/handlers/http.js.map +1 -0
  29. package/build/{implementations/http → adapters}/hono/handlers/http.test.js +1 -1
  30. package/build/adapters/hono/handlers/http.test.js.map +1 -0
  31. package/build/{implementations/http → adapters}/hono/handlers/rpc.d.ts +2 -2
  32. package/build/adapters/hono/handlers/rpc.js +23 -0
  33. package/build/adapters/hono/handlers/rpc.js.map +1 -0
  34. package/build/{implementations/http → adapters}/hono/handlers/rpc.test.js +1 -1
  35. package/build/adapters/hono/handlers/rpc.test.js.map +1 -0
  36. package/build/adapters/hono/handlers/stream.d.ts +12 -0
  37. package/build/adapters/hono/handlers/stream.js +89 -0
  38. package/build/adapters/hono/handlers/stream.js.map +1 -0
  39. package/build/{implementations/http → adapters}/hono/handlers/stream.test.js +3 -2
  40. package/build/adapters/hono/handlers/stream.test.js.map +1 -0
  41. package/build/{implementations/http → adapters}/hono/index.d.ts +24 -12
  42. package/build/{implementations/http → adapters}/hono/index.js +19 -8
  43. package/build/adapters/hono/index.js.map +1 -0
  44. package/build/{implementations/http → adapters}/hono/index.test.js +2 -4
  45. package/build/adapters/hono/index.test.js.map +1 -0
  46. package/build/{implementations/http → adapters/hono}/on-request-error.test.js +2 -2
  47. package/build/adapters/hono/on-request-error.test.js.map +1 -0
  48. package/build/adapters/hono/request.d.ts +7 -0
  49. package/build/adapters/hono/request.js +22 -0
  50. package/build/adapters/hono/request.js.map +1 -0
  51. package/build/{implementations/http → adapters/hono}/route-errors.test.js +4 -4
  52. package/build/adapters/hono/route-errors.test.js.map +1 -0
  53. package/build/adapters/hono/types.d.ts +55 -0
  54. package/build/adapters/hono/types.js +19 -0
  55. package/build/adapters/hono/types.js.map +1 -0
  56. package/build/client/freeze.test.js +39 -0
  57. package/build/client/freeze.test.js.map +1 -0
  58. package/build/client/typed-error-dispatch.test.js +2 -2
  59. package/build/client/typed-error-dispatch.test.js.map +1 -1
  60. package/build/codegen/__fixtures__/make-envelope.d.ts +1 -1
  61. package/build/codegen/bin/cli.d.ts +5 -0
  62. package/build/codegen/bin/cli.js +139 -182
  63. package/build/codegen/bin/cli.js.map +1 -1
  64. package/build/codegen/bin/cli.test.js +12 -2
  65. package/build/codegen/bin/cli.test.js.map +1 -1
  66. package/build/codegen/bin/flag-specs.d.ts +9 -0
  67. package/build/codegen/bin/flag-specs.js +33 -31
  68. package/build/codegen/bin/flag-specs.js.map +1 -1
  69. package/build/codegen/bin/flag-specs.test.js +14 -1
  70. package/build/codegen/bin/flag-specs.test.js.map +1 -1
  71. package/build/codegen/collect-models.d.ts +1 -1
  72. package/build/codegen/emit/api-route.d.ts +8 -0
  73. package/build/codegen/emit/api-route.js +156 -0
  74. package/build/codegen/emit/api-route.js.map +1 -0
  75. package/build/codegen/emit/context.d.ts +30 -0
  76. package/build/codegen/emit/context.js +2 -0
  77. package/build/codegen/emit/context.js.map +1 -0
  78. package/build/codegen/emit/declarations.d.ts +24 -0
  79. package/build/codegen/emit/declarations.js +48 -0
  80. package/build/codegen/emit/declarations.js.map +1 -0
  81. package/build/codegen/emit/format-types.d.ts +61 -0
  82. package/build/codegen/emit/format-types.js +188 -0
  83. package/build/codegen/emit/format-types.js.map +1 -0
  84. package/build/codegen/emit/http-stream-route.d.ts +7 -0
  85. package/build/codegen/emit/http-stream-route.js +138 -0
  86. package/build/codegen/emit/http-stream-route.js.map +1 -0
  87. package/build/codegen/emit/route-shared.d.ts +35 -0
  88. package/build/codegen/emit/route-shared.js +88 -0
  89. package/build/codegen/emit/route-shared.js.map +1 -0
  90. package/build/codegen/emit/rpc-route.d.ts +7 -0
  91. package/build/codegen/emit/rpc-route.js +37 -0
  92. package/build/codegen/emit/rpc-route.js.map +1 -0
  93. package/build/codegen/emit/scope-file.d.ts +39 -0
  94. package/build/codegen/emit/scope-file.js +166 -0
  95. package/build/codegen/emit/scope-file.js.map +1 -0
  96. package/build/codegen/emit/stream-route.d.ts +7 -0
  97. package/build/codegen/emit/stream-route.js +62 -0
  98. package/build/codegen/emit/stream-route.js.map +1 -0
  99. package/build/codegen/emit-errors.d.ts +1 -1
  100. package/build/codegen/emit-errors.integration.test.js +1 -1
  101. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  102. package/build/codegen/emit-scope.d.ts +13 -30
  103. package/build/codegen/emit-scope.js +15 -844
  104. package/build/codegen/emit-scope.js.map +1 -1
  105. package/build/codegen/goldens.test.js +69 -0
  106. package/build/codegen/goldens.test.js.map +1 -0
  107. package/build/codegen/group-routes.d.ts +1 -1
  108. package/build/codegen/pipeline.d.ts +1 -1
  109. package/build/codegen/resolve-envelope.d.ts +1 -1
  110. package/build/codegen/targets/_shared/error-schemas.d.ts +1 -1
  111. package/build/codegen/targets/_shared/route-slots.d.ts +1 -1
  112. package/build/codegen/targets/_shared/target-run.d.ts +1 -1
  113. package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +1 -1
  114. package/build/codegen/targets/swift/emit-route-swift.d.ts +1 -1
  115. package/build/core/create-http-stream.d.ts +50 -0
  116. package/build/core/create-http-stream.js +108 -0
  117. package/build/core/create-http-stream.js.map +1 -0
  118. package/build/{create-http-stream.test.js → core/create-http-stream.test.js} +1 -1
  119. package/build/core/create-http-stream.test.js.map +1 -0
  120. package/build/core/create-http.d.ts +51 -0
  121. package/build/core/create-http.js +65 -0
  122. package/build/core/create-http.js.map +1 -0
  123. package/build/{create-http.test.js → core/create-http.test.js} +13 -4
  124. package/build/core/create-http.test.js.map +1 -0
  125. package/build/core/create-stream.d.ts +26 -0
  126. package/build/core/create-stream.js +80 -0
  127. package/build/core/create-stream.js.map +1 -0
  128. package/build/{create-stream.test.js → core/create-stream.test.js} +23 -28
  129. package/build/core/create-stream.test.js.map +1 -0
  130. package/build/core/create.d.ts +22 -0
  131. package/build/core/create.js +71 -0
  132. package/build/core/create.js.map +1 -0
  133. package/build/{create.test.js → core/create.test.js} +25 -46
  134. package/build/core/create.test.js.map +1 -0
  135. package/build/core/definition-site.d.ts +24 -0
  136. package/build/{stack-utils.js → core/definition-site.js} +20 -20
  137. package/build/core/definition-site.js.map +1 -0
  138. package/build/{stack-utils.test.js → core/definition-site.test.js} +12 -3
  139. package/build/core/definition-site.test.js.map +1 -0
  140. package/build/{errors.d.ts → core/errors.d.ts} +19 -8
  141. package/build/{errors.js → core/errors.js} +21 -26
  142. package/build/core/errors.js.map +1 -0
  143. package/build/core/errors.test.js.map +1 -0
  144. package/build/core/factory-options.test.js +82 -0
  145. package/build/core/factory-options.test.js.map +1 -0
  146. package/build/core/http-route.d.ts +13 -0
  147. package/build/core/http-route.js +54 -0
  148. package/build/core/http-route.js.map +1 -0
  149. package/build/core/internal.d.ts +72 -0
  150. package/build/core/internal.js +128 -0
  151. package/build/core/internal.js.map +1 -0
  152. package/build/{migration.test.js → core/migration.test.js} +17 -1
  153. package/build/core/migration.test.js.map +1 -0
  154. package/build/core/procedures.d.ts +143 -0
  155. package/build/core/procedures.js +64 -0
  156. package/build/core/procedures.js.map +1 -0
  157. package/build/{index.test.js → core/procedures.test.js} +14 -11
  158. package/build/core/procedures.test.js.map +1 -0
  159. package/build/core/types.d.ts +182 -0
  160. package/build/{schema → core}/types.js.map +1 -1
  161. package/build/exports.d.ts +31 -11
  162. package/build/exports.js +23 -8
  163. package/build/exports.js.map +1 -1
  164. package/build/schema/adapter.d.ts +35 -0
  165. package/build/schema/adapter.js +13 -0
  166. package/build/schema/adapter.js.map +1 -0
  167. package/build/schema/adapter.test.js +53 -0
  168. package/build/schema/adapter.test.js.map +1 -0
  169. package/build/schema/compile.d.ts +37 -0
  170. package/build/schema/compile.js +38 -0
  171. package/build/schema/compile.js.map +1 -0
  172. package/build/schema/compile.test.js +78 -0
  173. package/build/schema/compile.test.js.map +1 -0
  174. package/build/schema/compute-schema.d.ts +47 -37
  175. package/build/schema/compute-schema.js +86 -29
  176. package/build/schema/compute-schema.js.map +1 -1
  177. package/build/schema/compute-schema.test.js +158 -40
  178. package/build/schema/compute-schema.test.js.map +1 -1
  179. package/build/schema/json-schema.d.ts +17 -0
  180. package/build/schema/json-schema.js +2 -0
  181. package/build/schema/json-schema.js.map +1 -0
  182. package/build/schema/typebox.d.ts +11 -0
  183. package/build/schema/typebox.js +24 -0
  184. package/build/schema/typebox.js.map +1 -0
  185. package/build/schema/typebox.test.js +34 -0
  186. package/build/schema/typebox.test.js.map +1 -0
  187. package/build/server/context.d.ts +8 -0
  188. package/build/server/context.js +7 -0
  189. package/build/server/context.js.map +1 -0
  190. package/build/server/context.test.js +16 -0
  191. package/build/server/context.test.js.map +1 -0
  192. package/build/{doc-envelope.d.ts → server/doc-envelope.d.ts} +1 -1
  193. package/build/server/doc-envelope.js.map +1 -0
  194. package/build/server/doc-envelope.test.d.ts +1 -0
  195. package/build/server/doc-envelope.test.js.map +1 -0
  196. package/build/{implementations/http → server}/doc-registry.d.ts +7 -2
  197. package/build/{implementations/http → server}/doc-registry.js +9 -5
  198. package/build/server/doc-registry.js.map +1 -0
  199. package/build/server/doc-registry.test.d.ts +1 -0
  200. package/build/{implementations/http → server}/doc-registry.test.js +27 -24
  201. package/build/server/doc-registry.test.js.map +1 -0
  202. package/build/server/docs/docs.test.d.ts +1 -0
  203. package/build/server/docs/docs.test.js +237 -0
  204. package/build/server/docs/docs.test.js.map +1 -0
  205. package/build/{implementations/http/hono → server}/docs/http-doc.d.ts +2 -2
  206. package/build/{implementations/http/hono → server}/docs/http-doc.js +1 -1
  207. package/build/server/docs/http-doc.js.map +1 -0
  208. package/build/{implementations/http/hono → server}/docs/http-stream-doc.d.ts +2 -2
  209. package/build/{implementations/http/hono → server}/docs/http-stream-doc.js +1 -1
  210. package/build/server/docs/http-stream-doc.js.map +1 -0
  211. package/build/{implementations/http/hono → server}/docs/rpc-doc.d.ts +2 -2
  212. package/build/{implementations/http/hono → server}/docs/rpc-doc.js +1 -1
  213. package/build/server/docs/rpc-doc.js.map +1 -0
  214. package/build/{implementations/http/hono → server}/docs/stream-doc.d.ts +2 -2
  215. package/build/{implementations/http/hono → server}/docs/stream-doc.js +1 -1
  216. package/build/server/docs/stream-doc.js.map +1 -0
  217. package/build/server/errors/dispatch.d.ts +96 -0
  218. package/build/{implementations/http/error-dispatch.js → server/errors/dispatch.js} +20 -10
  219. package/build/server/errors/dispatch.js.map +1 -0
  220. package/build/server/errors/dispatch.test.d.ts +1 -0
  221. package/build/server/errors/dispatch.test.js +418 -0
  222. package/build/server/errors/dispatch.test.js.map +1 -0
  223. package/build/{implementations/http/error-taxonomy.d.ts → server/errors/taxonomy.d.ts} +8 -17
  224. package/build/{implementations/http/error-taxonomy.js → server/errors/taxonomy.js} +6 -15
  225. package/build/server/errors/taxonomy.js.map +1 -0
  226. package/build/server/errors/taxonomy.test.d.ts +1 -0
  227. package/build/{implementations/http/error-taxonomy.test.js → server/errors/taxonomy.test.js} +45 -39
  228. package/build/server/errors/taxonomy.test.js.map +1 -0
  229. package/build/server/index.d.ts +29 -0
  230. package/build/server/index.js +27 -0
  231. package/build/server/index.js.map +1 -0
  232. package/build/server/no-framework-imports.test.d.ts +1 -0
  233. package/build/server/no-framework-imports.test.js +40 -0
  234. package/build/server/no-framework-imports.test.js.map +1 -0
  235. package/build/{implementations/http/hono/path.d.ts → server/paths.d.ts} +2 -3
  236. package/build/{implementations/http/hono/path.js → server/paths.js} +1 -1
  237. package/build/server/paths.js.map +1 -0
  238. package/build/server/paths.test.d.ts +1 -0
  239. package/build/server/paths.test.js +111 -0
  240. package/build/server/paths.test.js.map +1 -0
  241. package/build/server/request/params.d.ts +29 -0
  242. package/build/server/request/params.js +43 -0
  243. package/build/server/request/params.js.map +1 -0
  244. package/build/server/request/params.test.d.ts +1 -0
  245. package/build/server/request/params.test.js +91 -0
  246. package/build/server/request/params.test.js.map +1 -0
  247. package/build/server/request/query.d.ts +9 -0
  248. package/build/server/request/query.js +22 -0
  249. package/build/server/request/query.js.map +1 -0
  250. package/build/server/request/query.test.d.ts +1 -0
  251. package/build/server/request/query.test.js +60 -0
  252. package/build/server/request/query.test.js.map +1 -0
  253. package/build/server/sse.d.ts +70 -0
  254. package/build/server/sse.js +94 -0
  255. package/build/server/sse.js.map +1 -0
  256. package/build/server/sse.test.d.ts +1 -0
  257. package/build/server/sse.test.js +98 -0
  258. package/build/server/sse.test.js.map +1 -0
  259. package/build/{implementations → server}/types.d.ts +17 -15
  260. package/build/{implementations → server}/types.js.map +1 -1
  261. package/docs/astro-adapter.md +8 -9
  262. package/docs/client-and-codegen.md +4 -4
  263. package/docs/client-error-handling.md +5 -5
  264. package/docs/codegen-kotlin.md +2 -3
  265. package/docs/codegen-swift.md +1 -2
  266. package/docs/core.md +135 -54
  267. package/docs/http-integrations.md +58 -6
  268. package/docs/migration-v8-to-v9.md +192 -0
  269. package/docs/plans/2026-06-09-v9-rewrite.md +130 -0
  270. package/docs/specs/2026-06-09-v9-rewrite-design.md +221 -0
  271. package/docs/streaming.md +12 -0
  272. package/package.json +23 -47
  273. package/src/{implementations/http → adapters}/astro/index.test.ts +2 -2
  274. package/src/adapters/hono/__fixtures__/parity-envelope.json +389 -0
  275. package/src/adapters/hono/envelope-parity.test.ts +126 -0
  276. package/src/{implementations/http → adapters}/hono/handlers/http-stream.test.ts +1 -1
  277. package/src/adapters/hono/handlers/http-stream.ts +73 -0
  278. package/src/{implementations/http → adapters}/hono/handlers/http.test.ts +1 -1
  279. package/src/adapters/hono/handlers/http.ts +70 -0
  280. package/src/{implementations/http → adapters}/hono/handlers/rpc.test.ts +2 -2
  281. package/src/adapters/hono/handlers/rpc.ts +39 -0
  282. package/src/{implementations/http → adapters}/hono/handlers/stream.test.ts +4 -3
  283. package/src/{implementations/http → adapters}/hono/handlers/stream.ts +19 -92
  284. package/src/{implementations/http → adapters}/hono/index.test.ts +14 -16
  285. package/src/{implementations/http → adapters}/hono/index.ts +35 -30
  286. package/src/{implementations/http → adapters/hono}/on-request-error.test.ts +3 -3
  287. package/src/adapters/hono/request.ts +28 -0
  288. package/src/{implementations/http → adapters/hono}/route-errors.test.ts +5 -5
  289. package/src/{implementations/http → adapters}/hono/types.ts +43 -20
  290. package/src/client/freeze.test.ts +41 -0
  291. package/src/client/typed-error-dispatch.test.ts +3 -3
  292. package/src/codegen/__fixtures__/make-envelope.ts +1 -1
  293. package/src/codegen/__fixtures__/models-envelope.json +310 -0
  294. package/src/codegen/__goldens__/MANIFEST.json +85 -0
  295. package/src/codegen/__goldens__/kotlin-default--models/Billing.kt +112 -0
  296. package/src/codegen/__goldens__/kotlin-default--models/BillingReports.kt +26 -0
  297. package/src/codegen/__goldens__/kotlin-default--models/Orders.kt +88 -0
  298. package/src/codegen/__goldens__/kotlin-default--users/Users.kt +189 -0
  299. package/src/codegen/__goldens__/swift-default--models/Billing.swift +97 -0
  300. package/src/codegen/__goldens__/swift-default--models/BillingReports.swift +20 -0
  301. package/src/codegen/__goldens__/swift-default--models/Orders.swift +81 -0
  302. package/src/codegen/__goldens__/swift-default--users/Users.swift +204 -0
  303. package/src/codegen/__goldens__/ts-default--models/_client.ts +1319 -0
  304. package/src/codegen/__goldens__/ts-default--models/_errors.ts +90 -0
  305. package/src/codegen/__goldens__/ts-default--models/_models.ts +10 -0
  306. package/src/codegen/__goldens__/ts-default--models/_types.ts +502 -0
  307. package/src/codegen/__goldens__/ts-default--models/billing-reports.ts +29 -0
  308. package/src/codegen/__goldens__/ts-default--models/billing.ts +67 -0
  309. package/src/codegen/__goldens__/ts-default--models/index.ts +48 -0
  310. package/src/codegen/__goldens__/ts-default--models/orders.ts +80 -0
  311. package/src/codegen/__goldens__/ts-default--users/_client.ts +1319 -0
  312. package/src/codegen/__goldens__/ts-default--users/_errors.ts +90 -0
  313. package/src/codegen/__goldens__/ts-default--users/_types.ts +502 -0
  314. package/src/codegen/__goldens__/ts-default--users/index.ts +38 -0
  315. package/src/codegen/__goldens__/ts-default--users/users.ts +169 -0
  316. package/src/codegen/__goldens__/ts-external-runtime--models/_errors.ts +90 -0
  317. package/src/codegen/__goldens__/ts-external-runtime--models/_models.ts +10 -0
  318. package/src/codegen/__goldens__/ts-external-runtime--models/billing-reports.ts +29 -0
  319. package/src/codegen/__goldens__/ts-external-runtime--models/billing.ts +67 -0
  320. package/src/codegen/__goldens__/ts-external-runtime--models/index.ts +48 -0
  321. package/src/codegen/__goldens__/ts-external-runtime--models/orders.ts +80 -0
  322. package/src/codegen/__goldens__/ts-external-runtime--users/_errors.ts +90 -0
  323. package/src/codegen/__goldens__/ts-external-runtime--users/index.ts +38 -0
  324. package/src/codegen/__goldens__/ts-external-runtime--users/users.ts +169 -0
  325. package/src/codegen/__goldens__/ts-flat--models/_client.ts +1319 -0
  326. package/src/codegen/__goldens__/ts-flat--models/_errors.ts +87 -0
  327. package/src/codegen/__goldens__/ts-flat--models/_models.ts +10 -0
  328. package/src/codegen/__goldens__/ts-flat--models/_types.ts +502 -0
  329. package/src/codegen/__goldens__/ts-flat--models/billing-reports.ts +28 -0
  330. package/src/codegen/__goldens__/ts-flat--models/billing.ts +51 -0
  331. package/src/codegen/__goldens__/ts-flat--models/index.ts +42 -0
  332. package/src/codegen/__goldens__/ts-flat--models/orders.ts +73 -0
  333. package/src/codegen/__goldens__/ts-flat--users/_client.ts +1319 -0
  334. package/src/codegen/__goldens__/ts-flat--users/_errors.ts +87 -0
  335. package/src/codegen/__goldens__/ts-flat--users/_types.ts +502 -0
  336. package/src/codegen/__goldens__/ts-flat--users/index.ts +34 -0
  337. package/src/codegen/__goldens__/ts-flat--users/users.ts +126 -0
  338. package/src/codegen/__goldens__/ts-no-share-models--models/_client.ts +1319 -0
  339. package/src/codegen/__goldens__/ts-no-share-models--models/_errors.ts +90 -0
  340. package/src/codegen/__goldens__/ts-no-share-models--models/_types.ts +502 -0
  341. package/src/codegen/__goldens__/ts-no-share-models--models/billing-reports.ts +29 -0
  342. package/src/codegen/__goldens__/ts-no-share-models--models/billing.ts +111 -0
  343. package/src/codegen/__goldens__/ts-no-share-models--models/index.ts +48 -0
  344. package/src/codegen/__goldens__/ts-no-share-models--models/orders.ts +112 -0
  345. package/src/codegen/__goldens__/ts-no-share-models--users/_client.ts +1319 -0
  346. package/src/codegen/__goldens__/ts-no-share-models--users/_errors.ts +90 -0
  347. package/src/codegen/__goldens__/ts-no-share-models--users/_types.ts +502 -0
  348. package/src/codegen/__goldens__/ts-no-share-models--users/index.ts +38 -0
  349. package/src/codegen/__goldens__/ts-no-share-models--users/users.ts +169 -0
  350. package/src/codegen/__goldens__/ts-shared-models-module--models/_client.ts +1319 -0
  351. package/src/codegen/__goldens__/ts-shared-models-module--models/_errors.ts +90 -0
  352. package/src/codegen/__goldens__/ts-shared-models-module--models/_models.ts +7 -0
  353. package/src/codegen/__goldens__/ts-shared-models-module--models/_types.ts +502 -0
  354. package/src/codegen/__goldens__/ts-shared-models-module--models/billing-reports.ts +29 -0
  355. package/src/codegen/__goldens__/ts-shared-models-module--models/billing.ts +67 -0
  356. package/src/codegen/__goldens__/ts-shared-models-module--models/index.ts +48 -0
  357. package/src/codegen/__goldens__/ts-shared-models-module--models/orders.ts +80 -0
  358. package/src/codegen/bin/cli.test.ts +13 -2
  359. package/src/codegen/bin/cli.ts +181 -144
  360. package/src/codegen/bin/flag-specs.test.ts +16 -1
  361. package/src/codegen/bin/flag-specs.ts +43 -31
  362. package/src/codegen/bundle-size.test.ts +1 -1
  363. package/src/codegen/collect-models.ts +1 -1
  364. package/src/codegen/e2e.test.ts +1 -1
  365. package/src/codegen/emit/api-route.ts +184 -0
  366. package/src/codegen/emit/context.ts +32 -0
  367. package/src/codegen/emit/declarations.ts +49 -0
  368. package/src/codegen/emit/format-types.ts +232 -0
  369. package/src/codegen/emit/http-stream-route.ts +162 -0
  370. package/src/codegen/emit/route-shared.ts +102 -0
  371. package/src/codegen/emit/rpc-route.ts +49 -0
  372. package/src/codegen/emit/scope-file.ts +226 -0
  373. package/src/codegen/emit/stream-route.ts +81 -0
  374. package/src/codegen/emit-errors.integration.test.ts +2 -2
  375. package/src/codegen/emit-errors.test.ts +1 -1
  376. package/src/codegen/emit-errors.ts +1 -1
  377. package/src/codegen/emit-scope.test.ts +2 -2
  378. package/src/codegen/emit-scope.ts +15 -1048
  379. package/src/codegen/goldens.test.ts +89 -0
  380. package/src/codegen/group-routes.test.ts +1 -1
  381. package/src/codegen/group-routes.ts +1 -1
  382. package/src/codegen/pipeline.test.ts +1 -1
  383. package/src/codegen/pipeline.ts +1 -1
  384. package/src/codegen/resolve-envelope.test.ts +1 -1
  385. package/src/codegen/resolve-envelope.ts +1 -1
  386. package/src/codegen/targets/_shared/error-schemas.test.ts +1 -1
  387. package/src/codegen/targets/_shared/error-schemas.ts +1 -1
  388. package/src/codegen/targets/_shared/route-slots.test.ts +1 -1
  389. package/src/codegen/targets/_shared/route-slots.ts +1 -1
  390. package/src/codegen/targets/_shared/target-run.ts +1 -1
  391. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +1 -1
  392. package/src/codegen/targets/kotlin/emit-route-kotlin.ts +1 -1
  393. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +1 -1
  394. package/src/codegen/targets/swift/access-level.test.ts +1 -1
  395. package/src/codegen/targets/swift/emit-route-swift.test.ts +1 -1
  396. package/src/codegen/targets/swift/emit-route-swift.ts +1 -1
  397. package/src/codegen/targets/swift/emit-scope-swift.test.ts +1 -1
  398. package/src/codegen/targets/ts/shared-models.test.ts +1 -1
  399. package/src/{create-http-stream.test.ts → core/create-http-stream.test.ts} +1 -1
  400. package/src/core/create-http-stream.ts +207 -0
  401. package/src/{create-http.test.ts → core/create-http.test.ts} +15 -4
  402. package/src/core/create-http.ts +126 -0
  403. package/src/{create-stream.test.ts → core/create-stream.test.ts} +28 -31
  404. package/src/core/create-stream.ts +142 -0
  405. package/src/{create.test.ts → core/create.test.ts} +25 -57
  406. package/src/core/create.ts +121 -0
  407. package/src/{stack-utils.test.ts → core/definition-site.test.ts} +14 -3
  408. package/src/{stack-utils.ts → core/definition-site.ts} +20 -23
  409. package/src/{errors.test.ts → core/errors.test.ts} +1 -1
  410. package/src/{errors.ts → core/errors.ts} +30 -28
  411. package/src/core/factory-options.test.ts +112 -0
  412. package/src/core/http-route.ts +73 -0
  413. package/src/core/internal.ts +203 -0
  414. package/src/{migration.test.ts → core/migration.test.ts} +23 -1
  415. package/src/{index.test.ts → core/procedures.test.ts} +13 -11
  416. package/src/core/procedures.ts +75 -0
  417. package/src/core/types.ts +195 -0
  418. package/src/exports.ts +60 -11
  419. package/src/schema/adapter.test.ts +58 -0
  420. package/src/schema/adapter.ts +45 -0
  421. package/src/schema/compile.test.ts +95 -0
  422. package/src/schema/compile.ts +64 -0
  423. package/src/schema/compute-schema.test.ts +222 -41
  424. package/src/schema/compute-schema.ts +145 -71
  425. package/src/schema/json-schema.ts +21 -0
  426. package/src/schema/typebox.test.ts +40 -0
  427. package/src/schema/typebox.ts +27 -0
  428. package/src/server/context.test.ts +22 -0
  429. package/src/server/context.ts +18 -0
  430. package/src/{doc-envelope.test.ts → server/doc-envelope.test.ts} +2 -2
  431. package/src/{doc-envelope.ts → server/doc-envelope.ts} +1 -1
  432. package/src/{implementations/http → server}/doc-registry.test.ts +32 -26
  433. package/src/{implementations/http → server}/doc-registry.ts +11 -7
  434. package/src/server/docs/docs.test.ts +287 -0
  435. package/src/{implementations/http/hono → server}/docs/http-doc.ts +3 -3
  436. package/src/{implementations/http/hono → server}/docs/http-stream-doc.ts +3 -3
  437. package/src/{implementations/http/hono → server}/docs/rpc-doc.ts +3 -3
  438. package/src/{implementations/http/hono → server}/docs/stream-doc.ts +3 -3
  439. package/src/server/errors/dispatch.test.ts +450 -0
  440. package/src/server/errors/dispatch.ts +189 -0
  441. package/src/{implementations/http/error-taxonomy.test.ts → server/errors/taxonomy.test.ts} +45 -39
  442. package/src/{implementations/http/error-taxonomy.ts → server/errors/taxonomy.ts} +8 -17
  443. package/src/server/index.ts +29 -0
  444. package/src/server/no-framework-imports.test.ts +43 -0
  445. package/src/server/paths.test.ts +141 -0
  446. package/src/{implementations/http/hono/path.ts → server/paths.ts} +2 -13
  447. package/src/server/request/params.test.ts +143 -0
  448. package/src/server/request/params.ts +68 -0
  449. package/src/server/request/query.test.ts +70 -0
  450. package/src/server/request/query.ts +24 -0
  451. package/src/server/sse.test.ts +113 -0
  452. package/src/server/sse.ts +117 -0
  453. package/src/{implementations → server}/types.ts +17 -16
  454. package/build/create-http-stream.d.ts +0 -58
  455. package/build/create-http-stream.js +0 -122
  456. package/build/create-http-stream.js.map +0 -1
  457. package/build/create-http-stream.test.js.map +0 -1
  458. package/build/create-http.d.ts +0 -49
  459. package/build/create-http.js +0 -108
  460. package/build/create-http.js.map +0 -1
  461. package/build/create-http.test.js.map +0 -1
  462. package/build/create-stream.d.ts +0 -35
  463. package/build/create-stream.js +0 -123
  464. package/build/create-stream.js.map +0 -1
  465. package/build/create-stream.test.js.map +0 -1
  466. package/build/create.d.ts +0 -28
  467. package/build/create.js +0 -82
  468. package/build/create.js.map +0 -1
  469. package/build/create.test.js.map +0 -1
  470. package/build/doc-envelope.js.map +0 -1
  471. package/build/doc-envelope.test.js.map +0 -1
  472. package/build/errors.js.map +0 -1
  473. package/build/errors.test.js.map +0 -1
  474. package/build/implementations/http/astro/astro-context.js.map +0 -1
  475. package/build/implementations/http/astro/create-handler.js.map +0 -1
  476. package/build/implementations/http/astro/index.js.map +0 -1
  477. package/build/implementations/http/astro/index.test.js.map +0 -1
  478. package/build/implementations/http/astro/rewrite-request.js.map +0 -1
  479. package/build/implementations/http/doc-registry.js.map +0 -1
  480. package/build/implementations/http/doc-registry.test.js.map +0 -1
  481. package/build/implementations/http/error-dispatch.d.ts +0 -76
  482. package/build/implementations/http/error-dispatch.js.map +0 -1
  483. package/build/implementations/http/error-dispatch.test.js +0 -254
  484. package/build/implementations/http/error-dispatch.test.js.map +0 -1
  485. package/build/implementations/http/error-taxonomy.js.map +0 -1
  486. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  487. package/build/implementations/http/hono/docs/http-doc.js.map +0 -1
  488. package/build/implementations/http/hono/docs/http-stream-doc.js.map +0 -1
  489. package/build/implementations/http/hono/docs/rpc-doc.js.map +0 -1
  490. package/build/implementations/http/hono/docs/stream-doc.js.map +0 -1
  491. package/build/implementations/http/hono/handlers/http-stream.js +0 -123
  492. package/build/implementations/http/hono/handlers/http-stream.js.map +0 -1
  493. package/build/implementations/http/hono/handlers/http-stream.test.js.map +0 -1
  494. package/build/implementations/http/hono/handlers/http.js +0 -110
  495. package/build/implementations/http/hono/handlers/http.js.map +0 -1
  496. package/build/implementations/http/hono/handlers/http.test.js.map +0 -1
  497. package/build/implementations/http/hono/handlers/rpc.js +0 -32
  498. package/build/implementations/http/hono/handlers/rpc.js.map +0 -1
  499. package/build/implementations/http/hono/handlers/rpc.test.js.map +0 -1
  500. package/build/implementations/http/hono/handlers/stream.d.ts +0 -23
  501. package/build/implementations/http/hono/handlers/stream.js +0 -147
  502. package/build/implementations/http/hono/handlers/stream.js.map +0 -1
  503. package/build/implementations/http/hono/handlers/stream.test.js.map +0 -1
  504. package/build/implementations/http/hono/index.js.map +0 -1
  505. package/build/implementations/http/hono/index.test.js.map +0 -1
  506. package/build/implementations/http/hono/path.js.map +0 -1
  507. package/build/implementations/http/hono/path.test.js +0 -83
  508. package/build/implementations/http/hono/path.test.js.map +0 -1
  509. package/build/implementations/http/hono/types.d.ts +0 -51
  510. package/build/implementations/http/hono/types.js.map +0 -1
  511. package/build/implementations/http/on-request-error.test.js.map +0 -1
  512. package/build/implementations/http/route-errors.test.js.map +0 -1
  513. package/build/index.d.ts +0 -175
  514. package/build/index.js +0 -47
  515. package/build/index.js.map +0 -1
  516. package/build/index.test.js.map +0 -1
  517. package/build/migration.test.js.map +0 -1
  518. package/build/schema/extract-json-schema.d.ts +0 -2
  519. package/build/schema/extract-json-schema.js +0 -12
  520. package/build/schema/extract-json-schema.js.map +0 -1
  521. package/build/schema/extract-json-schema.test.js +0 -23
  522. package/build/schema/extract-json-schema.test.js.map +0 -1
  523. package/build/schema/parser.d.ts +0 -36
  524. package/build/schema/parser.js +0 -210
  525. package/build/schema/parser.js.map +0 -1
  526. package/build/schema/parser.test.js +0 -120
  527. package/build/schema/parser.test.js.map +0 -1
  528. package/build/schema/resolve-schema-lib.d.ts +0 -12
  529. package/build/schema/resolve-schema-lib.js +0 -11
  530. package/build/schema/resolve-schema-lib.js.map +0 -1
  531. package/build/schema/resolve-schema-lib.test.js +0 -17
  532. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  533. package/build/schema/types.d.ts +0 -8
  534. package/build/schema/types.js +0 -2
  535. package/build/stack-utils.d.ts +0 -25
  536. package/build/stack-utils.js.map +0 -1
  537. package/build/stack-utils.test.js.map +0 -1
  538. package/build/types.d.ts +0 -142
  539. package/build/types.js +0 -2
  540. package/build/types.js.map +0 -1
  541. package/docs/decisions/2026-06-02-monorepo-split-evaluation.md +0 -80
  542. package/docs/handoffs/2026-06-08-dx-round2-declines.md +0 -45
  543. package/docs/handoffs/ajsc-named-type-collision.md +0 -134
  544. package/docs/handoffs/ajsc-named-type-support.md +0 -181
  545. package/docs/handoffs/shared-models-auto-resolve-response.md +0 -181
  546. package/docs/npm-workspaces-migration-plan.md +0 -611
  547. package/docs/superpowers/plans/2026-04-24-doc-registry-simplification.md +0 -886
  548. package/docs/superpowers/plans/2026-04-24-kotlin-codegen-target.md +0 -1265
  549. package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +0 -1993
  550. package/docs/superpowers/plans/2026-04-29-safe-result-api.md +0 -2293
  551. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +0 -1391
  552. package/docs/superpowers/plans/2026-05-08-create-http.md +0 -3355
  553. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +0 -3365
  554. package/docs/superpowers/plans/2026-06-05-dx-feedback-round.md +0 -1292
  555. package/docs/superpowers/plans/2026-06-06-shared-models-convention-and-diagnostics.md +0 -659
  556. package/docs/superpowers/plans/2026-06-08-codegen-dx-surfacing.md +0 -428
  557. package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +0 -401
  558. package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +0 -314
  559. package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +0 -264
  560. package/docs/superpowers/specs/2026-04-29-safe-result-api-design.md +0 -324
  561. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +0 -252
  562. package/docs/superpowers/specs/2026-05-08-create-http-design.md +0 -409
  563. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +0 -411
  564. package/docs/superpowers/specs/2026-06-05-dx-feedback-round-design.md +0 -285
  565. package/docs/superpowers/specs/2026-06-08-dx-feedback-round-2-design.md +0 -376
  566. package/src/create-http-stream.ts +0 -191
  567. package/src/create-http.ts +0 -210
  568. package/src/create-stream.ts +0 -228
  569. package/src/create.ts +0 -172
  570. package/src/implementations/http/README.md +0 -390
  571. package/src/implementations/http/error-dispatch.test.ts +0 -283
  572. package/src/implementations/http/error-dispatch.ts +0 -176
  573. package/src/implementations/http/hono/handlers/http-stream.ts +0 -152
  574. package/src/implementations/http/hono/handlers/http.ts +0 -145
  575. package/src/implementations/http/hono/handlers/rpc.ts +0 -54
  576. package/src/implementations/http/hono/path.test.ts +0 -96
  577. package/src/index.ts +0 -101
  578. package/src/schema/extract-json-schema.test.ts +0 -25
  579. package/src/schema/extract-json-schema.ts +0 -15
  580. package/src/schema/parser.test.ts +0 -182
  581. package/src/schema/parser.ts +0 -265
  582. package/src/schema/resolve-schema-lib.test.ts +0 -19
  583. package/src/schema/resolve-schema-lib.ts +0 -29
  584. package/src/schema/types.ts +0 -20
  585. package/src/types.ts +0 -133
  586. /package/build/{implementations/http → adapters}/astro/astro-context.d.ts +0 -0
  587. /package/build/{implementations/http → adapters}/astro/astro-context.js +0 -0
  588. /package/build/{implementations/http → adapters}/astro/create-handler.d.ts +0 -0
  589. /package/build/{implementations/http → adapters}/astro/create-handler.js +0 -0
  590. /package/build/{implementations/http → adapters}/astro/index.d.ts +0 -0
  591. /package/build/{implementations/http → adapters}/astro/index.js +0 -0
  592. /package/build/{implementations/http → adapters}/astro/index.test.d.ts +0 -0
  593. /package/build/{implementations/http → adapters}/astro/rewrite-request.d.ts +0 -0
  594. /package/build/{implementations/http → adapters}/astro/rewrite-request.js +0 -0
  595. /package/build/{create-http-stream.test.d.ts → adapters/hono/envelope-parity.test.d.ts} +0 -0
  596. /package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.d.ts +0 -0
  597. /package/build/{implementations/http → adapters}/hono/handlers/http.test.d.ts +0 -0
  598. /package/build/{implementations/http → adapters}/hono/handlers/rpc.test.d.ts +0 -0
  599. /package/build/{implementations/http → adapters}/hono/handlers/stream.test.d.ts +0 -0
  600. /package/build/{implementations/http → adapters}/hono/index.test.d.ts +0 -0
  601. /package/build/{implementations/http → adapters/hono}/on-request-error.test.d.ts +0 -0
  602. /package/build/{implementations/http → adapters/hono}/route-errors.test.d.ts +0 -0
  603. /package/build/{create-http.test.d.ts → client/freeze.test.d.ts} +0 -0
  604. /package/build/{create-stream.test.d.ts → codegen/goldens.test.d.ts} +0 -0
  605. /package/build/{create.test.d.ts → core/create-http-stream.test.d.ts} +0 -0
  606. /package/build/{doc-envelope.test.d.ts → core/create-http.test.d.ts} +0 -0
  607. /package/build/{errors.test.d.ts → core/create-stream.test.d.ts} +0 -0
  608. /package/build/{implementations/http/doc-registry.test.d.ts → core/create.test.d.ts} +0 -0
  609. /package/build/{implementations/http/error-dispatch.test.d.ts → core/definition-site.test.d.ts} +0 -0
  610. /package/build/{implementations/http/error-taxonomy.test.d.ts → core/errors.test.d.ts} +0 -0
  611. /package/build/{errors.test.js → core/errors.test.js} +0 -0
  612. /package/build/{implementations/http/hono/path.test.d.ts → core/factory-options.test.d.ts} +0 -0
  613. /package/build/{migration.test.d.ts → core/migration.test.d.ts} +0 -0
  614. /package/build/{index.test.d.ts → core/procedures.test.d.ts} +0 -0
  615. /package/build/{implementations/http/hono → core}/types.js +0 -0
  616. /package/build/schema/{extract-json-schema.test.d.ts → adapter.test.d.ts} +0 -0
  617. /package/build/schema/{parser.test.d.ts → compile.test.d.ts} +0 -0
  618. /package/build/schema/{resolve-schema-lib.test.d.ts → typebox.test.d.ts} +0 -0
  619. /package/build/{stack-utils.test.d.ts → server/context.test.d.ts} +0 -0
  620. /package/build/{doc-envelope.js → server/doc-envelope.js} +0 -0
  621. /package/build/{doc-envelope.test.js → server/doc-envelope.test.js} +0 -0
  622. /package/build/{implementations → server}/types.js +0 -0
  623. /package/src/{implementations/http → adapters}/astro/README.md +0 -0
  624. /package/src/{implementations/http → adapters}/astro/astro-context.ts +0 -0
  625. /package/src/{implementations/http → adapters}/astro/create-handler.ts +0 -0
  626. /package/src/{implementations/http → adapters}/astro/index.ts +0 -0
  627. /package/src/{implementations/http → adapters}/astro/rewrite-request.ts +0 -0
@@ -0,0 +1,89 @@
1
+ import { mkdtemp, readFile, readdir, rm } from 'node:fs/promises'
2
+ import { tmpdir } from 'node:os'
3
+ import { dirname, join, resolve } from 'node:path'
4
+ import { fileURLToPath } from 'node:url'
5
+ import { afterAll, describe, expect, it } from 'vitest'
6
+ import { generateClient } from './index.js'
7
+ import { resolveProductionKotlinEmitter } from './targets/kotlin/ajsc-adapter.js'
8
+ import { resolveProductionSwiftEmitter } from './targets/swift/ajsc-adapter.js'
9
+
10
+ /**
11
+ * THE acceptance gate for v9 codegen: every generated file must be
12
+ * byte-identical to the v8.6.0 baselines captured by
13
+ * `tools/capture-goldens.mjs` into `__goldens__/`.
14
+ *
15
+ * The case matrix is read from `__goldens__/MANIFEST.json`, which the capture
16
+ * script writes alongside the baselines — one source of truth for both sides.
17
+ * (Kotlin/Swift emitters can't be serialized; they are re-resolved here from
18
+ * each case's `target`.)
19
+ *
20
+ * The only normalization applied on both sides is the package version inside
21
+ * the TS `CODEGEN_HEADER` line (`ts-procedures-codegen (v8.6.0)` vs `(v9.x)`),
22
+ * because the header intentionally records the producing version. Everything
23
+ * else — including the envelope-hash line — must match exactly (both sides
24
+ * hash the same fixture envelopes).
25
+ */
26
+ const here = dirname(fileURLToPath(import.meta.url))
27
+ const fixturesDir = resolve(here, '__fixtures__')
28
+ const goldensDir = resolve(here, '__goldens__')
29
+
30
+ type Manifest = {
31
+ capturedFrom: string
32
+ cases: Array<{ name: string; envelopes: string[]; options: Record<string, unknown> }>
33
+ cliDefaults: Record<string, unknown>
34
+ }
35
+
36
+ const manifest: Manifest = JSON.parse(await readFile(resolve(goldensDir, 'MANIFEST.json'), 'utf-8'))
37
+
38
+ function normalizeVersion(content: string): string {
39
+ return content.replace(
40
+ /ts-procedures-codegen \(v[^)]+\)/,
41
+ 'ts-procedures-codegen (<VERSION>)',
42
+ )
43
+ }
44
+
45
+ const tempDirs: string[] = []
46
+ afterAll(async () => {
47
+ await Promise.all(tempDirs.map((dir) => rm(dir, { recursive: true, force: true })))
48
+ })
49
+
50
+ describe(`codegen golden parity with ${manifest.capturedFrom}`, () => {
51
+ for (const c of manifest.cases) {
52
+ for (const envelopeName of c.envelopes) {
53
+ it(`${c.name}--${envelopeName} is byte-identical`, async () => {
54
+ const envelope = JSON.parse(
55
+ await readFile(resolve(fixturesDir, `${envelopeName}-envelope.json`), 'utf-8'),
56
+ )
57
+ const outDir = await mkdtemp(join(tmpdir(), 'v9-goldens-'))
58
+ tempDirs.push(outDir)
59
+
60
+ const options: Record<string, unknown> = {
61
+ envelope,
62
+ outDir,
63
+ ...manifest.cliDefaults,
64
+ ...c.options,
65
+ }
66
+ if (options.target === 'kotlin') {
67
+ options.kotlinEmitter = await resolveProductionKotlinEmitter()
68
+ }
69
+ if (options.target === 'swift') {
70
+ options.swiftEmitter = await resolveProductionSwiftEmitter()
71
+ }
72
+ await generateClient(options as unknown as Parameters<typeof generateClient>[0])
73
+
74
+ const goldenCaseDir = resolve(goldensDir, `${c.name}--${envelopeName}`)
75
+ const goldenFiles = (await readdir(goldenCaseDir)).sort()
76
+ const actualFiles = (await readdir(outDir)).sort()
77
+ expect(actualFiles, 'generated file set must match the v8 baseline').toEqual(goldenFiles)
78
+
79
+ for (const file of goldenFiles) {
80
+ const golden = await readFile(resolve(goldenCaseDir, file), 'utf-8')
81
+ const actual = await readFile(resolve(outDir, file), 'utf-8')
82
+ expect(normalizeVersion(actual), `${c.name}--${envelopeName}/${file}`).toBe(
83
+ normalizeVersion(golden),
84
+ )
85
+ }
86
+ })
87
+ }
88
+ }
89
+ })
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'
2
2
  import { normalizeScope, scopeToCamelCase, groupRoutesByScope } from './group-routes.js'
3
- import type { AnyHttpRouteDoc } from '../implementations/types.js'
3
+ import type { AnyHttpRouteDoc } from '../server/types.js'
4
4
 
5
5
  // ---------------------------------------------------------------------------
6
6
  // Fixtures
@@ -1,4 +1,4 @@
1
- import type { AnyHttpRouteDoc } from '../implementations/types.js'
1
+ import type { AnyHttpRouteDoc } from '../server/types.js'
2
2
 
3
3
  export interface ScopeGroup {
4
4
  scopeKey: string
@@ -6,7 +6,7 @@ import type { KotlinEmitOptions } from './targets/kotlin/ajsc-adapter.js'
6
6
  import { mkdirSync, rmSync, readFileSync, existsSync, writeFileSync } from 'node:fs'
7
7
  import { join } from 'node:path'
8
8
  import { tmpdir } from 'node:os'
9
- import type { DocEnvelope } from '../implementations/types.js'
9
+ import type { DocEnvelope } from '../server/types.js'
10
10
  import { CODEGEN_HEADER } from './constants.js'
11
11
 
12
12
  // ---------------------------------------------------------------------------
@@ -1,5 +1,5 @@
1
1
  import { createHash } from 'node:crypto'
2
- import type { DocEnvelope } from '../implementations/types.js'
2
+ import type { DocEnvelope } from '../server/types.js'
3
3
  import type { AjscOptions } from './emit-types.js'
4
4
  import { groupRoutesByScope } from './group-routes.js'
5
5
  import type { SharedTypesImportMap } from './collect-models.js'
@@ -3,7 +3,7 @@ import { writeFile, mkdtemp, rm } from 'node:fs/promises'
3
3
  import { tmpdir } from 'node:os'
4
4
  import { join } from 'node:path'
5
5
  import { resolveEnvelope } from './resolve-envelope.js'
6
- import type { DocEnvelope } from '../implementations/types.js'
6
+ import type { DocEnvelope } from '../server/types.js'
7
7
 
8
8
  // ---------------------------------------------------------------------------
9
9
  // Fixtures
@@ -1,5 +1,5 @@
1
1
  import { readFile } from 'node:fs/promises'
2
- import type { DocEnvelope } from '../implementations/types.js'
2
+ import type { DocEnvelope } from '../server/types.js'
3
3
 
4
4
  export interface ResolveInput {
5
5
  url?: string
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
  import { buildErrorSchemasMap } from './error-schemas.js'
3
- import type { ErrorDoc } from '../../../implementations/types.js'
3
+ import type { ErrorDoc } from '../../../server/types.js'
4
4
 
5
5
  describe('buildErrorSchemasMap', () => {
6
6
  it('returns an empty map when there are no errors', () => {
@@ -1,4 +1,4 @@
1
- import type { ErrorDoc } from '../../../implementations/types.js'
1
+ import type { ErrorDoc } from '../../../server/types.js'
2
2
 
3
3
  /**
4
4
  * Builds a lookup map from a {@link DocEnvelope}'s top-level `errors` array
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
  import { extractRouteSlots } from './route-slots.js'
3
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
3
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
4
4
 
5
5
  // Helpers for constructing minimal route docs per kind
6
6
  function apiRoute(jsonSchema: Record<string, unknown>): AnyHttpRouteDoc {
@@ -1,4 +1,4 @@
1
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
1
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
2
2
 
3
3
  /**
4
4
  * A "slot" is one of the deterministic schema sources a route exposes.
@@ -1,4 +1,4 @@
1
- import type { DocEnvelope } from '../../../implementations/types.js'
1
+ import type { DocEnvelope } from '../../../server/types.js'
2
2
  import type { ScopeGroup } from '../../group-routes.js'
3
3
  import type { AjscOptions } from '../../emit-types.js'
4
4
  import type { SharedTypesImportMap } from '../../collect-models.js'
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest'
2
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
2
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
3
3
  import { emitKotlinRoute } from './emit-route-kotlin.js'
4
4
  import { createStubKotlinEmitter, type KotlinEmitOptions, type KotlinEmitResult } from './ajsc-adapter.js'
5
5
 
@@ -1,4 +1,4 @@
1
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
1
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
2
2
  import type { KotlinEmitter, KotlinEmitOptions } from './ajsc-adapter.js'
3
3
  import { indent } from '../_shared/indent.js'
4
4
  import { pickDefined } from '../_shared/pick-defined.js'
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest'
2
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
2
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
3
3
  import type { ScopeGroup } from '../../group-routes.js'
4
4
  import { emitKotlinScope } from './emit-scope-kotlin.js'
5
5
  import { createStubKotlinEmitter, type KotlinEmitOptions, type KotlinEmitResult } from './ajsc-adapter.js'
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest'
2
- import type { DocEnvelope } from '../../../implementations/types.js'
2
+ import type { DocEnvelope } from '../../../server/types.js'
3
3
  import { runPipeline } from '../../pipeline.js'
4
4
  import { resolveProductionSwiftEmitter } from './ajsc-adapter.js'
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest'
2
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
2
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
3
3
  import { emitSwiftRoute } from './emit-route-swift.js'
4
4
  import { createStubSwiftEmitter, type SwiftEmitOptions, type SwiftEmitResult } from './ajsc-adapter.js'
5
5
 
@@ -1,4 +1,4 @@
1
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
1
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
2
2
  import type { SwiftEmitter, SwiftEmitOptions } from './ajsc-adapter.js'
3
3
  import { indent } from '../_shared/indent.js'
4
4
  import { pickDefined } from '../_shared/pick-defined.js'
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest'
2
- import type { AnyHttpRouteDoc } from '../../../implementations/types.js'
2
+ import type { AnyHttpRouteDoc } from '../../../server/types.js'
3
3
  import type { ScopeGroup } from '../../group-routes.js'
4
4
  import { emitSwiftScope } from './emit-scope-swift.js'
5
5
  import { createStubSwiftEmitter, type SwiftEmitOptions, type SwiftEmitResult } from './ajsc-adapter.js'
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, vi } from 'vitest'
2
2
  import { runPipeline } from '../../pipeline.js'
3
- import type { DocEnvelope } from '../../../implementations/types.js'
3
+ import type { DocEnvelope } from '../../../server/types.js'
4
4
  import type { GeneratedFile } from '../_shared/write-files.js'
5
5
  import { makeApiRoute, makeEnvelope } from '../../__fixtures__/make-envelope.js'
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { Procedures } from './index.js'
2
+ import { Procedures } from './procedures.js'
3
3
  import { Type } from 'typebox'
4
4
  import { ProcedureValidationError } from './errors.js'
5
5
 
@@ -0,0 +1,207 @@
1
+ import { ProcedureError, ProcedureRegistrationError } from './errors.js'
2
+ import { computeSchema } from '../schema/compute-schema.js'
3
+ import type { Infer, Prettify } from '../schema/json-schema.js'
4
+ import { captureDefinitionInfo } from './definition-site.js'
5
+ import { applyPathPrefix, checkPathParamConsistency } from './http-route.js'
6
+ import {
7
+ assertNotDuplicate,
8
+ combineSignals,
9
+ iterateWithGuards,
10
+ shouldSkipValidation,
11
+ validateReqChannels,
12
+ } from './internal.js'
13
+ import type { FactoryRuntime } from './internal.js'
14
+ import type { HttpMethod, ProcedureResult, TStreamContext, THttpStreamProcedureRegistration } from './types.js'
15
+
16
+ type HttpReq<TReq> = TReq extends Record<string, unknown>
17
+ ? Prettify<{ [K in keyof TReq]: Infer<TReq[K]> }>
18
+ : undefined
19
+
20
+ export function makeCreateHttpStream<TContext>(runtime: FactoryRuntime<TContext, any>) {
21
+ /**
22
+ * Defines a streaming HTTP procedure (SSE over a REST-shaped route).
23
+ *
24
+ * The handler either:
25
+ * - returns an async generator directly, or
26
+ * - (with `schema.res.headers` declared) returns
27
+ * `Promise<{ headers, stream }>` so initial response headers can be set
28
+ * before the stream opens.
29
+ */
30
+ return function CreateHttpStream<
31
+ TName extends string,
32
+ TReq extends Record<string, unknown> | undefined,
33
+ TYieldType,
34
+ TReturnType = void,
35
+ TResHeaders = undefined,
36
+ TErrorKey extends string = string,
37
+ >(
38
+ name: TName,
39
+ config: {
40
+ path: string
41
+ method: HttpMethod
42
+ scope?: string
43
+ errors?: TErrorKey[]
44
+ description?: string
45
+ schema: {
46
+ req?: TReq
47
+ yield?: TYieldType
48
+ returnType?: TReturnType
49
+ res?: TResHeaders extends undefined ? undefined : { headers: TResHeaders }
50
+ }
51
+ validateYields?: boolean
52
+ },
53
+ handler: TResHeaders extends undefined
54
+ ? (
55
+ ctx: Prettify<TContext & TStreamContext>,
56
+ req: HttpReq<TReq>,
57
+ ) => AsyncGenerator<Infer<TYieldType>, Infer<TReturnType> | void, unknown>
58
+ : (
59
+ ctx: Prettify<TContext & TStreamContext>,
60
+ req: HttpReq<TReq>,
61
+ ) => Promise<{
62
+ headers: Infer<TResHeaders>
63
+ stream: AsyncGenerator<Infer<TYieldType>, Infer<TReturnType> | void, unknown>
64
+ }>,
65
+ ) {
66
+ const definitionInfo = captureDefinitionInfo()
67
+
68
+ assertNotDuplicate(runtime.registry, name, definitionInfo)
69
+ if ((config.schema as any)?.params) {
70
+ throw new ProcedureRegistrationError(
71
+ name,
72
+ `Use schema.req.body (or schema.req.query) instead of schema.params on CreateHttpStream. Procedure: "${name}".`,
73
+ definitionInfo,
74
+ )
75
+ }
76
+
77
+ const { jsonSchema, validations } = computeSchema(
78
+ name,
79
+ {
80
+ req: config.schema.req as Record<string, unknown> | undefined,
81
+ yieldType: config.schema.yield,
82
+ returnType: config.schema.returnType,
83
+ res: config.schema.res as { headers?: unknown } | undefined,
84
+ },
85
+ { adapters: runtime.adapters, compile: runtime.compile, definitionInfo },
86
+ )
87
+
88
+ const path = applyPathPrefix(runtime.httpDefaults?.pathPrefix, config.path)
89
+ const scope = config.scope ?? runtime.httpDefaults?.scope
90
+
91
+ const pathParamsSchema = (jsonSchema.req as Record<string, unknown> | undefined)?.pathParams
92
+ checkPathParamConsistency(
93
+ name,
94
+ path,
95
+ pathParamsSchema as Record<string, unknown> | undefined,
96
+ definitionInfo,
97
+ )
98
+
99
+ const errorFactory = (message: string, meta?: object) =>
100
+ new ProcedureError(name, message, meta, definitionInfo)
101
+ const validateYields = config.validateYields ?? false
102
+
103
+ const wrappedHandler = async (
104
+ ctx: TContext,
105
+ req: any,
106
+ ): Promise<{ stream: AsyncGenerator<any, any, unknown>; initialHeaders?: Record<string, string> }> => {
107
+ const abortController = new AbortController()
108
+
109
+ if (!shouldSkipValidation(ctx, runtime)) {
110
+ validateReqChannels(name, validations.req, req, definitionInfo)
111
+ }
112
+
113
+ const incomingSignal = (ctx as { signal?: AbortSignal }).signal
114
+ const streamCtx: TStreamContext = {
115
+ error: errorFactory,
116
+ signal: combineSignals(incomingSignal, abortController.signal),
117
+ }
118
+
119
+ const handlerResult: any = (handler as any)({ ...ctx, ...streamCtx }, req)
120
+ const guardOptions = {
121
+ name,
122
+ validateYields,
123
+ validateYield: validations.yield,
124
+ abortController,
125
+ definitionInfo,
126
+ }
127
+
128
+ if (typeof handlerResult?.[Symbol.asyncIterator] === 'function') {
129
+ // Plain async generator from user
130
+ const userIterator = (handlerResult as AsyncGenerator<any, any, unknown>)[Symbol.asyncIterator]()
131
+ return { stream: iterateWithGuards(userIterator, guardOptions) }
132
+ } else if (typeof handlerResult?.then === 'function') {
133
+ // Async preamble: Promise<{ headers, stream }>
134
+ const resolved = await handlerResult
135
+ if (!resolved || typeof resolved !== 'object' || !('stream' in resolved)) {
136
+ throw new ProcedureError(
137
+ name,
138
+ `CreateHttpStream handler returned a Promise that did not resolve to { headers, stream }. Got: ${JSON.stringify(resolved)}`,
139
+ undefined,
140
+ definitionInfo,
141
+ )
142
+ }
143
+ const userIterator = (resolved.stream as AsyncGenerator<any, any, unknown>)[Symbol.asyncIterator]()
144
+ return {
145
+ stream: iterateWithGuards(userIterator, guardOptions),
146
+ initialHeaders: resolved.headers,
147
+ }
148
+ } else {
149
+ throw new ProcedureError(
150
+ name,
151
+ `CreateHttpStream handler must return an AsyncGenerator or Promise<{ headers, stream }>.`,
152
+ undefined,
153
+ definitionInfo,
154
+ )
155
+ }
156
+ }
157
+
158
+ // The registration's schema uses the SAME keys the route-doc builder and
159
+ // THttpStreamProcedureRegistration declare (`yield`, `res.headers`) — v8
160
+ // stored computeSchema's `yieldType` key and omitted `res` entirely, so
161
+ // live envelopes silently dropped both from http-stream route docs.
162
+ const registrationSchema = {
163
+ ...(jsonSchema.req !== undefined && { req: jsonSchema.req }),
164
+ ...(jsonSchema.res?.headers !== undefined && { res: { headers: jsonSchema.res.headers } }),
165
+ ...(jsonSchema.yieldType !== undefined && { yield: jsonSchema.yieldType }),
166
+ ...(jsonSchema.returnType !== undefined && { returnType: jsonSchema.returnType }),
167
+ }
168
+
169
+ const registeredProcedure: THttpStreamProcedureRegistration<TContext> = {
170
+ name,
171
+ kind: 'http-stream',
172
+ config: {
173
+ path,
174
+ method: config.method,
175
+ scope,
176
+ errors: config.errors as string[] | undefined,
177
+ description: config.description,
178
+ schema: registrationSchema,
179
+ validation: { req: validations.req, yield: validations.yield },
180
+ validateYields,
181
+ },
182
+ handler: wrappedHandler as any,
183
+ }
184
+
185
+ runtime.registry.set(name, registeredProcedure as any)
186
+ runtime.onCreate?.(registeredProcedure as any)
187
+
188
+ const info = { name, kind: 'http-stream' as const, ...registeredProcedure.config }
189
+
190
+ // Explicit handler type — preserves TReq/TYieldType/TReturnType through the
191
+ // public callable. Do NOT use `typeof registeredProcedure.handler` — that
192
+ // erases generics to `any`.
193
+ type Handler = (
194
+ ctx: Prettify<TContext>,
195
+ req: HttpReq<TReq>,
196
+ ) => Promise<{
197
+ stream: AsyncGenerator<Infer<TYieldType>, Infer<TReturnType> | void, unknown>
198
+ initialHeaders?: Record<string, string>
199
+ }>
200
+
201
+ return {
202
+ [name]: registeredProcedure.handler,
203
+ procedure: registeredProcedure.handler,
204
+ info,
205
+ } as ProcedureResult<TName, Handler, typeof info>
206
+ }
207
+ }
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, expectTypeOf } from 'vitest'
2
- import { Procedures } from './index.js'
3
- import { ProcedureRegistrationError, ProcedureValidationError } from './errors.js'
2
+ import { Procedures } from './procedures.js'
3
+ import { ProcedureValidationError } from './errors.js'
4
4
  import { Type } from 'typebox'
5
5
 
6
6
  describe('CreateHttp registration', () => {
@@ -101,10 +101,10 @@ describe('CreateHttp conditional return shape', () => {
101
101
  schema: {
102
102
  res: { headers: Type.Object({ 'x-version': Type.String() }) },
103
103
  },
104
- }, async () => ({ headers: { 'x-version': '8.0.0' } }))
104
+ }, async () => ({ headers: { 'x-version': '9.0.0' } }))
105
105
 
106
106
  const result = await Healthcheck({} as any, undefined)
107
- expect(result).toEqual({ headers: { 'x-version': '8.0.0' } })
107
+ expect(result).toEqual({ headers: { 'x-version': '9.0.0' } })
108
108
  })
109
109
 
110
110
  it('no res → returns void', async () => {
@@ -160,4 +160,15 @@ describe('CreateHttp req channel validation', () => {
160
160
  query: { limit: 'not-a-number' as any },
161
161
  })).rejects.toThrow(/req\.query/)
162
162
  })
163
+
164
+ it('skips req channel validation when factory has validation: false', async () => {
165
+ const procs = Procedures({ validation: false })
166
+ const { Echo } = procs.CreateHttp('Echo', {
167
+ path: '/echo', method: 'post',
168
+ schema: { req: { body: Type.Object({ name: Type.String() }) } },
169
+ }, async () => undefined)
170
+
171
+ // Missing required `name` would normally throw ProcedureValidationError
172
+ await expect(Echo({} as any, { body: {} as any })).resolves.toBeUndefined()
173
+ })
163
174
  })
@@ -0,0 +1,126 @@
1
+ import { ProcedureError, ProcedureRegistrationError } from './errors.js'
2
+ import { computeSchema } from '../schema/compute-schema.js'
3
+ import type { Infer, Prettify } from '../schema/json-schema.js'
4
+ import { captureDefinitionInfo } from './definition-site.js'
5
+ import { applyPathPrefix, checkPathParamConsistency } from './http-route.js'
6
+ import {
7
+ assertNotDuplicate,
8
+ shouldSkipValidation,
9
+ toProcedureError,
10
+ validateReqChannels,
11
+ } from './internal.js'
12
+ import type { FactoryRuntime } from './internal.js'
13
+ import type { ProcedureResult, TCreateHttpConfig, TLocalContext, THttpProcedureRegistration } from './types.js'
14
+
15
+ /**
16
+ * The handler return shape is gated by the DECLARED response schema, not by
17
+ * duck-typing the returned value — so domain objects that happen to have
18
+ * `body`/`headers` keys round-trip unchanged:
19
+ * - `schema.res.headers` declared → handler returns `{ body?, headers }`
20
+ * - only `schema.res.body` declared → handler returns the body itself
21
+ * - no `schema.res` → `void` (204-style)
22
+ */
23
+ export type HttpReturn<TRes> =
24
+ TRes extends { body: infer B; headers: infer H } ? { body: Infer<B>; headers: Infer<H> }
25
+ : TRes extends { headers: infer H } ? { headers: Infer<H> }
26
+ : TRes extends { body: infer B } ? Infer<B>
27
+ : void
28
+
29
+ type HttpReq<TReq> = TReq extends Record<string, unknown>
30
+ ? Prettify<{ [K in keyof TReq]: Infer<TReq[K]> }>
31
+ : undefined
32
+
33
+ export function makeCreateHttp<TContext>(runtime: FactoryRuntime<TContext, any>) {
34
+ /**
35
+ * Defines a REST-shaped HTTP procedure with per-channel input validation
36
+ * (`schema.req.{pathParams,query,body,headers}`).
37
+ *
38
+ * Factory-level `http.pathPrefix` / `http.scope` defaults apply here;
39
+ * the per-route config always wins.
40
+ */
41
+ return function CreateHttp<
42
+ TName extends string,
43
+ TReq extends Record<string, unknown> | undefined,
44
+ TRes extends { body?: unknown; headers?: unknown } | undefined = undefined,
45
+ TErrorKey extends string = string,
46
+ >(
47
+ name: TName,
48
+ config: TCreateHttpConfig<TReq, TRes, TErrorKey>,
49
+ handler: (ctx: Prettify<TContext & TLocalContext>, req: HttpReq<TReq>) => Promise<HttpReturn<TRes>>,
50
+ ) {
51
+ const definitionInfo = captureDefinitionInfo()
52
+
53
+ assertNotDuplicate(runtime.registry, name, definitionInfo)
54
+
55
+ if ((config.schema as any)?.params) {
56
+ throw new ProcedureRegistrationError(
57
+ name,
58
+ `Use schema.req.body (or schema.req.query) instead of schema.params on CreateHttp. Procedure: "${name}".`,
59
+ definitionInfo,
60
+ )
61
+ }
62
+
63
+ const { jsonSchema, validations } = computeSchema(
64
+ name,
65
+ {
66
+ req: config.schema.req as Record<string, unknown> | undefined,
67
+ res: config.schema.res as { body?: unknown; headers?: unknown } | undefined,
68
+ },
69
+ { adapters: runtime.adapters, compile: runtime.compile, definitionInfo },
70
+ )
71
+
72
+ const path = applyPathPrefix(runtime.httpDefaults?.pathPrefix, config.path)
73
+ const scope = config.scope ?? runtime.httpDefaults?.scope
74
+
75
+ const pathParamsSchema = (jsonSchema.req as Record<string, unknown> | undefined)?.pathParams
76
+ checkPathParamConsistency(
77
+ name,
78
+ path,
79
+ pathParamsSchema as Record<string, unknown> | undefined,
80
+ definitionInfo,
81
+ )
82
+
83
+ const errorFactory = (message: string, meta?: object) =>
84
+ new ProcedureError(name, message, meta, definitionInfo)
85
+
86
+ const registeredProcedure: THttpProcedureRegistration<TContext> = {
87
+ name,
88
+ kind: 'http',
89
+ config: {
90
+ path,
91
+ method: config.method,
92
+ successStatus: config.successStatus,
93
+ scope,
94
+ errors: config.errors as string[] | undefined,
95
+ description: config.description,
96
+ schema: jsonSchema as any,
97
+ validation: { req: validations.req },
98
+ },
99
+ handler: async (ctx: TContext, req: any) => {
100
+ try {
101
+ if (!shouldSkipValidation(ctx, runtime)) {
102
+ validateReqChannels(name, validations.req, req, definitionInfo)
103
+ }
104
+
105
+ const localCtx: TLocalContext = { error: errorFactory }
106
+ return await handler({ ...ctx, ...localCtx } as any, req)
107
+ } catch (error: any) {
108
+ throw toProcedureError(name, definitionInfo, error)
109
+ }
110
+ },
111
+ }
112
+
113
+ runtime.registry.set(name, registeredProcedure as any)
114
+ runtime.onCreate?.(registeredProcedure as any)
115
+
116
+ const info = { name, kind: 'http' as const, ...registeredProcedure.config }
117
+
118
+ type Handler = (ctx: Prettify<TContext>, req: HttpReq<TReq>) => Promise<HttpReturn<TRes>>
119
+
120
+ return {
121
+ [name]: registeredProcedure.handler,
122
+ procedure: registeredProcedure.handler,
123
+ info,
124
+ } as ProcedureResult<TName, Handler, typeof info>
125
+ }
126
+ }