ts-procedures 8.5.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 (635) 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-index.js +13 -0
  103. package/build/codegen/emit-index.js.map +1 -1
  104. package/build/codegen/emit-index.test.js +25 -0
  105. package/build/codegen/emit-index.test.js.map +1 -1
  106. package/build/codegen/emit-scope.d.ts +13 -30
  107. package/build/codegen/emit-scope.js +15 -807
  108. package/build/codegen/emit-scope.js.map +1 -1
  109. package/build/codegen/emit-scope.test.js +86 -4
  110. package/build/codegen/emit-scope.test.js.map +1 -1
  111. package/build/codegen/goldens.test.js +69 -0
  112. package/build/codegen/goldens.test.js.map +1 -0
  113. package/build/codegen/group-routes.d.ts +1 -1
  114. package/build/codegen/pipeline.d.ts +1 -1
  115. package/build/codegen/resolve-envelope.d.ts +1 -1
  116. package/build/codegen/targets/_shared/error-schemas.d.ts +1 -1
  117. package/build/codegen/targets/_shared/route-slots.d.ts +1 -1
  118. package/build/codegen/targets/_shared/target-run.d.ts +1 -1
  119. package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +1 -1
  120. package/build/codegen/targets/swift/emit-route-swift.d.ts +1 -1
  121. package/build/core/create-http-stream.d.ts +50 -0
  122. package/build/core/create-http-stream.js +108 -0
  123. package/build/core/create-http-stream.js.map +1 -0
  124. package/build/{create-http-stream.test.js → core/create-http-stream.test.js} +1 -1
  125. package/build/core/create-http-stream.test.js.map +1 -0
  126. package/build/core/create-http.d.ts +51 -0
  127. package/build/core/create-http.js +65 -0
  128. package/build/core/create-http.js.map +1 -0
  129. package/build/{create-http.test.js → core/create-http.test.js} +13 -4
  130. package/build/core/create-http.test.js.map +1 -0
  131. package/build/core/create-stream.d.ts +26 -0
  132. package/build/core/create-stream.js +80 -0
  133. package/build/core/create-stream.js.map +1 -0
  134. package/build/{create-stream.test.js → core/create-stream.test.js} +23 -28
  135. package/build/core/create-stream.test.js.map +1 -0
  136. package/build/core/create.d.ts +22 -0
  137. package/build/core/create.js +71 -0
  138. package/build/core/create.js.map +1 -0
  139. package/build/{create.test.js → core/create.test.js} +25 -46
  140. package/build/core/create.test.js.map +1 -0
  141. package/build/core/definition-site.d.ts +24 -0
  142. package/build/{stack-utils.js → core/definition-site.js} +20 -20
  143. package/build/core/definition-site.js.map +1 -0
  144. package/build/{stack-utils.test.js → core/definition-site.test.js} +12 -3
  145. package/build/core/definition-site.test.js.map +1 -0
  146. package/build/{errors.d.ts → core/errors.d.ts} +19 -8
  147. package/build/{errors.js → core/errors.js} +21 -26
  148. package/build/core/errors.js.map +1 -0
  149. package/build/core/errors.test.js.map +1 -0
  150. package/build/core/factory-options.test.js +82 -0
  151. package/build/core/factory-options.test.js.map +1 -0
  152. package/build/core/http-route.d.ts +13 -0
  153. package/build/core/http-route.js +54 -0
  154. package/build/core/http-route.js.map +1 -0
  155. package/build/core/internal.d.ts +72 -0
  156. package/build/core/internal.js +128 -0
  157. package/build/core/internal.js.map +1 -0
  158. package/build/{migration.test.js → core/migration.test.js} +17 -1
  159. package/build/core/migration.test.js.map +1 -0
  160. package/build/core/procedures.d.ts +143 -0
  161. package/build/core/procedures.js +64 -0
  162. package/build/core/procedures.js.map +1 -0
  163. package/build/{index.test.js → core/procedures.test.js} +14 -11
  164. package/build/core/procedures.test.js.map +1 -0
  165. package/build/core/types.d.ts +182 -0
  166. package/build/{schema → core}/types.js.map +1 -1
  167. package/build/exports.d.ts +31 -11
  168. package/build/exports.js +23 -8
  169. package/build/exports.js.map +1 -1
  170. package/build/schema/adapter.d.ts +35 -0
  171. package/build/schema/adapter.js +13 -0
  172. package/build/schema/adapter.js.map +1 -0
  173. package/build/schema/adapter.test.js +53 -0
  174. package/build/schema/adapter.test.js.map +1 -0
  175. package/build/schema/compile.d.ts +37 -0
  176. package/build/schema/compile.js +38 -0
  177. package/build/schema/compile.js.map +1 -0
  178. package/build/schema/compile.test.js +78 -0
  179. package/build/schema/compile.test.js.map +1 -0
  180. package/build/schema/compute-schema.d.ts +47 -37
  181. package/build/schema/compute-schema.js +86 -29
  182. package/build/schema/compute-schema.js.map +1 -1
  183. package/build/schema/compute-schema.test.js +158 -40
  184. package/build/schema/compute-schema.test.js.map +1 -1
  185. package/build/schema/json-schema.d.ts +17 -0
  186. package/build/schema/json-schema.js +2 -0
  187. package/build/schema/json-schema.js.map +1 -0
  188. package/build/schema/typebox.d.ts +11 -0
  189. package/build/schema/typebox.js +24 -0
  190. package/build/schema/typebox.js.map +1 -0
  191. package/build/schema/typebox.test.js +34 -0
  192. package/build/schema/typebox.test.js.map +1 -0
  193. package/build/server/context.d.ts +8 -0
  194. package/build/server/context.js +7 -0
  195. package/build/server/context.js.map +1 -0
  196. package/build/server/context.test.js +16 -0
  197. package/build/server/context.test.js.map +1 -0
  198. package/build/{doc-envelope.d.ts → server/doc-envelope.d.ts} +1 -1
  199. package/build/server/doc-envelope.js.map +1 -0
  200. package/build/server/doc-envelope.test.d.ts +1 -0
  201. package/build/server/doc-envelope.test.js.map +1 -0
  202. package/build/{implementations/http → server}/doc-registry.d.ts +7 -2
  203. package/build/{implementations/http → server}/doc-registry.js +9 -5
  204. package/build/server/doc-registry.js.map +1 -0
  205. package/build/server/doc-registry.test.d.ts +1 -0
  206. package/build/{implementations/http → server}/doc-registry.test.js +27 -24
  207. package/build/server/doc-registry.test.js.map +1 -0
  208. package/build/server/docs/docs.test.d.ts +1 -0
  209. package/build/server/docs/docs.test.js +237 -0
  210. package/build/server/docs/docs.test.js.map +1 -0
  211. package/build/{implementations/http/hono → server}/docs/http-doc.d.ts +2 -2
  212. package/build/{implementations/http/hono → server}/docs/http-doc.js +1 -1
  213. package/build/server/docs/http-doc.js.map +1 -0
  214. package/build/{implementations/http/hono → server}/docs/http-stream-doc.d.ts +2 -2
  215. package/build/{implementations/http/hono → server}/docs/http-stream-doc.js +1 -1
  216. package/build/server/docs/http-stream-doc.js.map +1 -0
  217. package/build/{implementations/http/hono → server}/docs/rpc-doc.d.ts +2 -2
  218. package/build/{implementations/http/hono → server}/docs/rpc-doc.js +1 -1
  219. package/build/server/docs/rpc-doc.js.map +1 -0
  220. package/build/{implementations/http/hono → server}/docs/stream-doc.d.ts +2 -2
  221. package/build/{implementations/http/hono → server}/docs/stream-doc.js +1 -1
  222. package/build/server/docs/stream-doc.js.map +1 -0
  223. package/build/server/errors/dispatch.d.ts +96 -0
  224. package/build/{implementations/http/error-dispatch.js → server/errors/dispatch.js} +20 -10
  225. package/build/server/errors/dispatch.js.map +1 -0
  226. package/build/server/errors/dispatch.test.d.ts +1 -0
  227. package/build/server/errors/dispatch.test.js +418 -0
  228. package/build/server/errors/dispatch.test.js.map +1 -0
  229. package/build/{implementations/http/error-taxonomy.d.ts → server/errors/taxonomy.d.ts} +8 -17
  230. package/build/{implementations/http/error-taxonomy.js → server/errors/taxonomy.js} +6 -15
  231. package/build/server/errors/taxonomy.js.map +1 -0
  232. package/build/server/errors/taxonomy.test.d.ts +1 -0
  233. package/build/{implementations/http/error-taxonomy.test.js → server/errors/taxonomy.test.js} +45 -39
  234. package/build/server/errors/taxonomy.test.js.map +1 -0
  235. package/build/server/index.d.ts +29 -0
  236. package/build/server/index.js +27 -0
  237. package/build/server/index.js.map +1 -0
  238. package/build/server/no-framework-imports.test.d.ts +1 -0
  239. package/build/server/no-framework-imports.test.js +40 -0
  240. package/build/server/no-framework-imports.test.js.map +1 -0
  241. package/build/{implementations/http/hono/path.d.ts → server/paths.d.ts} +2 -3
  242. package/build/{implementations/http/hono/path.js → server/paths.js} +1 -1
  243. package/build/server/paths.js.map +1 -0
  244. package/build/server/paths.test.d.ts +1 -0
  245. package/build/server/paths.test.js +111 -0
  246. package/build/server/paths.test.js.map +1 -0
  247. package/build/server/request/params.d.ts +29 -0
  248. package/build/server/request/params.js +43 -0
  249. package/build/server/request/params.js.map +1 -0
  250. package/build/server/request/params.test.d.ts +1 -0
  251. package/build/server/request/params.test.js +91 -0
  252. package/build/server/request/params.test.js.map +1 -0
  253. package/build/server/request/query.d.ts +9 -0
  254. package/build/server/request/query.js +22 -0
  255. package/build/server/request/query.js.map +1 -0
  256. package/build/server/request/query.test.d.ts +1 -0
  257. package/build/server/request/query.test.js +60 -0
  258. package/build/server/request/query.test.js.map +1 -0
  259. package/build/server/sse.d.ts +70 -0
  260. package/build/server/sse.js +94 -0
  261. package/build/server/sse.js.map +1 -0
  262. package/build/server/sse.test.d.ts +1 -0
  263. package/build/server/sse.test.js +98 -0
  264. package/build/server/sse.test.js.map +1 -0
  265. package/build/{implementations → server}/types.d.ts +17 -15
  266. package/build/{implementations → server}/types.js.map +1 -1
  267. package/docs/astro-adapter.md +8 -9
  268. package/docs/client-and-codegen.md +4 -4
  269. package/docs/client-error-handling.md +92 -5
  270. package/docs/codegen-kotlin.md +2 -3
  271. package/docs/codegen-swift.md +1 -2
  272. package/docs/core.md +135 -54
  273. package/docs/http-integrations.md +83 -6
  274. package/docs/migration-v8-to-v9.md +192 -0
  275. package/docs/plans/2026-06-09-v9-rewrite.md +130 -0
  276. package/docs/specs/2026-06-09-v9-rewrite-design.md +221 -0
  277. package/docs/streaming.md +12 -0
  278. package/package.json +23 -47
  279. package/src/{implementations/http → adapters}/astro/index.test.ts +2 -2
  280. package/src/adapters/hono/__fixtures__/parity-envelope.json +389 -0
  281. package/src/adapters/hono/envelope-parity.test.ts +126 -0
  282. package/src/{implementations/http → adapters}/hono/handlers/http-stream.test.ts +1 -1
  283. package/src/adapters/hono/handlers/http-stream.ts +73 -0
  284. package/src/{implementations/http → adapters}/hono/handlers/http.test.ts +1 -1
  285. package/src/adapters/hono/handlers/http.ts +70 -0
  286. package/src/{implementations/http → adapters}/hono/handlers/rpc.test.ts +2 -2
  287. package/src/adapters/hono/handlers/rpc.ts +39 -0
  288. package/src/{implementations/http → adapters}/hono/handlers/stream.test.ts +4 -3
  289. package/src/{implementations/http → adapters}/hono/handlers/stream.ts +19 -92
  290. package/src/{implementations/http → adapters}/hono/index.test.ts +14 -16
  291. package/src/{implementations/http → adapters}/hono/index.ts +35 -30
  292. package/src/{implementations/http → adapters/hono}/on-request-error.test.ts +3 -3
  293. package/src/adapters/hono/request.ts +28 -0
  294. package/src/{implementations/http → adapters/hono}/route-errors.test.ts +5 -5
  295. package/src/{implementations/http → adapters}/hono/types.ts +43 -20
  296. package/src/client/freeze.test.ts +41 -0
  297. package/src/client/typed-error-dispatch.test.ts +3 -3
  298. package/src/codegen/__fixtures__/make-envelope.ts +1 -1
  299. package/src/codegen/__fixtures__/models-envelope.json +310 -0
  300. package/src/codegen/__fixtures__/users-envelope.json +9 -0
  301. package/src/codegen/__goldens__/MANIFEST.json +85 -0
  302. package/src/codegen/__goldens__/kotlin-default--models/Billing.kt +112 -0
  303. package/src/codegen/__goldens__/kotlin-default--models/BillingReports.kt +26 -0
  304. package/src/codegen/__goldens__/kotlin-default--models/Orders.kt +88 -0
  305. package/src/codegen/__goldens__/kotlin-default--users/Users.kt +189 -0
  306. package/src/codegen/__goldens__/swift-default--models/Billing.swift +97 -0
  307. package/src/codegen/__goldens__/swift-default--models/BillingReports.swift +20 -0
  308. package/src/codegen/__goldens__/swift-default--models/Orders.swift +81 -0
  309. package/src/codegen/__goldens__/swift-default--users/Users.swift +204 -0
  310. package/src/codegen/__goldens__/ts-default--models/_client.ts +1319 -0
  311. package/src/codegen/__goldens__/ts-default--models/_errors.ts +90 -0
  312. package/src/codegen/__goldens__/ts-default--models/_models.ts +10 -0
  313. package/src/codegen/__goldens__/ts-default--models/_types.ts +502 -0
  314. package/src/codegen/__goldens__/ts-default--models/billing-reports.ts +29 -0
  315. package/src/codegen/__goldens__/ts-default--models/billing.ts +67 -0
  316. package/src/codegen/__goldens__/ts-default--models/index.ts +48 -0
  317. package/src/codegen/__goldens__/ts-default--models/orders.ts +80 -0
  318. package/src/codegen/__goldens__/ts-default--users/_client.ts +1319 -0
  319. package/src/codegen/__goldens__/ts-default--users/_errors.ts +90 -0
  320. package/src/codegen/__goldens__/ts-default--users/_types.ts +502 -0
  321. package/src/codegen/__goldens__/ts-default--users/index.ts +38 -0
  322. package/src/codegen/__goldens__/ts-default--users/users.ts +169 -0
  323. package/src/codegen/__goldens__/ts-external-runtime--models/_errors.ts +90 -0
  324. package/src/codegen/__goldens__/ts-external-runtime--models/_models.ts +10 -0
  325. package/src/codegen/__goldens__/ts-external-runtime--models/billing-reports.ts +29 -0
  326. package/src/codegen/__goldens__/ts-external-runtime--models/billing.ts +67 -0
  327. package/src/codegen/__goldens__/ts-external-runtime--models/index.ts +48 -0
  328. package/src/codegen/__goldens__/ts-external-runtime--models/orders.ts +80 -0
  329. package/src/codegen/__goldens__/ts-external-runtime--users/_errors.ts +90 -0
  330. package/src/codegen/__goldens__/ts-external-runtime--users/index.ts +38 -0
  331. package/src/codegen/__goldens__/ts-external-runtime--users/users.ts +169 -0
  332. package/src/codegen/__goldens__/ts-flat--models/_client.ts +1319 -0
  333. package/src/codegen/__goldens__/ts-flat--models/_errors.ts +87 -0
  334. package/src/codegen/__goldens__/ts-flat--models/_models.ts +10 -0
  335. package/src/codegen/__goldens__/ts-flat--models/_types.ts +502 -0
  336. package/src/codegen/__goldens__/ts-flat--models/billing-reports.ts +28 -0
  337. package/src/codegen/__goldens__/ts-flat--models/billing.ts +51 -0
  338. package/src/codegen/__goldens__/ts-flat--models/index.ts +42 -0
  339. package/src/codegen/__goldens__/ts-flat--models/orders.ts +73 -0
  340. package/src/codegen/__goldens__/ts-flat--users/_client.ts +1319 -0
  341. package/src/codegen/__goldens__/ts-flat--users/_errors.ts +87 -0
  342. package/src/codegen/__goldens__/ts-flat--users/_types.ts +502 -0
  343. package/src/codegen/__goldens__/ts-flat--users/index.ts +34 -0
  344. package/src/codegen/__goldens__/ts-flat--users/users.ts +126 -0
  345. package/src/codegen/__goldens__/ts-no-share-models--models/_client.ts +1319 -0
  346. package/src/codegen/__goldens__/ts-no-share-models--models/_errors.ts +90 -0
  347. package/src/codegen/__goldens__/ts-no-share-models--models/_types.ts +502 -0
  348. package/src/codegen/__goldens__/ts-no-share-models--models/billing-reports.ts +29 -0
  349. package/src/codegen/__goldens__/ts-no-share-models--models/billing.ts +111 -0
  350. package/src/codegen/__goldens__/ts-no-share-models--models/index.ts +48 -0
  351. package/src/codegen/__goldens__/ts-no-share-models--models/orders.ts +112 -0
  352. package/src/codegen/__goldens__/ts-no-share-models--users/_client.ts +1319 -0
  353. package/src/codegen/__goldens__/ts-no-share-models--users/_errors.ts +90 -0
  354. package/src/codegen/__goldens__/ts-no-share-models--users/_types.ts +502 -0
  355. package/src/codegen/__goldens__/ts-no-share-models--users/index.ts +38 -0
  356. package/src/codegen/__goldens__/ts-no-share-models--users/users.ts +169 -0
  357. package/src/codegen/__goldens__/ts-shared-models-module--models/_client.ts +1319 -0
  358. package/src/codegen/__goldens__/ts-shared-models-module--models/_errors.ts +90 -0
  359. package/src/codegen/__goldens__/ts-shared-models-module--models/_models.ts +7 -0
  360. package/src/codegen/__goldens__/ts-shared-models-module--models/_types.ts +502 -0
  361. package/src/codegen/__goldens__/ts-shared-models-module--models/billing-reports.ts +29 -0
  362. package/src/codegen/__goldens__/ts-shared-models-module--models/billing.ts +67 -0
  363. package/src/codegen/__goldens__/ts-shared-models-module--models/index.ts +48 -0
  364. package/src/codegen/__goldens__/ts-shared-models-module--models/orders.ts +80 -0
  365. package/src/codegen/bin/cli.test.ts +13 -2
  366. package/src/codegen/bin/cli.ts +181 -144
  367. package/src/codegen/bin/flag-specs.test.ts +16 -1
  368. package/src/codegen/bin/flag-specs.ts +43 -31
  369. package/src/codegen/bundle-size.test.ts +1 -1
  370. package/src/codegen/collect-models.ts +1 -1
  371. package/src/codegen/e2e.test.ts +1 -1
  372. package/src/codegen/emit/api-route.ts +184 -0
  373. package/src/codegen/emit/context.ts +32 -0
  374. package/src/codegen/emit/declarations.ts +49 -0
  375. package/src/codegen/emit/format-types.ts +232 -0
  376. package/src/codegen/emit/http-stream-route.ts +162 -0
  377. package/src/codegen/emit/route-shared.ts +102 -0
  378. package/src/codegen/emit/rpc-route.ts +49 -0
  379. package/src/codegen/emit/scope-file.ts +226 -0
  380. package/src/codegen/emit/stream-route.ts +81 -0
  381. package/src/codegen/emit-errors.integration.test.ts +2 -2
  382. package/src/codegen/emit-errors.test.ts +1 -1
  383. package/src/codegen/emit-errors.ts +1 -1
  384. package/src/codegen/emit-index.test.ts +34 -0
  385. package/src/codegen/emit-index.ts +19 -0
  386. package/src/codegen/emit-scope.test.ts +96 -6
  387. package/src/codegen/emit-scope.ts +15 -1003
  388. package/src/codegen/goldens.test.ts +89 -0
  389. package/src/codegen/group-routes.test.ts +1 -1
  390. package/src/codegen/group-routes.ts +1 -1
  391. package/src/codegen/pipeline.test.ts +1 -1
  392. package/src/codegen/pipeline.ts +1 -1
  393. package/src/codegen/resolve-envelope.test.ts +1 -1
  394. package/src/codegen/resolve-envelope.ts +1 -1
  395. package/src/codegen/targets/_shared/error-schemas.test.ts +1 -1
  396. package/src/codegen/targets/_shared/error-schemas.ts +1 -1
  397. package/src/codegen/targets/_shared/route-slots.test.ts +1 -1
  398. package/src/codegen/targets/_shared/route-slots.ts +1 -1
  399. package/src/codegen/targets/_shared/target-run.ts +1 -1
  400. package/src/codegen/targets/kotlin/__fixtures__/users-golden.kt +6 -0
  401. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +1 -1
  402. package/src/codegen/targets/kotlin/emit-route-kotlin.ts +1 -1
  403. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +1 -1
  404. package/src/codegen/targets/swift/__fixtures__/users-golden.swift +6 -0
  405. package/src/codegen/targets/swift/access-level.test.ts +1 -1
  406. package/src/codegen/targets/swift/emit-route-swift.test.ts +1 -1
  407. package/src/codegen/targets/swift/emit-route-swift.ts +1 -1
  408. package/src/codegen/targets/swift/emit-scope-swift.test.ts +1 -1
  409. package/src/codegen/targets/ts/shared-models.test.ts +1 -1
  410. package/src/{create-http-stream.test.ts → core/create-http-stream.test.ts} +1 -1
  411. package/src/core/create-http-stream.ts +207 -0
  412. package/src/{create-http.test.ts → core/create-http.test.ts} +15 -4
  413. package/src/core/create-http.ts +126 -0
  414. package/src/{create-stream.test.ts → core/create-stream.test.ts} +28 -31
  415. package/src/core/create-stream.ts +142 -0
  416. package/src/{create.test.ts → core/create.test.ts} +25 -57
  417. package/src/core/create.ts +121 -0
  418. package/src/{stack-utils.test.ts → core/definition-site.test.ts} +14 -3
  419. package/src/{stack-utils.ts → core/definition-site.ts} +20 -23
  420. package/src/{errors.test.ts → core/errors.test.ts} +1 -1
  421. package/src/{errors.ts → core/errors.ts} +30 -28
  422. package/src/core/factory-options.test.ts +112 -0
  423. package/src/core/http-route.ts +73 -0
  424. package/src/core/internal.ts +203 -0
  425. package/src/{migration.test.ts → core/migration.test.ts} +23 -1
  426. package/src/{index.test.ts → core/procedures.test.ts} +13 -11
  427. package/src/core/procedures.ts +75 -0
  428. package/src/core/types.ts +195 -0
  429. package/src/exports.ts +60 -11
  430. package/src/schema/adapter.test.ts +58 -0
  431. package/src/schema/adapter.ts +45 -0
  432. package/src/schema/compile.test.ts +95 -0
  433. package/src/schema/compile.ts +64 -0
  434. package/src/schema/compute-schema.test.ts +222 -41
  435. package/src/schema/compute-schema.ts +145 -71
  436. package/src/schema/json-schema.ts +21 -0
  437. package/src/schema/typebox.test.ts +40 -0
  438. package/src/schema/typebox.ts +27 -0
  439. package/src/server/context.test.ts +22 -0
  440. package/src/server/context.ts +18 -0
  441. package/src/{doc-envelope.test.ts → server/doc-envelope.test.ts} +2 -2
  442. package/src/{doc-envelope.ts → server/doc-envelope.ts} +1 -1
  443. package/src/{implementations/http → server}/doc-registry.test.ts +32 -26
  444. package/src/{implementations/http → server}/doc-registry.ts +11 -7
  445. package/src/server/docs/docs.test.ts +287 -0
  446. package/src/{implementations/http/hono → server}/docs/http-doc.ts +3 -3
  447. package/src/{implementations/http/hono → server}/docs/http-stream-doc.ts +3 -3
  448. package/src/{implementations/http/hono → server}/docs/rpc-doc.ts +3 -3
  449. package/src/{implementations/http/hono → server}/docs/stream-doc.ts +3 -3
  450. package/src/server/errors/dispatch.test.ts +450 -0
  451. package/src/server/errors/dispatch.ts +189 -0
  452. package/src/{implementations/http/error-taxonomy.test.ts → server/errors/taxonomy.test.ts} +45 -39
  453. package/src/{implementations/http/error-taxonomy.ts → server/errors/taxonomy.ts} +8 -17
  454. package/src/server/index.ts +29 -0
  455. package/src/server/no-framework-imports.test.ts +43 -0
  456. package/src/server/paths.test.ts +141 -0
  457. package/src/{implementations/http/hono/path.ts → server/paths.ts} +2 -13
  458. package/src/server/request/params.test.ts +143 -0
  459. package/src/server/request/params.ts +68 -0
  460. package/src/server/request/query.test.ts +70 -0
  461. package/src/server/request/query.ts +24 -0
  462. package/src/server/sse.test.ts +113 -0
  463. package/src/server/sse.ts +117 -0
  464. package/src/{implementations → server}/types.ts +17 -16
  465. package/build/create-http-stream.d.ts +0 -58
  466. package/build/create-http-stream.js +0 -122
  467. package/build/create-http-stream.js.map +0 -1
  468. package/build/create-http-stream.test.js.map +0 -1
  469. package/build/create-http.d.ts +0 -49
  470. package/build/create-http.js +0 -108
  471. package/build/create-http.js.map +0 -1
  472. package/build/create-http.test.js.map +0 -1
  473. package/build/create-stream.d.ts +0 -35
  474. package/build/create-stream.js +0 -123
  475. package/build/create-stream.js.map +0 -1
  476. package/build/create-stream.test.js.map +0 -1
  477. package/build/create.d.ts +0 -28
  478. package/build/create.js +0 -82
  479. package/build/create.js.map +0 -1
  480. package/build/create.test.js.map +0 -1
  481. package/build/doc-envelope.js.map +0 -1
  482. package/build/doc-envelope.test.js.map +0 -1
  483. package/build/errors.js.map +0 -1
  484. package/build/errors.test.js.map +0 -1
  485. package/build/implementations/http/astro/astro-context.js.map +0 -1
  486. package/build/implementations/http/astro/create-handler.js.map +0 -1
  487. package/build/implementations/http/astro/index.js.map +0 -1
  488. package/build/implementations/http/astro/index.test.js.map +0 -1
  489. package/build/implementations/http/astro/rewrite-request.js.map +0 -1
  490. package/build/implementations/http/doc-registry.js.map +0 -1
  491. package/build/implementations/http/doc-registry.test.js.map +0 -1
  492. package/build/implementations/http/error-dispatch.d.ts +0 -76
  493. package/build/implementations/http/error-dispatch.js.map +0 -1
  494. package/build/implementations/http/error-dispatch.test.js +0 -254
  495. package/build/implementations/http/error-dispatch.test.js.map +0 -1
  496. package/build/implementations/http/error-taxonomy.js.map +0 -1
  497. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  498. package/build/implementations/http/hono/docs/http-doc.js.map +0 -1
  499. package/build/implementations/http/hono/docs/http-stream-doc.js.map +0 -1
  500. package/build/implementations/http/hono/docs/rpc-doc.js.map +0 -1
  501. package/build/implementations/http/hono/docs/stream-doc.js.map +0 -1
  502. package/build/implementations/http/hono/handlers/http-stream.js +0 -123
  503. package/build/implementations/http/hono/handlers/http-stream.js.map +0 -1
  504. package/build/implementations/http/hono/handlers/http-stream.test.js.map +0 -1
  505. package/build/implementations/http/hono/handlers/http.js +0 -110
  506. package/build/implementations/http/hono/handlers/http.js.map +0 -1
  507. package/build/implementations/http/hono/handlers/http.test.js.map +0 -1
  508. package/build/implementations/http/hono/handlers/rpc.js +0 -32
  509. package/build/implementations/http/hono/handlers/rpc.js.map +0 -1
  510. package/build/implementations/http/hono/handlers/rpc.test.js.map +0 -1
  511. package/build/implementations/http/hono/handlers/stream.d.ts +0 -23
  512. package/build/implementations/http/hono/handlers/stream.js +0 -147
  513. package/build/implementations/http/hono/handlers/stream.js.map +0 -1
  514. package/build/implementations/http/hono/handlers/stream.test.js.map +0 -1
  515. package/build/implementations/http/hono/index.js.map +0 -1
  516. package/build/implementations/http/hono/index.test.js.map +0 -1
  517. package/build/implementations/http/hono/path.js.map +0 -1
  518. package/build/implementations/http/hono/path.test.js +0 -83
  519. package/build/implementations/http/hono/path.test.js.map +0 -1
  520. package/build/implementations/http/hono/types.d.ts +0 -51
  521. package/build/implementations/http/hono/types.js.map +0 -1
  522. package/build/implementations/http/on-request-error.test.js.map +0 -1
  523. package/build/implementations/http/route-errors.test.js.map +0 -1
  524. package/build/index.d.ts +0 -175
  525. package/build/index.js +0 -47
  526. package/build/index.js.map +0 -1
  527. package/build/index.test.js.map +0 -1
  528. package/build/migration.test.js.map +0 -1
  529. package/build/schema/extract-json-schema.d.ts +0 -2
  530. package/build/schema/extract-json-schema.js +0 -12
  531. package/build/schema/extract-json-schema.js.map +0 -1
  532. package/build/schema/extract-json-schema.test.js +0 -23
  533. package/build/schema/extract-json-schema.test.js.map +0 -1
  534. package/build/schema/parser.d.ts +0 -36
  535. package/build/schema/parser.js +0 -210
  536. package/build/schema/parser.js.map +0 -1
  537. package/build/schema/parser.test.js +0 -120
  538. package/build/schema/parser.test.js.map +0 -1
  539. package/build/schema/resolve-schema-lib.d.ts +0 -12
  540. package/build/schema/resolve-schema-lib.js +0 -11
  541. package/build/schema/resolve-schema-lib.js.map +0 -1
  542. package/build/schema/resolve-schema-lib.test.js +0 -17
  543. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  544. package/build/schema/types.d.ts +0 -8
  545. package/build/schema/types.js +0 -2
  546. package/build/stack-utils.d.ts +0 -25
  547. package/build/stack-utils.js.map +0 -1
  548. package/build/stack-utils.test.js.map +0 -1
  549. package/build/types.d.ts +0 -142
  550. package/build/types.js +0 -2
  551. package/build/types.js.map +0 -1
  552. package/docs/decisions/2026-06-02-monorepo-split-evaluation.md +0 -80
  553. package/docs/handoffs/ajsc-named-type-collision.md +0 -134
  554. package/docs/handoffs/ajsc-named-type-support.md +0 -181
  555. package/docs/handoffs/shared-models-auto-resolve-response.md +0 -181
  556. package/docs/npm-workspaces-migration-plan.md +0 -611
  557. package/docs/superpowers/plans/2026-04-24-doc-registry-simplification.md +0 -886
  558. package/docs/superpowers/plans/2026-04-24-kotlin-codegen-target.md +0 -1265
  559. package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +0 -1993
  560. package/docs/superpowers/plans/2026-04-29-safe-result-api.md +0 -2293
  561. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +0 -1391
  562. package/docs/superpowers/plans/2026-05-08-create-http.md +0 -3355
  563. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +0 -3365
  564. package/docs/superpowers/plans/2026-06-05-dx-feedback-round.md +0 -1292
  565. package/docs/superpowers/plans/2026-06-06-shared-models-convention-and-diagnostics.md +0 -659
  566. package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +0 -401
  567. package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +0 -314
  568. package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +0 -264
  569. package/docs/superpowers/specs/2026-04-29-safe-result-api-design.md +0 -324
  570. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +0 -252
  571. package/docs/superpowers/specs/2026-05-08-create-http-design.md +0 -409
  572. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +0 -411
  573. package/docs/superpowers/specs/2026-06-05-dx-feedback-round-design.md +0 -285
  574. package/src/create-http-stream.ts +0 -191
  575. package/src/create-http.ts +0 -210
  576. package/src/create-stream.ts +0 -228
  577. package/src/create.ts +0 -172
  578. package/src/implementations/http/README.md +0 -390
  579. package/src/implementations/http/error-dispatch.test.ts +0 -283
  580. package/src/implementations/http/error-dispatch.ts +0 -176
  581. package/src/implementations/http/hono/handlers/http-stream.ts +0 -152
  582. package/src/implementations/http/hono/handlers/http.ts +0 -145
  583. package/src/implementations/http/hono/handlers/rpc.ts +0 -54
  584. package/src/implementations/http/hono/path.test.ts +0 -96
  585. package/src/index.ts +0 -101
  586. package/src/schema/extract-json-schema.test.ts +0 -25
  587. package/src/schema/extract-json-schema.ts +0 -15
  588. package/src/schema/parser.test.ts +0 -182
  589. package/src/schema/parser.ts +0 -265
  590. package/src/schema/resolve-schema-lib.test.ts +0 -19
  591. package/src/schema/resolve-schema-lib.ts +0 -29
  592. package/src/schema/types.ts +0 -20
  593. package/src/types.ts +0 -133
  594. /package/build/{implementations/http → adapters}/astro/astro-context.d.ts +0 -0
  595. /package/build/{implementations/http → adapters}/astro/astro-context.js +0 -0
  596. /package/build/{implementations/http → adapters}/astro/create-handler.d.ts +0 -0
  597. /package/build/{implementations/http → adapters}/astro/create-handler.js +0 -0
  598. /package/build/{implementations/http → adapters}/astro/index.d.ts +0 -0
  599. /package/build/{implementations/http → adapters}/astro/index.js +0 -0
  600. /package/build/{implementations/http → adapters}/astro/index.test.d.ts +0 -0
  601. /package/build/{implementations/http → adapters}/astro/rewrite-request.d.ts +0 -0
  602. /package/build/{implementations/http → adapters}/astro/rewrite-request.js +0 -0
  603. /package/build/{create-http-stream.test.d.ts → adapters/hono/envelope-parity.test.d.ts} +0 -0
  604. /package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.d.ts +0 -0
  605. /package/build/{implementations/http → adapters}/hono/handlers/http.test.d.ts +0 -0
  606. /package/build/{implementations/http → adapters}/hono/handlers/rpc.test.d.ts +0 -0
  607. /package/build/{implementations/http → adapters}/hono/handlers/stream.test.d.ts +0 -0
  608. /package/build/{implementations/http → adapters}/hono/index.test.d.ts +0 -0
  609. /package/build/{implementations/http → adapters/hono}/on-request-error.test.d.ts +0 -0
  610. /package/build/{implementations/http → adapters/hono}/route-errors.test.d.ts +0 -0
  611. /package/build/{create-http.test.d.ts → client/freeze.test.d.ts} +0 -0
  612. /package/build/{create-stream.test.d.ts → codegen/goldens.test.d.ts} +0 -0
  613. /package/build/{create.test.d.ts → core/create-http-stream.test.d.ts} +0 -0
  614. /package/build/{doc-envelope.test.d.ts → core/create-http.test.d.ts} +0 -0
  615. /package/build/{errors.test.d.ts → core/create-stream.test.d.ts} +0 -0
  616. /package/build/{implementations/http/doc-registry.test.d.ts → core/create.test.d.ts} +0 -0
  617. /package/build/{implementations/http/error-dispatch.test.d.ts → core/definition-site.test.d.ts} +0 -0
  618. /package/build/{implementations/http/error-taxonomy.test.d.ts → core/errors.test.d.ts} +0 -0
  619. /package/build/{errors.test.js → core/errors.test.js} +0 -0
  620. /package/build/{implementations/http/hono/path.test.d.ts → core/factory-options.test.d.ts} +0 -0
  621. /package/build/{migration.test.d.ts → core/migration.test.d.ts} +0 -0
  622. /package/build/{index.test.d.ts → core/procedures.test.d.ts} +0 -0
  623. /package/build/{implementations/http/hono → core}/types.js +0 -0
  624. /package/build/schema/{extract-json-schema.test.d.ts → adapter.test.d.ts} +0 -0
  625. /package/build/schema/{parser.test.d.ts → compile.test.d.ts} +0 -0
  626. /package/build/schema/{resolve-schema-lib.test.d.ts → typebox.test.d.ts} +0 -0
  627. /package/build/{stack-utils.test.d.ts → server/context.test.d.ts} +0 -0
  628. /package/build/{doc-envelope.js → server/doc-envelope.js} +0 -0
  629. /package/build/{doc-envelope.test.js → server/doc-envelope.test.js} +0 -0
  630. /package/build/{implementations → server}/types.js +0 -0
  631. /package/src/{implementations/http → adapters}/astro/README.md +0 -0
  632. /package/src/{implementations/http → adapters}/astro/astro-context.ts +0 -0
  633. /package/src/{implementations/http → adapters}/astro/create-handler.ts +0 -0
  634. /package/src/{implementations/http → adapters}/astro/index.ts +0 -0
  635. /package/src/{implementations/http → adapters}/astro/rewrite-request.ts +0 -0
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { resolveFactoryContext } from './context.js'
3
+
4
+ describe('resolveFactoryContext', () => {
5
+ it('returns a plain value as-is', async () => {
6
+ const ctx = { db: 'x' }
7
+ await expect(resolveFactoryContext(ctx, { raw: true })).resolves.toBe(ctx)
8
+ })
9
+
10
+ it('invokes a sync function with the raw request context', async () => {
11
+ const raw = { url: '/a' }
12
+ await expect(
13
+ resolveFactoryContext((r: { url: string }) => ({ from: r.url }), raw),
14
+ ).resolves.toEqual({ from: '/a' })
15
+ })
16
+
17
+ it('awaits an async function', async () => {
18
+ await expect(
19
+ resolveFactoryContext(async () => ({ ready: true }), null),
20
+ ).resolves.toEqual({ ready: true })
21
+ })
22
+ })
@@ -0,0 +1,18 @@
1
+ /**
2
+ * A factory context as accepted by server adapters' `register()`: either the
3
+ * context value itself, or a function deriving it from the adapter's request
4
+ * context per request (sync or async).
5
+ */
6
+ export type FactoryContextInit<TContext, TRaw> =
7
+ | TContext
8
+ | ((raw: TRaw) => TContext | Promise<TContext>)
9
+
10
+ /** Resolves a {@link FactoryContextInit} for one request. */
11
+ export async function resolveFactoryContext<TContext, TRaw>(
12
+ init: FactoryContextInit<TContext, TRaw>,
13
+ raw: TRaw,
14
+ ): Promise<TContext> {
15
+ return typeof init === 'function'
16
+ ? await (init as (raw: TRaw) => TContext | Promise<TContext>)(raw)
17
+ : init
18
+ }
@@ -3,12 +3,12 @@ import { readFile, rm, mkdtemp } from 'node:fs/promises'
3
3
  import { tmpdir } from 'node:os'
