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
@@ -1,411 +0,0 @@
1
- # HonoAppBuilder Convergence — Design
2
-
3
- **Date:** 2026-05-08
4
- **Status:** Draft for review
5
- **Scope:** Hono only
6
-
7
- ## Problem
8
-
9
- `ts-procedures` currently exposes three Hono builders — `HonoRPCAppBuilder`, `HonoAPIAppBuilder`, `HonoStreamAppBuilder` — totaling ~1,580 lines of near-parallel code (constructor, `register()`, `build()`, error dispatch, factory iteration, doc emission). Each filters procedures by `kind` and warn-skips mismatches.
10
-
11
- Since v8, a single `Procedures<TContext>()` factory produces all four procedure kinds (`rpc`, `rpc-stream`, `http`, `http-stream`) from one call. Splitting registration across three builders is no longer a structural necessity — it's friction. A user wiring a typical app today does:
12
-
13
- ```ts
14
- const rpc = new HonoRPCAppBuilder({ app, errors }).register(F1, ctx1)
15
- const api = new HonoAPIAppBuilder({ app, errors }).register(F2, ctx2)
16
- const stream = new HonoStreamAppBuilder({ app, errors, onMidStreamError }).register(F3, ctx3)
17
- rpc.build(); api.build(); stream.build()
18
- new DocRegistry().from(rpc).from(api).from(stream).toJSON()
19
- ```
20
-
21
- …three constructors, three `errors` config objects, three `build()` calls, an explicit shared `app`, and a DocRegistry assembly step — to do what is conceptually one thing: "mount these procedures on this Hono server."
22
-
23
- ## Goal
24
-
25
- A single `HonoAppBuilder` that accepts any `Procedures<>()` factory and mounts every procedure kind correctly, with the appropriate documentation surfaced for the codegen pipeline. The current four-builder surface is removed.
26
-
27
- ## Non-Goals
28
-
29
- - **Removing or rewriting `DocRegistry`.** It remains the multi-app aggregation primitive.
30
- - **Changing per-procedure config.** `RPCConfig`, `APIConfig`, the `CreateHttp`/`CreateStream`/`CreateHttpStream` shapes are unchanged. The convergence is at the *builder* layer, not the procedure-definition layer.
31
- - **Path generation rule changes.** RPC/rpc-stream still use `pathPrefix + kebab(scope)/kebab(name)/version`. HTTP/http-stream still use `pathPrefix + config.path`.
32
- - **Error taxonomy semantics.** `defineErrorTaxonomy`, `resolveErrorResponse`, mid-stream error wire shape, and the `onRequestError` observer all keep their current behavior.
33
-
34
- ## Decisions
35
-
36
- | Decision | Choice | Rationale |
37
- |---|---|---|
38
- | Convergence scope | Full collapse, remove old builders, no deprecation period | v8 has not been published; v8 is already a breaking release from v7. Bundling this convergence with the v8 break avoids a second migration. |
39
- | Config shape for kind-specific knobs | Stratified — top-level cross-cutting + nested `rpc`/`api`/`stream` blocks | Type-safe, discoverable; users who only register one kind don't see clutter from other kinds. |
40
- | Documentation | Builder gains `toDocEnvelope()` for single-app; `DocRegistry` stays for multi-app aggregation | Common case is one builder per app — `toDocEnvelope()` removes the registry boilerplate. Multi-app users keep the existing primitive. |
41
- | Builder name | `HonoAppBuilder` | Drops the kind suffix (RPC/API/Stream) since it now serves all kinds. |
42
- | Non-streaming hooks (`onSuccess`) placement | Inside stratified blocks (`rpc.onSuccess`, `api.onSuccess`) | Strict typing per kind; users wiring a unified metrics callback assign the same function to both blocks. Non-breaking to add a top-level `onSuccess` later if duplication is a real pain point. |
43
- | Shared error-dispatch module location | `src/implementations/http/error-dispatch.ts` (one level up from `hono/`) | Lives outside the framework-specific subdir so it can be reused by future framework adapters. |
44
- | Path-builder static method | `HonoAppBuilder.makeRoutePath({ procedure, prefix })` — handles all four kinds | Tooling consumers get one entry point regardless of kind. |
45
-
46
- ## Public API
47
-
48
- ```ts
49
- import { HonoAppBuilder } from 'ts-procedures/hono'
50
-
51
- const { Create, CreateStream, CreateHttp, CreateHttpStream } =
52
- Procedures<AppCtx>()
53
-
54
- // ... define procedures with any combination of the four creators ...
55
-
56
- const builder = new HonoAppBuilder({
57
- app, // optional pre-existing Hono
58
- pathPrefix: '/api/v1',
59
- errors: appErrors, // ErrorTaxonomy, cross-cutting
60
- unknownError,
61
- onError, // imperative peer of `errors`
62
- onRequestError, // observer
63
- onRequestStart,
64
- onRequestEnd,
65
- rpc: {
66
- onSuccess: (proc, c) => {},
67
- },
68
- api: {
69
- queryParser: qs.parse,
70
- onSuccess: (proc, c) => {},
71
- },
72
- stream: {
73
- defaultStreamMode: 'sse', // applies to rpc-stream + http-stream
74
- onStreamStart, onStreamEnd,
75
- onMidStreamError,
76
- },
77
- })
78
-
79
- builder
80
- .register(AppFactory, ctxResolver)
81
- .register(InternalFactory, internalCtxResolver, {
82
- streamMode: 'text', // optional per-factory override
83
- extendProcedureDoc: ({ base }) => {
84
- switch (base.kind) {
85
- case 'rpc': return { internal: true }
86
- case 'api': return { internal: true, group: 'admin' }
87
- case 'stream': return { internal: true }
88
- case 'http-stream': return { internal: true }
89
- }
90
- },
91
- })
92
-
93
- const honoApp = builder.build() // returns Hono
94
- const docs = builder.docs // AnyHttpRouteDoc[] (lazy-cached)
95
- const envelope = builder.toDocEnvelope() // DocEnvelope (single-app)
96
- ```
97
-
98
- ### Config Type
99
-
100
- ```ts
101
- export type HonoAppBuilderConfig<TStreamErrorData = unknown> = {
102
- // Cross-cutting
103
- app?: Hono
104
- pathPrefix?: string
105
-
106
- errors?: ErrorTaxonomy
107
- unknownError?: UnknownErrorConfig
108
- onError?: (
109
- procedure: AnyProcedureRegistration,
110
- c: Context,
111
- error: Error,
112
- ) => Response | Promise<Response>
113
- onRequestError?: (ctx: OnRequestErrorContext) => void | Promise<void>
114
-
115
- onRequestStart?: (c: Context) => void
116
- onRequestEnd?: (c: Context) => void
117
-
118
- // Kind-specific
119
- rpc?: {
120
- onSuccess?: (procedure: TProcedureRegistration, c: Context) => void
121
- }
122
- api?: {
123
- queryParser?: QueryParser
124
- onSuccess?: (
125
- procedure: THttpProcedureRegistration<any>,
126
- c: Context,
127
- ) => void
128
- }
129
- stream?: {
130
- defaultStreamMode?: StreamMode
131
- onStreamStart?: (
132
- procedure: TStreamProcedureRegistration | THttpStreamProcedureRegistration<any>,
133
- c: Context,
134
- streamMode: StreamMode,
135
- ) => void
136
- onStreamEnd?: (
137
- procedure: TStreamProcedureRegistration | THttpStreamProcedureRegistration<any>,
138
- c: Context,
139
- streamMode: StreamMode,
140
- ) => void
141
- onMidStreamError?: (
142
- procedure: TStreamProcedureRegistration | THttpStreamProcedureRegistration<any>,
143
- c: Context,
144
- error: Error,
145
- ) => MidStreamErrorResult<TStreamErrorData> | undefined
146
- }
147
- }
148
-
149
- export type AnyProcedureRegistration =
150
- | TProcedureRegistration
151
- | TStreamProcedureRegistration
152
- | THttpProcedureRegistration<any>
153
- | THttpStreamProcedureRegistration<any>
154
-
155
- export type OnRequestErrorContext = {
156
- err: unknown
157
- procedure: AnyProcedureRegistration
158
- raw: Context
159
- }
160
- ```
161
-
162
- ### `register()`
163
-
164
- ```ts
165
- register<TFactory extends ProceduresFactory>(
166
- factory: TFactory,
167
- factoryContext:
168
- | ExtractContext<TFactory>
169
- | ((c: Context) => ExtractContext<TFactory> | Promise<ExtractContext<TFactory>>),
170
- options?: {
171
- /** Per-factory override for stream.defaultStreamMode. */
172
- streamMode?: StreamMode
173
- /** Extend route docs. base is a kind-discriminated union. */
174
- extendProcedureDoc?: (params: {
175
- base: RPCHttpRouteDoc | APIHttpRouteDoc | StreamHttpRouteDoc | HttpStreamRouteDoc
176
- procedure: AnyProcedureRegistration
177
- }) => Record<string, unknown>
178
- },
179
- ): this
180
- ```
181
-
182
- ### `toDocEnvelope()`
183
-
184
- Mirrors `DocRegistry.toJSON()`'s option surface so the produced envelope is identical and the codegen pipeline reads either interchangeably:
185
-
186
- ```ts
187
- toDocEnvelope(options?: {
188
- basePath?: string
189
- errors?: ErrorTaxonomy | ErrorDoc[]
190
- includeDefaults?: boolean
191
- filter?: (route: AnyHttpRouteDoc) => boolean
192
- transform?: (route: AnyHttpRouteDoc) => AnyHttpRouteDoc
193
- }): DocEnvelope
194
- ```
195
-
196
- `builder.docs` exposes the underlying array (lazy-computed on first read or on `build()`, whichever happens first; cached thereafter).
197
-
198
- ### Static Path Builder
199
-
200
- ```ts
201
- HonoAppBuilder.makeRoutePath({
202
- procedure: AnyProcedureRegistration,
203
- prefix?: string,
204
- }): string
205
- ```
206
-
207
- - For `rpc` / `rpc-stream`: `{prefix}/{kebab(scope)}/{kebab(name)}/{version}`
208
- - For `http` / `http-stream`: `{prefix}{config.path}` (prefix normalized to leading `/`)
209
-
210
- ## Internal Architecture
211
-
212
- ```
213
- src/implementations/http/
214
- ├── error-dispatch.ts # SHARED — pre-stream + mid-stream dispatchers
215
- ├── error-taxonomy.ts # unchanged
216
- ├── doc-registry.ts # unchanged
217
- ├── hono/
218
- │ ├── index.ts # HonoAppBuilder (~200 lines)
219
- │ ├── path.ts # makeRoutePath, resolveFullPath
220
- │ ├── types.ts # HonoAppBuilderConfig, factory item
221
- │ ├── handlers/
222
- │ │ ├── rpc.ts # installRpcRoute(...)
223
- │ │ ├── http.ts # installHttpRoute(...)
224
- │ │ ├── stream.ts # installRpcStreamRoute(...)
225
- │ │ └── http-stream.ts # installHttpStreamRoute(...)
226
- │ └── docs/
227
- │ ├── rpc-doc.ts # buildRpcRouteDoc
228
- │ ├── http-doc.ts # buildHttpRouteDoc
229
- │ ├── stream-doc.ts # buildStreamRouteDoc
230
- │ └── http-stream-doc.ts # buildHttpStreamRouteDoc
231
- ```
232
-
233
- ### `build()` Dispatch Loop
234
-
235
- ```ts
236
- build(): Hono {
237
- for (const item of this._factories) {
238
- for (const procedure of item.factory.getProcedures().values()) {
239
- switch (procedure.kind) {
240
- case 'rpc':
241
- installRpcRoute(this._app, procedure, item, this.config, this._docs)
242
- break
243
- case 'rpc-stream':
244
- installRpcStreamRoute(this._app, procedure, item, this.config, this._docs)
245
- break
246
- case 'http':
247
- installHttpRoute(this._app, procedure, item, this.config, this._docs)
248
- break
249
- case 'http-stream':
250
- installHttpStreamRoute(this._app, procedure, item, this.config, this._docs)
251
- break
252
- default: {
253
- const reason = `Unknown procedure kind "${(procedure as any).kind}"`
254
- this._skipped.push({ name: procedure.name, reason })
255
- console.warn(`[ts-procedures hono] ${reason}`)
256
- }
257
- }
258
- }
259
- }
260
- return this._app
261
- }
262
- ```
263
-
264
- ### Shared Error Dispatch
265
-
266
- `src/implementations/http/error-dispatch.ts` exports two functions that consolidate the three current near-identical implementations:
267
-
268
- ```ts
269
- // Used by rpc, http, and the pre-stream guards in stream / http-stream.
270
- // Returns a Response.
271
- export async function dispatchPreStreamError(args: {
272
- err: unknown
273
- procedure: AnyProcedureRegistration
274
- raw: Context
275
- cfg: {
276
- errors?: ErrorTaxonomy
277
- unknownError?: UnknownErrorConfig
278
- onError?: HonoAppBuilderConfig['onError']
279
- onRequestError?: HonoAppBuilderConfig['onRequestError']
280
- }
281
- }): Promise<Response>
282
-
283
- // Used inside stream generator catch blocks. Returns the data to write
284
- // (plus optional SSE metadata + onCatch hook), not a full Response — the
285
- // HTTP status is already committed once streaming starts.
286
- export async function dispatchMidStreamError<TData = unknown>(args: {
287
- err: unknown
288
- procedure: TStreamProcedureRegistration | THttpStreamProcedureRegistration<any>
289
- raw: Context
290
- cfg: {
291
- errors?: ErrorTaxonomy
292
- unknownError?: UnknownErrorConfig
293
- onMidStreamError?: HonoAppBuilderConfig<TData>['stream']['onMidStreamError']
294
- onRequestError?: HonoAppBuilderConfig['onRequestError']
295
- }
296
- }): Promise<{
297
- data: unknown
298
- sseEvent?: string
299
- sseId?: string
300
- sseRetry?: number
301
- runOnCatch?: () => Promise<void>
302
- }>
303
- ```
304
-
305
- Both call the `onRequestError` observer first (swallowing observer throws) and then dispatch through taxonomy → onError/onMidStreamError → hard default — same order as today.
306
-
307
- ### Per-Kind Handler Modules
308
-
309
- Each handler module is a small file (~80–180 lines) exporting one `install*Route` function. Their job:
310
-
311
- 1. Build the route doc (`docs/<kind>-doc.ts`) and push to `_docs`.
312
- 2. Resolve the route path (`path.ts`).
313
- 3. Register the Hono handler that:
314
- - Resolves the factory context (sync object | sync fn | async fn).
315
- - Extracts and assembles params from the request (per kind: body for rpc; structured req for http/http-stream; query-or-body for rpc-stream).
316
- - Invokes `procedure.handler({ ...ctx, signal: c.req.raw.signal }, params)`.
317
- - For streams: forwards `isPrevalidated: true` after the pre-stream validation so core doesn't re-validate.
318
- - Catches and routes through `dispatchPreStreamError`.
319
- - For streams: forwards mid-stream throws through `dispatchMidStreamError` and writes the result via `streamSSE`/`streamText`.
320
- - Calls the right kind-specific lifecycle hook (`rpc.onSuccess`, `api.onSuccess`, `stream.onStreamStart`/`onStreamEnd`).
321
-
322
- Module-level coupling: each handler imports only the slice of config it needs (e.g., `handlers/stream.ts` imports `stream.*` and the cross-cutting error config). The full `HonoAppBuilderConfig` type lives in `hono/types.ts`.
323
-
324
- ### Lazy Doc Computation
325
-
326
- Today `_docs` is populated during `build()` — calling `builder.docs` before `build()` returns an empty array. New behavior: `docs` is a getter that runs the per-kind doc-builders (`docs/<kind>-doc.ts`) without touching route registration; the result is cached. `build()` reuses the cached array. This makes `toDocEnvelope()` usable in tests without spinning up handlers.
327
-
328
- ## Migration Impact
329
-
330
- Since v8 is unpublished, there's no in-the-wild deprecation cycle — we update docs, templates, and tests and ship.
331
-
332
- ### Deletions
333
-
334
- - `src/implementations/http/hono-rpc/` (entire directory)
335
- - `src/implementations/http/hono-api/` (entire directory)
336
- - `src/implementations/http/hono-stream/` (entire directory)
337
- - The corresponding `package.json#exports` entries: `./hono-rpc`, `./hono-api`, `./hono-stream`
338
-
339
- ### Additions
340
-
341
- - `src/implementations/http/hono/` (per the layout above)
342
- - `package.json#exports` entry: `./hono`
343
- - `src/implementations/http/error-dispatch.ts` — shared dispatchers (replacing inline copies in three builders)
344
-
345
- ### Re-exports From `ts-procedures/hono`
346
-
347
- `HonoAppBuilder`, `HonoAppBuilderConfig`, `OnRequestErrorContext`, `AnyProcedureRegistration`, `RPCConfig`, `RPCHttpRouteDoc`, `APIConfig`, `APIHttpRouteDoc`, `APIInput`, `StreamHttpRouteDoc`, `HttpStreamRouteDoc`, `StreamMode`, `HttpMethod`, `QueryParser`, `MidStreamErrorResult`, `sse`, `defineErrorTaxonomy`, `ErrorTaxonomy`, `ErrorTaxonomyEntry`, `UnknownErrorConfig`.
348
-
349
- `./http-errors` and `./http-docs` (DocRegistry) keep their current subpaths.
350
-
351
- ### User-Facing Migration Table
352
-
353
- | Before (in-flight v8) | After |
354
- |---|---|
355
- | `import { HonoRPCAppBuilder } from 'ts-procedures/hono-rpc'` | `import { HonoAppBuilder } from 'ts-procedures/hono'` |
356
- | `import { HonoAPIAppBuilder } from 'ts-procedures/hono-api'` | same |
357
- | `import { HonoStreamAppBuilder } from 'ts-procedures/hono-stream'` | same |
358
- | `new HonoRPCAppBuilder({ errors, onSuccess })` | `new HonoAppBuilder({ errors, rpc: { onSuccess } })` |
359
- | `new HonoAPIAppBuilder({ errors, queryParser })` | `new HonoAppBuilder({ errors, api: { queryParser } })` |
360
- | `new HonoStreamAppBuilder({ errors, onMidStreamError, defaultStreamMode })` | `new HonoAppBuilder({ errors, stream: { onMidStreamError, defaultStreamMode } })` |
361
- | Three builders sharing `app: Hono` | One builder, no shared-`app` plumbing |
362
- | `new DocRegistry().from(rpc).from(api).from(stream).toJSON()` | `builder.toDocEnvelope()` for single-app; DocRegistry only for multi-app aggregation |
363
-
364
- ### Edge Cases & Behavior Preservation
365
-
366
- 1. **Mixed-kind factories work natively.** A single `Procedures<>()` factory with `Create`/`CreateStream`/`CreateHttp`/`CreateHttpStream` calls dispatches correctly under one builder.
367
- 2. **`pathPrefix` is global to the builder.** Users who genuinely need different prefixes per kind (rare) instantiate two `HonoAppBuilder`s sharing the same `app`.
368
- 3. **`extendProcedureDoc`** receives a discriminated union — switch on `base.kind`.
369
- 4. **Per-factory `streamMode` override** stays via `register(factory, ctx, { streamMode })`. Applies to both rpc-stream and http-stream procedures within that factory.
370
- 5. **`AbortSignal` injection, SSE `event: 'return'`, `isPrevalidated`, `noRuntimeValidation`** — all preserved.
371
- 6. **`skippedProcedures`** stays on the public surface but is expected to always be empty post-convergence (defensive logging for future kinds).
372
- 7. **`HonoAppBuilder` satisfies `DocSource`** — multi-app users continue to assemble via `DocRegistry`.
373
-
374
- ### Tests
375
-
376
- Consolidated under `src/implementations/http/hono/`:
377
-
378
- - `index.test.ts` — public surface (constructor, register, build, docs, toDocEnvelope, makeRoutePath)
379
- - `handlers/rpc.test.ts`, `handlers/http.test.ts`, `handlers/stream.test.ts`, `handlers/http-stream.test.ts` — per-kind handler behavior, taking the place of the three separate `index.test.ts` files
380
- - `../error-dispatch.test.ts` — shared error dispatch (folds in `error-taxonomy.test.ts` content from each old builder)
381
-
382
- Top-level shared tests at `src/implementations/http/` stay: `error-taxonomy.test.ts`, `doc-registry.test.ts`, `on-request-error.test.ts`, `route-errors.test.ts`.
383
-
384
- Codegen e2e fixtures consume `DocEnvelope` JSON — unaffected.
385
-
386
- ### Templates & Docs
387
-
388
- - `agent_config/claude-code/skills/ts-procedures-scaffold/templates/` — delete `hono-rpc.ts`, `hono-stream.ts`; rewrite `hono-api.ts` (or rename to `hono.ts`) demonstrating one builder serving all kinds.
389
- - `agent_config/claude-code/skills/ts-procedures/{SKILL.md, patterns.md, anti-patterns.md}` — replace per-builder examples with single-builder examples.
390
- - `agent_config/copilot/copilot-instructions.md` and `agent_config/cursor/cursorrules` — same updates (these mirror the Claude skill content).
391
- - `src/implementations/http/README.md` — rewrite around `HonoAppBuilder`. Drop the "RPC vs Streaming vs API builder" sectioning. Replace with one section + a "Which procedure kind to use" table.
392
- - `docs/http-integrations.md` — rewrite around the unified builder. Delete the "One Hono Server, Multiple Builders" section (no longer relevant).
393
- - README v8 changelog — update the convergence entry.
394
-
395
- ## Test Plan
396
-
397
- 1. **Public-surface contract** — constructor stores config; `register()` is chainable; `build()` returns `Hono`; `docs` is lazy and stable across multiple reads; `toDocEnvelope()` produces a DocEnvelope identical to a `DocRegistry({ basePath, errors }).from(builder).toJSON()` output for the same builder.
398
- 2. **Per-kind dispatch** — register a single factory containing one procedure of each of the four kinds; verify each is mounted at the correct path with the correct method(s) and produces the correct doc shape.
399
- 3. **Mixed factories** — register two factories with different `factoryContext` resolvers; verify each procedure receives the correct context and that the resolver runs once per request.
400
- 4. **Stratified config** — `rpc.onSuccess` fires only for rpc; `api.onSuccess` fires only for http; `stream.onStreamStart`/`onStreamEnd`/`onMidStreamError` fire only for streaming kinds. Cross-cutting hooks (`onRequestStart`/`onRequestEnd`/`onRequestError`) fire for every kind.
401
- 5. **Error dispatch parity** — port the existing taxonomy tests from each old builder. Pre-stream errors flow through `dispatchPreStreamError`; mid-stream errors flow through `dispatchMidStreamError` with status already committed. `onRequestError` observer fires before dispatch in both paths and its throws are swallowed.
402
- 6. **Path generation** — `makeRoutePath` returns the expected URL for each kind; with and without `prefix`; with array vs. string `scope`.
403
- 7. **Per-factory `streamMode` override** — registering with `{ streamMode: 'text' }` overrides `stream.defaultStreamMode` for that factory's stream procedures only.
404
- 8. **`extendProcedureDoc`** — receives a kind-discriminated `base`; returned fields are merged onto the route doc; `kind` cannot be overwritten.
405
- 9. **DocSource compatibility** — `new DocRegistry().from(builder).toJSON()` produces a valid envelope matching `builder.toDocEnvelope()` (modulo `basePath` if not specified).
406
- 10. **Codegen end-to-end** — feed `builder.toDocEnvelope()` into `generateClient()` for the TS / Kotlin / Swift targets and verify the generated output compiles. Use the existing fixture envelope structure.
407
-
408
- ## Out of Scope (Follow-ups)
409
-
410
- - **Top-level `onSuccess` shortcut** — if the duplicated `rpc.onSuccess` + `api.onSuccess` pattern shows up in real apps, add a top-level `onSuccess` that fans out to both. Non-breaking when added.
411
- - **Different `pathPrefix` per kind** — if users actually need this, add `rpc.pathPrefix` / `api.pathPrefix` / `stream.pathPrefix` overrides. Today the workaround (two builders sharing one `app`) is acceptable.