ts-procedures 8.6.0 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/CHANGELOG.md +540 -0
  2. package/README.md +166 -101
  3. package/agent_config/claude-code/.claude-plugin/plugin.json +1 -1
  4. package/agent_config/claude-code/agents/ts-procedures-architect.md +11 -10
  5. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +25 -12
  6. package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +10 -12
  7. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +141 -45
  8. package/agent_config/claude-code/skills/ts-procedures/checklist.md +7 -6
  9. package/agent_config/claude-code/skills/ts-procedures/patterns.md +45 -6
  10. package/agent_config/claude-code/skills/ts-procedures/templates/client.md +1 -1
  11. package/agent_config/claude-code/skills/ts-procedures/templates/hono.md +1 -1
  12. package/agent_config/copilot/copilot-instructions.md +50 -33
  13. package/agent_config/cursor/cursorrules +50 -33
  14. package/build/adapters/astro/astro-context.js.map +1 -0
  15. package/build/adapters/astro/create-handler.js.map +1 -0
  16. package/build/adapters/astro/index.js.map +1 -0
  17. package/build/{implementations/http → adapters}/astro/index.test.js +1 -1
  18. package/build/adapters/astro/index.test.js.map +1 -0
  19. package/build/adapters/astro/rewrite-request.js.map +1 -0
  20. package/build/adapters/hono/envelope-parity.test.js +98 -0
  21. package/build/adapters/hono/envelope-parity.test.js.map +1 -0
  22. package/build/{implementations/http → adapters}/hono/handlers/http-stream.d.ts +1 -1
  23. package/build/adapters/hono/handlers/http-stream.js +55 -0
  24. package/build/adapters/hono/handlers/http-stream.js.map +1 -0
  25. package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.js +1 -1
  26. package/build/adapters/hono/handlers/http-stream.test.js.map +1 -0
  27. package/build/{implementations/http → adapters}/hono/handlers/http.d.ts +1 -1
  28. package/build/adapters/hono/handlers/http.js +50 -0
  29. package/build/adapters/hono/handlers/http.js.map +1 -0
  30. package/build/{implementations/http → adapters}/hono/handlers/http.test.js +1 -1
  31. package/build/adapters/hono/handlers/http.test.js.map +1 -0
  32. package/build/{implementations/http → adapters}/hono/handlers/rpc.d.ts +2 -2
  33. package/build/adapters/hono/handlers/rpc.js +23 -0
  34. package/build/adapters/hono/handlers/rpc.js.map +1 -0
  35. package/build/{implementations/http → adapters}/hono/handlers/rpc.test.js +1 -1
  36. package/build/adapters/hono/handlers/rpc.test.js.map +1 -0
  37. package/build/adapters/hono/handlers/stream.d.ts +12 -0
  38. package/build/adapters/hono/handlers/stream.js +89 -0
  39. package/build/adapters/hono/handlers/stream.js.map +1 -0
  40. package/build/{implementations/http → adapters}/hono/handlers/stream.test.js +3 -2
  41. package/build/adapters/hono/handlers/stream.test.js.map +1 -0
  42. package/build/{implementations/http → adapters}/hono/index.d.ts +24 -12
  43. package/build/{implementations/http → adapters}/hono/index.js +19 -8
  44. package/build/adapters/hono/index.js.map +1 -0
  45. package/build/{implementations/http → adapters}/hono/index.test.js +2 -4
  46. package/build/adapters/hono/index.test.js.map +1 -0
  47. package/build/{implementations/http → adapters/hono}/on-request-error.test.js +2 -2
  48. package/build/adapters/hono/on-request-error.test.js.map +1 -0
  49. package/build/adapters/hono/request.d.ts +7 -0
  50. package/build/adapters/hono/request.js +22 -0
  51. package/build/adapters/hono/request.js.map +1 -0
  52. package/build/{implementations/http → adapters/hono}/route-errors.test.js +4 -4
  53. package/build/adapters/hono/route-errors.test.js.map +1 -0
  54. package/build/adapters/hono/types.d.ts +55 -0
  55. package/build/adapters/hono/types.js +19 -0
  56. package/build/adapters/hono/types.js.map +1 -0
  57. package/build/client/freeze.test.js +39 -0
  58. package/build/client/freeze.test.js.map +1 -0
  59. package/build/client/typed-error-dispatch.test.js +2 -2
  60. package/build/client/typed-error-dispatch.test.js.map +1 -1
  61. package/build/codegen/__fixtures__/make-envelope.d.ts +1 -1
  62. package/build/codegen/bin/cli.d.ts +5 -0
  63. package/build/codegen/bin/cli.js +139 -182
  64. package/build/codegen/bin/cli.js.map +1 -1
  65. package/build/codegen/bin/cli.test.js +12 -2
  66. package/build/codegen/bin/cli.test.js.map +1 -1
  67. package/build/codegen/bin/flag-specs.d.ts +9 -0
  68. package/build/codegen/bin/flag-specs.js +33 -31
  69. package/build/codegen/bin/flag-specs.js.map +1 -1
  70. package/build/codegen/bin/flag-specs.test.js +14 -1
  71. package/build/codegen/bin/flag-specs.test.js.map +1 -1
  72. package/build/codegen/collect-models.d.ts +1 -1
  73. package/build/codegen/emit/api-route.d.ts +8 -0
  74. package/build/codegen/emit/api-route.js +156 -0
  75. package/build/codegen/emit/api-route.js.map +1 -0
  76. package/build/codegen/emit/context.d.ts +30 -0
  77. package/build/codegen/emit/context.js +2 -0
  78. package/build/codegen/emit/context.js.map +1 -0
  79. package/build/codegen/emit/declarations.d.ts +24 -0
  80. package/build/codegen/emit/declarations.js +48 -0
  81. package/build/codegen/emit/declarations.js.map +1 -0
  82. package/build/codegen/emit/format-types.d.ts +61 -0
  83. package/build/codegen/emit/format-types.js +188 -0
  84. package/build/codegen/emit/format-types.js.map +1 -0
  85. package/build/codegen/emit/http-stream-route.d.ts +7 -0
  86. package/build/codegen/emit/http-stream-route.js +138 -0
  87. package/build/codegen/emit/http-stream-route.js.map +1 -0
  88. package/build/codegen/emit/route-shared.d.ts +37 -0
  89. package/build/codegen/emit/route-shared.js +88 -0
  90. package/build/codegen/emit/route-shared.js.map +1 -0
  91. package/build/codegen/emit/rpc-route.d.ts +7 -0
  92. package/build/codegen/emit/rpc-route.js +37 -0
  93. package/build/codegen/emit/rpc-route.js.map +1 -0
  94. package/build/codegen/emit/scope-file.d.ts +39 -0
  95. package/build/codegen/emit/scope-file.js +166 -0
  96. package/build/codegen/emit/scope-file.js.map +1 -0
  97. package/build/codegen/emit/stream-route.d.ts +7 -0
  98. package/build/codegen/emit/stream-route.js +62 -0
  99. package/build/codegen/emit/stream-route.js.map +1 -0
  100. package/build/codegen/emit-errors.d.ts +1 -1
  101. package/build/codegen/emit-errors.integration.test.js +1 -1
  102. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  103. package/build/codegen/emit-scope.d.ts +13 -30
  104. package/build/codegen/emit-scope.js +15 -844
  105. package/build/codegen/emit-scope.js.map +1 -1
  106. package/build/codegen/emit-scope.test.js +67 -0
  107. package/build/codegen/emit-scope.test.js.map +1 -1
  108. package/build/codegen/goldens.test.js +69 -0
  109. package/build/codegen/goldens.test.js.map +1 -0
  110. package/build/codegen/group-routes.d.ts +1 -1
  111. package/build/codegen/pipeline.d.ts +1 -1
  112. package/build/codegen/resolve-envelope.d.ts +1 -1
  113. package/build/codegen/targets/_shared/error-schemas.d.ts +1 -1
  114. package/build/codegen/targets/_shared/route-slots.d.ts +1 -1
  115. package/build/codegen/targets/_shared/target-run.d.ts +1 -1
  116. package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +1 -1
  117. package/build/codegen/targets/swift/emit-route-swift.d.ts +1 -1
  118. package/build/core/create-http-stream.d.ts +50 -0
  119. package/build/core/create-http-stream.js +108 -0
  120. package/build/core/create-http-stream.js.map +1 -0
  121. package/build/{create-http-stream.test.js → core/create-http-stream.test.js} +1 -1
  122. package/build/core/create-http-stream.test.js.map +1 -0
  123. package/build/core/create-http.d.ts +51 -0
  124. package/build/core/create-http.js +65 -0
  125. package/build/core/create-http.js.map +1 -0
  126. package/build/{create-http.test.js → core/create-http.test.js} +27 -4
  127. package/build/core/create-http.test.js.map +1 -0
  128. package/build/core/create-stream.d.ts +26 -0
  129. package/build/core/create-stream.js +80 -0
  130. package/build/core/create-stream.js.map +1 -0
  131. package/build/{create-stream.test.js → core/create-stream.test.js} +23 -28
  132. package/build/core/create-stream.test.js.map +1 -0
  133. package/build/core/create.d.ts +22 -0
  134. package/build/core/create.js +71 -0
  135. package/build/core/create.js.map +1 -0
  136. package/build/{create.test.js → core/create.test.js} +25 -46
  137. package/build/core/create.test.js.map +1 -0
  138. package/build/core/definition-site.d.ts +24 -0
  139. package/build/{stack-utils.js → core/definition-site.js} +20 -20
  140. package/build/core/definition-site.js.map +1 -0
  141. package/build/{stack-utils.test.js → core/definition-site.test.js} +12 -3
  142. package/build/core/definition-site.test.js.map +1 -0
  143. package/build/{errors.d.ts → core/errors.d.ts} +19 -8
  144. package/build/{errors.js → core/errors.js} +21 -26
  145. package/build/core/errors.js.map +1 -0
  146. package/build/core/errors.test.js.map +1 -0
  147. package/build/core/factory-options.test.js +82 -0
  148. package/build/core/factory-options.test.js.map +1 -0
  149. package/build/core/http-route.d.ts +13 -0
  150. package/build/core/http-route.js +54 -0
  151. package/build/core/http-route.js.map +1 -0
  152. package/build/core/internal.d.ts +72 -0
  153. package/build/core/internal.js +128 -0
  154. package/build/core/internal.js.map +1 -0
  155. package/build/{migration.test.js → core/migration.test.js} +17 -1
  156. package/build/core/migration.test.js.map +1 -0
  157. package/build/core/procedures.d.ts +143 -0
  158. package/build/core/procedures.js +64 -0
  159. package/build/core/procedures.js.map +1 -0
  160. package/build/{index.test.js → core/procedures.test.js} +14 -11
  161. package/build/core/procedures.test.js.map +1 -0
  162. package/build/core/types.d.ts +183 -0
  163. package/build/{schema → core}/types.js.map +1 -1
  164. package/build/exports.d.ts +31 -11
  165. package/build/exports.js +23 -8
  166. package/build/exports.js.map +1 -1
  167. package/build/schema/adapter.d.ts +35 -0
  168. package/build/schema/adapter.js +13 -0
  169. package/build/schema/adapter.js.map +1 -0
  170. package/build/schema/adapter.test.js +53 -0
  171. package/build/schema/adapter.test.js.map +1 -0
  172. package/build/schema/compile.d.ts +37 -0
  173. package/build/schema/compile.js +38 -0
  174. package/build/schema/compile.js.map +1 -0
  175. package/build/schema/compile.test.js +78 -0
  176. package/build/schema/compile.test.js.map +1 -0
  177. package/build/schema/compute-schema.d.ts +47 -37
  178. package/build/schema/compute-schema.js +86 -29
  179. package/build/schema/compute-schema.js.map +1 -1
  180. package/build/schema/compute-schema.test.js +158 -40
  181. package/build/schema/compute-schema.test.js.map +1 -1
  182. package/build/schema/json-schema.d.ts +17 -0
  183. package/build/schema/json-schema.js +2 -0
  184. package/build/schema/json-schema.js.map +1 -0
  185. package/build/schema/typebox.d.ts +11 -0
  186. package/build/schema/typebox.js +24 -0
  187. package/build/schema/typebox.js.map +1 -0
  188. package/build/schema/typebox.test.js +34 -0
  189. package/build/schema/typebox.test.js.map +1 -0
  190. package/build/server/context.d.ts +8 -0
  191. package/build/server/context.js +7 -0
  192. package/build/server/context.js.map +1 -0
  193. package/build/server/context.test.js +16 -0
  194. package/build/server/context.test.js.map +1 -0
  195. package/build/{doc-envelope.d.ts → server/doc-envelope.d.ts} +1 -1
  196. package/build/server/doc-envelope.js.map +1 -0
  197. package/build/server/doc-envelope.test.d.ts +1 -0
  198. package/build/server/doc-envelope.test.js.map +1 -0
  199. package/build/{implementations/http → server}/doc-registry.d.ts +7 -2
  200. package/build/{implementations/http → server}/doc-registry.js +9 -5
  201. package/build/server/doc-registry.js.map +1 -0
  202. package/build/server/doc-registry.test.d.ts +1 -0
  203. package/build/{implementations/http → server}/doc-registry.test.js +27 -24
  204. package/build/server/doc-registry.test.js.map +1 -0
  205. package/build/server/docs/docs.test.d.ts +1 -0
  206. package/build/server/docs/docs.test.js +237 -0
  207. package/build/server/docs/docs.test.js.map +1 -0
  208. package/build/{implementations/http/hono → server}/docs/http-doc.d.ts +2 -2
  209. package/build/{implementations/http/hono → server}/docs/http-doc.js +1 -1
  210. package/build/server/docs/http-doc.js.map +1 -0
  211. package/build/{implementations/http/hono → server}/docs/http-stream-doc.d.ts +2 -2
  212. package/build/{implementations/http/hono → server}/docs/http-stream-doc.js +1 -1
  213. package/build/server/docs/http-stream-doc.js.map +1 -0
  214. package/build/{implementations/http/hono → server}/docs/rpc-doc.d.ts +2 -2
  215. package/build/{implementations/http/hono → server}/docs/rpc-doc.js +1 -1
  216. package/build/server/docs/rpc-doc.js.map +1 -0
  217. package/build/{implementations/http/hono → server}/docs/stream-doc.d.ts +2 -2
  218. package/build/{implementations/http/hono → server}/docs/stream-doc.js +1 -1
  219. package/build/server/docs/stream-doc.js.map +1 -0
  220. package/build/server/errors/dispatch.d.ts +96 -0
  221. package/build/{implementations/http/error-dispatch.js → server/errors/dispatch.js} +20 -10
  222. package/build/server/errors/dispatch.js.map +1 -0
  223. package/build/server/errors/dispatch.test.d.ts +1 -0
  224. package/build/server/errors/dispatch.test.js +418 -0
  225. package/build/server/errors/dispatch.test.js.map +1 -0
  226. package/build/{implementations/http/error-taxonomy.d.ts → server/errors/taxonomy.d.ts} +8 -17
  227. package/build/{implementations/http/error-taxonomy.js → server/errors/taxonomy.js} +6 -15
  228. package/build/server/errors/taxonomy.js.map +1 -0
  229. package/build/server/errors/taxonomy.test.d.ts +1 -0
  230. package/build/{implementations/http/error-taxonomy.test.js → server/errors/taxonomy.test.js} +45 -39
  231. package/build/server/errors/taxonomy.test.js.map +1 -0
  232. package/build/server/index.d.ts +29 -0
  233. package/build/server/index.js +27 -0
  234. package/build/server/index.js.map +1 -0
  235. package/build/server/no-framework-imports.test.d.ts +1 -0
  236. package/build/server/no-framework-imports.test.js +40 -0
  237. package/build/server/no-framework-imports.test.js.map +1 -0
  238. package/build/{implementations/http/hono/path.d.ts → server/paths.d.ts} +2 -3
  239. package/build/{implementations/http/hono/path.js → server/paths.js} +1 -1
  240. package/build/server/paths.js.map +1 -0
  241. package/build/server/paths.test.d.ts +1 -0
  242. package/build/server/paths.test.js +111 -0
  243. package/build/server/paths.test.js.map +1 -0
  244. package/build/server/request/params.d.ts +29 -0
  245. package/build/server/request/params.js +43 -0
  246. package/build/server/request/params.js.map +1 -0
  247. package/build/server/request/params.test.d.ts +1 -0
  248. package/build/server/request/params.test.js +91 -0
  249. package/build/server/request/params.test.js.map +1 -0
  250. package/build/server/request/query.d.ts +9 -0
  251. package/build/server/request/query.js +22 -0
  252. package/build/server/request/query.js.map +1 -0
  253. package/build/server/request/query.test.d.ts +1 -0
  254. package/build/server/request/query.test.js +60 -0
  255. package/build/server/request/query.test.js.map +1 -0
  256. package/build/server/sse.d.ts +70 -0
  257. package/build/server/sse.js +94 -0
  258. package/build/server/sse.js.map +1 -0
  259. package/build/server/sse.test.d.ts +1 -0
  260. package/build/server/sse.test.js +98 -0
  261. package/build/server/sse.test.js.map +1 -0
  262. package/build/{implementations → server}/types.d.ts +17 -15
  263. package/build/{implementations → server}/types.js.map +1 -1
  264. package/docs/astro-adapter.md +8 -9
  265. package/docs/client-and-codegen.md +10 -4
  266. package/docs/client-error-handling.md +5 -5
  267. package/docs/codegen-kotlin.md +2 -3
  268. package/docs/codegen-swift.md +1 -2
  269. package/docs/core.md +135 -54
  270. package/docs/http-integrations.md +58 -6
  271. package/docs/migration-v8-to-v9.md +200 -0
  272. package/docs/plans/2026-06-09-v9-rewrite.md +130 -0
  273. package/docs/specs/2026-06-09-v9-rewrite-design.md +221 -0
  274. package/docs/streaming.md +12 -0
  275. package/package.json +25 -48
  276. package/src/{implementations/http → adapters}/astro/index.test.ts +2 -2
  277. package/src/adapters/hono/__fixtures__/parity-envelope.json +389 -0
  278. package/src/adapters/hono/envelope-parity.test.ts +126 -0
  279. package/src/{implementations/http → adapters}/hono/handlers/http-stream.test.ts +1 -1
  280. package/src/adapters/hono/handlers/http-stream.ts +73 -0
  281. package/src/{implementations/http → adapters}/hono/handlers/http.test.ts +1 -1
  282. package/src/adapters/hono/handlers/http.ts +70 -0
  283. package/src/{implementations/http → adapters}/hono/handlers/rpc.test.ts +2 -2
  284. package/src/adapters/hono/handlers/rpc.ts +39 -0
  285. package/src/{implementations/http → adapters}/hono/handlers/stream.test.ts +4 -3
  286. package/src/{implementations/http → adapters}/hono/handlers/stream.ts +19 -92
  287. package/src/{implementations/http → adapters}/hono/index.test.ts +14 -16
  288. package/src/{implementations/http → adapters}/hono/index.ts +35 -30
  289. package/src/{implementations/http → adapters/hono}/on-request-error.test.ts +3 -3
  290. package/src/adapters/hono/request.ts +28 -0
  291. package/src/{implementations/http → adapters/hono}/route-errors.test.ts +5 -5
  292. package/src/{implementations/http → adapters}/hono/types.ts +43 -20
  293. package/src/client/freeze.test.ts +41 -0
  294. package/src/client/typed-error-dispatch.test.ts +3 -3
  295. package/src/codegen/__fixtures__/make-envelope.ts +1 -1
  296. package/src/codegen/__fixtures__/models-envelope.json +310 -0
  297. package/src/codegen/__goldens__/MANIFEST.json +85 -0
  298. package/src/codegen/__goldens__/kotlin-default--models/Billing.kt +112 -0
  299. package/src/codegen/__goldens__/kotlin-default--models/BillingReports.kt +26 -0
  300. package/src/codegen/__goldens__/kotlin-default--models/Orders.kt +88 -0
  301. package/src/codegen/__goldens__/kotlin-default--users/Users.kt +189 -0
  302. package/src/codegen/__goldens__/swift-default--models/Billing.swift +97 -0
  303. package/src/codegen/__goldens__/swift-default--models/BillingReports.swift +20 -0
  304. package/src/codegen/__goldens__/swift-default--models/Orders.swift +81 -0
  305. package/src/codegen/__goldens__/swift-default--users/Users.swift +204 -0
  306. package/src/codegen/__goldens__/ts-default--models/_client.ts +1319 -0
  307. package/src/codegen/__goldens__/ts-default--models/_errors.ts +90 -0
  308. package/src/codegen/__goldens__/ts-default--models/_models.ts +10 -0
  309. package/src/codegen/__goldens__/ts-default--models/_types.ts +502 -0
  310. package/src/codegen/__goldens__/ts-default--models/billing-reports.ts +29 -0
  311. package/src/codegen/__goldens__/ts-default--models/billing.ts +67 -0
  312. package/src/codegen/__goldens__/ts-default--models/index.ts +48 -0
  313. package/src/codegen/__goldens__/ts-default--models/orders.ts +80 -0
  314. package/src/codegen/__goldens__/ts-default--users/_client.ts +1319 -0
  315. package/src/codegen/__goldens__/ts-default--users/_errors.ts +90 -0
  316. package/src/codegen/__goldens__/ts-default--users/_types.ts +502 -0
  317. package/src/codegen/__goldens__/ts-default--users/index.ts +38 -0
  318. package/src/codegen/__goldens__/ts-default--users/users.ts +169 -0
  319. package/src/codegen/__goldens__/ts-external-runtime--models/_errors.ts +90 -0
  320. package/src/codegen/__goldens__/ts-external-runtime--models/_models.ts +10 -0
  321. package/src/codegen/__goldens__/ts-external-runtime--models/billing-reports.ts +29 -0
  322. package/src/codegen/__goldens__/ts-external-runtime--models/billing.ts +67 -0
  323. package/src/codegen/__goldens__/ts-external-runtime--models/index.ts +48 -0
  324. package/src/codegen/__goldens__/ts-external-runtime--models/orders.ts +80 -0
  325. package/src/codegen/__goldens__/ts-external-runtime--users/_errors.ts +90 -0
  326. package/src/codegen/__goldens__/ts-external-runtime--users/index.ts +38 -0
  327. package/src/codegen/__goldens__/ts-external-runtime--users/users.ts +169 -0
  328. package/src/codegen/__goldens__/ts-flat--models/_client.ts +1319 -0
  329. package/src/codegen/__goldens__/ts-flat--models/_errors.ts +87 -0
  330. package/src/codegen/__goldens__/ts-flat--models/_models.ts +10 -0
  331. package/src/codegen/__goldens__/ts-flat--models/_types.ts +502 -0
  332. package/src/codegen/__goldens__/ts-flat--models/billing-reports.ts +28 -0
  333. package/src/codegen/__goldens__/ts-flat--models/billing.ts +51 -0
  334. package/src/codegen/__goldens__/ts-flat--models/index.ts +42 -0
  335. package/src/codegen/__goldens__/ts-flat--models/orders.ts +73 -0
  336. package/src/codegen/__goldens__/ts-flat--users/_client.ts +1319 -0
  337. package/src/codegen/__goldens__/ts-flat--users/_errors.ts +87 -0
  338. package/src/codegen/__goldens__/ts-flat--users/_types.ts +502 -0
  339. package/src/codegen/__goldens__/ts-flat--users/index.ts +34 -0
  340. package/src/codegen/__goldens__/ts-flat--users/users.ts +126 -0
  341. package/src/codegen/__goldens__/ts-no-share-models--models/_client.ts +1319 -0
  342. package/src/codegen/__goldens__/ts-no-share-models--models/_errors.ts +90 -0
  343. package/src/codegen/__goldens__/ts-no-share-models--models/_types.ts +502 -0
  344. package/src/codegen/__goldens__/ts-no-share-models--models/billing-reports.ts +29 -0
  345. package/src/codegen/__goldens__/ts-no-share-models--models/billing.ts +111 -0
  346. package/src/codegen/__goldens__/ts-no-share-models--models/index.ts +48 -0
  347. package/src/codegen/__goldens__/ts-no-share-models--models/orders.ts +112 -0
  348. package/src/codegen/__goldens__/ts-no-share-models--users/_client.ts +1319 -0
  349. package/src/codegen/__goldens__/ts-no-share-models--users/_errors.ts +90 -0
  350. package/src/codegen/__goldens__/ts-no-share-models--users/_types.ts +502 -0
  351. package/src/codegen/__goldens__/ts-no-share-models--users/index.ts +38 -0
  352. package/src/codegen/__goldens__/ts-no-share-models--users/users.ts +169 -0
  353. package/src/codegen/__goldens__/ts-shared-models-module--models/_client.ts +1319 -0
  354. package/src/codegen/__goldens__/ts-shared-models-module--models/_errors.ts +90 -0
  355. package/src/codegen/__goldens__/ts-shared-models-module--models/_models.ts +7 -0
  356. package/src/codegen/__goldens__/ts-shared-models-module--models/_types.ts +502 -0
  357. package/src/codegen/__goldens__/ts-shared-models-module--models/billing-reports.ts +29 -0
  358. package/src/codegen/__goldens__/ts-shared-models-module--models/billing.ts +67 -0
  359. package/src/codegen/__goldens__/ts-shared-models-module--models/index.ts +48 -0
  360. package/src/codegen/__goldens__/ts-shared-models-module--models/orders.ts +80 -0
  361. package/src/codegen/bin/cli.test.ts +13 -2
  362. package/src/codegen/bin/cli.ts +181 -144
  363. package/src/codegen/bin/flag-specs.test.ts +16 -1
  364. package/src/codegen/bin/flag-specs.ts +43 -31
  365. package/src/codegen/bundle-size.test.ts +1 -1
  366. package/src/codegen/collect-models.ts +1 -1
  367. package/src/codegen/e2e.test.ts +1 -1
  368. package/src/codegen/emit/api-route.ts +184 -0
  369. package/src/codegen/emit/context.ts +32 -0
  370. package/src/codegen/emit/declarations.ts +49 -0
  371. package/src/codegen/emit/format-types.ts +232 -0
  372. package/src/codegen/emit/http-stream-route.ts +162 -0
  373. package/src/codegen/emit/route-shared.ts +104 -0
  374. package/src/codegen/emit/rpc-route.ts +49 -0
  375. package/src/codegen/emit/scope-file.ts +226 -0
  376. package/src/codegen/emit/stream-route.ts +81 -0
  377. package/src/codegen/emit-errors.integration.test.ts +2 -2
  378. package/src/codegen/emit-errors.test.ts +1 -1
  379. package/src/codegen/emit-errors.ts +1 -1
  380. package/src/codegen/emit-scope.test.ts +75 -2
  381. package/src/codegen/emit-scope.ts +15 -1048
  382. package/src/codegen/goldens.test.ts +89 -0
  383. package/src/codegen/group-routes.test.ts +1 -1
  384. package/src/codegen/group-routes.ts +1 -1
  385. package/src/codegen/pipeline.test.ts +1 -1
  386. package/src/codegen/pipeline.ts +1 -1
  387. package/src/codegen/resolve-envelope.test.ts +1 -1
  388. package/src/codegen/resolve-envelope.ts +1 -1
  389. package/src/codegen/targets/_shared/error-schemas.test.ts +1 -1
  390. package/src/codegen/targets/_shared/error-schemas.ts +1 -1
  391. package/src/codegen/targets/_shared/route-slots.test.ts +1 -1
  392. package/src/codegen/targets/_shared/route-slots.ts +1 -1
  393. package/src/codegen/targets/_shared/target-run.ts +1 -1
  394. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +1 -1
  395. package/src/codegen/targets/kotlin/emit-route-kotlin.ts +1 -1
  396. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +1 -1
  397. package/src/codegen/targets/swift/access-level.test.ts +1 -1
  398. package/src/codegen/targets/swift/emit-route-swift.test.ts +1 -1
  399. package/src/codegen/targets/swift/emit-route-swift.ts +1 -1
  400. package/src/codegen/targets/swift/emit-scope-swift.test.ts +1 -1
  401. package/src/codegen/targets/ts/shared-models.test.ts +1 -1
  402. package/src/{create-http-stream.test.ts → core/create-http-stream.test.ts} +1 -1
  403. package/src/core/create-http-stream.ts +207 -0
  404. package/src/{create-http.test.ts → core/create-http.test.ts} +31 -4
  405. package/src/core/create-http.ts +126 -0
  406. package/src/{create-stream.test.ts → core/create-stream.test.ts} +28 -31
  407. package/src/core/create-stream.ts +142 -0
  408. package/src/{create.test.ts → core/create.test.ts} +25 -57
  409. package/src/core/create.ts +121 -0
  410. package/src/{stack-utils.test.ts → core/definition-site.test.ts} +14 -3
  411. package/src/{stack-utils.ts → core/definition-site.ts} +20 -23
  412. package/src/{errors.test.ts → core/errors.test.ts} +1 -1
  413. package/src/{errors.ts → core/errors.ts} +30 -28
  414. package/src/core/factory-options.test.ts +112 -0
  415. package/src/core/http-route.ts +73 -0
  416. package/src/core/internal.ts +203 -0
  417. package/src/{migration.test.ts → core/migration.test.ts} +23 -1
  418. package/src/{index.test.ts → core/procedures.test.ts} +13 -11
  419. package/src/core/procedures.ts +75 -0
  420. package/src/core/types.ts +196 -0
  421. package/src/exports.ts +60 -11
  422. package/src/schema/adapter.test.ts +58 -0
  423. package/src/schema/adapter.ts +45 -0
  424. package/src/schema/compile.test.ts +95 -0
  425. package/src/schema/compile.ts +64 -0
  426. package/src/schema/compute-schema.test.ts +222 -41
  427. package/src/schema/compute-schema.ts +145 -71
  428. package/src/schema/json-schema.ts +21 -0
  429. package/src/schema/typebox.test.ts +40 -0
  430. package/src/schema/typebox.ts +27 -0
  431. package/src/server/context.test.ts +22 -0
  432. package/src/server/context.ts +18 -0
  433. package/src/{doc-envelope.test.ts → server/doc-envelope.test.ts} +2 -2
  434. package/src/{doc-envelope.ts → server/doc-envelope.ts} +1 -1
  435. package/src/{implementations/http → server}/doc-registry.test.ts +32 -26
  436. package/src/{implementations/http → server}/doc-registry.ts +11 -7
  437. package/src/server/docs/docs.test.ts +287 -0
  438. package/src/{implementations/http/hono → server}/docs/http-doc.ts +3 -3
  439. package/src/{implementations/http/hono → server}/docs/http-stream-doc.ts +3 -3
  440. package/src/{implementations/http/hono → server}/docs/rpc-doc.ts +3 -3
  441. package/src/{implementations/http/hono → server}/docs/stream-doc.ts +3 -3
  442. package/src/server/errors/dispatch.test.ts +450 -0
  443. package/src/server/errors/dispatch.ts +189 -0
  444. package/src/{implementations/http/error-taxonomy.test.ts → server/errors/taxonomy.test.ts} +45 -39
  445. package/src/{implementations/http/error-taxonomy.ts → server/errors/taxonomy.ts} +8 -17
  446. package/src/server/index.ts +29 -0
  447. package/src/server/no-framework-imports.test.ts +43 -0
  448. package/src/server/paths.test.ts +141 -0
  449. package/src/{implementations/http/hono/path.ts → server/paths.ts} +2 -13
  450. package/src/server/request/params.test.ts +143 -0
  451. package/src/server/request/params.ts +68 -0
  452. package/src/server/request/query.test.ts +70 -0
  453. package/src/server/request/query.ts +24 -0
  454. package/src/server/sse.test.ts +113 -0
  455. package/src/server/sse.ts +117 -0
  456. package/src/{implementations → server}/types.ts +17 -16
  457. package/build/create-http-stream.d.ts +0 -58
  458. package/build/create-http-stream.js +0 -122
  459. package/build/create-http-stream.js.map +0 -1
  460. package/build/create-http-stream.test.js.map +0 -1
  461. package/build/create-http.d.ts +0 -49
  462. package/build/create-http.js +0 -108
  463. package/build/create-http.js.map +0 -1
  464. package/build/create-http.test.js.map +0 -1
  465. package/build/create-stream.d.ts +0 -35
  466. package/build/create-stream.js +0 -123
  467. package/build/create-stream.js.map +0 -1
  468. package/build/create-stream.test.js.map +0 -1
  469. package/build/create.d.ts +0 -28
  470. package/build/create.js +0 -82
  471. package/build/create.js.map +0 -1
  472. package/build/create.test.js.map +0 -1
  473. package/build/doc-envelope.js.map +0 -1
  474. package/build/doc-envelope.test.js.map +0 -1
  475. package/build/errors.js.map +0 -1
  476. package/build/errors.test.js.map +0 -1
  477. package/build/implementations/http/astro/astro-context.js.map +0 -1
  478. package/build/implementations/http/astro/create-handler.js.map +0 -1
  479. package/build/implementations/http/astro/index.js.map +0 -1
  480. package/build/implementations/http/astro/index.test.js.map +0 -1
  481. package/build/implementations/http/astro/rewrite-request.js.map +0 -1
  482. package/build/implementations/http/doc-registry.js.map +0 -1
  483. package/build/implementations/http/doc-registry.test.js.map +0 -1
  484. package/build/implementations/http/error-dispatch.d.ts +0 -76
  485. package/build/implementations/http/error-dispatch.js.map +0 -1
  486. package/build/implementations/http/error-dispatch.test.js +0 -254
  487. package/build/implementations/http/error-dispatch.test.js.map +0 -1
  488. package/build/implementations/http/error-taxonomy.js.map +0 -1
  489. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  490. package/build/implementations/http/hono/docs/http-doc.js.map +0 -1
  491. package/build/implementations/http/hono/docs/http-stream-doc.js.map +0 -1
  492. package/build/implementations/http/hono/docs/rpc-doc.js.map +0 -1
  493. package/build/implementations/http/hono/docs/stream-doc.js.map +0 -1
  494. package/build/implementations/http/hono/handlers/http-stream.js +0 -123
  495. package/build/implementations/http/hono/handlers/http-stream.js.map +0 -1
  496. package/build/implementations/http/hono/handlers/http-stream.test.js.map +0 -1
  497. package/build/implementations/http/hono/handlers/http.js +0 -110
  498. package/build/implementations/http/hono/handlers/http.js.map +0 -1
  499. package/build/implementations/http/hono/handlers/http.test.js.map +0 -1
  500. package/build/implementations/http/hono/handlers/rpc.js +0 -32
  501. package/build/implementations/http/hono/handlers/rpc.js.map +0 -1
  502. package/build/implementations/http/hono/handlers/rpc.test.js.map +0 -1
  503. package/build/implementations/http/hono/handlers/stream.d.ts +0 -23
  504. package/build/implementations/http/hono/handlers/stream.js +0 -147
  505. package/build/implementations/http/hono/handlers/stream.js.map +0 -1
  506. package/build/implementations/http/hono/handlers/stream.test.js.map +0 -1
  507. package/build/implementations/http/hono/index.js.map +0 -1
  508. package/build/implementations/http/hono/index.test.js.map +0 -1
  509. package/build/implementations/http/hono/path.js.map +0 -1
  510. package/build/implementations/http/hono/path.test.js +0 -83
  511. package/build/implementations/http/hono/path.test.js.map +0 -1
  512. package/build/implementations/http/hono/types.d.ts +0 -51
  513. package/build/implementations/http/hono/types.js.map +0 -1
  514. package/build/implementations/http/on-request-error.test.js.map +0 -1
  515. package/build/implementations/http/route-errors.test.js.map +0 -1
  516. package/build/index.d.ts +0 -175
  517. package/build/index.js +0 -47
  518. package/build/index.js.map +0 -1
  519. package/build/index.test.js.map +0 -1
  520. package/build/migration.test.js.map +0 -1
  521. package/build/schema/extract-json-schema.d.ts +0 -2
  522. package/build/schema/extract-json-schema.js +0 -12
  523. package/build/schema/extract-json-schema.js.map +0 -1
  524. package/build/schema/extract-json-schema.test.js +0 -23
  525. package/build/schema/extract-json-schema.test.js.map +0 -1
  526. package/build/schema/parser.d.ts +0 -36
  527. package/build/schema/parser.js +0 -210
  528. package/build/schema/parser.js.map +0 -1
  529. package/build/schema/parser.test.js +0 -120
  530. package/build/schema/parser.test.js.map +0 -1
  531. package/build/schema/resolve-schema-lib.d.ts +0 -12
  532. package/build/schema/resolve-schema-lib.js +0 -11
  533. package/build/schema/resolve-schema-lib.js.map +0 -1
  534. package/build/schema/resolve-schema-lib.test.js +0 -17
  535. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  536. package/build/schema/types.d.ts +0 -8
  537. package/build/schema/types.js +0 -2
  538. package/build/stack-utils.d.ts +0 -25
  539. package/build/stack-utils.js.map +0 -1
  540. package/build/stack-utils.test.js.map +0 -1
  541. package/build/types.d.ts +0 -142
  542. package/build/types.js +0 -2
  543. package/build/types.js.map +0 -1
  544. package/docs/decisions/2026-06-02-monorepo-split-evaluation.md +0 -80
  545. package/docs/handoffs/2026-06-08-dx-round2-declines.md +0 -45
  546. package/docs/handoffs/ajsc-named-type-collision.md +0 -134
  547. package/docs/handoffs/ajsc-named-type-support.md +0 -181
  548. package/docs/handoffs/shared-models-auto-resolve-response.md +0 -181
  549. package/docs/npm-workspaces-migration-plan.md +0 -611
  550. package/docs/superpowers/plans/2026-04-24-doc-registry-simplification.md +0 -886
  551. package/docs/superpowers/plans/2026-04-24-kotlin-codegen-target.md +0 -1265
  552. package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +0 -1993
  553. package/docs/superpowers/plans/2026-04-29-safe-result-api.md +0 -2293
  554. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +0 -1391
  555. package/docs/superpowers/plans/2026-05-08-create-http.md +0 -3355
  556. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +0 -3365
  557. package/docs/superpowers/plans/2026-06-05-dx-feedback-round.md +0 -1292
  558. package/docs/superpowers/plans/2026-06-06-shared-models-convention-and-diagnostics.md +0 -659
  559. package/docs/superpowers/plans/2026-06-08-codegen-dx-surfacing.md +0 -428
  560. package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +0 -401
  561. package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +0 -314
  562. package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +0 -264
  563. package/docs/superpowers/specs/2026-04-29-safe-result-api-design.md +0 -324
  564. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +0 -252
  565. package/docs/superpowers/specs/2026-05-08-create-http-design.md +0 -409
  566. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +0 -411
  567. package/docs/superpowers/specs/2026-06-05-dx-feedback-round-design.md +0 -285
  568. package/docs/superpowers/specs/2026-06-08-dx-feedback-round-2-design.md +0 -376
  569. package/src/create-http-stream.ts +0 -191
  570. package/src/create-http.ts +0 -210
  571. package/src/create-stream.ts +0 -228
  572. package/src/create.ts +0 -172
  573. package/src/implementations/http/README.md +0 -390
  574. package/src/implementations/http/error-dispatch.test.ts +0 -283
  575. package/src/implementations/http/error-dispatch.ts +0 -176
  576. package/src/implementations/http/hono/handlers/http-stream.ts +0 -152
  577. package/src/implementations/http/hono/handlers/http.ts +0 -145
  578. package/src/implementations/http/hono/handlers/rpc.ts +0 -54
  579. package/src/implementations/http/hono/path.test.ts +0 -96
  580. package/src/index.ts +0 -101
  581. package/src/schema/extract-json-schema.test.ts +0 -25
  582. package/src/schema/extract-json-schema.ts +0 -15
  583. package/src/schema/parser.test.ts +0 -182
  584. package/src/schema/parser.ts +0 -265
  585. package/src/schema/resolve-schema-lib.test.ts +0 -19
  586. package/src/schema/resolve-schema-lib.ts +0 -29
  587. package/src/schema/types.ts +0 -20
  588. package/src/types.ts +0 -133
  589. /package/build/{implementations/http → adapters}/astro/astro-context.d.ts +0 -0
  590. /package/build/{implementations/http → adapters}/astro/astro-context.js +0 -0
  591. /package/build/{implementations/http → adapters}/astro/create-handler.d.ts +0 -0
  592. /package/build/{implementations/http → adapters}/astro/create-handler.js +0 -0
  593. /package/build/{implementations/http → adapters}/astro/index.d.ts +0 -0
  594. /package/build/{implementations/http → adapters}/astro/index.js +0 -0
  595. /package/build/{implementations/http → adapters}/astro/index.test.d.ts +0 -0
  596. /package/build/{implementations/http → adapters}/astro/rewrite-request.d.ts +0 -0
  597. /package/build/{implementations/http → adapters}/astro/rewrite-request.js +0 -0
  598. /package/build/{create-http-stream.test.d.ts → adapters/hono/envelope-parity.test.d.ts} +0 -0
  599. /package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.d.ts +0 -0
  600. /package/build/{implementations/http → adapters}/hono/handlers/http.test.d.ts +0 -0
  601. /package/build/{implementations/http → adapters}/hono/handlers/rpc.test.d.ts +0 -0
  602. /package/build/{implementations/http → adapters}/hono/handlers/stream.test.d.ts +0 -0
  603. /package/build/{implementations/http → adapters}/hono/index.test.d.ts +0 -0
  604. /package/build/{implementations/http → adapters/hono}/on-request-error.test.d.ts +0 -0
  605. /package/build/{implementations/http → adapters/hono}/route-errors.test.d.ts +0 -0
  606. /package/build/{create-http.test.d.ts → client/freeze.test.d.ts} +0 -0
  607. /package/build/{create-stream.test.d.ts → codegen/goldens.test.d.ts} +0 -0
  608. /package/build/{create.test.d.ts → core/create-http-stream.test.d.ts} +0 -0
  609. /package/build/{doc-envelope.test.d.ts → core/create-http.test.d.ts} +0 -0
  610. /package/build/{errors.test.d.ts → core/create-stream.test.d.ts} +0 -0
  611. /package/build/{implementations/http/doc-registry.test.d.ts → core/create.test.d.ts} +0 -0
  612. /package/build/{implementations/http/error-dispatch.test.d.ts → core/definition-site.test.d.ts} +0 -0
  613. /package/build/{implementations/http/error-taxonomy.test.d.ts → core/errors.test.d.ts} +0 -0
  614. /package/build/{errors.test.js → core/errors.test.js} +0 -0
  615. /package/build/{implementations/http/hono/path.test.d.ts → core/factory-options.test.d.ts} +0 -0
  616. /package/build/{migration.test.d.ts → core/migration.test.d.ts} +0 -0
  617. /package/build/{index.test.d.ts → core/procedures.test.d.ts} +0 -0
  618. /package/build/{implementations/http/hono → core}/types.js +0 -0
  619. /package/build/schema/{extract-json-schema.test.d.ts → adapter.test.d.ts} +0 -0
  620. /package/build/schema/{parser.test.d.ts → compile.test.d.ts} +0 -0
  621. /package/build/schema/{resolve-schema-lib.test.d.ts → typebox.test.d.ts} +0 -0
  622. /package/build/{stack-utils.test.d.ts → server/context.test.d.ts} +0 -0
  623. /package/build/{doc-envelope.js → server/doc-envelope.js} +0 -0
  624. /package/build/{doc-envelope.test.js → server/doc-envelope.test.js} +0 -0
  625. /package/build/{implementations → server}/types.js +0 -0
  626. /package/src/{implementations/http → adapters}/astro/README.md +0 -0
  627. /package/src/{implementations/http → adapters}/astro/astro-context.ts +0 -0
  628. /package/src/{implementations/http → adapters}/astro/create-handler.ts +0 -0
  629. /package/src/{implementations/http → adapters}/astro/index.ts +0 -0
  630. /package/src/{implementations/http → adapters}/astro/rewrite-request.ts +0 -0
