ts-procedures 8.6.0 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/CHANGELOG.md +540 -0
  2. package/README.md +166 -101
  3. package/agent_config/claude-code/.claude-plugin/plugin.json +1 -1
  4. package/agent_config/claude-code/agents/ts-procedures-architect.md +11 -10
  5. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +25 -12
  6. package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +10 -12
  7. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +141 -45
  8. package/agent_config/claude-code/skills/ts-procedures/checklist.md +7 -6
  9. package/agent_config/claude-code/skills/ts-procedures/patterns.md +45 -6
  10. package/agent_config/claude-code/skills/ts-procedures/templates/client.md +1 -1
  11. package/agent_config/claude-code/skills/ts-procedures/templates/hono.md +1 -1
  12. package/agent_config/copilot/copilot-instructions.md +50 -33
  13. package/agent_config/cursor/cursorrules +50 -33
  14. package/build/adapters/astro/astro-context.js.map +1 -0
  15. package/build/adapters/astro/create-handler.js.map +1 -0
  16. package/build/adapters/astro/index.js.map +1 -0
  17. package/build/{implementations/http → adapters}/astro/index.test.js +1 -1
  18. package/build/adapters/astro/index.test.js.map +1 -0
  19. package/build/adapters/astro/rewrite-request.js.map +1 -0
  20. package/build/adapters/hono/envelope-parity.test.js +98 -0
  21. package/build/adapters/hono/envelope-parity.test.js.map +1 -0
  22. package/build/{implementations/http → adapters}/hono/handlers/http-stream.d.ts +1 -1
  23. package/build/adapters/hono/handlers/http-stream.js +55 -0
  24. package/build/adapters/hono/handlers/http-stream.js.map +1 -0
  25. package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.js +1 -1
  26. package/build/adapters/hono/handlers/http-stream.test.js.map +1 -0
  27. package/build/{implementations/http → adapters}/hono/handlers/http.d.ts +1 -1
  28. package/build/adapters/hono/handlers/http.js +50 -0
  29. package/build/adapters/hono/handlers/http.js.map +1 -0
  30. package/build/{implementations/http → adapters}/hono/handlers/http.test.js +1 -1
  31. package/build/adapters/hono/handlers/http.test.js.map +1 -0
  32. package/build/{implementations/http → adapters}/hono/handlers/rpc.d.ts +2 -2
  33. package/build/adapters/hono/handlers/rpc.js +23 -0
  34. package/build/adapters/hono/handlers/rpc.js.map +1 -0
  35. package/build/{implementations/http → adapters}/hono/handlers/rpc.test.js +1 -1
  36. package/build/adapters/hono/handlers/rpc.test.js.map +1 -0
  37. package/build/adapters/hono/handlers/stream.d.ts +12 -0
  38. package/build/adapters/hono/handlers/stream.js +89 -0
  39. package/build/adapters/hono/handlers/stream.js.map +1 -0
  40. package/build/{implementations/http → adapters}/hono/handlers/stream.test.js +3 -2
  41. package/build/adapters/hono/handlers/stream.test.js.map +1 -0
  42. package/build/{implementations/http → adapters}/hono/index.d.ts +24 -12
  43. package/build/{implementations/http → adapters}/hono/index.js +19 -8
  44. package/build/adapters/hono/index.js.map +1 -0
  45. package/build/{implementations/http → adapters}/hono/index.test.js +2 -4
  46. package/build/adapters/hono/index.test.js.map +1 -0
  47. package/build/{implementations/http → adapters/hono}/on-request-error.test.js +2 -2
  48. package/build/adapters/hono/on-request-error.test.js.map +1 -0
  49. package/build/adapters/hono/request.d.ts +7 -0
  50. package/build/adapters/hono/request.js +22 -0
  51. package/build/adapters/hono/request.js.map +1 -0
  52. package/build/{implementations/http → adapters/hono}/route-errors.test.js +4 -4
  53. package/build/adapters/hono/route-errors.test.js.map +1 -0
  54. package/build/adapters/hono/types.d.ts +55 -0
  55. package/build/adapters/hono/types.js +19 -0
  56. package/build/adapters/hono/types.js.map +1 -0
  57. package/build/client/freeze.test.js +39 -0
  58. package/build/client/freeze.test.js.map +1 -0
  59. package/build/client/typed-error-dispatch.test.js +2 -2
  60. package/build/client/typed-error-dispatch.test.js.map +1 -1
  61. package/build/codegen/__fixtures__/make-envelope.d.ts +1 -1
  62. package/build/codegen/bin/cli.d.ts +5 -0
  63. package/build/codegen/bin/cli.js +139 -182
  64. package/build/codegen/bin/cli.js.map +1 -1
  65. package/build/codegen/bin/cli.test.js +12 -2
  66. package/build/codegen/bin/cli.test.js.map +1 -1
  67. package/build/codegen/bin/flag-specs.d.ts +9 -0
  68. package/build/codegen/bin/flag-specs.js +33 -31
  69. package/build/codegen/bin/flag-specs.js.map +1 -1
  70. package/build/codegen/bin/flag-specs.test.js +14 -1
  71. package/build/codegen/bin/flag-specs.test.js.map +1 -1
  72. package/build/codegen/collect-models.d.ts +1 -1
  73. package/build/codegen/emit/api-route.d.ts +8 -0
  74. package/build/codegen/emit/api-route.js +156 -0
  75. package/build/codegen/emit/api-route.js.map +1 -0
  76. package/build/codegen/emit/context.d.ts +30 -0
  77. package/build/codegen/emit/context.js +2 -0
  78. package/build/codegen/emit/context.js.map +1 -0
  79. package/build/codegen/emit/declarations.d.ts +24 -0
  80. package/build/codegen/emit/declarations.js +48 -0
  81. package/build/codegen/emit/declarations.js.map +1 -0
  82. package/build/codegen/emit/format-types.d.ts +61 -0
  83. package/build/codegen/emit/format-types.js +188 -0
  84. package/build/codegen/emit/format-types.js.map +1 -0
  85. package/build/codegen/emit/http-stream-route.d.ts +7 -0
  86. package/build/codegen/emit/http-stream-route.js +138 -0
  87. package/build/codegen/emit/http-stream-route.js.map +1 -0
  88. package/build/codegen/emit/route-shared.d.ts +37 -0
  89. package/build/codegen/emit/route-shared.js +88 -0
  90. package/build/codegen/emit/route-shared.js.map +1 -0
  91. package/build/codegen/emit/rpc-route.d.ts +7 -0
  92. package/build/codegen/emit/rpc-route.js +37 -0
  93. package/build/codegen/emit/rpc-route.js.map +1 -0
  94. package/build/codegen/emit/scope-file.d.ts +39 -0
  95. package/build/codegen/emit/scope-file.js +166 -0
  96. package/build/codegen/emit/scope-file.js.map +1 -0
  97. package/build/codegen/emit/stream-route.d.ts +7 -0
  98. package/build/codegen/emit/stream-route.js +62 -0
  99. package/build/codegen/emit/stream-route.js.map +1 -0
  100. package/build/codegen/emit-errors.d.ts +1 -1
  101. package/build/codegen/emit-errors.integration.test.js +1 -1
  102. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  103. package/build/codegen/emit-scope.d.ts +13 -30
  104. package/build/codegen/emit-scope.js +15 -844
  105. package/build/codegen/emit-scope.js.map +1 -1
  106. package/build/codegen/emit-scope.test.js +67 -0
  107. package/build/codegen/emit-scope.test.js.map +1 -1
  108. package/build/codegen/goldens.test.js +69 -0
  109. package/build/codegen/goldens.test.js.map +1 -0
  110. package/build/codegen/group-routes.d.ts +1 -1
  111. package/build/codegen/pipeline.d.ts +1 -1
  112. package/build/codegen/resolve-envelope.d.ts +1 -1
  113. package/build/codegen/targets/_shared/error-schemas.d.ts +1 -1
  114. package/build/codegen/targets/_shared/route-slots.d.ts +1 -1
  115. package/build/codegen/targets/_shared/target-run.d.ts +1 -1
  116. package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +1 -1
  117. package/build/codegen/targets/swift/emit-route-swift.d.ts +1 -1
  118. package/build/core/create-http-stream.d.ts +50 -0
  119. package/build/core/create-http-stream.js +108 -0
  120. package/build/core/create-http-stream.js.map +1 -0
  121. package/build/{create-http-stream.test.js → core/create-http-stream.test.js} +1 -1
  122. package/build/core/create-http-stream.test.js.map +1 -0
  123. package/build/core/create-http.d.ts +51 -0
  124. package/build/core/create-http.js +65 -0
  125. package/build/core/create-http.js.map +1 -0
  126. package/build/{create-http.test.js → core/create-http.test.js} +27 -4
  127. package/build/core/create-http.test.js.map +1 -0
  128. package/build/core/create-stream.d.ts +26 -0
  129. package/build/core/create-stream.js +80 -0
  130. package/build/core/create-stream.js.map +1 -0
  131. package/build/{create-stream.test.js → core/create-stream.test.js} +23 -28
  132. package/build/core/create-stream.test.js.map +1 -0
  133. package/build/core/create.d.ts +22 -0
  134. package/build/core/create.js +71 -0
  135. package/build/core/create.js.map +1 -0
  136. package/build/{create.test.js → core/create.test.js} +25 -46
  137. package/build/core/create.test.js.map +1 -0
  138. package/build/core/definition-site.d.ts +24 -0
  139. package/build/{stack-utils.js → core/definition-site.js} +20 -20
  140. package/build/core/definition-site.js.map +1 -0
  141. package/build/{stack-utils.test.js → core/definition-site.test.js} +12 -3
  142. package/build/core/definition-site.test.js.map +1 -0
  143. package/build/{errors.d.ts → core/errors.d.ts} +19 -8
  144. package/build/{errors.js → core/errors.js} +21 -26
  145. package/build/core/errors.js.map +1 -0
  146. package/build/core/errors.test.js.map +1 -0
  147. package/build/core/factory-options.test.js +82 -0
  148. package/build/core/factory-options.test.js.map +1 -0
  149. package/build/core/http-route.d.ts +13 -0
  150. package/build/core/http-route.js +54 -0
  151. package/build/core/http-route.js.map +1 -0
  152. package/build/core/internal.d.ts +72 -0
  153. package/build/core/internal.js +128 -0
  154. package/build/core/internal.js.map +1 -0
  155. package/build/{migration.test.js → core/migration.test.js} +17 -1
  156. package/build/core/migration.test.js.map +1 -0
  157. package/build/core/procedures.d.ts +143 -0
  158. package/build/core/procedures.js +64 -0
  159. package/build/core/procedures.js.map +1 -0
  160. package/build/{index.test.js → core/procedures.test.js} +14 -11
  161. package/build/core/procedures.test.js.map +1 -0
  162. package/build/core/types.d.ts +183 -0
  163. package/build/{schema → core}/types.js.map +1 -1
  164. package/build/exports.d.ts +31 -11
  165. package/build/exports.js +23 -8
  166. package/build/exports.js.map +1 -1
  167. package/build/schema/adapter.d.ts +35 -0
  168. package/build/schema/adapter.js +13 -0
  169. package/build/schema/adapter.js.map +1 -0
  170. package/build/schema/adapter.test.js +53 -0
  171. package/build/schema/adapter.test.js.map +1 -0
  172. package/build/schema/compile.d.ts +37 -0
  173. package/build/schema/compile.js +38 -0
  174. package/build/schema/compile.js.map +1 -0
  175. package/build/schema/compile.test.js +78 -0
  176. package/build/schema/compile.test.js.map +1 -0
  177. package/build/schema/compute-schema.d.ts +47 -37
  178. package/build/schema/compute-schema.js +86 -29
  179. package/build/schema/compute-schema.js.map +1 -1
  180. package/build/schema/compute-schema.test.js +158 -40
  181. package/build/schema/compute-schema.test.js.map +1 -1
  182. package/build/schema/json-schema.d.ts +17 -0
  183. package/build/schema/json-schema.js +2 -0
  184. package/build/schema/json-schema.js.map +1 -0
  185. package/build/schema/typebox.d.ts +11 -0
  186. package/build/schema/typebox.js +24 -0
  187. package/build/schema/typebox.js.map +1 -0
  188. package/build/schema/typebox.test.js +34 -0
  189. package/build/schema/typebox.test.js.map +1 -0
  190. package/build/server/context.d.ts +8 -0
  191. package/build/server/context.js +7 -0
  192. package/build/server/context.js.map +1 -0
  193. package/build/server/context.test.js +16 -0
  194. package/build/server/context.test.js.map +1 -0
  195. package/build/{doc-envelope.d.ts → server/doc-envelope.d.ts} +1 -1
  196. package/build/server/doc-envelope.js.map +1 -0
  197. package/build/server/doc-envelope.test.d.ts +1 -0
  198. package/build/server/doc-envelope.test.js.map +1 -0
  199. package/build/{implementations/http → server}/doc-registry.d.ts +7 -2
  200. package/build/{implementations/http → server}/doc-registry.js +9 -5
  201. package/build/server/doc-registry.js.map +1 -0
  202. package/build/server/doc-registry.test.d.ts +1 -0
  203. package/build/{implementations/http → server}/doc-registry.test.js +27 -24
  204. package/build/server/doc-registry.test.js.map +1 -0
  205. package/build/server/docs/docs.test.d.ts +1 -0
  206. package/build/server/docs/docs.test.js +237 -0
  207. package/build/server/docs/docs.test.js.map +1 -0
  208. package/build/{implementations/http/hono → server}/docs/http-doc.d.ts +2 -2
  209. package/build/{implementations/http/hono → server}/docs/http-doc.js +1 -1
  210. package/build/server/docs/http-doc.js.map +1 -0
  211. package/build/{implementations/http/hono → server}/docs/http-stream-doc.d.ts +2 -2
  212. package/build/{implementations/http/hono → server}/docs/http-stream-doc.js +1 -1
  213. package/build/server/docs/http-stream-doc.js.map +1 -0
  214. package/build/{implementations/http/hono → server}/docs/rpc-doc.d.ts +2 -2
  215. package/build/{implementations/http/hono → server}/docs/rpc-doc.js +1 -1
  216. package/build/server/docs/rpc-doc.js.map +1 -0
  217. package/build/{implementations/http/hono → server}/docs/stream-doc.d.ts +2 -2
  218. package/build/{implementations/http/hono → server}/docs/stream-doc.js +1 -1
  219. package/build/server/docs/stream-doc.js.map +1 -0
  220. package/build/server/errors/dispatch.d.ts +96 -0
  221. package/build/{implementations/http/error-dispatch.js → server/errors/dispatch.js} +20 -10
  222. package/build/server/errors/dispatch.js.map +1 -0
  223. package/build/server/errors/dispatch.test.d.ts +1 -0
  224. package/build/server/errors/dispatch.test.js +418 -0
  225. package/build/server/errors/dispatch.test.js.map +1 -0
  226. package/build/{implementations/http/error-taxonomy.d.ts → server/errors/taxonomy.d.ts} +8 -17
  227. package/build/{implementations/http/error-taxonomy.js → server/errors/taxonomy.js} +6 -15
  228. package/build/server/errors/taxonomy.js.map +1 -0
  229. package/build/server/errors/taxonomy.test.d.ts +1 -0
  230. package/build/{implementations/http/error-taxonomy.test.js → server/errors/taxonomy.test.js} +45 -39
  231. package/build/server/errors/taxonomy.test.js.map +1 -0
  232. package/build/server/index.d.ts +29 -0
  233. package/build/server/index.js +27 -0
  234. package/build/server/index.js.map +1 -0
  235. package/build/server/no-framework-imports.test.d.ts +1 -0
  236. package/build/server/no-framework-imports.test.js +40 -0
  237. package/build/server/no-framework-imports.test.js.map +1 -0
  238. package/build/{implementations/http/hono/path.d.ts → server/paths.d.ts} +2 -3
  239. package/build/{implementations/http/hono/path.js → server/paths.js} +1 -1
  240. package/build/server/paths.js.map +1 -0
  241. package/build/server/paths.test.d.ts +1 -0
  242. package/build/server/paths.test.js +111 -0
  243. package/build/server/paths.test.js.map +1 -0
  244. package/build/server/request/params.d.ts +29 -0
  245. package/build/server/request/params.js +43 -0
  246. package/build/server/request/params.js.map +1 -0
  247. package/build/server/request/params.test.d.ts +1 -0
  248. package/build/server/request/params.test.js +91 -0
  249. package/build/server/request/params.test.js.map +1 -0
  250. package/build/server/request/query.d.ts +9 -0
  251. package/build/server/request/query.js +22 -0
  252. package/build/server/request/query.js.map +1 -0
  253. package/build/server/request/query.test.d.ts +1 -0
  254. package/build/server/request/query.test.js +60 -0
  255. package/build/server/request/query.test.js.map +1 -0
  256. package/build/server/sse.d.ts +70 -0
  257. package/build/server/sse.js +94 -0
  258. package/build/server/sse.js.map +1 -0
  259. package/build/server/sse.test.d.ts +1 -0
  260. package/build/server/sse.test.js +98 -0
  261. package/build/server/sse.test.js.map +1 -0
  262. package/build/{implementations → server}/types.d.ts +17 -15
  263. package/build/{implementations → server}/types.js.map +1 -1
  264. package/docs/astro-adapter.md +8 -9
  265. package/docs/client-and-codegen.md +10 -4
  266. package/docs/client-error-handling.md +5 -5
  267. package/docs/codegen-kotlin.md +2 -3
  268. package/docs/codegen-swift.md +1 -2
  269. package/docs/core.md +135 -54
  270. package/docs/http-integrations.md +58 -6
  271. package/docs/migration-v8-to-v9.md +200 -0
  272. package/docs/plans/2026-06-09-v9-rewrite.md +130 -0
  273. package/docs/specs/2026-06-09-v9-rewrite-design.md +221 -0
  274. package/docs/streaming.md +12 -0
  275. package/package.json +25 -48
  276. package/src/{implementations/http → adapters}/astro/index.test.ts +2 -2
  277. package/src/adapters/hono/__fixtures__/parity-envelope.json +389 -0
  278. package/src/adapters/hono/envelope-parity.test.ts +126 -0
  279. package/src/{implementations/http → adapters}/hono/handlers/http-stream.test.ts +1 -1
  280. package/src/adapters/hono/handlers/http-stream.ts +73 -0
  281. package/src/{implementations/http → adapters}/hono/handlers/http.test.ts +1 -1
  282. package/src/adapters/hono/handlers/http.ts +70 -0
  283. package/src/{implementations/http → adapters}/hono/handlers/rpc.test.ts +2 -2
  284. package/src/adapters/hono/handlers/rpc.ts +39 -0
  285. package/src/{implementations/http → adapters}/hono/handlers/stream.test.ts +4 -3
  286. package/src/{implementations/http → adapters}/hono/handlers/stream.ts +19 -92
  287. package/src/{implementations/http → adapters}/hono/index.test.ts +14 -16
  288. package/src/{implementations/http → adapters}/hono/index.ts +35 -30
  289. package/src/{implementations/http → adapters/hono}/on-request-error.test.ts +3 -3
  290. package/src/adapters/hono/request.ts +28 -0
  291. package/src/{implementations/http → adapters/hono}/route-errors.test.ts +5 -5
  292. package/src/{implementations/http → adapters}/hono/types.ts +43 -20
  293. package/src/client/freeze.test.ts +41 -0
  294. package/src/client/typed-error-dispatch.test.ts +3 -3
  295. package/src/codegen/__fixtures__/make-envelope.ts +1 -1
  296. package/src/codegen/__fixtures__/models-envelope.json +310 -0
  297. package/src/codegen/__goldens__/MANIFEST.json +85 -0
  298. package/src/codegen/__goldens__/kotlin-default--models/Billing.kt +112 -0
  299. package/src/codegen/__goldens__/kotlin-default--models/BillingReports.kt +26 -0
  300. package/src/codegen/__goldens__/kotlin-default--models/Orders.kt +88 -0
  301. package/src/codegen/__goldens__/kotlin-default--users/Users.kt +189 -0
  302. package/src/codegen/__goldens__/swift-default--models/Billing.swift +97 -0
  303. package/src/codegen/__goldens__/swift-default--models/BillingReports.swift +20 -0
  304. package/src/codegen/__goldens__/swift-default--models/Orders.swift +81 -0
  305. package/src/codegen/__goldens__/swift-default--users/Users.swift +204 -0
  306. package/src/codegen/__goldens__/ts-default--models/_client.ts +1319 -0
  307. package/src/codegen/__goldens__/ts-default--models/_errors.ts +90 -0
  308. package/src/codegen/__goldens__/ts-default--models/_models.ts +10 -0
  309. package/src/codegen/__goldens__/ts-default--models/_types.ts +502 -0
  310. package/src/codegen/__goldens__/ts-default--models/billing-reports.ts +29 -0
  311. package/src/codegen/__goldens__/ts-default--models/billing.ts +67 -0
  312. package/src/codegen/__goldens__/ts-default--models/index.ts +48 -0
  313. package/src/codegen/__goldens__/ts-default--models/orders.ts +80 -0
  314. package/src/codegen/__goldens__/ts-default--users/_client.ts +1319 -0
  315. package/src/codegen/__goldens__/ts-default--users/_errors.ts +90 -0
  316. package/src/codegen/__goldens__/ts-default--users/_types.ts +502 -0
  317. package/src/codegen/__goldens__/ts-default--users/index.ts +38 -0
  318. package/src/codegen/__goldens__/ts-default--users/users.ts +169 -0
  319. package/src/codegen/__goldens__/ts-external-runtime--models/_errors.ts +90 -0
  320. package/src/codegen/__goldens__/ts-external-runtime--models/_models.ts +10 -0
  321. package/src/codegen/__goldens__/ts-external-runtime--models/billing-reports.ts +29 -0
  322. package/src/codegen/__goldens__/ts-external-runtime--models/billing.ts +67 -0
  323. package/src/codegen/__goldens__/ts-external-runtime--models/index.ts +48 -0
  324. package/src/codegen/__goldens__/ts-external-runtime--models/orders.ts +80 -0
  325. package/src/codegen/__goldens__/ts-external-runtime--users/_errors.ts +90 -0
  326. package/src/codegen/__goldens__/ts-external-runtime--users/index.ts +38 -0
  327. package/src/codegen/__goldens__/ts-external-runtime--users/users.ts +169 -0
  328. package/src/codegen/__goldens__/ts-flat--models/_client.ts +1319 -0
  329. package/src/codegen/__goldens__/ts-flat--models/_errors.ts +87 -0
  330. package/src/codegen/__goldens__/ts-flat--models/_models.ts +10 -0
  331. package/src/codegen/__goldens__/ts-flat--models/_types.ts +502 -0
  332. package/src/codegen/__goldens__/ts-flat--models/billing-reports.ts +28 -0
  333. package/src/codegen/__goldens__/ts-flat--models/billing.ts +51 -0
  334. package/src/codegen/__goldens__/ts-flat--models/index.ts +42 -0
  335. package/src/codegen/__goldens__/ts-flat--models/orders.ts +73 -0
  336. package/src/codegen/__goldens__/ts-flat--users/_client.ts +1319 -0
  337. package/src/codegen/__goldens__/ts-flat--users/_errors.ts +87 -0
  338. package/src/codegen/__goldens__/ts-flat--users/_types.ts +502 -0
  339. package/src/codegen/__goldens__/ts-flat--users/index.ts +34 -0
  340. package/src/codegen/__goldens__/ts-flat--users/users.ts +126 -0
  341. package/src/codegen/__goldens__/ts-no-share-models--models/_client.ts +1319 -0
  342. package/src/codegen/__goldens__/ts-no-share-models--models/_errors.ts +90 -0
  343. package/src/codegen/__goldens__/ts-no-share-models--models/_types.ts +502 -0
  344. package/src/codegen/__goldens__/ts-no-share-models--models/billing-reports.ts +29 -0
  345. package/src/codegen/__goldens__/ts-no-share-models--models/billing.ts +111 -0
  346. package/src/codegen/__goldens__/ts-no-share-models--models/index.ts +48 -0
  347. package/src/codegen/__goldens__/ts-no-share-models--models/orders.ts +112 -0
  348. package/src/codegen/__goldens__/ts-no-share-models--users/_client.ts +1319 -0
  349. package/src/codegen/__goldens__/ts-no-share-models--users/_errors.ts +90 -0
  350. package/src/codegen/__goldens__/ts-no-share-models--users/_types.ts +502 -0
  351. package/src/codegen/__goldens__/ts-no-share-models--users/index.ts +38 -0
  352. package/src/codegen/__goldens__/ts-no-share-models--users/users.ts +169 -0
  353. package/src/codegen/__goldens__/ts-shared-models-module--models/_client.ts +1319 -0
  354. package/src/codegen/__goldens__/ts-shared-models-module--models/_errors.ts +90 -0
  355. package/src/codegen/__goldens__/ts-shared-models-module--models/_models.ts +7 -0
  356. package/src/codegen/__goldens__/ts-shared-models-module--models/_types.ts +502 -0
  357. package/src/codegen/__goldens__/ts-shared-models-module--models/billing-reports.ts +29 -0
  358. package/src/codegen/__goldens__/ts-shared-models-module--models/billing.ts +67 -0
  359. package/src/codegen/__goldens__/ts-shared-models-module--models/index.ts +48 -0
  360. package/src/codegen/__goldens__/ts-shared-models-module--models/orders.ts +80 -0
  361. package/src/codegen/bin/cli.test.ts +13 -2
  362. package/src/codegen/bin/cli.ts +181 -144
  363. package/src/codegen/bin/flag-specs.test.ts +16 -1
  364. package/src/codegen/bin/flag-specs.ts +43 -31
  365. package/src/codegen/bundle-size.test.ts +1 -1
  366. package/src/codegen/collect-models.ts +1 -1
  367. package/src/codegen/e2e.test.ts +1 -1
  368. package/src/codegen/emit/api-route.ts +184 -0
  369. package/src/codegen/emit/context.ts +32 -0
  370. package/src/codegen/emit/declarations.ts +49 -0
  371. package/src/codegen/emit/format-types.ts +232 -0
  372. package/src/codegen/emit/http-stream-route.ts +162 -0
  373. package/src/codegen/emit/route-shared.ts +104 -0
  374. package/src/codegen/emit/rpc-route.ts +49 -0
  375. package/src/codegen/emit/scope-file.ts +226 -0
  376. package/src/codegen/emit/stream-route.ts +81 -0
  377. package/src/codegen/emit-errors.integration.test.ts +2 -2
  378. package/src/codegen/emit-errors.test.ts +1 -1
  379. package/src/codegen/emit-errors.ts +1 -1
  380. package/src/codegen/emit-scope.test.ts +75 -2
  381. package/src/codegen/emit-scope.ts +15 -1048
  382. package/src/codegen/goldens.test.ts +89 -0
  383. package/src/codegen/group-routes.test.ts +1 -1
  384. package/src/codegen/group-routes.ts +1 -1
  385. package/src/codegen/pipeline.test.ts +1 -1
  386. package/src/codegen/pipeline.ts +1 -1
  387. package/src/codegen/resolve-envelope.test.ts +1 -1
  388. package/src/codegen/resolve-envelope.ts +1 -1
  389. package/src/codegen/targets/_shared/error-schemas.test.ts +1 -1
  390. package/src/codegen/targets/_shared/error-schemas.ts +1 -1
  391. package/src/codegen/targets/_shared/route-slots.test.ts +1 -1
  392. package/src/codegen/targets/_shared/route-slots.ts +1 -1
  393. package/src/codegen/targets/_shared/target-run.ts +1 -1
  394. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +1 -1
  395. package/src/codegen/targets/kotlin/emit-route-kotlin.ts +1 -1
  396. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +1 -1
  397. package/src/codegen/targets/swift/access-level.test.ts +1 -1
  398. package/src/codegen/targets/swift/emit-route-swift.test.ts +1 -1
  399. package/src/codegen/targets/swift/emit-route-swift.ts +1 -1
  400. package/src/codegen/targets/swift/emit-scope-swift.test.ts +1 -1
  401. package/src/codegen/targets/ts/shared-models.test.ts +1 -1
  402. package/src/{create-http-stream.test.ts → core/create-http-stream.test.ts} +1 -1
  403. package/src/core/create-http-stream.ts +207 -0
  404. package/src/{create-http.test.ts → core/create-http.test.ts} +31 -4
  405. package/src/core/create-http.ts +126 -0
  406. package/src/{create-stream.test.ts → core/create-stream.test.ts} +28 -31
  407. package/src/core/create-stream.ts +142 -0
  408. package/src/{create.test.ts → core/create.test.ts} +25 -57
  409. package/src/core/create.ts +121 -0
  410. package/src/{stack-utils.test.ts → core/definition-site.test.ts} +14 -3
  411. package/src/{stack-utils.ts → core/definition-site.ts} +20 -23
  412. package/src/{errors.test.ts → core/errors.test.ts} +1 -1
  413. package/src/{errors.ts → core/errors.ts} +30 -28
  414. package/src/core/factory-options.test.ts +112 -0
  415. package/src/core/http-route.ts +73 -0
  416. package/src/core/internal.ts +203 -0
  417. package/src/{migration.test.ts → core/migration.test.ts} +23 -1
  418. package/src/{index.test.ts → core/procedures.test.ts} +13 -11
  419. package/src/core/procedures.ts +75 -0
  420. package/src/core/types.ts +196 -0
  421. package/src/exports.ts +60 -11
  422. package/src/schema/adapter.test.ts +58 -0
  423. package/src/schema/adapter.ts +45 -0
  424. package/src/schema/compile.test.ts +95 -0
  425. package/src/schema/compile.ts +64 -0
  426. package/src/schema/compute-schema.test.ts +222 -41
  427. package/src/schema/compute-schema.ts +145 -71
  428. package/src/schema/json-schema.ts +21 -0
  429. package/src/schema/typebox.test.ts +40 -0
  430. package/src/schema/typebox.ts +27 -0
  431. package/src/server/context.test.ts +22 -0
  432. package/src/server/context.ts +18 -0
  433. package/src/{doc-envelope.test.ts → server/doc-envelope.test.ts} +2 -2
  434. package/src/{doc-envelope.ts → server/doc-envelope.ts} +1 -1
  435. package/src/{implementations/http → server}/doc-registry.test.ts +32 -26
  436. package/src/{implementations/http → server}/doc-registry.ts +11 -7
  437. package/src/server/docs/docs.test.ts +287 -0
  438. package/src/{implementations/http/hono → server}/docs/http-doc.ts +3 -3
  439. package/src/{implementations/http/hono → server}/docs/http-stream-doc.ts +3 -3
  440. package/src/{implementations/http/hono → server}/docs/rpc-doc.ts +3 -3
  441. package/src/{implementations/http/hono → server}/docs/stream-doc.ts +3 -3
  442. package/src/server/errors/dispatch.test.ts +450 -0
  443. package/src/server/errors/dispatch.ts +189 -0
  444. package/src/{implementations/http/error-taxonomy.test.ts → server/errors/taxonomy.test.ts} +45 -39
  445. package/src/{implementations/http/error-taxonomy.ts → server/errors/taxonomy.ts} +8 -17
  446. package/src/server/index.ts +29 -0
  447. package/src/server/no-framework-imports.test.ts +43 -0
  448. package/src/server/paths.test.ts +141 -0
  449. package/src/{implementations/http/hono/path.ts → server/paths.ts} +2 -13
  450. package/src/server/request/params.test.ts +143 -0
  451. package/src/server/request/params.ts +68 -0
  452. package/src/server/request/query.test.ts +70 -0
  453. package/src/server/request/query.ts +24 -0
  454. package/src/server/sse.test.ts +113 -0
  455. package/src/server/sse.ts +117 -0
  456. package/src/{implementations → server}/types.ts +17 -16
  457. package/build/create-http-stream.d.ts +0 -58
  458. package/build/create-http-stream.js +0 -122
  459. package/build/create-http-stream.js.map +0 -1
  460. package/build/create-http-stream.test.js.map +0 -1
  461. package/build/create-http.d.ts +0 -49
  462. package/build/create-http.js +0 -108
  463. package/build/create-http.js.map +0 -1
  464. package/build/create-http.test.js.map +0 -1
  465. package/build/create-stream.d.ts +0 -35
  466. package/build/create-stream.js +0 -123
  467. package/build/create-stream.js.map +0 -1
  468. package/build/create-stream.test.js.map +0 -1
  469. package/build/create.d.ts +0 -28
  470. package/build/create.js +0 -82
  471. package/build/create.js.map +0 -1
  472. package/build/create.test.js.map +0 -1
  473. package/build/doc-envelope.js.map +0 -1
  474. package/build/doc-envelope.test.js.map +0 -1
  475. package/build/errors.js.map +0 -1
  476. package/build/errors.test.js.map +0 -1
  477. package/build/implementations/http/astro/astro-context.js.map +0 -1
  478. package/build/implementations/http/astro/create-handler.js.map +0 -1
  479. package/build/implementations/http/astro/index.js.map +0 -1
  480. package/build/implementations/http/astro/index.test.js.map +0 -1
  481. package/build/implementations/http/astro/rewrite-request.js.map +0 -1
  482. package/build/implementations/http/doc-registry.js.map +0 -1
  483. package/build/implementations/http/doc-registry.test.js.map +0 -1
  484. package/build/implementations/http/error-dispatch.d.ts +0 -76
  485. package/build/implementations/http/error-dispatch.js.map +0 -1
  486. package/build/implementations/http/error-dispatch.test.js +0 -254
  487. package/build/implementations/http/error-dispatch.test.js.map +0 -1
  488. package/build/implementations/http/error-taxonomy.js.map +0 -1
  489. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  490. package/build/implementations/http/hono/docs/http-doc.js.map +0 -1
  491. package/build/implementations/http/hono/docs/http-stream-doc.js.map +0 -1
  492. package/build/implementations/http/hono/docs/rpc-doc.js.map +0 -1
  493. package/build/implementations/http/hono/docs/stream-doc.js.map +0 -1
  494. package/build/implementations/http/hono/handlers/http-stream.js +0 -123
  495. package/build/implementations/http/hono/handlers/http-stream.js.map +0 -1
  496. package/build/implementations/http/hono/handlers/http-stream.test.js.map +0 -1
  497. package/build/implementations/http/hono/handlers/http.js +0 -110
  498. package/build/implementations/http/hono/handlers/http.js.map +0 -1
  499. package/build/implementations/http/hono/handlers/http.test.js.map +0 -1
  500. package/build/implementations/http/hono/handlers/rpc.js +0 -32
  501. package/build/implementations/http/hono/handlers/rpc.js.map +0 -1
  502. package/build/implementations/http/hono/handlers/rpc.test.js.map +0 -1
  503. package/build/implementations/http/hono/handlers/stream.d.ts +0 -23
  504. package/build/implementations/http/hono/handlers/stream.js +0 -147
  505. package/build/implementations/http/hono/handlers/stream.js.map +0 -1
  506. package/build/implementations/http/hono/handlers/stream.test.js.map +0 -1
  507. package/build/implementations/http/hono/index.js.map +0 -1
  508. package/build/implementations/http/hono/index.test.js.map +0 -1
  509. package/build/implementations/http/hono/path.js.map +0 -1
  510. package/build/implementations/http/hono/path.test.js +0 -83
  511. package/build/implementations/http/hono/path.test.js.map +0 -1
  512. package/build/implementations/http/hono/types.d.ts +0 -51
  513. package/build/implementations/http/hono/types.js.map +0 -1
  514. package/build/implementations/http/on-request-error.test.js.map +0 -1
  515. package/build/implementations/http/route-errors.test.js.map +0 -1
  516. package/build/index.d.ts +0 -175
  517. package/build/index.js +0 -47
  518. package/build/index.js.map +0 -1
  519. package/build/index.test.js.map +0 -1
  520. package/build/migration.test.js.map +0 -1
  521. package/build/schema/extract-json-schema.d.ts +0 -2
  522. package/build/schema/extract-json-schema.js +0 -12
  523. package/build/schema/extract-json-schema.js.map +0 -1
  524. package/build/schema/extract-json-schema.test.js +0 -23
  525. package/build/schema/extract-json-schema.test.js.map +0 -1
  526. package/build/schema/parser.d.ts +0 -36
  527. package/build/schema/parser.js +0 -210
  528. package/build/schema/parser.js.map +0 -1
  529. package/build/schema/parser.test.js +0 -120
  530. package/build/schema/parser.test.js.map +0 -1
  531. package/build/schema/resolve-schema-lib.d.ts +0 -12
  532. package/build/schema/resolve-schema-lib.js +0 -11
  533. package/build/schema/resolve-schema-lib.js.map +0 -1
  534. package/build/schema/resolve-schema-lib.test.js +0 -17
  535. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  536. package/build/schema/types.d.ts +0 -8
  537. package/build/schema/types.js +0 -2
  538. package/build/stack-utils.d.ts +0 -25
  539. package/build/stack-utils.js.map +0 -1
  540. package/build/stack-utils.test.js.map +0 -1
  541. package/build/types.d.ts +0 -142
  542. package/build/types.js +0 -2
  543. package/build/types.js.map +0 -1
  544. package/docs/decisions/2026-06-02-monorepo-split-evaluation.md +0 -80
  545. package/docs/handoffs/2026-06-08-dx-round2-declines.md +0 -45
  546. package/docs/handoffs/ajsc-named-type-collision.md +0 -134
  547. package/docs/handoffs/ajsc-named-type-support.md +0 -181
  548. package/docs/handoffs/shared-models-auto-resolve-response.md +0 -181
  549. package/docs/npm-workspaces-migration-plan.md +0 -611
  550. package/docs/superpowers/plans/2026-04-24-doc-registry-simplification.md +0 -886
  551. package/docs/superpowers/plans/2026-04-24-kotlin-codegen-target.md +0 -1265
  552. package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +0 -1993
  553. package/docs/superpowers/plans/2026-04-29-safe-result-api.md +0 -2293
  554. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +0 -1391
  555. package/docs/superpowers/plans/2026-05-08-create-http.md +0 -3355
  556. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +0 -3365
  557. package/docs/superpowers/plans/2026-06-05-dx-feedback-round.md +0 -1292
  558. package/docs/superpowers/plans/2026-06-06-shared-models-convention-and-diagnostics.md +0 -659
  559. package/docs/superpowers/plans/2026-06-08-codegen-dx-surfacing.md +0 -428
  560. package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +0 -401
  561. package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +0 -314
  562. package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +0 -264
  563. package/docs/superpowers/specs/2026-04-29-safe-result-api-design.md +0 -324
  564. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +0 -252
  565. package/docs/superpowers/specs/2026-05-08-create-http-design.md +0 -409
  566. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +0 -411
  567. package/docs/superpowers/specs/2026-06-05-dx-feedback-round-design.md +0 -285
  568. package/docs/superpowers/specs/2026-06-08-dx-feedback-round-2-design.md +0 -376
  569. package/src/create-http-stream.ts +0 -191
  570. package/src/create-http.ts +0 -210
  571. package/src/create-stream.ts +0 -228
  572. package/src/create.ts +0 -172
  573. package/src/implementations/http/README.md +0 -390
  574. package/src/implementations/http/error-dispatch.test.ts +0 -283
  575. package/src/implementations/http/error-dispatch.ts +0 -176
  576. package/src/implementations/http/hono/handlers/http-stream.ts +0 -152
  577. package/src/implementations/http/hono/handlers/http.ts +0 -145
  578. package/src/implementations/http/hono/handlers/rpc.ts +0 -54
  579. package/src/implementations/http/hono/path.test.ts +0 -96
  580. package/src/index.ts +0 -101
  581. package/src/schema/extract-json-schema.test.ts +0 -25
  582. package/src/schema/extract-json-schema.ts +0 -15
  583. package/src/schema/parser.test.ts +0 -182
  584. package/src/schema/parser.ts +0 -265
  585. package/src/schema/resolve-schema-lib.test.ts +0 -19
  586. package/src/schema/resolve-schema-lib.ts +0 -29
  587. package/src/schema/types.ts +0 -20
  588. package/src/types.ts +0 -133
  589. /package/build/{implementations/http → adapters}/astro/astro-context.d.ts +0 -0
  590. /package/build/{implementations/http → adapters}/astro/astro-context.js +0 -0
  591. /package/build/{implementations/http → adapters}/astro/create-handler.d.ts +0 -0
  592. /package/build/{implementations/http → adapters}/astro/create-handler.js +0 -0
  593. /package/build/{implementations/http → adapters}/astro/index.d.ts +0 -0
  594. /package/build/{implementations/http → adapters}/astro/index.js +0 -0
  595. /package/build/{implementations/http → adapters}/astro/index.test.d.ts +0 -0
  596. /package/build/{implementations/http → adapters}/astro/rewrite-request.d.ts +0 -0
  597. /package/build/{implementations/http → adapters}/astro/rewrite-request.js +0 -0
  598. /package/build/{create-http-stream.test.d.ts → adapters/hono/envelope-parity.test.d.ts} +0 -0
  599. /package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.d.ts +0 -0
  600. /package/build/{implementations/http → adapters}/hono/handlers/http.test.d.ts +0 -0
  601. /package/build/{implementations/http → adapters}/hono/handlers/rpc.test.d.ts +0 -0
  602. /package/build/{implementations/http → adapters}/hono/handlers/stream.test.d.ts +0 -0
  603. /package/build/{implementations/http → adapters}/hono/index.test.d.ts +0 -0
  604. /package/build/{implementations/http → adapters/hono}/on-request-error.test.d.ts +0 -0
  605. /package/build/{implementations/http → adapters/hono}/route-errors.test.d.ts +0 -0
  606. /package/build/{create-http.test.d.ts → client/freeze.test.d.ts} +0 -0
  607. /package/build/{create-stream.test.d.ts → codegen/goldens.test.d.ts} +0 -0
  608. /package/build/{create.test.d.ts → core/create-http-stream.test.d.ts} +0 -0
  609. /package/build/{doc-envelope.test.d.ts → core/create-http.test.d.ts} +0 -0
  610. /package/build/{errors.test.d.ts → core/create-stream.test.d.ts} +0 -0
  611. /package/build/{implementations/http/doc-registry.test.d.ts → core/create.test.d.ts} +0 -0
  612. /package/build/{implementations/http/error-dispatch.test.d.ts → core/definition-site.test.d.ts} +0 -0
  613. /package/build/{implementations/http/error-taxonomy.test.d.ts → core/errors.test.d.ts} +0 -0
  614. /package/build/{errors.test.js → core/errors.test.js} +0 -0
  615. /package/build/{implementations/http/hono/path.test.d.ts → core/factory-options.test.d.ts} +0 -0
  616. /package/build/{migration.test.d.ts → core/migration.test.d.ts} +0 -0
  617. /package/build/{index.test.d.ts → core/procedures.test.d.ts} +0 -0
  618. /package/build/{implementations/http/hono → core}/types.js +0 -0
  619. /package/build/schema/{extract-json-schema.test.d.ts → adapter.test.d.ts} +0 -0
  620. /package/build/schema/{parser.test.d.ts → compile.test.d.ts} +0 -0
  621. /package/build/schema/{resolve-schema-lib.test.d.ts → typebox.test.d.ts} +0 -0
  622. /package/build/{stack-utils.test.d.ts → server/context.test.d.ts} +0 -0
  623. /package/build/{doc-envelope.js → server/doc-envelope.js} +0 -0
  624. /package/build/{doc-envelope.test.js → server/doc-envelope.test.js} +0 -0
  625. /package/build/{implementations → server}/types.js +0 -0
  626. /package/src/{implementations/http → adapters}/astro/README.md +0 -0
  627. /package/src/{implementations/http → adapters}/astro/astro-context.ts +0 -0
  628. /package/src/{implementations/http → adapters}/astro/create-handler.ts +0 -0
  629. /package/src/{implementations/http → adapters}/astro/index.ts +0 -0
  630. /package/src/{implementations/http → adapters}/astro/rewrite-request.ts +0 -0