4
4
  import { join } from 'node:path'
5
5
  import { writeDocEnvelope } from './doc-envelope.js'
6
- import type { DocEnvelope } from './implementations/types.js'
6
+ import type { DocEnvelope } from './types.js'
7
7
 
8
8
  const envelope: DocEnvelope = { basePath: '', headers: [], errors: [], routes: [] }
9
9
 
10
10
  describe('writeDocEnvelope', () => {
11
- let dir: string
11
+ let dir: string | undefined
12
12
  afterEach(async () => { if (dir) await rm(dir, { recursive: true, force: true }) })
13
13
 
14
14
  it('writes a plain DocEnvelope as pretty JSON', async () => {
@@ -1,6 +1,6 @@
1
1
  import { mkdir, writeFile } from 'node:fs/promises'
2
2
  import { dirname } from 'node:path'
3
- import type { DocEnvelope } from './implementations/types.js'
3
+ import type { DocEnvelope } from './types.js'
4
4
 
5
5
  export type DocEnvelopeSource =
6
6
  | DocEnvelope
@@ -1,10 +1,14 @@
1
1
  import { describe, expect, it, test, vi, afterEach } from 'vitest'
2
- import { v } from 'suretype'
3
2
  import { Type } from 'typebox'
4
- import { Procedures } from '../../index.js'
5
- import { HonoAppBuilder } from './hono/index.js'
3
+ import { Procedures } from '../core/procedures.js'
4
+ import type {
5
+ THttpStreamProcedureRegistration,
6
+ TProcedureRegistration,
7
+ } from '../core/types.js'
6
8
  import { DocRegistry } from './doc-registry.js'
7
- import { defineErrorTaxonomy } from './error-taxonomy.js'
9
+ import { defineErrorTaxonomy } from './errors/taxonomy.js'
10
+ import { buildRpcRouteDoc } from './docs/rpc-doc.js'
11
+ import { buildHttpStreamRouteDoc } from './docs/http-stream-doc.js'
8
12
  import type {
9
13
  AnyHttpRouteDoc,
10
14
  RPCHttpRouteDoc,
@@ -13,9 +17,8 @@ import type {
13
17
  StreamHttpRouteDoc,
14
18
  HttpStreamRouteDoc,
15
19
  DocSource,
16
- DocEnvelope,
17
20
  ErrorDoc,
18
- } from '../types.js'
21
+ } from './types.js'
19
22
 
20
23
  // ---------------------------------------------------------------------------
21
24
  // Helpers — minimal doc fixtures
@@ -111,17 +114,17 @@ describe('DocRegistry', () => {
111
114
  expect(result).toBe(registry)
112
115
  })
113
116
 
114
- test('accepts RPC builder source', () => {
117
+ test('accepts RPC doc source', () => {
115
118
  const registry = new DocRegistry().from(makeSource([rpcDoc]))
116
119
  expect(registry.toJSON().routes).toEqual([rpcDoc])
117
120
  })
118
121
 
119
- test('accepts API builder source', () => {
122
+ test('accepts API doc source', () => {
120
123
  const registry = new DocRegistry().from(makeSource([apiDoc]))
121
124
  expect(registry.toJSON().routes).toEqual([apiDoc])
122
125
  })
123
126
 
124
- test('accepts Stream builder source', () => {
127
+ test('accepts Stream doc source', () => {
125
128
  const registry = new DocRegistry().from(makeSource([streamDoc]))
126
129
  expect(registry.toJSON().routes).toEqual([streamDoc])
127
130
  })
@@ -132,13 +135,13 @@ describe('DocRegistry', () => {
132
135
  expect(registry.toJSON().routes).toHaveLength(2)
133
136
  })
134
137
 
135
- test('builder not yet built returns empty routes', () => {
138
+ test('source with no docs yet returns empty routes', () => {
136
139
  const emptySource = makeSource<RPCHttpRouteDoc>([])
137
140
  const registry = new DocRegistry().from(emptySource)
138
141
  expect(registry.toJSON().routes).toEqual([])
139
142
  })
140
143
 
141
- test('same builder twice duplicates routes', () => {
144
+ test('same source twice duplicates routes', () => {
142
145
  const source = makeSource([rpcDoc])
143
146
  const registry = new DocRegistry().from(source).from(source)
144
147
  expect(registry.toJSON().routes).toHaveLength(2)
@@ -313,7 +316,7 @@ describe('DocRegistry', () => {
313
316
  })
314
317
 
315
318
  // --------------------------------------------------------------------------
316
- // taxonomy input + auto-defaults + dedupe (v6.0.1 simplification)
319
+ // taxonomy input + auto-defaults + dedupe
317
320
  // --------------------------------------------------------------------------
318
321
  describe('errors: ErrorTaxonomy (polymorphic constructor input)', () => {
319
322
  test('accepts an ErrorTaxonomy directly and converts to ErrorDoc[]', () => {
@@ -327,8 +330,8 @@ describe('DocRegistry', () => {
327
330
  const envelope = new DocRegistry({ errors: taxonomy }).toJSON()
328
331
  const auth = envelope.errors.find((e) => e.name === 'AuthError')
329
332
  expect(auth).toBeDefined()
330
- expect(auth?.statusCode).toBe(401)
331
- expect(auth?.description).toBe('unauthenticated')
333
+ expect(auth!.statusCode).toBe(401)
334
+ expect(auth!.description).toBe('unauthenticated')
332
335
  })
333
336
 
334
337
  test('auto-includes framework defaults when errors is a taxonomy', () => {
@@ -495,7 +498,7 @@ describe('DocRegistry', () => {
495
498
  // Integration
496
499
  // --------------------------------------------------------------------------
497
500
  describe('integration', () => {
498
- test('multiple builder types composed', () => {
501
+ test('multiple doc kinds composed', () => {
499
502
  const registry = new DocRegistry({
500
503
  basePath: '/api',
501
504
  headers: [{ name: 'Authorization', description: 'Bearer token', required: false }],
@@ -597,7 +600,10 @@ describe('DocRegistry', () => {
597
600
  })
598
601
  })
599
602
 
600
- it('aggregates http-stream routes from HonoAppBuilder', () => {
603
+ // v8 used a built HonoAppBuilder as the source here; the hono adapter
604
+ // doesn't exist yet in v9 (Phase 3), so a plain DocSource backed by the
605
+ // real doc builders takes its place.
606
+ it('aggregates http-stream routes built from a real procedure registration', () => {
601
607
  const procs = Procedures()
602
608
  procs.CreateHttpStream('Tail', {
603
609
  path: '/streams/logs',
@@ -608,29 +614,29 @@ describe('DocRegistry', () => {
608
614
  },
609
615
  }, async function* () {})
610
616
 
611
- const builder = new HonoAppBuilder().register(procs, {})
612
- builder.build()
617
+ const reg = procs.getProcedures()[0]! as THttpStreamProcedureRegistration<any>
618
+ const source: DocSource = { docs: [buildHttpStreamRouteDoc(reg, undefined)] }
613
619
 
614
- const registry = new DocRegistry().from(builder)
620
+ const registry = new DocRegistry().from(source)
615
621
  const envelope = registry.toJSON()
616
622
  const route = envelope.routes.find((r) => r.name === 'Tail')
617
- expect(route?.kind).toBe('http-stream')
623
+ expect(route).toBeDefined()
624
+ expect(route!.kind).toBe('http-stream')
618
625
  })
619
626
 
620
- test('accepts a real HonoAppBuilder as source', () => {
627
+ test('accepts a real RPC registration via a plain DocSource', () => {
621
628
  const RPC = Procedures<{ userId: string }, RPCConfig>()
622
629
 
623
630
  RPC.Create(
624
631
  'Ping',
625
- { scope: 'ping', version: 1, schema: { params: v.object({ msg: v.string() }) } },
632
+ { scope: 'ping', version: 1, schema: { params: Type.Object({ msg: Type.String() }) } },
626
633
  async (_ctx, params) => params,
627
634
  )
628
635
 
629
- const builder = new HonoAppBuilder()
630
- builder.register(RPC, () => ({ userId: '123' }))
631
- builder.build()
636
+ const reg = RPC.getProcedures()[0]! as TProcedureRegistration<any, RPCConfig>
637
+ const source: DocSource = { docs: [buildRpcRouteDoc(reg, undefined)] }
632
638
 
633
- const registry = new DocRegistry({ basePath: '/rpc' }).from(builder)
639
+ const registry = new DocRegistry({ basePath: '/rpc' }).from(source)
634
640
  const out = registry.toJSON()
635
641
 
636
642
  expect(out.basePath).toBe('/rpc')
@@ -6,13 +6,13 @@ import type {
6
6
  DocSource,
7
7
  ErrorDoc,
8
8
  HeaderDoc,
9
- } from '../types.js'
9
+ } from './types.js'
10
10
  import {
11
11
  PROCEDURE_REGISTRATION_ERROR_DOC,
12
12
  defaultErrorTaxonomy,
13
13
  taxonomyToErrorDocs,
14
14
  type ErrorTaxonomy,
15
- } from './error-taxonomy.js'
15
+ } from './errors/taxonomy.js'
16
16
 
17
17
  export type {
18
18
  AnyHttpRouteDoc,
@@ -22,7 +22,7 @@ export type {
22
22
  DocSource,
23
23
  ErrorDoc,
24
24
  HeaderDoc,
25
- } from '../types.js'
25
+ } from './types.js'
26
26
 
27
27
  function isTaxonomy(input: ErrorTaxonomy | ErrorDoc[]): input is ErrorTaxonomy {
28
28
  return !Array.isArray(input)
@@ -38,6 +38,11 @@ function dedupeByName(docs: ErrorDoc[]): ErrorDoc[] {
38
38
  return Array.from(byName.values())
39
39
  }
40
40
 
41
+ /**
42
+ * Composes route docs from multiple builders into one {@link DocEnvelope}
43
+ * (multi-app aggregation). Single-app users prefer `builder.toDocEnvelope()`,
44
+ * which wraps this class.
45
+ */
41
46
  export class DocRegistry {
42
47
  private readonly basePath: string
43
48
  private readonly headers: HeaderDoc[]
@@ -88,10 +93,9 @@ export class DocRegistry {
88
93
  routes = routes.filter(options.filter)
89
94
  }
90
95
 
91
- // Surface coverage gaps — when a builder skipped procedures (e.g. a
92
- // streaming procedure registered with HonoAppBuilder), the per-builder
93
- // warning fires once at `build()` time, but consumers who only call
94
- // `registry.toJSON()` (e.g. to dump the envelope to disk for codegen)
96
+ // Surface coverage gaps — when a builder skipped procedures, the
97
+ // per-builder warning fires once at `build()` time, but consumers who only
98
+ // call `registry.toJSON()` (e.g. to dump the envelope to disk for codegen)
95
99
  // wouldn't see it without this aggregate. Single warning per call,
96
100
  // suppressed when the env var is set so CI pipelines stay quiet.
97
101
  if (process.env.TS_PROCEDURES_SUPPRESS_COVERAGE_WARNINGS !== '1') {
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Doc-builder tests — ported from the doc-builder parts of v8's
3
+ * route-errors.test.ts (the hono-server parts arrive with the Phase 3
4
+ * adapter). Covers config.errors propagation onto route docs plus the
5
+ * core doc shapes each builder emits.
6
+ */
7
+ import { describe, expect, test } from 'vitest'
8
+ import { Type } from 'typebox'
9
+ import { Procedures } from '../../core/procedures.js'
10
+ import type {
11
+ THttpProcedureRegistration,
12
+ THttpStreamProcedureRegistration,
13
+ TProcedureRegistration,
14
+ TStreamProcedureRegistration,
15
+ } from '../../core/types.js'
16
+ import type { APIConfig, RPCConfig } from '../types.js'
17
+ import { defineErrorTaxonomy } from '../errors/taxonomy.js'
18
+ import { buildRpcRouteDoc } from './rpc-doc.js'
19
+ import { buildStreamRouteDoc } from './stream-doc.js'
20
+ import { buildHttpRouteDoc } from './http-doc.js'
21
+ import { buildHttpStreamRouteDoc } from './http-stream-doc.js'
22
+
23
+ class UseCaseError extends Error {
24
+ constructor(readonly externalMsg: string) {
25
+ super(externalMsg)
26
+ this.name = 'UseCaseError'
27
+ Object.setPrototypeOf(this, UseCaseError.prototype)
28
+ }
29
+ }
30
+
31
+ class AuthError extends Error {}
32
+
33
+ const appErrors = defineErrorTaxonomy({
34
+ UseCaseError: { class: UseCaseError, statusCode: 422 },
35
+ AuthError: { class: AuthError, statusCode: 401 },
36
+ })
37
+
38
+ type AppErrorKey = keyof typeof appErrors & string
39
+
40
+ // ---------------------------------------------------------------------------
41
+ // Fixture helpers — real registrations built through the core factory
42
+ // ---------------------------------------------------------------------------
43
+
44
+ function makeRpcReg(config: RPCConfig<AppErrorKey> & { schema?: { params?: unknown; returnType?: unknown } }) {
45
+ const RPC = Procedures<Record<string, never>, RPCConfig<AppErrorKey>>()
46
+ RPC.Create('DoThing', config as any, async () => ({}))
47
+ return RPC.getProcedures()[0]! as TProcedureRegistration<any, RPCConfig>
48
+ }
49
+
50
+ function makeStreamReg(config: RPCConfig<AppErrorKey> & { schema?: { params?: unknown; yieldType?: unknown; returnType?: unknown } }) {
51
+ const Stream = Procedures<Record<string, never>, RPCConfig<AppErrorKey>>()
52
+ Stream.CreateStream('Watch', config as any, async function* () {
53
+ yield { ok: true }
54
+ })
55
+ return Stream.getProcedures()[0]! as TStreamProcedureRegistration<any, RPCConfig>
56
+ }
57
+
58
+ // ---------------------------------------------------------------------------
59
+ // buildRpcRouteDoc
60
+ // ---------------------------------------------------------------------------
61
+
62
+ describe('buildRpcRouteDoc', () => {
63
+ test('copies config.errors onto the route doc', () => {
64
+ const reg = makeRpcReg({
65
+ scope: 'things',
66
+ version: 1,
67
+ errors: ['UseCaseError'],
68
+ schema: { params: Type.Object({}) },
69
+ })
70
+ const doc = buildRpcRouteDoc(reg, undefined)
71
+ expect(doc.errors).toEqual(['UseCaseError'])
72
+ })
73
+
74
+ test('omits errors when not declared', () => {
75
+ const reg = makeRpcReg({ scope: 'things', version: 1 })
76
+ const doc = buildRpcRouteDoc(reg, undefined)
77
+ expect(doc.errors).toBeUndefined()
78
+ })
79
+
80
+ test('emits kind, method and the rpc path (with prefix)', () => {
81
+ const reg = makeRpcReg({ scope: 'userThings', version: 2 })
82
+ const doc = buildRpcRouteDoc(reg, '/api')
83
+ expect(doc.kind).toBe('rpc')
84
+ expect(doc.method).toBe('post')
85
+ expect(doc.name).toBe('DoThing')
86
+ expect(doc.path).toBe('/api/user-things/do-thing/2')
87
+ })
88
+
89
+ test('maps schema.params → jsonSchema.body and schema.returnType → jsonSchema.response', () => {
90
+ const reg = makeRpcReg({
91
+ scope: 'things',
92
+ version: 1,
93
+ schema: {
94
+ params: Type.Object({ id: Type.String() }),
95
+ returnType: Type.Object({ ok: Type.Boolean() }),
96
+ },
97
+ })
98
+ const doc = buildRpcRouteDoc(reg, undefined)
99
+ expect(doc.jsonSchema.body).toMatchObject({ type: 'object' })
100
+ expect(doc.jsonSchema.response).toMatchObject({ type: 'object' })
101
+ })
102
+
103
+ test('extend() merges extra fields but base fields win', () => {
104
+ const reg = makeRpcReg({ scope: 'things', version: 1 })
105
+ const doc = buildRpcRouteDoc(reg, undefined, ({ base }) => ({
106
+ custom: 'extra',
107
+ name: `OVERRIDE-${base.name}`,
108
+ }))
109
+ expect((doc as unknown as Record<string, unknown>).custom).toBe('extra')
110
+ expect(doc.name).toBe('DoThing')
111
+ })
112
+ })
113
+
114
+ // ---------------------------------------------------------------------------
115
+ // buildStreamRouteDoc
116
+ // ---------------------------------------------------------------------------
117
+
118
+ describe('buildStreamRouteDoc', () => {
119
+ test('copies config.errors onto the route doc', () => {
120
+ const reg = makeStreamReg({ scope: 'watch', version: 1, errors: ['AuthError'] })
121
+ const doc = buildStreamRouteDoc(reg, 'sse', undefined)
122
+ expect(doc.errors).toEqual(['AuthError'])
123
+ })
124
+
125
+ test('omits errors when not declared', () => {
126
+ const reg = makeStreamReg({ scope: 'watch', version: 1 })
127
+ const doc = buildStreamRouteDoc(reg, 'sse', undefined)
128
+ expect(doc.errors).toBeUndefined()
129
+ })
130
+
131
+ test('emits kind, methods (post first for codegen) and streamMode', () => {
132
+ const reg = makeStreamReg({ scope: 'watch', version: 1 })
133
+ const doc = buildStreamRouteDoc(reg, 'sse', '/api')
134
+ expect(doc.kind).toBe('stream')
135
+ expect(doc.methods).toEqual(['post', 'get'])
136
+ expect(doc.streamMode).toBe('sse')
137
+ expect(doc.path).toBe('/api/watch/watch/1')
138
+ })
139
+
140
+ test('sse mode wraps yieldType in the SSE message envelope', () => {
141
+ const reg = makeStreamReg({
142
+ scope: 'watch',
143
+ version: 1,
144
+ schema: { yieldType: Type.Object({ ok: Type.Boolean() }) },
145
+ })
146
+ const doc = buildStreamRouteDoc(reg, 'sse', undefined)
147
+ const envelope = doc.jsonSchema.yieldType as Record<string, any>
148
+ expect(envelope.required).toEqual(['data', 'event', 'id'])
149
+ expect(envelope.properties.data).toMatchObject({ type: 'object' })
150
+ expect(envelope.properties.event).toEqual({ type: 'string' })
151
+ expect(envelope.properties.id).toEqual({ type: 'string' })
152
+ expect(envelope.properties.retry).toEqual({ type: 'number' })
153
+ })
154
+
155
+ test('text mode passes yieldType through unwrapped', () => {
156
+ const reg = makeStreamReg({
157
+ scope: 'watch',
158
+ version: 1,
159
+ schema: { yieldType: Type.Object({ ok: Type.Boolean() }) },
160
+ })
161
+ const doc = buildStreamRouteDoc(reg, 'text', undefined)
162
+ const yieldType = doc.jsonSchema.yieldType as Record<string, any>
163
+ expect(yieldType.properties.ok).toMatchObject({ type: 'boolean' })
164
+ expect(yieldType.properties.data).toBeUndefined()
165
+ })
166
+ })
167
+
168
+ // ---------------------------------------------------------------------------
169
+ // buildHttpRouteDoc
170
+ // ---------------------------------------------------------------------------
171
+
172
+ describe('buildHttpRouteDoc', () => {
173
+ function makeHttpReg() {
174
+ const HTTP = Procedures()
175
+ HTTP.CreateHttp(
176
+ 'GetUser',
177
+ {
178
+ path: '/users/:id',
179
+ method: 'get',
180
+ scope: 'users',
181
+ successStatus: 200,
182
+ errors: ['UseCaseError'],
183
+ schema: {
184
+ req: { pathParams: Type.Object({ id: Type.String() }) },
185
+ res: { body: Type.Object({ id: Type.String() }) },
186
+ },
187
+ },
188
+ async (_ctx, req) => ({ id: req.pathParams.id }),
189
+ )
190
+ return HTTP.getProcedures()[0]! as THttpProcedureRegistration<any>
191
+ }
192
+
193
+ test('copies config.errors onto the route doc', () => {
194
+ const doc = buildHttpRouteDoc(makeHttpReg(), undefined)
195
+ expect(doc.errors).toEqual(['UseCaseError'])
196
+ })
197
+
198
+ test('route doc omits errors when not declared', () => {
199
+ const HTTP = Procedures()
200
+ HTTP.CreateHttp(
201
+ 'Ping',
202
+ { path: '/ping', method: 'get', schema: {} },
203
+ async () => {},
204
+ )
205
+ const reg = HTTP.getProcedures()[0]! as THttpProcedureRegistration<any>
206
+ const doc = buildHttpRouteDoc(reg, undefined)
207
+ expect(doc.errors).toBeUndefined()
208
+ })
209
+
210
+ test('resolves fullPath from prefix while keeping the registered path', () => {
211
+ const doc = buildHttpRouteDoc(makeHttpReg(), '/api')
212
+ expect(doc.kind).toBe('api')
213
+ expect(doc.path).toBe('/users/:id')
214
+ expect(doc.fullPath).toBe('/api/users/:id')
215
+ expect(doc.method).toBe('get')
216
+ expect(doc.scope).toBe('users')
217
+ })
218
+
219
+ test('copies successStatus and req/res channel schemas', () => {
220
+ const doc = buildHttpRouteDoc(makeHttpReg(), undefined)
221
+ expect(doc.successStatus).toBe(200)
222
+ expect(doc.jsonSchema.req!.pathParams).toMatchObject({ type: 'object' })
223
+ expect(doc.jsonSchema.res!.body).toMatchObject({ type: 'object' })
224
+ })
225
+ })
226
+
227
+ // ---------------------------------------------------------------------------
228
+ // buildHttpStreamRouteDoc
229
+ // ---------------------------------------------------------------------------
230
+
231
+ describe('buildHttpStreamRouteDoc', () => {
232
+ function makeHttpStreamReg(errors?: AppErrorKey[]) {
233
+ const S = Procedures()
234
+ S.CreateHttpStream(
235
+ 'Tail',
236
+ {
237
+ path: '/streams/logs',
238
+ method: 'get',
239
+ errors,
240
+ schema: {
241
+ req: { query: Type.Object({ source: Type.String() }) },
242
+ yield: Type.Object({ line: Type.String() }),
243
+ },
244
+ },
245
+ async function* () {
246
+ yield { line: 'x' }
247
+ },
248
+ )
249
+ return S.getProcedures()[0]! as THttpStreamProcedureRegistration<any>
250
+ }
251
+
252
+ test('copies config.errors onto the route doc', () => {
253
+ const doc = buildHttpStreamRouteDoc(makeHttpStreamReg(['AuthError']), undefined)
254
+ expect(doc.errors).toEqual(['AuthError'])
255
+ })
256
+
257
+ test('omits errors when not declared', () => {
258
+ const doc = buildHttpStreamRouteDoc(makeHttpStreamReg(), undefined)
259
+ expect(doc.errors).toBeUndefined()
260
+ })
261
+
262
+ test('emits kind, streamMode sse, fullPath and yield schema', () => {
263
+ const doc = buildHttpStreamRouteDoc(makeHttpStreamReg(), '/api')
264
+ expect(doc.kind).toBe('http-stream')
265
+ expect(doc.streamMode).toBe('sse')
266
+ expect(doc.path).toBe('/streams/logs')
267
+ expect(doc.fullPath).toBe('/api/streams/logs')
268
+ expect(doc.jsonSchema.req!.query).toMatchObject({ type: 'object' })
269
+ expect(doc.jsonSchema.yield).toMatchObject({ type: 'object' })
270
+ })
271
+ })
272
+
273
+ // ---------------------------------------------------------------------------
274
+ // Compile-time narrowing (ported from route-errors.test.ts)
275
+ // ---------------------------------------------------------------------------
276
+
277
+ describe('per-route errors declaration', () => {
278
+ test('compile-time: errors typed as keyof taxonomy narrows valid keys', () => {
279
+ // TS-only: this test compiles only if the generic narrows correctly.
280
+ type Narrow = APIConfig<AppErrorKey>['errors']
281
+ const _valid: Narrow = ['UseCaseError', 'AuthError']
282
+ // @ts-expect-error - 'NotRegistered' is not in the taxonomy
283
+ const _invalid: Narrow = ['NotRegistered']
284
+ expect(_valid).toBeDefined()
285
+ expect(_invalid).toBeDefined()
286
+ })
287
+ })
@@ -1,6 +1,6 @@
1
- import type { THttpProcedureRegistration } from '../../../../types.js'
2
- import type { APIHttpRouteDoc } from '../../../types.js'
3
- import { resolveFullPath } from '../path.js'
1
+ import type { THttpProcedureRegistration } from '../../core/types.js'
2
+ import type { APIHttpRouteDoc } from '../types.js'
3
+ import { resolveFullPath } from '../paths.js'
4
4
 
5
5
  export function buildHttpRouteDoc(
6
6
  procedure: THttpProcedureRegistration<any>,
@@ -1,6 +1,6 @@
1
- import type { THttpStreamProcedureRegistration } from '../../../../types.js'
2
- import type { HttpStreamRouteDoc } from '../../../types.js'
3
- import { resolveFullPath } from '../path.js'
1
+ import type { THttpStreamProcedureRegistration } from '../../core/types.js'
2
+ import type { HttpStreamRouteDoc } from '../types.js'
3
+ import { resolveFullPath } from '../paths.js'
4
4
 
5
5
  export function buildHttpStreamRouteDoc(
6
6
  procedure: THttpStreamProcedureRegistration<any>,
@@ -1,6 +1,6 @@
1
- import type { TProcedureRegistration } from '../../../../types.js'
2
- import type { RPCConfig, RPCHttpRouteDoc } from '../../../types.js'
3
- import { makeRoutePath } from '../path.js'
1
+ import type { TProcedureRegistration } from '../../core/types.js'
2
+ import type { RPCConfig, RPCHttpRouteDoc } from '../types.js'
3
+ import { makeRoutePath } from '../paths.js'
4
4
 
5
5
  export function buildRpcRouteDoc(
6
6
  procedure: TProcedureRegistration<any, RPCConfig>,
@@ -1,6 +1,6 @@
1
- import type { TStreamProcedureRegistration } from '../../../../types.js'
2
- import type { RPCConfig, StreamHttpRouteDoc, StreamMode } from '../../../types.js'
3
- import { makeRoutePath } from '../path.js'
1
+ import type { TStreamProcedureRegistration } from '../../core/types.js'
2
+ import type { RPCConfig, StreamHttpRouteDoc, StreamMode } from '../types.js'
3
+ import { makeRoutePath } from '../paths.js'
4
4
 
5
5
  export function buildStreamRouteDoc(
6
6
  procedure: TStreamProcedureRegistration<any, RPCConfig>,