@@ -1,191 +0,0 @@
1
- import { ProcedureError, ProcedureRegistrationError, ProcedureValidationError, ProcedureYieldValidationError } from './errors.js'
2
- import { computeSchema } from './schema/compute-schema.js'
3
- import type { Prettify, TSchemaLib } from './schema/types.js'
4
- import { captureDefinitionInfo } from './stack-utils.js'
5
- import type {
6
- HttpMethod, TBuilderConfig, TStreamContext,
7
- THttpStreamProcedureRegistration, TProcedureRegistration, TStreamProcedureRegistration, THttpProcedureRegistration,
8
- } from './types.js'
9
- import { checkPathParamConsistency } from './create-http.js'
10
-
11
- /**
12
- * Wraps a user's AsyncIterator in a generator that:
13
- * - optionally validates each yielded value
14
- * - augments error stack traces with the procedure definition site
15
- * - aborts the stream controller on completion
16
- */
17
- async function* yieldingWrapper(
18
- userIterator: AsyncIterator<any, any, unknown>,
19
- validateYields: boolean,
20
- validations: { yield?: (value: any) => { errors?: any[] } },
21
- abortController: AbortController,
22
- definitionInfo: ReturnType<typeof captureDefinitionInfo>,
23
- name: string,
24
- ): AsyncGenerator<any, any, unknown> {
25
- try {
26
- let result = await userIterator.next()
27
- while (!result.done) {
28
- const value = result.value
29
- if (validateYields && validations.yield) {
30
- const { errors } = validations.yield(value)
31
- if (errors) throw new ProcedureYieldValidationError(name, `Yield validation error for ${name}`, errors, definitionInfo)
32
- }
33
- yield value
34
- result = await userIterator.next()
35
- }
36
- return result.value
37
- } catch (error: any) {
38
- if (definitionInfo.definedAt && error && typeof error.stack === 'string') {
39
- const { file, line, column } = definitionInfo.definedAt
40
- error.stack = `${error.stack}\n--- Procedure "${name}" defined at ---\n at ${file}:${line}:${column}`
41
- }
42
- throw error
43
- } finally {
44
- try { await userIterator.return?.(undefined) } catch { /* swallow */ }
45
- abortController.abort('stream-completed')
46
- }
47
- }
48
-
49
- export function makeCreateHttpStream<TContext>(
50
- procedures: Map<string, TProcedureRegistration<TContext, any> | TStreamProcedureRegistration<TContext, any> | THttpProcedureRegistration<TContext> | THttpStreamProcedureRegistration<TContext>>,
51
- builder?: { config?: TBuilderConfig; onCreate?: (procedure: any) => void },
52
- ) {
53
- return function CreateHttpStream<
54
- TName extends string,
55
- TReq extends Record<string, unknown> | undefined,
56
- TYieldType,
57
- TReturnType = void,
58
- TResHeaders = undefined,
59
- TErrorKey extends string = string,
60
- >(
61
- name: TName,
62
- config: {
63
- path: string
64
- method: HttpMethod
65
- scope?: string
66
- errors?: TErrorKey[]
67
- description?: string
68
- schema: {
69
- req?: TReq
70
- yield?: TYieldType
71
- returnType?: TReturnType
72
- res?: TResHeaders extends undefined ? undefined : { headers: TResHeaders }
73
- }
74
- validateYields?: boolean
75
- },
76
- handler: TResHeaders extends undefined
77
- ? (
78
- ctx: Prettify<TContext & TStreamContext>,
79
- req: TReq extends Record<string, unknown> ? Prettify<{ [K in keyof TReq]: TSchemaLib<TReq[K]> }> : undefined,
80
- ) => AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
81
- : (
82
- ctx: Prettify<TContext & TStreamContext>,
83
- req: TReq extends Record<string, unknown> ? Prettify<{ [K in keyof TReq]: TSchemaLib<TReq[K]> }> : undefined,
84
- ) => Promise<{ headers: TSchemaLib<TResHeaders>; stream: AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown> }>,
85
- ) {
86
- const definitionInfo = captureDefinitionInfo()
87
-
88
- if (procedures.has(name)) throw new Error(`Procedure with name ${name} is already registered`)
89
- if ((config.schema as any)?.params) {
90
- throw new ProcedureRegistrationError(name, `Use schema.req.body (or schema.req.query) instead of schema.params on CreateHttpStream. Procedure: "${name}".`, definitionInfo)
91
- }
92
-
93
- const { jsonSchema, validations } = computeSchema(name, {
94
- req: config.schema.req as Record<string, unknown> | undefined,
95
- yieldType: config.schema.yield,
96
- returnType: config.schema.returnType,
97
- }, definitionInfo)
98
-
99
- const pathParamsSchema = (jsonSchema.req as Record<string, unknown> | undefined)?.pathParams
100
- checkPathParamConsistency(name, config.path, pathParamsSchema as Record<string, unknown> | undefined, definitionInfo)
101
-
102
- const errorFactory = (message: string, meta?: object) => new ProcedureError(name, message, meta, definitionInfo)
103
- const validateYields = config.validateYields ?? false
104
-
105
- const wrappedHandler = async (ctx: TContext, req: any): Promise<{ stream: AsyncGenerator<any, any, unknown>; initialHeaders?: Record<string, string> }> => {
106
- const abortController = new AbortController()
107
- const skipValidation = (ctx as { isPrevalidated?: boolean }).isPrevalidated || builder?.config?.noRuntimeValidation
108
-
109
- if (validations?.req && !skipValidation) {
110
- for (const [channel, validator] of Object.entries(validations.req)) {
111
- const channelValue = (req as Record<string, unknown>)?.[channel]
112
- const { errors } = validator(channelValue)
113
- if (errors) {
114
- throw new ProcedureValidationError(name, `Validation error for ${name} in req.${channel}`, errors, definitionInfo)
115
- }
116
- }
117
- }
118
-
119
- const incomingSignal = (ctx as { signal?: AbortSignal }).signal
120
- const signal = incomingSignal ? AbortSignal.any([incomingSignal, abortController.signal]) : abortController.signal
121
- const streamCtx: TStreamContext = { error: errorFactory, signal }
122
-
123
- const handlerResult: any = (handler as any)({ ...ctx, ...streamCtx }, req)
124
-
125
- if (typeof handlerResult?.[Symbol.asyncIterator] === 'function') {
126
- // Plain async generator from user
127
- const userIterator = (handlerResult as AsyncGenerator<any, any, unknown>)[Symbol.asyncIterator]()
128
- return { stream: yieldingWrapper(userIterator, validateYields, validations, abortController, definitionInfo, name) }
129
- } else if (typeof handlerResult?.then === 'function') {
130
- // Async preamble: Promise<{ headers, stream }>
131
- const resolved = await handlerResult
132
- if (!resolved || typeof resolved !== 'object' || !('stream' in resolved)) {
133
- throw new ProcedureError(name, `CreateHttpStream handler returned a Promise that did not resolve to { headers, stream }. Got: ${JSON.stringify(resolved)}`, undefined, definitionInfo)
134
- }
135
- const userIterator = (resolved.stream as AsyncGenerator<any, any, unknown>)[Symbol.asyncIterator]()
136
- return {
137
- stream: yieldingWrapper(userIterator, validateYields, validations, abortController, definitionInfo, name),
138
- initialHeaders: resolved.headers,
139
- }
140
- } else {
141
- throw new ProcedureError(name, `CreateHttpStream handler must return an AsyncGenerator or Promise<{ headers, stream }>.`, undefined, definitionInfo)
142
- }
143
- }
144
-
145
- const registeredProcedure: THttpStreamProcedureRegistration<TContext> = {
146
- name,
147
- kind: 'http-stream',
148
- config: {
149
- path: config.path,
150
- method: config.method,
151
- scope: config.scope,
152
- errors: config.errors as string[] | undefined,
153
- description: config.description,
154
- schema: jsonSchema as any,
155
- validation: { req: validations.req, yield: validations.yield },
156
- validateYields,
157
- },
158
- handler: wrappedHandler as any,
159
- }
160
-
161
- procedures.set(name, registeredProcedure as any)
162
- builder?.onCreate?.(registeredProcedure)
163
-
164
- const info = { name, kind: 'http-stream' as const, ...registeredProcedure.config }
165
-
166
- // Explicit return type — preserves TReq/TYieldType/TReturnType through the public callable.
167
- // Do NOT use `typeof registeredProcedure.handler` — that erases generics to `any`.
168
- return {
169
- [name]: registeredProcedure.handler,
170
- procedure: registeredProcedure.handler,
171
- info,
172
- } as {
173
- [K in TName]: (
174
- ctx: Prettify<TContext>,
175
- req: TReq extends Record<string, unknown> ? Prettify<{ [K in keyof TReq]: TSchemaLib<TReq[K]> }> : undefined,
176
- ) => Promise<{
177
- stream: AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
178
- initialHeaders?: Record<string, string>
179
- }>
180
- } & {
181
- procedure: (
182
- ctx: Prettify<TContext>,
183
- req: TReq extends Record<string, unknown> ? Prettify<{ [K in keyof TReq]: TSchemaLib<TReq[K]> }> : undefined,
184
- ) => Promise<{
185
- stream: AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
186
- initialHeaders?: Record<string, string>
187
- }>
188
- info: typeof info
189
- }
190
- }
191
- }
@@ -1,210 +0,0 @@
1
- import { ProcedureError, ProcedureRegistrationError, ProcedureValidationError } from './errors.js'
2
- import { computeSchema } from './schema/compute-schema.js'
3
- import type { Prettify, TSchemaLib } from './schema/types.js'
4
- import { captureDefinitionInfo } from './stack-utils.js'
5
- import type {
6
- TBuilderConfig,
7
- TCreateHttpConfig,
8
- TLocalContext,
9
- THttpProcedureRegistration,
10
- THttpStreamProcedureRegistration,
11
- TProcedureRegistration,
12
- TStreamProcedureRegistration,
13
- } from './types.js'
14
-
15
- type Infer<T> = TSchemaLib<T>
16
-
17
- export type HttpReturn<TRes> =
18
- TRes extends { body: infer B; headers: infer H } ? { body: Infer<B>; headers: Infer<H> }
19
- : TRes extends { headers: infer H } ? { headers: Infer<H> }
20
- : TRes extends { body: infer B } ? Infer<B>
21
- : void
22
-
23
- const PATH_PARAM_RE = /:([a-zA-Z_][a-zA-Z0-9_]*)/g
24
-
25
- function extractPathParamNames(path: string): string[] {
26
- const matches = path.match(PATH_PARAM_RE)
27
- return matches ? matches.map((m) => m.slice(1)) : []
28
- }
29
-
30
- export function checkPathParamConsistency(
31
- procedureName: string,
32
- path: string,
33
- pathParamsSchema: Record<string, unknown> | undefined,
34
- definitionInfo: ReturnType<typeof captureDefinitionInfo>,
35
- ) {
36
- const pathParamNames = extractPathParamNames(path)
37
- const hasPathParams = pathParamNames.length > 0
38
- const hasSchema = pathParamsSchema !== undefined
39
-
40
- if (hasPathParams && !hasSchema) {
41
- throw new ProcedureRegistrationError(
42
- procedureName,
43
- `Path "${path}" has path parameters [${pathParamNames.join(', ')}] but schema.req.pathParams is not defined.`,
44
- definitionInfo,
45
- )
46
- }
47
- if (!hasPathParams && hasSchema) {
48
- throw new ProcedureRegistrationError(
49
- procedureName,
50
- `schema.req.pathParams is defined but path "${path}" has no path parameters.`,
51
- definitionInfo,
52
- )
53
- }
54
- if (hasPathParams && hasSchema) {
55
- const schemaProperties = (pathParamsSchema as { properties?: Record<string, unknown> }).properties
56
- if (schemaProperties) {
57
- const schemaKeys = Object.keys(schemaProperties)
58
- const missing = pathParamNames.filter((p) => !schemaKeys.includes(p))
59
- const extra = schemaKeys.filter((k) => !pathParamNames.includes(k))
60
- if (missing.length > 0 || extra.length > 0) {
61
- const parts: string[] = []
62
- if (missing.length > 0) parts.push(`path has [${missing.join(', ')}] missing from schema`)
63
- if (extra.length > 0) parts.push(`schema has [${extra.join(', ')}] not in path`)
64
- throw new ProcedureRegistrationError(
65
- procedureName,
66
- `Path param mismatch for "${procedureName}": ${parts.join('; ')}.`,
67
- definitionInfo,
68
- )
69
- }
70
- }
71
- }
72
- }
73
-
74
- export function makeCreateHttp<TContext>(
75
- procedures: Map<
76
- string,
77
- | TProcedureRegistration<TContext, any>
78
- | TStreamProcedureRegistration<TContext, any>
79
- | THttpProcedureRegistration<TContext>
80
- | THttpStreamProcedureRegistration<TContext>
81
- >,
82
- builder?: { config?: TBuilderConfig; onCreate?: (procedure: any) => void },
83
- ) {
84
- return function CreateHttp<
85
- TName extends string,
86
- TReq extends Record<string, unknown> | undefined,
87
- TRes extends { body?: unknown; headers?: unknown } | undefined = undefined,
88
- TErrorKey extends string = string,
89
- >(
90
- name: TName,
91
- config: TCreateHttpConfig<TReq, TRes, TErrorKey>,
92
- handler: (
93
- ctx: Prettify<TContext & TLocalContext>,
94
- req: TReq extends Record<string, unknown> ? Prettify<{ [K in keyof TReq]: TSchemaLib<TReq[K]> }> : undefined,
95
- ) => Promise<HttpReturn<TRes>>,
96
- ) {
97
- const definitionInfo = captureDefinitionInfo()
98
-
99
- if (procedures.has(name)) {
100
- throw new Error(`Procedure with name ${name} is already registered`)
101
- }
102
-
103
- if ((config.schema as any)?.params) {
104
- throw new ProcedureRegistrationError(
105
- name,
106
- `Use schema.req.body (or schema.req.query) instead of schema.params on CreateHttp. Procedure: "${name}".`,
107
- definitionInfo,
108
- )
109
- }
110
-
111
- const { jsonSchema, validations } = computeSchema(
112
- name,
113
- {
114
- req: config.schema.req as Record<string, unknown> | undefined,
115
- res: config.schema.res as { body?: unknown; headers?: unknown } | undefined,
116
- },
117
- definitionInfo,
118
- )
119
-
120
- const pathParamsSchema = (jsonSchema.req as Record<string, unknown> | undefined)?.pathParams
121
- checkPathParamConsistency(
122
- name,
123
- config.path,
124
- pathParamsSchema as Record<string, unknown> | undefined,
125
- definitionInfo,
126
- )
127
-
128
- const errorFactory = (message: string, meta?: object) =>
129
- new ProcedureError(name, message, meta, definitionInfo)
130
-
131
- const registeredProcedure: THttpProcedureRegistration<TContext> = {
132
- name,
133
- kind: 'http',
134
- config: {
135
- path: config.path,
136
- method: config.method,
137
- successStatus: config.successStatus,
138
- scope: config.scope,
139
- errors: config.errors as string[] | undefined,
140
- description: config.description,
141
- schema: jsonSchema as any,
142
- validation: { req: validations.req },
143
- },
144
- handler: async (ctx: TContext, req: any) => {
145
- try {
146
- const skipValidation =
147
- (ctx as { isPrevalidated?: boolean }).isPrevalidated ||
148
- builder?.config?.noRuntimeValidation
149
-
150
- if (validations?.req && !skipValidation) {
151
- for (const [channel, validator] of Object.entries(validations.req)) {
152
- const channelValue = (req as Record<string, unknown>)?.[channel]
153
- const { errors } = validator(channelValue)
154
- if (errors) {
155
- throw new ProcedureValidationError(
156
- name,
157
- `Validation error for ${name} in req.${channel}`,
158
- errors,
159
- definitionInfo,
160
- )
161
- }
162
- }
163
- }
164
-
165
- const localCtx: TLocalContext = { error: errorFactory }
166
- return await handler({ ...ctx, ...localCtx } as any, req)
167
- } catch (error: any) {
168
- if (error instanceof ProcedureError) throw error
169
- const err = new ProcedureError(
170
- name,
171
- `Error in handler for ${name} - ${error?.message}`,
172
- undefined,
173
- definitionInfo,
174
- )
175
- err.cause = error
176
- if (error.stack && definitionInfo.definedAt) {
177
- const { file, line, column } = definitionInfo.definedAt
178
- err.stack =
179
- error.stack + `\n--- Procedure "${name}" defined at ---\n at ${file}:${line}:${column}`
180
- } else if (error.stack) {
181
- err.stack = error.stack
182
- }
183
- throw err
184
- }
185
- },
186
- }
187
-
188
- procedures.set(name, registeredProcedure as any)
189
- builder?.onCreate?.(registeredProcedure)
190
-
191
- const info = { name, ...registeredProcedure.config }
192
-
193
- return {
194
- [name]: registeredProcedure.handler,
195
- procedure: registeredProcedure.handler,
196
- info,
197
- } as {
198
- [K in TName]: (
199
- ctx: Prettify<TContext>,
200
- req: TReq extends Record<string, unknown> ? Prettify<{ [K in keyof TReq]: TSchemaLib<TReq[K]> }> : undefined,
201
- ) => Promise<HttpReturn<TRes>>
202
- } & {
203
- procedure: (
204
- ctx: Prettify<TContext>,
205
- req: TReq extends Record<string, unknown> ? Prettify<{ [K in keyof TReq]: TSchemaLib<TReq[K]> }> : undefined,
206
- ) => Promise<HttpReturn<TRes>>
207
- info: typeof info
208
- }
209
- }
210
- }
@@ -1,228 +0,0 @@
1
- import { ProcedureError, ProcedureRegistrationError, ProcedureValidationError, ProcedureYieldValidationError } from './errors.js'
2
- import { computeSchema } from './schema/compute-schema.js'
3
- import type { Prettify, TSchemaLib } from './schema/types.js'
4
- import { captureDefinitionInfo } from './stack-utils.js'
5
- import type {
6
- TBuilderConfig,
7
- THttpProcedureRegistration,
8
- THttpStreamProcedureRegistration,
9
- TStreamContext,
10
- TProcedureRegistration,
11
- TStreamProcedureRegistration,
12
- } from './types.js'
13
-
14
- export type CreateStreamBuilderArg<TContext, TExtendedConfig> = {
15
- config?: TBuilderConfig
16
- onCreate?: (
17
- procedure:
18
- | TProcedureRegistration<TContext, TExtendedConfig>
19
- | TStreamProcedureRegistration<TContext, TExtendedConfig>
20
- ) => void
21
- }
22
-
23
- export function makeCreateStream<TContext, TExtendedConfig>(
24
- procedures: Map<
25
- string,
26
- | TProcedureRegistration<TContext, TExtendedConfig>
27
- | TStreamProcedureRegistration<TContext, TExtendedConfig>
28
- | THttpProcedureRegistration<TContext>
29
- | THttpStreamProcedureRegistration<TContext>
30
- >,
31
- builder?: CreateStreamBuilderArg<TContext, TExtendedConfig>
32
- ) {
33
- return function CreateStream<TName extends string, TParams, TYieldType, TReturnType = void>(
34
- name: TName,
35
- config: {
36
- description?: string
37
- schema?: {
38
- params?: TParams
39
- yieldType?: TYieldType
40
- returnType?: TReturnType
41
- }
42
- validateYields?: boolean
43
- } & TExtendedConfig,
44
- handler: (
45
- ctx: Prettify<TContext & TStreamContext>,
46
- params: TSchemaLib<TParams>
47
- ) => AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
48
- ) {
49
- // Capture definition location as first action
50
- const definitionInfo = captureDefinitionInfo()
51
-
52
- const HTTP_FIELDS = ['path', 'method', 'req', 'res', 'successStatus'] as const
53
- const presentHttpFields = HTTP_FIELDS.filter((f) => (config as any)[f] !== undefined)
54
- if (presentHttpFields.length > 0) {
55
- throw new ProcedureRegistrationError(
56
- name,
57
- `HTTP fields require CreateHttp / CreateHttpStream. Procedure "${name}" has [${presentHttpFields.join(', ')}] which are not valid on CreateStream.`,
58
- definitionInfo,
59
- )
60
- }
61
-
62
- // BEFORE computeSchema - fail fast on duplicate
63
- if (procedures.has(name)) {
64
- throw new Error(`Procedure with name ${name} is already registered`)
65
- }
66
-
67
- const { jsonSchema, validations } = computeSchema(name, config.schema, definitionInfo)
68
-
69
- // Create error factory once at registration time (outside handler)
70
- const errorFactory = (message: string, meta?: object) => {
71
- return new ProcedureError(name, message, meta, definitionInfo)
72
- }
73
-
74
- const validateYields = config.validateYields ?? false
75
-
76
- const registeredProcedure: TStreamProcedureRegistration<TContext, TExtendedConfig> = {
77
- name,
78
- kind: 'rpc-stream',
79
- isStream: true,
80
- config: {
81
- ...config,
82
- description: config.description,
83
- schema: jsonSchema,
84
- validation: {
85
- params: validations.params,
86
- yield: validations.yield,
87
- },
88
- },
89
-
90
- handler: async function* wrappedHandler(
91
- ctx: Prettify<TContext>,
92
- params: TSchemaLib<TParams>
93
- ) {
94
- // Create abort controller for this stream
95
- const abortController = new AbortController()
96
-
97
- // Skip validation if caller has already validated (e.g., HonoAppBuilder) or if builder config dictates noRuntimeValidation
98
- const skipValidation =
99
- (ctx as { isPrevalidated?: boolean }).isPrevalidated ||
100
- builder?.config?.noRuntimeValidation
101
-
102
- if (validations?.params && !skipValidation) {
103
- const { errors } = validations.params(params)
104
-
105
- if (errors) {
106
- throw new ProcedureValidationError(
107
- name,
108
- `Validation error for ${name}`,
109
- errors,
110
- definitionInfo
111
- )
112
- }
113
- }
114
-
115
- // Combine with external signal (e.g., from HTTP request) if provided
116
- const incomingSignal = (ctx as { signal?: AbortSignal }).signal
117
- const signal = incomingSignal
118
- ? AbortSignal.any([incomingSignal, abortController.signal])
119
- : abortController.signal
120
-
121
- const streamCtx: TStreamContext = {
122
- error: errorFactory,
123
- signal,
124
- }
125
-
126
- // params is correctly typed at the public API boundary via conditional type;
127
- // cast here because TS cannot narrow conditional generics inside implementations
128
- const userGenerator = handler(
129
- {
130
- ...ctx,
131
- ...streamCtx,
132
- } as Prettify<TContext & TStreamContext>,
133
- params as any
134
- )
135
-
136
- const userIterator = userGenerator[Symbol.asyncIterator]()
137
- try {
138
- let userIterResult = await userIterator.next()
139
-
140
- while (!userIterResult.done) {
141
- const value = userIterResult.value
142
-
143
- // Only validate if explicitly enabled via validateYields: true
144
- if (validateYields && validations.yield) {
145
- const { errors } = validations.yield(value)
146
- if (errors) {
147
- throw new ProcedureYieldValidationError(
148
- name,
149
- `Yield validation error for ${name}`,
150
- errors,
151
- definitionInfo
152
- )
153
- }
154
- }
155
-
156
- yield value
157
- userIterResult = await userIterator.next()
158
- }
159
-
160
- // Propagate the generator's return value so consumers (e.g. HonoAppBuilder)
161
- // can send it as a special 'return' SSE event
162
- return userIterResult.value
163
- } catch (error: any) {
164
- // Preserve the original error class so HTTP builders' taxonomies and
165
- // `onMidStreamError` callbacks see the actual thrown type — boxing
166
- // user-defined errors inside ProcedureError defeats route-declared
167
- // typed-error dispatch on the client. Augment the stack trace in
168
- // place with the procedure's definition site when available.
169
- if (definitionInfo.definedAt && error && typeof error.stack === 'string') {
170
- const { file, line, column } = definitionInfo.definedAt
171
- error.stack = `${error.stack}\n--- Procedure "${name}" defined at ---\n at ${file}:${line}:${column}`
172
- }
173
- throw error
174
- } finally {
175
- // Propagate `.return()` to the user generator so its `finally`
176
- // blocks (and any `signal`-driven cleanup) run when the consumer
177
- // closes the stream early. No-op when iteration already completed.
178
- try {
179
- await userIterator.return?.(undefined)
180
- } catch {
181
- // Swallow — cleanup must not mask the primary error path
182
- }
183
- abortController.abort('stream-completed')
184
- }
185
- } as (ctx: TContext, params?: any) => AsyncGenerator<any, any, unknown>,
186
- }
187
-
188
- procedures.set(name, registeredProcedure)
189
- builder?.onCreate?.(registeredProcedure)
190
-
191
- const info = {
192
- name,
193
- isStream: true as const,
194
- ...registeredProcedure.config,
195
- }
196
-
197
- // return so can be called directly (ie: int/unit tests)
198
- return {
199
- [name]: registeredProcedure.handler,
200
- procedure: registeredProcedure.handler,
201
- info,
202
- } as {
203
- [K in TName]: (
204
- ctx: Prettify<TContext>,
205
- params: TSchemaLib<TParams>
206
- ) => AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
207
- } & {
208
- procedure: (
209
- ctx: Prettify<TContext>,
210
- params: TSchemaLib<TParams>
211
- ) => AsyncGenerator<TSchemaLib<TYieldType>, TSchemaLib<TReturnType> | void, unknown>
212
- info: {
213
- name: TName
214
- isStream: true
215
- description?: string
216
- schema: {
217
- params?: TParams
218
- yieldType?: TYieldType
219
- returnType?: TReturnType
220
- }
221
- validation?: {
222
- params?: (params: any) => { errors?: any[] }
223
- yield?: (value: any) => { errors?: any[] }
224
- }
225
- } & TExtendedConfig
226
- }
227
- }
228
- }