@@ -0,0 +1,87 @@
1
+ // Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
2
+ // Source hash: 7b621d913616819f78563ff671bffa03
3
+
4
+ /** Base class for every generated error in this service. Catch with `instanceof`. */
5
+ export class ApiProcedureError<TBody = unknown> extends Error {
6
+ readonly status: number
7
+ readonly procedureName: string
8
+ readonly scope: string
9
+ readonly body: TBody
10
+ constructor(args: {
11
+ name: string
12
+ message: string
13
+ status: number
14
+ procedureName: string
15
+ scope: string
16
+ body: TBody
17
+ }) {
18
+ super(args.message)
19
+ this.name = args.name
20
+ this.status = args.status
21
+ this.procedureName = args.procedureName
22
+ this.scope = args.scope
23
+ this.body = args.body
24
+ Object.setPrototypeOf(this, new.target.prototype)
25
+ }
26
+ }
27
+
28
+ /** Response body for NotFound. */
29
+ export type NotFoundBody = { name: "NotFound"; message: string; }
30
+
31
+ /** Resource not found (HTTP 404) */
32
+ export class NotFound extends ApiProcedureError<NotFoundBody> {
33
+ static readonly errorName = 'NotFound' as const
34
+ static readonly statusCode = 404
35
+ static fromResponse(
36
+ body: NotFoundBody,
37
+ meta: { status: number; procedureName: string; scope: string }
38
+ ): NotFound {
39
+ const message =
40
+ body && typeof (body as { message?: unknown }).message === 'string'
41
+ ? (body as { message: string }).message
42
+ : 'NotFound'
43
+ return new NotFound({
44
+ name: 'NotFound',
45
+ message,
46
+ status: meta.status,
47
+ procedureName: meta.procedureName,
48
+ scope: meta.scope,
49
+ body,
50
+ })
51
+ }
52
+ }
53
+
54
+ /** Response body for ValidationError. */
55
+ export type ValidationErrorBody = { name: "ValidationError"; message: string; field?: string; }
56
+
57
+ /** Input failed validation (HTTP 400) */
58
+ export class ValidationError extends ApiProcedureError<ValidationErrorBody> {
59
+ static readonly errorName = 'ValidationError' as const
60
+ static readonly statusCode = 400
61
+ static fromResponse(
62
+ body: ValidationErrorBody,
63
+ meta: { status: number; procedureName: string; scope: string }
64
+ ): ValidationError {
65
+ const message =
66
+ body && typeof (body as { message?: unknown }).message === 'string'
67
+ ? (body as { message: string }).message
68
+ : 'ValidationError'
69
+ return new ValidationError({
70
+ name: 'ValidationError',
71
+ message,
72
+ status: meta.status,
73
+ procedureName: meta.procedureName,
74
+ scope: meta.scope,
75
+ body,
76
+ })
77
+ }
78
+ }
79
+
80
+ /** Union of every generated error in this service. */
81
+ export type ApiProcedureErrorUnion = NotFound | ValidationError
82
+
83
+ /** Runtime registry consumed by the client to dispatch by `body.name`. */
84
+ export const ApiErrorRegistry = {
85
+ NotFound,
86
+ ValidationError,
87
+ } as const
@@ -0,0 +1,502 @@
1
+ // Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
2
+ // Source hash: 7b621d913616819f78563ff671bffa03
3
+
4
+ export class ClientHttpError extends Error {
5
+ readonly name = 'ClientHttpError'
6
+ readonly status: number
7
+ readonly headers: Record<string, string>
8
+ readonly body: unknown
9
+ readonly procedureName: string
10
+ readonly scope: string
11
+
12
+ constructor(opts: {
13
+ status: number
14
+ headers: Record<string, string>
15
+ body: unknown
16
+ procedureName: string
17
+ scope: string
18
+ cause?: unknown
19
+ }) {
20
+ super(
21
+ `${opts.procedureName} (${opts.scope}) failed with status ${opts.status}`,
22
+ { cause: opts.cause }
23
+ )
24
+ this.status = opts.status
25
+ this.headers = opts.headers
26
+ this.body = opts.body
27
+ this.procedureName = opts.procedureName
28
+ this.scope = opts.scope
29
+ }
30
+ }
31
+
32
+ /** @deprecated Renamed to `ClientHttpError`. The alias is retained for one minor release after the 7.0.0 major bump and will be removed in a subsequent minor (e.g. 7.1.0). Migrate to `ClientHttpError` now. */
33
+
34
+ export const ClientRequestError = ClientHttpError
35
+ /** @deprecated Renamed to `ClientHttpError`. The alias is retained for one minor release after the 7.0.0 major bump and will be removed in a subsequent minor (e.g. 7.1.0). Migrate to `ClientHttpError` now. */
36
+ // eslint-disable-next-line no-redeclare
37
+ export type ClientRequestError = ClientHttpError
38
+
39
+ export class ClientPathParamError extends Error {
40
+ readonly name = 'ClientPathParamError'
41
+
42
+ constructor(param: string, path: string, procedureName: string, cause?: unknown) {
43
+ super(`Missing path parameter "${param}" in "${path}" for procedure ${procedureName}`, { cause })
44
+ }
45
+ }
46
+
47
+ export class ClientStreamError extends Error {
48
+ readonly name = 'ClientStreamError'
49
+ readonly procedureName: string
50
+ readonly scope: string
51
+
52
+ constructor(message: string, procedureName: string, scope: string, cause?: unknown) {
53
+ super(message, { cause })
54
+ this.procedureName = procedureName
55
+ this.scope = scope
56
+ }
57
+ }
58
+
59
+ export class ClientNetworkError extends Error {
60
+ readonly name = 'ClientNetworkError'
61
+ readonly procedureName: string
62
+ readonly scope: string
63
+
64
+ constructor(opts: { procedureName: string; scope: string; cause?: unknown; message?: string }) {
65
+ super(opts.message ?? `${opts.procedureName} (${opts.scope}) failed: network error`, { cause: opts.cause })
66
+ this.procedureName = opts.procedureName
67
+ this.scope = opts.scope
68
+ }
69
+ }
70
+
71
+ export class ClientTimeoutError extends Error {
72
+ readonly name = 'ClientTimeoutError'
73
+ readonly procedureName: string
74
+ readonly scope: string
75
+ readonly timeoutMs: number
76
+
77
+ constructor(opts: { procedureName: string; scope: string; timeoutMs: number; cause?: unknown }) {
78
+ super(`${opts.procedureName} (${opts.scope}) timed out after ${opts.timeoutMs}ms`, { cause: opts.cause })
79
+ this.procedureName = opts.procedureName
80
+ this.scope = opts.scope
81
+ this.timeoutMs = opts.timeoutMs
82
+ }
83
+ }
84
+
85
+ export class ClientAbortError extends Error {
86
+ readonly name = 'ClientAbortError'
87
+ readonly procedureName: string
88
+ readonly scope: string
89
+ readonly reason: unknown
90
+
91
+ constructor(opts: { procedureName: string; scope: string; reason?: unknown; cause?: unknown }) {
92
+ super(`${opts.procedureName} (${opts.scope}) aborted`, { cause: opts.cause })
93
+ this.procedureName = opts.procedureName
94
+ this.scope = opts.scope
95
+ this.reason = opts.reason
96
+ }
97
+ }
98
+
99
+ export class ClientParseError extends Error {
100
+ readonly name = 'ClientParseError'
101
+ readonly procedureName: string
102
+ readonly scope: string
103
+
104
+ constructor(opts: { procedureName: string; scope: string; cause?: unknown; message?: string }) {
105
+ super(opts.message ?? `${opts.procedureName} (${opts.scope}) response could not be parsed`, { cause: opts.cause })
106
+ this.procedureName = opts.procedureName
107
+ this.scope = opts.scope
108
+ }
109
+ }
110
+
111
+ // ── Request Metadata ─────────────────────────────────────
112
+
113
+ /**
114
+ * Per-request metadata visible to adapters and hooks. Defined as an empty
115
+ * interface so consumers can augment it via TypeScript declaration merging
116
+ * to get end-to-end type safety for their own metadata fields.
117
+ *
118
+ * @example With a non-self-contained client:
119
+ * ```ts
120
+ * declare module 'ts-procedures/client' {
121
+ * interface RequestMeta {
122
+ * traceId?: string
123
+ * priority?: 'high' | 'low'
124
+ * }
125
+ * }
126
+ * ```
127
+ *
128
+ * @example With a self-contained (code-generated) client:
129
+ * ```ts
130
+ * declare module './generated/_types' {
131
+ * interface RequestMeta {
132
+ * traceId?: string
133
+ * }
134
+ * }
135
+ * ```
136
+ *
137
+ * After augmentation, `request.meta.traceId` is typed everywhere — per-call
138
+ * options, hooks, and adapters.
139
+ */
140
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
141
+ export interface RequestMeta {}
142
+
143
+ // ── Error Classifier ─────────────────────────────────────
144
+
145
+ /**
146
+ * Classification context — supplies provenance the classifier needs that's
147
+ * not derivable from the raw error itself.
148
+ *
149
+ * `timeoutSignal` and `userSignal` let the classifier distinguish a timeout
150
+ * abort from a user-initiated abort when an `AbortError` lands.
151
+ */
152
+ export interface ClassifyErrorContext {
153
+ procedureName: string
154
+ scope: string
155
+ timeoutSignal?: AbortSignal
156
+ userSignal?: AbortSignal
157
+ timeoutMs?: number
158
+ }
159
+
160
+ /**
161
+ * The output shape of a successful classification. Contract: `error` is
162
+ * always an `Error` subclass (the framework class). Non-`Error` values fall
163
+ * through to `null` (handled by `executeCall` as `kind: 'unknown'`).
164
+ */
165
+ export interface ClassifiedError {
166
+ kind: string
167
+ error: Error
168
+ }
169
+
170
+ /**
171
+ * Adapter-provided classifier — runs before `defaultClassifyError`. Return
172
+ * `null` to fall through to the default. Adapter authors should compose with
173
+ * the default explicitly:
174
+ *
175
+ * classifyError: (e, ctx) => myClassify(e, ctx) ?? defaultClassifyError(e, ctx)
176
+ */
177
+ export type ErrorClassifier = (
178
+ raw: unknown,
179
+ ctx: ClassifyErrorContext,
180
+ ) => ClassifiedError | null
181
+
182
+ // ── Adapter ──────────────────────────────────────────────
183
+
184
+ export interface ClientAdapter {
185
+ request(config: AdapterRequest): Promise<AdapterResponse>
186
+ stream(config: AdapterRequest): Promise<AdapterStreamResponse>
187
+ /** Optional adapter-level error classifier — composes with `defaultClassifyError`. */
188
+ classifyError?: ErrorClassifier
189
+ }
190
+
191
+ export interface AdapterRequest {
192
+ url: string
193
+ method: string
194
+ headers?: Record<string, string>
195
+ body?: unknown
196
+ signal?: AbortSignal
197
+ /**
198
+ * Per-request metadata. Augment `RequestMeta` via declaration merging to
199
+ * type your own fields. See {@link RequestMeta}.
200
+ */
201
+ meta?: RequestMeta
202
+ }
203
+
204
+ export interface AdapterResponse {
205
+ status: number
206
+ headers: Record<string, string>
207
+ body: unknown
208
+ }
209
+
210
+ export interface AdapterStreamResponse {
211
+ status: number
212
+ /**
213
+ * Platform `Headers` object populated by the adapter. Passed through to
214
+ * `TypedStream.headers` when the route declares `res.headers`.
215
+ */
216
+ headers: Headers
217
+ body: AsyncIterable<unknown>
218
+ /**
219
+ * Populated when `status` is non-2xx — the parsed response body. Surfaced so
220
+ * `executeStream` can dispatch typed errors via the error registry instead
221
+ * of always falling back to `ClientHttpError` with `body: null`.
222
+ */
223
+ errorBody?: unknown
224
+ }
225
+
226
+ // ── Hooks ────────────────────────────────────────────────
227
+
228
+ export interface ClientHooks {
229
+ onBeforeRequest?(context: BeforeRequestContext): BeforeRequestContext | Promise<BeforeRequestContext>
230
+ onAfterResponse?(context: AfterResponseContext): void | Promise<void>
231
+ onError?(context: ErrorContext): void | Promise<void>
232
+ }
233
+
234
+ export interface BeforeRequestContext {
235
+ procedureName: string
236
+ scope: string
237
+ request: AdapterRequest
238
+ }
239
+
240
+ export interface AfterResponseContext {
241
+ procedureName: string
242
+ scope: string
243
+ request: AdapterRequest
244
+ response: AdapterResponse
245
+ }
246
+
247
+ export interface ErrorContext {
248
+ procedureName: string
249
+ scope: string
250
+ request: AdapterRequest
251
+ error: unknown
252
+ }
253
+
254
+ // ── Descriptors ──────────────────────────────────────────
255
+
256
+ export interface CallDescriptor {
257
+ name: string
258
+ scope: string
259
+ path: string
260
+ method: string
261
+ kind: 'rpc' | 'api' | 'stream' | 'http-stream'
262
+ params: unknown
263
+ /**
264
+ * Set by codegen when the route declares `schema.res.headers`. Drives
265
+ * whether `executeCall` returns bare body (`undefined`/false) or a
266
+ * `{ body, headers }` envelope (`true`). Mirrors the `HttpReturn<TRes>`
267
+ * conditional return shape on the server side.
268
+ */
269
+ responseHeadersDeclared?: boolean
270
+ }
271
+
272
+ export interface StreamDescriptor extends CallDescriptor {
273
+ kind: 'stream' | 'http-stream'
274
+ streamMode: 'sse' | 'text'
275
+ }
276
+
277
+ // ── TypedStream ──────────────────────────────────────────
278
+
279
+ export interface TypedStream<TYield, TReturn = void> extends AsyncIterable<TYield> {
280
+ /**
281
+ * Resolves when the stream completes with the final return value.
282
+ * Rejects if the stream errors before completing.
283
+ * Note: iteration must begin (via for-await) for this promise to settle,
284
+ * since resolution depends on the async generator running to completion.
285
+ */
286
+ result: Promise<TReturn>
287
+ /**
288
+ * Platform `Headers` from the initial stream response. Populated only when
289
+ * the route declares `res.headers` (i.e. `responseHeadersDeclared: true` on
290
+ * the descriptor). Undefined otherwise — consumers without declared response
291
+ * headers should not rely on this field.
292
+ */
293
+ headers?: Headers
294
+ }
295
+
296
+ // ── Request Options ──────────────────────────────────────
297
+
298
+ /**
299
+ * Request-level configuration that can be set as client-level defaults
300
+ * (via `CreateClientConfig.defaults`) or per-call (via `ProcedureCallOptions`).
301
+ *
302
+ * - `signal`: AbortSignal for cancellation. When both a default and per-call
303
+ * signal are provided, they're combined — whichever aborts first wins.
304
+ * - `timeout`: Timeout in milliseconds. Combined with `signal` the same way.
305
+ * A per-call `timeout: 0` disables an inherited default timeout.
306
+ * - `headers`: Extra headers merged into the request, as a static record OR a
307
+ * (possibly async) function evaluated per request. Per-call keys win over
308
+ * default keys. Use the function form for values that change between calls
309
+ * (e.g. a rotating bearer token) so they don't go stale. Still subject to
310
+ * further mutation by `onBeforeRequest` hooks.
311
+ * - `basePath`: Override the base path for this call. Per-call > default > config.
312
+ * - `meta`: Per-request metadata typed via the {@link RequestMeta} interface.
313
+ * Merged shallowly (per-call keys win over default keys).
314
+ */
315
+ /**
316
+ * Request headers as a static record OR a (possibly async) function evaluated
317
+ * per request. Use the function form for values that change between calls — e.g.
318
+ * a rotating bearer token: `headers: () => ({ Authorization: `Bearer ${session.token}` })`.
319
+ * A static record captured at construction goes stale; a function is re-evaluated each call.
320
+ *
321
+ * Named `ClientHeadersInit` (not `HeadersInit`) to avoid shadowing the DOM lib's
322
+ * global `HeadersInit`, which has a different shape.
323
+ */
324
+ export type ClientHeadersInit =
325
+ | Record<string, string>
326
+ | (() => Record<string, string> | Promise<Record<string, string>>)
327
+
328
+ export interface ProcedureCallDefaults {
329
+ signal?: AbortSignal
330
+ timeout?: number
331
+ headers?: ClientHeadersInit
332
+ basePath?: string
333
+ meta?: RequestMeta
334
+ }
335
+
336
+ /**
337
+ * Per-call options. Extends both `ProcedureCallDefaults` (request config) and
338
+ * `ClientHooks` (hooks), so a single options bag covers both concerns.
339
+ */
340
+ export interface ProcedureCallOptions extends ProcedureCallDefaults, ClientHooks {}
341
+
342
+ // ── Error Registry ───────────────────────────────────────
343
+
344
+ /**
345
+ * Metadata attached to a typed error at construction. Supplies the transport
346
+ * context (status, procedure, scope) that isn't part of the response body.
347
+ */
348
+ export interface ErrorResponseMeta {
349
+ status: number
350
+ procedureName: string
351
+ scope: string
352
+ }
353
+
354
+ /**
355
+ * A factory for a typed error class — constructed from the response body plus
356
+ * transport metadata. Generated error classes expose this as a static method.
357
+ */
358
+ export interface ErrorFactory {
359
+ fromResponse(body: unknown, meta: ErrorResponseMeta): Error
360
+ }
361
+
362
+ /**
363
+ * Maps `body.name` values (taxonomy keys) to error class factories. When the
364
+ * client sees a non-2xx response whose body has a `name` matching a registry
365
+ * entry, it throws the typed error instead of a generic `ClientHttpError`.
366
+ */
367
+ export type ErrorRegistry = Record<string, ErrorFactory>
368
+
369
+ // ── Client Instance ──────────────────────────────────────
370
+
371
+ export interface ClientInstance {
372
+ basePath: string
373
+ adapter: ClientAdapter
374
+ hooks: ClientHooks
375
+ defaults: ProcedureCallDefaults
376
+ /** Optional registry for runtime dispatch of typed errors by `body.name`. */
377
+ errorRegistry?: ErrorRegistry
378
+ call<TResponse>(descriptor: CallDescriptor, options?: ProcedureCallOptions): Promise<TResponse>
379
+ safeCall<TResponse, ETyped = never>(
380
+ descriptor: CallDescriptor,
381
+ options?: ProcedureCallOptions,
382
+ ): Promise<Result<TResponse, ETyped>>
383
+ stream<TYield, TReturn>(descriptor: StreamDescriptor, options?: ProcedureCallOptions): TypedStream<TYield, TReturn>
384
+ /**
385
+ * Wires a callable with a `.safe` sibling for routes without declared typed errors.
386
+ * Used by codegen to produce a compact one-line callable per route.
387
+ *
388
+ * The returned function's `.name` is set to `descriptor.name` for nicer stack traces.
389
+ */
390
+ bindCallable<TParams, TResponse>(
391
+ descriptor: Omit<CallDescriptor, 'params'>,
392
+ ): {
393
+ (params: TParams, options?: ProcedureCallOptions): Promise<TResponse>
394
+ safe(params: TParams, options?: ProcedureCallOptions): Promise<ResultNoTyped<TResponse>>
395
+ }
396
+ /**
397
+ * Wires a callable with a `.safe` sibling for routes with declared typed errors.
398
+ * The `.safe` form returns `Result<TResponse, ETyped>` where `ETyped` is the
399
+ * union of route-declared error classes.
400
+ *
401
+ * The returned function's `.name` is set to `descriptor.name` for nicer stack traces.
402
+ */
403
+ bindCallableTyped<TParams, TResponse, ETyped>(
404
+ descriptor: Omit<CallDescriptor, 'params'>,
405
+ ): {
406
+ (params: TParams, options?: ProcedureCallOptions): Promise<TResponse>
407
+ safe(params: TParams, options?: ProcedureCallOptions): Promise<Result<TResponse, ETyped>>
408
+ }
409
+ }
410
+
411
+ // ── createClient Config ──────────────────────────────────
412
+
413
+ export interface CreateClientConfig<TScopes> {
414
+ adapter: ClientAdapter
415
+ basePath: string
416
+ scopes: (client: ClientInstance) => TScopes
417
+ hooks?: ClientHooks
418
+ /**
419
+ * Default request options applied to every call. Per-call options override
420
+ * these (except `signal`, which combines via AbortSignal.any — whichever
421
+ * fires first cancels the request).
422
+ */
423
+ defaults?: ProcedureCallDefaults
424
+ /**
425
+ * Optional error-dispatch registry. When a non-2xx response body has a
426
+ * `name` field matching a registry key, the client throws the typed error
427
+ * constructed via that entry's `fromResponse`. When absent or when no key
428
+ * matches, falls back to `ClientHttpError` (transport error shape).
429
+ */
430
+ errorRegistry?: ErrorRegistry
431
+ /**
432
+ * Returns the current bearer token, re-evaluated per request (so a rotating
433
+ * token never goes stale). Wired internally to the `Authorization: Bearer
434
+ * <token>` header — a `null`/`undefined` token omits the header entirely.
435
+ *
436
+ * This is sugar over a function-valued `defaults.headers`; it composes with
437
+ * `defaults.headers` (both are applied, auth last) and is still subject to
438
+ * per-call `headers` and `onBeforeRequest`, which run after and can override.
439
+ *
440
+ * @example
441
+ * ```ts
442
+ * createClient({ adapter, basePath, auth: () => session.token, scopes })
443
+ * ```
444
+ */
445
+ auth?: () => string | null | undefined | Promise<string | null | undefined>
446
+ }
447
+
448
+ // ── Result Types ─────────────────────────────────────────
449
+
450
+
451
+ /**
452
+ * Augmentable map of `kind` discriminant → error class for the framework's
453
+ * non-typed failure categories. Mirrors the `RequestMeta` augmentation
454
+ * pattern: extend via TypeScript declaration merging.
455
+ *
456
+ * @example
457
+ * ```ts
458
+ * declare module 'ts-procedures/client' {
459
+ * interface ClientErrorMap {
460
+ * rateLimited: MyRateLimitError
461
+ * paymentRequired: MyPaymentError
462
+ * }
463
+ * }
464
+ * ```
465
+ *
466
+ * **`'typed'` is reserved** — it's the discriminant used by `Result` for
467
+ * route-declared errors and is not part of `ClientErrorMap`. Attempting to
468
+ * register it produces a TS error about overlapping discriminants.
469
+ */
470
+ export interface ClientErrorMap {
471
+ http: ClientHttpError
472
+ network: ClientNetworkError
473
+ timeout: ClientTimeoutError
474
+ aborted: ClientAbortError
475
+ parse: ClientParseError
476
+ usage: ClientPathParamError
477
+ unknown: unknown
478
+ }
479
+
480
+ /** Distributed union of every framework failure kind. */
481
+ export type FrameworkFailure = {
482
+ [K in keyof ClientErrorMap]: { ok: false; kind: K; error: ClientErrorMap[K] }
483
+ }[keyof ClientErrorMap]
484
+
485
+ /**
486
+ * Discriminated result type for the `.safe()` form. `kind: 'typed'` carries
487
+ * route-declared errors (registry-dispatched); other kinds carry framework
488
+ * failures. Use `ResultNoTyped<T>` for routes without declared errors.
489
+ */
490
+ export type Result<T, ETyped> =
491
+ | { ok: true; value: T }
492
+ | { ok: false; kind: 'typed'; error: ETyped }
493
+ | FrameworkFailure
494
+
495
+ /**
496
+ * `Result` for routes that don't declare typed errors. Omits the `'typed'`
497
+ * arm entirely so IDE hovers stay clean (TS doesn't collapse `never`-payload
498
+ * arms in tooltip output).
499
+ */
500
+ export type ResultNoTyped<T> =
501
+ | { ok: true; value: T }
502
+ | FrameworkFailure
@@ -0,0 +1,34 @@
1
+ // Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
2
+ // Source hash: 7b621d913616819f78563ff671bffa03
3
+ import { createClient } from './_client'
4
+ import type { ClientInstance, CreateClientConfig } from './_types'
5
+ import * as _users from './users'
6
+ import * as _errorsModule from './_errors'
7
+
8
+
9
+ export function createApiBindings(client: ClientInstance) {
10
+ return {
11
+ users: _users.bindUsersScope(client),
12
+ }
13
+ }
14
+
15
+ /** Full typed client surface — every scope of `Api`. */
16
+ export type ApiClient = ReturnType<typeof createApiBindings>
17
+ /** Narrow port for the `users` scope — inject as a DI seam without casting the aggregate client. */
18
+ export type UsersClient = ApiClient['users']
19
+
20
+ /**
21
+ * Creates a typed client for this service with the generated error
22
+ * registry pre-configured. Non-2xx responses whose body `name` matches
23
+ * a registered error are thrown as typed class instances instead of
24
+ * generic `ClientHttpError`s.
25
+ */
26
+ export function createApiClient(
27
+ config: Omit<CreateClientConfig<ReturnType<typeof createApiBindings>>, 'scopes' | 'errorRegistry'>
28
+ ) {
29
+ return createClient({
30
+ ...config,
31
+ errorRegistry: _errorsModule.ApiErrorRegistry,
32
+ scopes: (client) => createApiBindings(client),
33
+ })
34
+ }