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
@@ -1,21 +1,23 @@
1
-
2
- import { describe, expect, it, test } from 'vitest'
3
- import { Procedures } from './index.js'
4
- import { v } from 'suretype'
1
+ import { describe, expect, test } from 'vitest'
2
+ import { Procedures } from './procedures.js'
5
3
  import { Type } from 'typebox'
6
- import { ProcedureError, ProcedureValidationError } from './errors.js'
4
+ import {
5
+ ProcedureError,
6
+ ProcedureValidationError,
7
+ ProcedureYieldValidationError,
8
+ } from './errors.js'
7
9
 
8
10
  describe('Streaming Procedures - CreateStream', () => {
9
11
  test('CreateStream creates a streaming procedure', async () => {
10
- const { CreateStream } = Procedures()
12
+ const procs = Procedures()
11
13
 
12
- const { StreamTest, procedure, info } = CreateStream(
14
+ const { StreamTest, procedure, info } = procs.CreateStream(
13
15
  'StreamTest',
14
16
  {
15
17
  description: 'Test streaming procedure',
16
18
  schema: {
17
- params: v.object({ count: v.number().required() }),
18
- yieldType: v.object({ value: v.number().required() }),
19
+ params: Type.Object({ count: Type.Number() }),
20
+ yieldType: Type.Object({ value: Type.Number() }),
19
21
  },
20
22
  },
21
23
  async function* (ctx, params) {
@@ -27,7 +29,7 @@ describe('Streaming Procedures - CreateStream', () => {
27
29
 
28
30
  expect(StreamTest).toBeDefined()
29
31
  expect(procedure).toBeDefined()
30
- expect(info.isStream).toBe(true)
32
+ expect(procs.getProcedure('StreamTest')?.kind).toBe('rpc-stream')
31
33
  expect(info.name).toBe('StreamTest')
32
34
  expect(info.description).toBe('Test streaming procedure')
33
35
  expect(info.schema.params).toEqual({
@@ -57,8 +59,8 @@ describe('Streaming Procedures - CreateStream', () => {
57
59
  'StreamWithParams',
58
60
  {
59
61
  schema: {
60
- params: v.object({ name: v.string().required() }),
61
- yieldType: v.string(),
62
+ params: Type.Object({ name: Type.String() }),
63
+ yieldType: Type.String(),
62
64
  },
63
65
  },
64
66
  async function* (ctx, params) {
@@ -81,13 +83,12 @@ describe('Streaming Procedures - CreateStream', () => {
81
83
 
82
84
  test('CreateStream with validateYields validates each yielded value', async () => {
83
85
  const { CreateStream } = Procedures()
84
- const { ProcedureYieldValidationError } = await import('./errors.js')
85
86
 
86
87
  const { StreamValidateYields } = CreateStream(
87
88
  'StreamValidateYields',
88
89
  {
89
90
  schema: {
90
- yieldType: v.object({ id: v.number().required() }),
91
+ yieldType: Type.Object({ id: Type.Number() }),
91
92
  },
92
93
  validateYields: true,
93
94
  },
@@ -117,7 +118,7 @@ describe('Streaming Procedures - CreateStream', () => {
117
118
  'StreamNoValidate',
118
119
  {
119
120
  schema: {
120
- yieldType: v.object({ id: v.number().required() }),
121
+ yieldType: Type.Object({ id: Type.Number() }),
121
122
  },
122
123
  // validateYields defaults to false
123
124
  },
@@ -176,7 +177,7 @@ describe('Streaming Procedures - CreateStream', () => {
176
177
  expect(signalReceived).toBe(true)
177
178
  })
178
179
 
179
- test('CreateStream onCreate callback receives isStream flag', () =>
180
+ test('CreateStream onCreate callback receives kind: rpc-stream', () =>
180
181
  new Promise<void>((done) => {
181
182
  let receivedProc: any
182
183
 
@@ -191,7 +192,7 @@ describe('Streaming Procedures - CreateStream', () => {
191
192
  })
192
193
 
193
194
  expect(receivedProc).toBeDefined()
194
- expect(receivedProc.isStream).toBe(true)
195
+ expect(receivedProc.kind).toBe('rpc-stream')
195
196
  expect(receivedProc.name).toBe('OnCreateStream')
196
197
  done()
197
198
  }))
@@ -217,7 +218,7 @@ describe('Streaming Procedures - CreateStream', () => {
217
218
  'StreamErrorLocation',
218
219
  {
219
220
  schema: {
220
- params: v.object({ id: v.number().required() }),
221
+ params: Type.Object({ id: Type.Number() }),
221
222
  },
222
223
  },
223
224
  async function* () {
@@ -294,7 +295,7 @@ describe('Streaming Procedures - CreateStream', () => {
294
295
  // user's class). Stack annotation is added in place; class identity and
295
296
  // custom properties are preserved.
296
297
  class MyDomainError extends Error {
297
- readonly name = 'MyDomainError'
298
+ override readonly name = 'MyDomainError'
298
299
  readonly code = 'STREAM_FAIL'
299
300
  }
300
301
 
@@ -373,7 +374,6 @@ describe('Streaming Procedures - CreateStream', () => {
373
374
  expect(info.scope).toBe('api')
374
375
  expect(info.version).toBe(1)
375
376
  expect(info.description).toBe('Extended config stream')
376
- expect(info.isStream).toBe(true)
377
377
  })
378
378
 
379
379
  test('CreateStream signal.aborted becomes true after generator completes', async () => {
@@ -444,7 +444,7 @@ describe('isPrevalidated context property', () => {
444
444
  'StreamSkipValidation',
445
445
  {
446
446
  schema: {
447
- params: v.object({ count: v.number().required() }),
447
+ params: Type.Object({ count: Type.Number() }),
448
448
  },
449
449
  },
450
450
  async function* (ctx, params) {
@@ -468,7 +468,7 @@ describe('isPrevalidated context property', () => {
468
468
  'StreamValidate',
469
469
  {
470
470
  schema: {
471
- params: v.object({ count: v.number().required() }),
471
+ params: Type.Object({ count: Type.Number() }),
472
472
  },
473
473
  },
474
474
  async function* (ctx, params) {
@@ -494,7 +494,7 @@ describe('isPrevalidated context property', () => {
494
494
  'StreamValidateUndefined',
495
495
  {
496
496
  schema: {
497
- params: v.object({ value: v.string().required() }),
497
+ params: Type.Object({ value: Type.String() }),
498
498
  },
499
499
  },
500
500
  async function* (ctx, params) {
@@ -514,9 +514,9 @@ describe('isPrevalidated context property', () => {
514
514
  })
515
515
  })
516
516
 
517
- describe('builder.config.noRuntimeValidation', () => {
518
- test('CreateStream skips params validation when noRuntimeValidation is true', async () => {
519
- const { CreateStream } = Procedures({ config: { noRuntimeValidation: true } })
517
+ describe('Procedures({ validation: false })', () => {
518
+ test('CreateStream skips params validation when validation is false', async () => {
519
+ const { CreateStream } = Procedures({ validation: false })
520
520
 
521
521
  const { StreamSkipParams } = CreateStream(
522
522
  'StreamSkipParams',
@@ -538,11 +538,8 @@ describe('builder.config.noRuntimeValidation', () => {
538
538
  expect(values).toEqual([{ received: {} }])
539
539
  })
540
540
 
541
- // migrated to schema.req in Phase 3+ (CreateHttpStream)
542
- test.todo('CreateStream skips input channel validation when noRuntimeValidation is true')
543
-
544
- test('CreateStream still validates when noRuntimeValidation is omitted', async () => {
545
- const { CreateStream } = Procedures({ config: {} })
541
+ test('CreateStream still validates when validation is omitted', async () => {
542
+ const { CreateStream } = Procedures({})
546
543
 
547
544
  const { StreamValidateDefault } = CreateStream(
548
545
  'StreamValidateDefault',
@@ -0,0 +1,142 @@
1
+ import { ProcedureError } from './errors.js'
2
+ import { computeSchema } from '../schema/compute-schema.js'
3
+ import type { Infer, Prettify } from '../schema/json-schema.js'
4
+ import { captureDefinitionInfo } from './definition-site.js'
5
+ import {
6
+ assertNoHttpFields,
7
+ assertNotDuplicate,
8
+ combineSignals,
9
+ iterateWithGuards,
10
+ shouldSkipValidation,
11
+ validateParams,
12
+ } from './internal.js'
13
+ import type { FactoryRuntime } from './internal.js'
14
+ import type { ProcedureResult, TStreamContext, TStreamProcedureRegistration } from './types.js'
15
+ import type { Validate } from '../schema/compile.js'
16
+
17
+ export function makeCreateStream<TContext, TExtendedConfig>(runtime: FactoryRuntime<TContext, TExtendedConfig>) {
18
+ /**
19
+ * Defines a streaming RPC procedure (async generator).
20
+ *
21
+ * - `ctx.signal` is ALWAYS present: it aborts on client disconnect, and with
22
+ * reason `'stream-completed'` on normal completion.
23
+ * - Yields are validated only with `validateYields: true` + a `yieldType`
24
+ * schema.
25
+ * - The generator's return value propagates to consumers (it becomes the
26
+ * `event: 'return'` SSE payload over HTTP).
27
+ */
28
+ return function CreateStream<TName extends string, TParams, TYieldType, TReturnType = void>(
29
+ name: TName,
30
+ config: {
31
+ description?: string
32
+ schema?: {
33
+ params?: TParams
34
+ yieldType?: TYieldType
35
+ returnType?: TReturnType
36
+ }
37
+ validateYields?: boolean
38
+ } & TExtendedConfig,
39
+ handler: (
40
+ ctx: Prettify<TContext & TStreamContext>,
41
+ params: Infer<TParams>,
42
+ ) => AsyncGenerator<Infer<TYieldType>, Infer<TReturnType> | void, unknown>,
43
+ ) {
44
+ // Capture definition location as first action
45
+ const definitionInfo = captureDefinitionInfo()
46
+
47
+ assertNoHttpFields('CreateStream', name, config as Record<string, unknown>, definitionInfo)
48
+ assertNotDuplicate(runtime.registry, name, definitionInfo)
49
+
50
+ const { jsonSchema, validations } = computeSchema(name, config.schema, {
51
+ adapters: runtime.adapters,
52
+ compile: runtime.compile,
53
+ definitionInfo,
54
+ })
55
+
56
+ // Create error factory once at registration time (outside handler)
57
+ const errorFactory = (message: string, meta?: object) =>
58
+ new ProcedureError(name, message, meta, definitionInfo)
59
+
60
+ const validateYields = config.validateYields ?? false
61
+
62
+ const registeredProcedure: TStreamProcedureRegistration<TContext, TExtendedConfig> = {
63
+ name,
64
+ kind: 'rpc-stream',
65
+ config: {
66
+ ...config,
67
+ description: config.description,
68
+ schema: jsonSchema,
69
+ validation: {
70
+ params: validations.params,
71
+ yield: validations.yield,
72
+ },
73
+ },
74
+
75
+ handler: async function* wrappedHandler(ctx: Prettify<TContext>, params: Infer<TParams>) {
76
+ // Per-stream controller: aborts on completion ('stream-completed') so
77
+ // handlers can distinguish completion from client disconnect
78
+ const abortController = new AbortController()
79
+
80
+ if (!shouldSkipValidation(ctx, runtime)) {
81
+ validateParams(name, validations.params, params, definitionInfo)
82
+ }
83
+
84
+ const incomingSignal = (ctx as { signal?: AbortSignal }).signal
85
+ const streamCtx: TStreamContext = {
86
+ error: errorFactory,
87
+ signal: combineSignals(incomingSignal, abortController.signal),
88
+ }
89
+
90
+ // params is correctly typed at the public API boundary via conditional
91
+ // type; cast here because TS cannot narrow generics inside implementations
92
+ const userGenerator = handler(
93
+ { ...ctx, ...streamCtx } as Prettify<TContext & TStreamContext>,
94
+ params as any,
95
+ )
96
+
97
+ return yield* iterateWithGuards(userGenerator[Symbol.asyncIterator](), {
98
+ name,
99
+ validateYields,
100
+ validateYield: validations.yield,
101
+ abortController,
102
+ definitionInfo,
103
+ })
104
+ } as (ctx: TContext, params?: any) => AsyncGenerator<any, any, unknown>,
105
+ }
106
+
107
+ runtime.registry.set(name, registeredProcedure)
108
+ runtime.onCreate?.(registeredProcedure)
109
+
110
+ const info = {
111
+ name,
112
+ kind: 'rpc-stream' as const,
113
+ ...registeredProcedure.config,
114
+ }
115
+
116
+ type Handler = (
117
+ ctx: Prettify<TContext>,
118
+ params: Infer<TParams>,
119
+ ) => AsyncGenerator<Infer<TYieldType>, Infer<TReturnType> | void, unknown>
120
+ type Info = {
121
+ name: TName
122
+ kind: 'rpc-stream'
123
+ description?: string
124
+ schema: {
125
+ params?: TParams
126
+ yieldType?: TYieldType
127
+ returnType?: TReturnType
128
+ }
129
+ validation?: {
130
+ params?: Validate
131
+ yield?: Validate
132
+ }
133
+ } & TExtendedConfig
134
+
135
+ // return so the procedure can be called directly (e.g. unit tests)
136
+ return {
137
+ [name]: registeredProcedure.handler,
138
+ procedure: registeredProcedure.handler,
139
+ info,
140
+ } as ProcedureResult<TName, Handler, Info>
141
+ }
142
+ }
@@ -1,7 +1,5 @@
1
-
2
- import { describe, expect, it, test } from 'vitest'
3
- import { Procedures } from './index.js'
4
- import { v } from 'suretype'
1
+ import { describe, expect, test } from 'vitest'
2
+ import { Procedures } from './procedures.js'
5
3
  import { Type } from 'typebox'
6
4
  import { ProcedureError, ProcedureValidationError } from './errors.js'
7
5
 
@@ -48,40 +46,12 @@ describe('Procedures', () => {
48
46
  expect(info2).toBeDefined()
49
47
  })
50
48
 
51
- test('Procedures - Create call', () =>
52
- new Promise<void>((done) => {
53
- let mockHttpCall: any
54
-
55
- const { Create } = Procedures({
56
- onCreate: ({ handler }) => {
57
- mockHttpCall = handler
58
- },
59
- })
60
-
61
- Create(
62
- 'Handler',
63
- {
64
- schema: {
65
- params: v.object({ name: v.string() }),
66
- returnType: v.string(),
67
- },
68
- },
69
- async (ctx, params) => {
70
- expect(params).toEqual({ name: 'name' })
71
- done()
72
- return 'name'
73
- }
74
- )
75
-
76
- mockHttpCall({}, { name: 'name' })
77
- }))
78
-
79
49
  test('Procedures - Create call w/ Typebox', () =>
80
50
  new Promise<void>((done) => {
81
51
  let mockHttpCall: any
82
52
 
83
53
  const { Create } = Procedures({
84
- onCreate: ({ handler, config, name }) => {
54
+ onCreate: ({ handler }) => {
85
55
  mockHttpCall = handler
86
56
  },
87
57
  })
@@ -118,7 +88,7 @@ describe('Procedures', () => {
118
88
  {
119
89
  description: 'Handler description',
120
90
  schema: {
121
- params: v.object({ number: v.number() }),
91
+ params: Type.Object({ number: Type.Number() }),
122
92
  },
123
93
  },
124
94
  async (ctx, params) => {
@@ -143,6 +113,7 @@ describe('Procedures', () => {
143
113
  expect(info.schema.params).toEqual({
144
114
  type: 'object',
145
115
  properties: { number: { type: 'number' } },
116
+ required: ['number'],
146
117
  })
147
118
  expect(info).toHaveProperty('description')
148
119
  expect(info.description).toEqual('Handler description')
@@ -153,7 +124,7 @@ describe('Procedures', () => {
153
124
  let mockHttpCall: any
154
125
 
155
126
  const { Create } = Procedures({
156
- onCreate: ({ handler, config, name }) => {
127
+ onCreate: ({ handler, config }) => {
157
128
  mockHttpCall = (callParams: any) => {
158
129
  const validation = (config as any).validation
159
130
  if (validation?.params) {
@@ -175,7 +146,7 @@ describe('Procedures', () => {
175
146
  'test',
176
147
  {
177
148
  schema: {
178
- params: v.object({}),
149
+ params: Type.Object({}),
179
150
  },
180
151
  },
181
152
  async () => {
@@ -191,7 +162,7 @@ describe('Procedures', () => {
191
162
  let mockHttpCall: any
192
163
 
193
164
  const { Create } = Procedures({
194
- onCreate: async ({ handler, config, name }) => {
165
+ onCreate: ({ handler, config }) => {
195
166
  mockHttpCall = async (callParams: any) => {
196
167
  const validation = (config as any).validation
197
168
  if (validation?.params) {
@@ -215,10 +186,10 @@ describe('Procedures', () => {
215
186
  'test',
216
187
  {
217
188
  schema: {
218
- params: v.object({
219
- name: v.string().required(),
220
- id: v.number().required(),
221
- email: v.string(),
189
+ params: Type.Object({
190
+ name: Type.String(),
191
+ id: Type.Number(),
192
+ email: Type.Optional(Type.String()),
222
193
  }),
223
194
  },
224
195
  },
@@ -242,7 +213,7 @@ describe('Procedures', () => {
242
213
  },
243
214
  })
244
215
 
245
- Create('test', {}, async (ctx, params) => {
216
+ Create('test', {}, async (ctx) => {
246
217
  expect(ctx.testCtx).toEqual('testCtx')
247
218
  done()
248
219
  })
@@ -282,7 +253,7 @@ describe('Procedures', () => {
282
253
  'CheckIsAuthenticated',
283
254
  {
284
255
  schema: {
285
- returnType: v.string(),
256
+ returnType: Type.String(),
286
257
  },
287
258
  },
288
259
  async (ctx) => {
@@ -401,7 +372,7 @@ describe('Procedures - Definition Location in Errors', () => {
401
372
  'TestValidation',
402
373
  {
403
374
  schema: {
404
- params: v.object({ name: v.string().required() }),
375
+ params: Type.Object({ name: Type.String() }),
405
376
  },
406
377
  },
407
378
  async (ctx, params) => {
@@ -466,7 +437,7 @@ describe('Procedures - Definition Location in Errors', () => {
466
437
  'TestGetLocation',
467
438
  {
468
439
  schema: {
469
- params: v.object({ id: v.number().required() }),
440
+ params: Type.Object({ id: Type.Number() }),
470
441
  },
471
442
  },
472
443
  async (ctx, params) => {
@@ -491,7 +462,7 @@ describe('Procedures - Definition Location in Errors', () => {
491
462
  'TestStackFormat',
492
463
  {
493
464
  schema: {
494
- params: v.object({ value: v.string().required() }),
465
+ params: Type.Object({ value: Type.String() }),
495
466
  },
496
467
  },
497
468
  async (ctx, params) => {
@@ -527,7 +498,7 @@ describe('isPrevalidated context property', () => {
527
498
  'SkipValidation',
528
499
  {
529
500
  schema: {
530
- params: v.object({ name: v.string().required() }),
501
+ params: Type.Object({ name: Type.String() }),
531
502
  },
532
503
  },
533
504
  async (ctx, params) => {
@@ -548,7 +519,7 @@ describe('isPrevalidated context property', () => {
548
519
  'ValidateParams',
549
520
  {
550
521
  schema: {
551
- params: v.object({ name: v.string().required() }),
522
+ params: Type.Object({ name: Type.String() }),
552
523
  },
553
524
  },
554
525
  async (ctx, params) => {
@@ -572,7 +543,7 @@ describe('isPrevalidated context property', () => {
572
543
  'ValidateUndefined',
573
544
  {
574
545
  schema: {
575
- params: v.object({ id: v.number().required() }),
546
+ params: Type.Object({ id: Type.Number() }),
576
547
  },
577
548
  },
578
549
  async (ctx, params) => {
@@ -600,9 +571,9 @@ describe('isPrevalidated context property', () => {
600
571
  })
601
572
  })
602
573
 
603
- describe('builder.config.noRuntimeValidation', () => {
604
- test('Create skips params validation when noRuntimeValidation is true', async () => {
605
- const { Create } = Procedures({ config: { noRuntimeValidation: true } })
574
+ describe('Procedures({ validation: false })', () => {
575
+ test('Create skips params validation when validation is false', async () => {
576
+ const { Create } = Procedures({ validation: false })
606
577
 
607
578
  const { SkipParams } = Create(
608
579
  'SkipParams',
@@ -619,11 +590,8 @@ describe('builder.config.noRuntimeValidation', () => {
619
590
  expect(result).toEqual({})
620
591
  })
621
592
 
622
- // migrated to schema.req in Phase 3+
623
- test.todo('Create skips input channel validation when noRuntimeValidation is true')
624
-
625
- test('Create still validates when noRuntimeValidation is omitted', async () => {
626
- const { Create } = Procedures({ config: {} })
593
+ test('Create still validates when validation is omitted', async () => {
594
+ const { Create } = Procedures({})
627
595
 
628
596
  const { ValidateDefault } = Create(
629
597
  'ValidateDefault',
@@ -0,0 +1,121 @@
1
+ import { ProcedureError } from './errors.js'
2
+ import { computeSchema } from '../schema/compute-schema.js'
3
+ import type { Infer, Prettify } from '../schema/json-schema.js'
4
+ import { captureDefinitionInfo } from './definition-site.js'
5
+ import {
6
+ assertNoHttpFields,
7
+ assertNotDuplicate,
8
+ shouldSkipValidation,
9
+ toProcedureError,
10
+ validateParams,
11
+ } from './internal.js'
12
+ import type { FactoryRuntime } from './internal.js'
13
+ import type { ProcedureResult, TLocalContext, TProcedureRegistration } from './types.js'
14
+ import type { Validate } from '../schema/compile.js'
15
+
16
+ export function makeCreate<TContext, TExtendedConfig>(runtime: FactoryRuntime<TContext, TExtendedConfig>) {
17
+ /**
18
+ * Defines a unary RPC procedure.
19
+ *
20
+ * - `schema.params` is validated at runtime; `schema.returnType` is
21
+ * documentation/codegen only.
22
+ * - The handler receives `(ctx, params)` where ctx adds `error()` and an
23
+ * optional `signal` on top of the factory context.
24
+ * - Returns `{ [name]: handler, procedure: handler, info }` so the procedure
25
+ * is directly callable in tests and introspectable via `info`.
26
+ */
27
+ return function Create<TName extends string, TParams, TReturnType>(
28
+ name: TName,
29
+ config: {
30
+ description?: string
31
+ schema?: {
32
+ params?: TParams
33
+ returnType?: TReturnType
34
+ }
35
+ } & TExtendedConfig,
36
+ handler: (
37
+ ctx: Prettify<TContext & TLocalContext>,
38
+ params: Infer<TParams>,
39
+ ) => Promise<Infer<TReturnType>>,
40
+ ) {
41
+ // Capture definition location as first action
42
+ const definitionInfo = captureDefinitionInfo()
43
+
44
+ assertNoHttpFields('Create', name, config as Record<string, unknown>, definitionInfo)
45
+ assertNotDuplicate(runtime.registry, name, definitionInfo)
46
+
47
+ const { jsonSchema, validations } = computeSchema(name, config.schema, {
48
+ adapters: runtime.adapters,
49
+ compile: runtime.compile,
50
+ definitionInfo,
51
+ })
52
+
53
+ // Create error factory once at registration time (outside handler)
54
+ const errorFactory = (message: string, meta?: object) =>
55
+ new ProcedureError(name, message, meta, definitionInfo)
56
+
57
+ const registeredProcedure: TProcedureRegistration<TContext, TExtendedConfig> = {
58
+ name,
59
+ kind: 'rpc',
60
+ config: {
61
+ ...config,
62
+ description: config.description,
63
+ schema: jsonSchema,
64
+ validation: {
65
+ params: validations.params,
66
+ },
67
+ },
68
+
69
+ handler: async (ctx: Prettify<TContext>, params: Infer<TParams>) => {
70
+ try {
71
+ if (!shouldSkipValidation(ctx, runtime)) {
72
+ validateParams(name, validations.params, params, definitionInfo)
73
+ }
74
+
75
+ const localCtx: TLocalContext = {
76
+ error: errorFactory,
77
+ }
78
+
79
+ // params is correctly typed at the public API boundary;
80
+ // cast here because TS cannot narrow generics inside implementations
81
+ return await handler(
82
+ { ...ctx, ...localCtx } as Prettify<TContext & TLocalContext>,
83
+ params as any,
84
+ )
85
+ } catch (error: any) {
86
+ throw toProcedureError(name, definitionInfo, error)
87
+ }
88
+ },
89
+ }
90
+
91
+ runtime.registry.set(name, registeredProcedure)
92
+ runtime.onCreate?.(registeredProcedure)
93
+
94
+ const info = {
95
+ name,
96
+ kind: 'rpc' as const,
97
+ ...registeredProcedure.config,
98
+ }
99
+
100
+ type Handler = (ctx: Prettify<TContext>, params: Infer<TParams>) => Promise<Infer<TReturnType>>
101
+ type Info = {
102
+ name: TName
103
+ kind: 'rpc'
104
+ description?: string
105
+ schema: {
106
+ params?: TParams
107
+ returnType?: TReturnType
108
+ }
109
+ validation?: {
110
+ params?: Validate
111
+ }
112
+ } & TExtendedConfig
113
+
114
+ // return so the procedure can be called directly (e.g. unit tests)
115
+ return {
116
+ [name]: registeredProcedure.handler,
117
+ procedure: registeredProcedure.handler,
118
+ info,
119
+ } as ProcedureResult<TName, Handler, Info>
120
+ }
121
+ }
@@ -1,8 +1,8 @@
1
1
  import { describe, expect, test } from 'vitest'
2
- import type { DefinitionInfo } from './stack-utils.js';
3
- import { captureDefinitionInfo, formatDefinitionInfo } from './stack-utils.js'
2
+ import type { DefinitionInfo } from './definition-site.js'
3
+ import { captureDefinitionInfo, formatDefinitionInfo } from './definition-site.js'
4
4
 
5
- describe('Stack Utils', () => {
5
+ describe('Definition Site', () => {
6
6
  describe('captureDefinitionInfo', () => {
7
7
  test('returns definition info with definedAt', () => {
8
8
  const info = captureDefinitionInfo()
@@ -91,5 +91,16 @@ describe('Stack Utils', () => {
91
91
  expect(info).toBeDefined()
92
92
  expect(info.definitionStack).toBeDefined()
93
93
  })
94
+
95
+ test('skips v9 library-internal frames, not this test file', () => {
96
+ // v9's internal-file list covers procedures.ts / internal.ts / compile.ts
97
+ // (etc.) — but must never swallow user/test frames whose names merely
98
+ // resemble internal files (e.g. this `definition-site.test.ts` file is
99
+ // NOT matched by the `/definition-site.ts` entry).
100
+ const info = captureDefinitionInfo()
101
+
102
+ expect(info.definedAt).toBeDefined()
103
+ expect(info.definedAt?.file).toContain('definition-site.test.ts')
104
+ })
94
105
  })
95
106
  })