ts-procedures 8.6.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. package/README.md +166 -101
  2. package/agent_config/claude-code/.claude-plugin/plugin.json +1 -1
  3. package/agent_config/claude-code/agents/ts-procedures-architect.md +11 -10
  4. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +25 -12
  5. package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +10 -12
  6. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +141 -45
  7. package/agent_config/claude-code/skills/ts-procedures/checklist.md +7 -6
  8. package/agent_config/claude-code/skills/ts-procedures/patterns.md +45 -6
  9. package/agent_config/claude-code/skills/ts-procedures/templates/client.md +1 -1
  10. package/agent_config/claude-code/skills/ts-procedures/templates/hono.md +1 -1
  11. package/agent_config/copilot/copilot-instructions.md +50 -33
  12. package/agent_config/cursor/cursorrules +50 -33
  13. package/build/adapters/astro/astro-context.js.map +1 -0
  14. package/build/adapters/astro/create-handler.js.map +1 -0
  15. package/build/adapters/astro/index.js.map +1 -0
  16. package/build/{implementations/http → adapters}/astro/index.test.js +1 -1
  17. package/build/adapters/astro/index.test.js.map +1 -0
  18. package/build/adapters/astro/rewrite-request.js.map +1 -0
  19. package/build/adapters/hono/envelope-parity.test.js +98 -0
  20. package/build/adapters/hono/envelope-parity.test.js.map +1 -0
  21. package/build/{implementations/http → adapters}/hono/handlers/http-stream.d.ts +1 -1
  22. package/build/adapters/hono/handlers/http-stream.js +55 -0
  23. package/build/adapters/hono/handlers/http-stream.js.map +1 -0
  24. package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.js +1 -1
  25. package/build/adapters/hono/handlers/http-stream.test.js.map +1 -0
  26. package/build/{implementations/http → adapters}/hono/handlers/http.d.ts +1 -1
  27. package/build/adapters/hono/handlers/http.js +50 -0
  28. package/build/adapters/hono/handlers/http.js.map +1 -0
  29. package/build/{implementations/http → adapters}/hono/handlers/http.test.js +1 -1
  30. package/build/adapters/hono/handlers/http.test.js.map +1 -0
  31. package/build/{implementations/http → adapters}/hono/handlers/rpc.d.ts +2 -2
  32. package/build/adapters/hono/handlers/rpc.js +23 -0
  33. package/build/adapters/hono/handlers/rpc.js.map +1 -0
  34. package/build/{implementations/http → adapters}/hono/handlers/rpc.test.js +1 -1
  35. package/build/adapters/hono/handlers/rpc.test.js.map +1 -0
  36. package/build/adapters/hono/handlers/stream.d.ts +12 -0
  37. package/build/adapters/hono/handlers/stream.js +89 -0
  38. package/build/adapters/hono/handlers/stream.js.map +1 -0
  39. package/build/{implementations/http → adapters}/hono/handlers/stream.test.js +3 -2
  40. package/build/adapters/hono/handlers/stream.test.js.map +1 -0
  41. package/build/{implementations/http → adapters}/hono/index.d.ts +24 -12
  42. package/build/{implementations/http → adapters}/hono/index.js +19 -8
  43. package/build/adapters/hono/index.js.map +1 -0
  44. package/build/{implementations/http → adapters}/hono/index.test.js +2 -4
  45. package/build/adapters/hono/index.test.js.map +1 -0
  46. package/build/{implementations/http → adapters/hono}/on-request-error.test.js +2 -2
  47. package/build/adapters/hono/on-request-error.test.js.map +1 -0
  48. package/build/adapters/hono/request.d.ts +7 -0
  49. package/build/adapters/hono/request.js +22 -0
  50. package/build/adapters/hono/request.js.map +1 -0
  51. package/build/{implementations/http → adapters/hono}/route-errors.test.js +4 -4
  52. package/build/adapters/hono/route-errors.test.js.map +1 -0
  53. package/build/adapters/hono/types.d.ts +55 -0
  54. package/build/adapters/hono/types.js +19 -0
  55. package/build/adapters/hono/types.js.map +1 -0
  56. package/build/client/freeze.test.js +39 -0
  57. package/build/client/freeze.test.js.map +1 -0
  58. package/build/client/typed-error-dispatch.test.js +2 -2
  59. package/build/client/typed-error-dispatch.test.js.map +1 -1
  60. package/build/codegen/__fixtures__/make-envelope.d.ts +1 -1
  61. package/build/codegen/bin/cli.d.ts +5 -0
  62. package/build/codegen/bin/cli.js +139 -182
  63. package/build/codegen/bin/cli.js.map +1 -1
  64. package/build/codegen/bin/cli.test.js +12 -2
  65. package/build/codegen/bin/cli.test.js.map +1 -1
  66. package/build/codegen/bin/flag-specs.d.ts +9 -0
  67. package/build/codegen/bin/flag-specs.js +33 -31
  68. package/build/codegen/bin/flag-specs.js.map +1 -1
  69. package/build/codegen/bin/flag-specs.test.js +14 -1
  70. package/build/codegen/bin/flag-specs.test.js.map +1 -1
  71. package/build/codegen/collect-models.d.ts +1 -1
  72. package/build/codegen/emit/api-route.d.ts +8 -0
  73. package/build/codegen/emit/api-route.js +156 -0
  74. package/build/codegen/emit/api-route.js.map +1 -0
  75. package/build/codegen/emit/context.d.ts +30 -0
  76. package/build/codegen/emit/context.js +2 -0
  77. package/build/codegen/emit/context.js.map +1 -0
  78. package/build/codegen/emit/declarations.d.ts +24 -0
  79. package/build/codegen/emit/declarations.js +48 -0
  80. package/build/codegen/emit/declarations.js.map +1 -0
  81. package/build/codegen/emit/format-types.d.ts +61 -0
  82. package/build/codegen/emit/format-types.js +188 -0
  83. package/build/codegen/emit/format-types.js.map +1 -0
  84. package/build/codegen/emit/http-stream-route.d.ts +7 -0
  85. package/build/codegen/emit/http-stream-route.js +138 -0
  86. package/build/codegen/emit/http-stream-route.js.map +1 -0
  87. package/build/codegen/emit/route-shared.d.ts +35 -0
  88. package/build/codegen/emit/route-shared.js +88 -0
  89. package/build/codegen/emit/route-shared.js.map +1 -0
  90. package/build/codegen/emit/rpc-route.d.ts +7 -0
  91. package/build/codegen/emit/rpc-route.js +37 -0
  92. package/build/codegen/emit/rpc-route.js.map +1 -0
  93. package/build/codegen/emit/scope-file.d.ts +39 -0
  94. package/build/codegen/emit/scope-file.js +166 -0
  95. package/build/codegen/emit/scope-file.js.map +1 -0
  96. package/build/codegen/emit/stream-route.d.ts +7 -0
  97. package/build/codegen/emit/stream-route.js +62 -0
  98. package/build/codegen/emit/stream-route.js.map +1 -0
  99. package/build/codegen/emit-errors.d.ts +1 -1
  100. package/build/codegen/emit-errors.integration.test.js +1 -1
  101. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  102. package/build/codegen/emit-scope.d.ts +13 -30
  103. package/build/codegen/emit-scope.js +15 -844
  104. package/build/codegen/emit-scope.js.map +1 -1
  105. package/build/codegen/goldens.test.js +69 -0
  106. package/build/codegen/goldens.test.js.map +1 -0
  107. package/build/codegen/group-routes.d.ts +1 -1
  108. package/build/codegen/pipeline.d.ts +1 -1
  109. package/build/codegen/resolve-envelope.d.ts +1 -1
  110. package/build/codegen/targets/_shared/error-schemas.d.ts +1 -1
  111. package/build/codegen/targets/_shared/route-slots.d.ts +1 -1
  112. package/build/codegen/targets/_shared/target-run.d.ts +1 -1
  113. package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +1 -1
  114. package/build/codegen/targets/swift/emit-route-swift.d.ts +1 -1
  115. package/build/core/create-http-stream.d.ts +50 -0
  116. package/build/core/create-http-stream.js +108 -0
  117. package/build/core/create-http-stream.js.map +1 -0
  118. package/build/{create-http-stream.test.js → core/create-http-stream.test.js} +1 -1
  119. package/build/core/create-http-stream.test.js.map +1 -0
  120. package/build/core/create-http.d.ts +51 -0
  121. package/build/core/create-http.js +65 -0
  122. package/build/core/create-http.js.map +1 -0
  123. package/build/{create-http.test.js → core/create-http.test.js} +13 -4
  124. package/build/core/create-http.test.js.map +1 -0
  125. package/build/core/create-stream.d.ts +26 -0
  126. package/build/core/create-stream.js +80 -0
  127. package/build/core/create-stream.js.map +1 -0
  128. package/build/{create-stream.test.js → core/create-stream.test.js} +23 -28
  129. package/build/core/create-stream.test.js.map +1 -0
  130. package/build/core/create.d.ts +22 -0
  131. package/build/core/create.js +71 -0
  132. package/build/core/create.js.map +1 -0
  133. package/build/{create.test.js → core/create.test.js} +25 -46
  134. package/build/core/create.test.js.map +1 -0
  135. package/build/core/definition-site.d.ts +24 -0
  136. package/build/{stack-utils.js → core/definition-site.js} +20 -20
  137. package/build/core/definition-site.js.map +1 -0
  138. package/build/{stack-utils.test.js → core/definition-site.test.js} +12 -3
  139. package/build/core/definition-site.test.js.map +1 -0
  140. package/build/{errors.d.ts → core/errors.d.ts} +19 -8
  141. package/build/{errors.js → core/errors.js} +21 -26
  142. package/build/core/errors.js.map +1 -0
  143. package/build/core/errors.test.js.map +1 -0
  144. package/build/core/factory-options.test.js +82 -0
  145. package/build/core/factory-options.test.js.map +1 -0
  146. package/build/core/http-route.d.ts +13 -0
  147. package/build/core/http-route.js +54 -0
  148. package/build/core/http-route.js.map +1 -0
  149. package/build/core/internal.d.ts +72 -0
  150. package/build/core/internal.js +128 -0
  151. package/build/core/internal.js.map +1 -0
  152. package/build/{migration.test.js → core/migration.test.js} +17 -1
  153. package/build/core/migration.test.js.map +1 -0
  154. package/build/core/procedures.d.ts +143 -0
  155. package/build/core/procedures.js +64 -0
  156. package/build/core/procedures.js.map +1 -0
  157. package/build/{index.test.js → core/procedures.test.js} +14 -11
  158. package/build/core/procedures.test.js.map +1 -0
  159. package/build/core/types.d.ts +182 -0
  160. package/build/{schema → core}/types.js.map +1 -1
  161. package/build/exports.d.ts +31 -11
  162. package/build/exports.js +23 -8
  163. package/build/exports.js.map +1 -1
  164. package/build/schema/adapter.d.ts +35 -0
  165. package/build/schema/adapter.js +13 -0
  166. package/build/schema/adapter.js.map +1 -0
  167. package/build/schema/adapter.test.js +53 -0
  168. package/build/schema/adapter.test.js.map +1 -0
  169. package/build/schema/compile.d.ts +37 -0
  170. package/build/schema/compile.js +38 -0
  171. package/build/schema/compile.js.map +1 -0
  172. package/build/schema/compile.test.js +78 -0
  173. package/build/schema/compile.test.js.map +1 -0
  174. package/build/schema/compute-schema.d.ts +47 -37
  175. package/build/schema/compute-schema.js +86 -29
  176. package/build/schema/compute-schema.js.map +1 -1
  177. package/build/schema/compute-schema.test.js +158 -40
  178. package/build/schema/compute-schema.test.js.map +1 -1
  179. package/build/schema/json-schema.d.ts +17 -0
  180. package/build/schema/json-schema.js +2 -0
  181. package/build/schema/json-schema.js.map +1 -0
  182. package/build/schema/typebox.d.ts +11 -0
  183. package/build/schema/typebox.js +24 -0
  184. package/build/schema/typebox.js.map +1 -0
  185. package/build/schema/typebox.test.js +34 -0
  186. package/build/schema/typebox.test.js.map +1 -0
  187. package/build/server/context.d.ts +8 -0
  188. package/build/server/context.js +7 -0
  189. package/build/server/context.js.map +1 -0
  190. package/build/server/context.test.js +16 -0
  191. package/build/server/context.test.js.map +1 -0
  192. package/build/{doc-envelope.d.ts → server/doc-envelope.d.ts} +1 -1
  193. package/build/server/doc-envelope.js.map +1 -0
  194. package/build/server/doc-envelope.test.d.ts +1 -0
  195. package/build/server/doc-envelope.test.js.map +1 -0
  196. package/build/{implementations/http → server}/doc-registry.d.ts +7 -2
  197. package/build/{implementations/http → server}/doc-registry.js +9 -5
  198. package/build/server/doc-registry.js.map +1 -0
  199. package/build/server/doc-registry.test.d.ts +1 -0
  200. package/build/{implementations/http → server}/doc-registry.test.js +27 -24
  201. package/build/server/doc-registry.test.js.map +1 -0
  202. package/build/server/docs/docs.test.d.ts +1 -0
  203. package/build/server/docs/docs.test.js +237 -0
  204. package/build/server/docs/docs.test.js.map +1 -0
  205. package/build/{implementations/http/hono → server}/docs/http-doc.d.ts +2 -2
  206. package/build/{implementations/http/hono → server}/docs/http-doc.js +1 -1
  207. package/build/server/docs/http-doc.js.map +1 -0
  208. package/build/{implementations/http/hono → server}/docs/http-stream-doc.d.ts +2 -2
  209. package/build/{implementations/http/hono → server}/docs/http-stream-doc.js +1 -1
  210. package/build/server/docs/http-stream-doc.js.map +1 -0
  211. package/build/{implementations/http/hono → server}/docs/rpc-doc.d.ts +2 -2
  212. package/build/{implementations/http/hono → server}/docs/rpc-doc.js +1 -1
  213. package/build/server/docs/rpc-doc.js.map +1 -0
  214. package/build/{implementations/http/hono → server}/docs/stream-doc.d.ts +2 -2
  215. package/build/{implementations/http/hono → server}/docs/stream-doc.js +1 -1
  216. package/build/server/docs/stream-doc.js.map +1 -0
  217. package/build/server/errors/dispatch.d.ts +96 -0
  218. package/build/{implementations/http/error-dispatch.js → server/errors/dispatch.js} +20 -10
  219. package/build/server/errors/dispatch.js.map +1 -0
  220. package/build/server/errors/dispatch.test.d.ts +1 -0
  221. package/build/server/errors/dispatch.test.js +418 -0
  222. package/build/server/errors/dispatch.test.js.map +1 -0
  223. package/build/{implementations/http/error-taxonomy.d.ts → server/errors/taxonomy.d.ts} +8 -17
  224. package/build/{implementations/http/error-taxonomy.js → server/errors/taxonomy.js} +6 -15
  225. package/build/server/errors/taxonomy.js.map +1 -0
  226. package/build/server/errors/taxonomy.test.d.ts +1 -0
  227. package/build/{implementations/http/error-taxonomy.test.js → server/errors/taxonomy.test.js} +45 -39
  228. package/build/server/errors/taxonomy.test.js.map +1 -0
  229. package/build/server/index.d.ts +29 -0
  230. package/build/server/index.js +27 -0
  231. package/build/server/index.js.map +1 -0
  232. package/build/server/no-framework-imports.test.d.ts +1 -0
  233. package/build/server/no-framework-imports.test.js +40 -0
  234. package/build/server/no-framework-imports.test.js.map +1 -0
  235. package/build/{implementations/http/hono/path.d.ts → server/paths.d.ts} +2 -3
  236. package/build/{implementations/http/hono/path.js → server/paths.js} +1 -1
  237. package/build/server/paths.js.map +1 -0
  238. package/build/server/paths.test.d.ts +1 -0
  239. package/build/server/paths.test.js +111 -0
  240. package/build/server/paths.test.js.map +1 -0
  241. package/build/server/request/params.d.ts +29 -0
  242. package/build/server/request/params.js +43 -0
  243. package/build/server/request/params.js.map +1 -0
  244. package/build/server/request/params.test.d.ts +1 -0
  245. package/build/server/request/params.test.js +91 -0
  246. package/build/server/request/params.test.js.map +1 -0
  247. package/build/server/request/query.d.ts +9 -0
  248. package/build/server/request/query.js +22 -0
  249. package/build/server/request/query.js.map +1 -0
  250. package/build/server/request/query.test.d.ts +1 -0
  251. package/build/server/request/query.test.js +60 -0
  252. package/build/server/request/query.test.js.map +1 -0
  253. package/build/server/sse.d.ts +70 -0
  254. package/build/server/sse.js +94 -0
  255. package/build/server/sse.js.map +1 -0
  256. package/build/server/sse.test.d.ts +1 -0
  257. package/build/server/sse.test.js +98 -0
  258. package/build/server/sse.test.js.map +1 -0
  259. package/build/{implementations → server}/types.d.ts +17 -15
  260. package/build/{implementations → server}/types.js.map +1 -1
  261. package/docs/astro-adapter.md +8 -9
  262. package/docs/client-and-codegen.md +4 -4
  263. package/docs/client-error-handling.md +5 -5
  264. package/docs/codegen-kotlin.md +2 -3
  265. package/docs/codegen-swift.md +1 -2
  266. package/docs/core.md +135 -54
  267. package/docs/http-integrations.md +58 -6
  268. package/docs/migration-v8-to-v9.md +192 -0
  269. package/docs/plans/2026-06-09-v9-rewrite.md +130 -0
  270. package/docs/specs/2026-06-09-v9-rewrite-design.md +221 -0
  271. package/docs/streaming.md +12 -0
  272. package/package.json +23 -47
  273. package/src/{implementations/http → adapters}/astro/index.test.ts +2 -2
  274. package/src/adapters/hono/__fixtures__/parity-envelope.json +389 -0
  275. package/src/adapters/hono/envelope-parity.test.ts +126 -0
  276. package/src/{implementations/http → adapters}/hono/handlers/http-stream.test.ts +1 -1
  277. package/src/adapters/hono/handlers/http-stream.ts +73 -0
  278. package/src/{implementations/http → adapters}/hono/handlers/http.test.ts +1 -1
  279. package/src/adapters/hono/handlers/http.ts +70 -0
  280. package/src/{implementations/http → adapters}/hono/handlers/rpc.test.ts +2 -2
  281. package/src/adapters/hono/handlers/rpc.ts +39 -0
  282. package/src/{implementations/http → adapters}/hono/handlers/stream.test.ts +4 -3
  283. package/src/{implementations/http → adapters}/hono/handlers/stream.ts +19 -92
  284. package/src/{implementations/http → adapters}/hono/index.test.ts +14 -16
  285. package/src/{implementations/http → adapters}/hono/index.ts +35 -30
  286. package/src/{implementations/http → adapters/hono}/on-request-error.test.ts +3 -3
  287. package/src/adapters/hono/request.ts +28 -0
  288. package/src/{implementations/http → adapters/hono}/route-errors.test.ts +5 -5
  289. package/src/{implementations/http → adapters}/hono/types.ts +43 -20
  290. package/src/client/freeze.test.ts +41 -0
  291. package/src/client/typed-error-dispatch.test.ts +3 -3
  292. package/src/codegen/__fixtures__/make-envelope.ts +1 -1
  293. package/src/codegen/__fixtures__/models-envelope.json +310 -0
  294. package/src/codegen/__goldens__/MANIFEST.json +85 -0
  295. package/src/codegen/__goldens__/kotlin-default--models/Billing.kt +112 -0
  296. package/src/codegen/__goldens__/kotlin-default--models/BillingReports.kt +26 -0
  297. package/src/codegen/__goldens__/kotlin-default--models/Orders.kt +88 -0
  298. package/src/codegen/__goldens__/kotlin-default--users/Users.kt +189 -0
  299. package/src/codegen/__goldens__/swift-default--models/Billing.swift +97 -0
  300. package/src/codegen/__goldens__/swift-default--models/BillingReports.swift +20 -0
  301. package/src/codegen/__goldens__/swift-default--models/Orders.swift +81 -0
  302. package/src/codegen/__goldens__/swift-default--users/Users.swift +204 -0
  303. package/src/codegen/__goldens__/ts-default--models/_client.ts +1319 -0
  304. package/src/codegen/__goldens__/ts-default--models/_errors.ts +90 -0
  305. package/src/codegen/__goldens__/ts-default--models/_models.ts +10 -0
  306. package/src/codegen/__goldens__/ts-default--models/_types.ts +502 -0
  307. package/src/codegen/__goldens__/ts-default--models/billing-reports.ts +29 -0
  308. package/src/codegen/__goldens__/ts-default--models/billing.ts +67 -0
  309. package/src/codegen/__goldens__/ts-default--models/index.ts +48 -0
  310. package/src/codegen/__goldens__/ts-default--models/orders.ts +80 -0
  311. package/src/codegen/__goldens__/ts-default--users/_client.ts +1319 -0
  312. package/src/codegen/__goldens__/ts-default--users/_errors.ts +90 -0
  313. package/src/codegen/__goldens__/ts-default--users/_types.ts +502 -0
  314. package/src/codegen/__goldens__/ts-default--users/index.ts +38 -0
  315. package/src/codegen/__goldens__/ts-default--users/users.ts +169 -0
  316. package/src/codegen/__goldens__/ts-external-runtime--models/_errors.ts +90 -0
  317. package/src/codegen/__goldens__/ts-external-runtime--models/_models.ts +10 -0
  318. package/src/codegen/__goldens__/ts-external-runtime--models/billing-reports.ts +29 -0
  319. package/src/codegen/__goldens__/ts-external-runtime--models/billing.ts +67 -0
  320. package/src/codegen/__goldens__/ts-external-runtime--models/index.ts +48 -0
  321. package/src/codegen/__goldens__/ts-external-runtime--models/orders.ts +80 -0
  322. package/src/codegen/__goldens__/ts-external-runtime--users/_errors.ts +90 -0
  323. package/src/codegen/__goldens__/ts-external-runtime--users/index.ts +38 -0
  324. package/src/codegen/__goldens__/ts-external-runtime--users/users.ts +169 -0
  325. package/src/codegen/__goldens__/ts-flat--models/_client.ts +1319 -0
  326. package/src/codegen/__goldens__/ts-flat--models/_errors.ts +87 -0
  327. package/src/codegen/__goldens__/ts-flat--models/_models.ts +10 -0
  328. package/src/codegen/__goldens__/ts-flat--models/_types.ts +502 -0
  329. package/src/codegen/__goldens__/ts-flat--models/billing-reports.ts +28 -0
  330. package/src/codegen/__goldens__/ts-flat--models/billing.ts +51 -0
  331. package/src/codegen/__goldens__/ts-flat--models/index.ts +42 -0
  332. package/src/codegen/__goldens__/ts-flat--models/orders.ts +73 -0
  333. package/src/codegen/__goldens__/ts-flat--users/_client.ts +1319 -0
  334. package/src/codegen/__goldens__/ts-flat--users/_errors.ts +87 -0
  335. package/src/codegen/__goldens__/ts-flat--users/_types.ts +502 -0
  336. package/src/codegen/__goldens__/ts-flat--users/index.ts +34 -0
  337. package/src/codegen/__goldens__/ts-flat--users/users.ts +126 -0
  338. package/src/codegen/__goldens__/ts-no-share-models--models/_client.ts +1319 -0
  339. package/src/codegen/__goldens__/ts-no-share-models--models/_errors.ts +90 -0
  340. package/src/codegen/__goldens__/ts-no-share-models--models/_types.ts +502 -0
  341. package/src/codegen/__goldens__/ts-no-share-models--models/billing-reports.ts +29 -0
  342. package/src/codegen/__goldens__/ts-no-share-models--models/billing.ts +111 -0
  343. package/src/codegen/__goldens__/ts-no-share-models--models/index.ts +48 -0
  344. package/src/codegen/__goldens__/ts-no-share-models--models/orders.ts +112 -0
  345. package/src/codegen/__goldens__/ts-no-share-models--users/_client.ts +1319 -0
  346. package/src/codegen/__goldens__/ts-no-share-models--users/_errors.ts +90 -0
  347. package/src/codegen/__goldens__/ts-no-share-models--users/_types.ts +502 -0
  348. package/src/codegen/__goldens__/ts-no-share-models--users/index.ts +38 -0
  349. package/src/codegen/__goldens__/ts-no-share-models--users/users.ts +169 -0
  350. package/src/codegen/__goldens__/ts-shared-models-module--models/_client.ts +1319 -0
  351. package/src/codegen/__goldens__/ts-shared-models-module--models/_errors.ts +90 -0
  352. package/src/codegen/__goldens__/ts-shared-models-module--models/_models.ts +7 -0
  353. package/src/codegen/__goldens__/ts-shared-models-module--models/_types.ts +502 -0
  354. package/src/codegen/__goldens__/ts-shared-models-module--models/billing-reports.ts +29 -0
  355. package/src/codegen/__goldens__/ts-shared-models-module--models/billing.ts +67 -0
  356. package/src/codegen/__goldens__/ts-shared-models-module--models/index.ts +48 -0
  357. package/src/codegen/__goldens__/ts-shared-models-module--models/orders.ts +80 -0
  358. package/src/codegen/bin/cli.test.ts +13 -2
  359. package/src/codegen/bin/cli.ts +181 -144
  360. package/src/codegen/bin/flag-specs.test.ts +16 -1
  361. package/src/codegen/bin/flag-specs.ts +43 -31
  362. package/src/codegen/bundle-size.test.ts +1 -1
  363. package/src/codegen/collect-models.ts +1 -1
  364. package/src/codegen/e2e.test.ts +1 -1
  365. package/src/codegen/emit/api-route.ts +184 -0
  366. package/src/codegen/emit/context.ts +32 -0
  367. package/src/codegen/emit/declarations.ts +49 -0
  368. package/src/codegen/emit/format-types.ts +232 -0
  369. package/src/codegen/emit/http-stream-route.ts +162 -0
  370. package/src/codegen/emit/route-shared.ts +102 -0
  371. package/src/codegen/emit/rpc-route.ts +49 -0
  372. package/src/codegen/emit/scope-file.ts +226 -0
  373. package/src/codegen/emit/stream-route.ts +81 -0
  374. package/src/codegen/emit-errors.integration.test.ts +2 -2
  375. package/src/codegen/emit-errors.test.ts +1 -1
  376. package/src/codegen/emit-errors.ts +1 -1
  377. package/src/codegen/emit-scope.test.ts +2 -2
  378. package/src/codegen/emit-scope.ts +15 -1048
  379. package/src/codegen/goldens.test.ts +89 -0
  380. package/src/codegen/group-routes.test.ts +1 -1
  381. package/src/codegen/group-routes.ts +1 -1
  382. package/src/codegen/pipeline.test.ts +1 -1
  383. package/src/codegen/pipeline.ts +1 -1
  384. package/src/codegen/resolve-envelope.test.ts +1 -1
  385. package/src/codegen/resolve-envelope.ts +1 -1
  386. package/src/codegen/targets/_shared/error-schemas.test.ts +1 -1
  387. package/src/codegen/targets/_shared/error-schemas.ts +1 -1
  388. package/src/codegen/targets/_shared/route-slots.test.ts +1 -1
  389. package/src/codegen/targets/_shared/route-slots.ts +1 -1
  390. package/src/codegen/targets/_shared/target-run.ts +1 -1
  391. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +1 -1
  392. package/src/codegen/targets/kotlin/emit-route-kotlin.ts +1 -1
  393. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +1 -1
  394. package/src/codegen/targets/swift/access-level.test.ts +1 -1
  395. package/src/codegen/targets/swift/emit-route-swift.test.ts +1 -1
  396. package/src/codegen/targets/swift/emit-route-swift.ts +1 -1
  397. package/src/codegen/targets/swift/emit-scope-swift.test.ts +1 -1
  398. package/src/codegen/targets/ts/shared-models.test.ts +1 -1
  399. package/src/{create-http-stream.test.ts → core/create-http-stream.test.ts} +1 -1
  400. package/src/core/create-http-stream.ts +207 -0
  401. package/src/{create-http.test.ts → core/create-http.test.ts} +15 -4
  402. package/src/core/create-http.ts +126 -0
  403. package/src/{create-stream.test.ts → core/create-stream.test.ts} +28 -31
  404. package/src/core/create-stream.ts +142 -0
  405. package/src/{create.test.ts → core/create.test.ts} +25 -57
  406. package/src/core/create.ts +121 -0
  407. package/src/{stack-utils.test.ts → core/definition-site.test.ts} +14 -3
  408. package/src/{stack-utils.ts → core/definition-site.ts} +20 -23
  409. package/src/{errors.test.ts → core/errors.test.ts} +1 -1
  410. package/src/{errors.ts → core/errors.ts} +30 -28
  411. package/src/core/factory-options.test.ts +112 -0
  412. package/src/core/http-route.ts +73 -0
  413. package/src/core/internal.ts +203 -0
  414. package/src/{migration.test.ts → core/migration.test.ts} +23 -1
  415. package/src/{index.test.ts → core/procedures.test.ts} +13 -11
  416. package/src/core/procedures.ts +75 -0
  417. package/src/core/types.ts +195 -0
  418. package/src/exports.ts +60 -11
  419. package/src/schema/adapter.test.ts +58 -0
  420. package/src/schema/adapter.ts +45 -0
  421. package/src/schema/compile.test.ts +95 -0
  422. package/src/schema/compile.ts +64 -0
  423. package/src/schema/compute-schema.test.ts +222 -41
  424. package/src/schema/compute-schema.ts +145 -71
  425. package/src/schema/json-schema.ts +21 -0
  426. package/src/schema/typebox.test.ts +40 -0
  427. package/src/schema/typebox.ts +27 -0
  428. package/src/server/context.test.ts +22 -0
  429. package/src/server/context.ts +18 -0
  430. package/src/{doc-envelope.test.ts → server/doc-envelope.test.ts} +2 -2
  431. package/src/{doc-envelope.ts → server/doc-envelope.ts} +1 -1
  432. package/src/{implementations/http → server}/doc-registry.test.ts +32 -26
  433. package/src/{implementations/http → server}/doc-registry.ts +11 -7
  434. package/src/server/docs/docs.test.ts +287 -0
  435. package/src/{implementations/http/hono → server}/docs/http-doc.ts +3 -3
  436. package/src/{implementations/http/hono → server}/docs/http-stream-doc.ts +3 -3
  437. package/src/{implementations/http/hono → server}/docs/rpc-doc.ts +3 -3
  438. package/src/{implementations/http/hono → server}/docs/stream-doc.ts +3 -3
  439. package/src/server/errors/dispatch.test.ts +450 -0
  440. package/src/server/errors/dispatch.ts +189 -0
  441. package/src/{implementations/http/error-taxonomy.test.ts → server/errors/taxonomy.test.ts} +45 -39
  442. package/src/{implementations/http/error-taxonomy.ts → server/errors/taxonomy.ts} +8 -17
  443. package/src/server/index.ts +29 -0
  444. package/src/server/no-framework-imports.test.ts +43 -0
  445. package/src/server/paths.test.ts +141 -0
  446. package/src/{implementations/http/hono/path.ts → server/paths.ts} +2 -13
  447. package/src/server/request/params.test.ts +143 -0
  448. package/src/server/request/params.ts +68 -0
  449. package/src/server/request/query.test.ts +70 -0
  450. package/src/server/request/query.ts +24 -0
  451. package/src/server/sse.test.ts +113 -0
  452. package/src/server/sse.ts +117 -0
  453. package/src/{implementations → server}/types.ts +17 -16
  454. package/build/create-http-stream.d.ts +0 -58
  455. package/build/create-http-stream.js +0 -122
  456. package/build/create-http-stream.js.map +0 -1
  457. package/build/create-http-stream.test.js.map +0 -1
  458. package/build/create-http.d.ts +0 -49
  459. package/build/create-http.js +0 -108
  460. package/build/create-http.js.map +0 -1
  461. package/build/create-http.test.js.map +0 -1
  462. package/build/create-stream.d.ts +0 -35
  463. package/build/create-stream.js +0 -123
  464. package/build/create-stream.js.map +0 -1
  465. package/build/create-stream.test.js.map +0 -1
  466. package/build/create.d.ts +0 -28
  467. package/build/create.js +0 -82
  468. package/build/create.js.map +0 -1
  469. package/build/create.test.js.map +0 -1
  470. package/build/doc-envelope.js.map +0 -1
  471. package/build/doc-envelope.test.js.map +0 -1
  472. package/build/errors.js.map +0 -1
  473. package/build/errors.test.js.map +0 -1
  474. package/build/implementations/http/astro/astro-context.js.map +0 -1
  475. package/build/implementations/http/astro/create-handler.js.map +0 -1
  476. package/build/implementations/http/astro/index.js.map +0 -1
  477. package/build/implementations/http/astro/index.test.js.map +0 -1
  478. package/build/implementations/http/astro/rewrite-request.js.map +0 -1
  479. package/build/implementations/http/doc-registry.js.map +0 -1
  480. package/build/implementations/http/doc-registry.test.js.map +0 -1
  481. package/build/implementations/http/error-dispatch.d.ts +0 -76
  482. package/build/implementations/http/error-dispatch.js.map +0 -1
  483. package/build/implementations/http/error-dispatch.test.js +0 -254
  484. package/build/implementations/http/error-dispatch.test.js.map +0 -1
  485. package/build/implementations/http/error-taxonomy.js.map +0 -1
  486. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  487. package/build/implementations/http/hono/docs/http-doc.js.map +0 -1
  488. package/build/implementations/http/hono/docs/http-stream-doc.js.map +0 -1
  489. package/build/implementations/http/hono/docs/rpc-doc.js.map +0 -1
  490. package/build/implementations/http/hono/docs/stream-doc.js.map +0 -1
  491. package/build/implementations/http/hono/handlers/http-stream.js +0 -123
  492. package/build/implementations/http/hono/handlers/http-stream.js.map +0 -1
  493. package/build/implementations/http/hono/handlers/http-stream.test.js.map +0 -1
  494. package/build/implementations/http/hono/handlers/http.js +0 -110
  495. package/build/implementations/http/hono/handlers/http.js.map +0 -1
  496. package/build/implementations/http/hono/handlers/http.test.js.map +0 -1
  497. package/build/implementations/http/hono/handlers/rpc.js +0 -32
  498. package/build/implementations/http/hono/handlers/rpc.js.map +0 -1
  499. package/build/implementations/http/hono/handlers/rpc.test.js.map +0 -1
  500. package/build/implementations/http/hono/handlers/stream.d.ts +0 -23
  501. package/build/implementations/http/hono/handlers/stream.js +0 -147
  502. package/build/implementations/http/hono/handlers/stream.js.map +0 -1
  503. package/build/implementations/http/hono/handlers/stream.test.js.map +0 -1
  504. package/build/implementations/http/hono/index.js.map +0 -1
  505. package/build/implementations/http/hono/index.test.js.map +0 -1
  506. package/build/implementations/http/hono/path.js.map +0 -1
  507. package/build/implementations/http/hono/path.test.js +0 -83
  508. package/build/implementations/http/hono/path.test.js.map +0 -1
  509. package/build/implementations/http/hono/types.d.ts +0 -51
  510. package/build/implementations/http/hono/types.js.map +0 -1
  511. package/build/implementations/http/on-request-error.test.js.map +0 -1
  512. package/build/implementations/http/route-errors.test.js.map +0 -1
  513. package/build/index.d.ts +0 -175
  514. package/build/index.js +0 -47
  515. package/build/index.js.map +0 -1
  516. package/build/index.test.js.map +0 -1
  517. package/build/migration.test.js.map +0 -1
  518. package/build/schema/extract-json-schema.d.ts +0 -2
  519. package/build/schema/extract-json-schema.js +0 -12
  520. package/build/schema/extract-json-schema.js.map +0 -1
  521. package/build/schema/extract-json-schema.test.js +0 -23
  522. package/build/schema/extract-json-schema.test.js.map +0 -1
  523. package/build/schema/parser.d.ts +0 -36
  524. package/build/schema/parser.js +0 -210
  525. package/build/schema/parser.js.map +0 -1
  526. package/build/schema/parser.test.js +0 -120
  527. package/build/schema/parser.test.js.map +0 -1
  528. package/build/schema/resolve-schema-lib.d.ts +0 -12
  529. package/build/schema/resolve-schema-lib.js +0 -11
  530. package/build/schema/resolve-schema-lib.js.map +0 -1
  531. package/build/schema/resolve-schema-lib.test.js +0 -17
  532. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  533. package/build/schema/types.d.ts +0 -8
  534. package/build/schema/types.js +0 -2
  535. package/build/stack-utils.d.ts +0 -25
  536. package/build/stack-utils.js.map +0 -1
  537. package/build/stack-utils.test.js.map +0 -1
  538. package/build/types.d.ts +0 -142
  539. package/build/types.js +0 -2
  540. package/build/types.js.map +0 -1
  541. package/docs/decisions/2026-06-02-monorepo-split-evaluation.md +0 -80
  542. package/docs/handoffs/2026-06-08-dx-round2-declines.md +0 -45
  543. package/docs/handoffs/ajsc-named-type-collision.md +0 -134
  544. package/docs/handoffs/ajsc-named-type-support.md +0 -181
  545. package/docs/handoffs/shared-models-auto-resolve-response.md +0 -181
  546. package/docs/npm-workspaces-migration-plan.md +0 -611
  547. package/docs/superpowers/plans/2026-04-24-doc-registry-simplification.md +0 -886
  548. package/docs/superpowers/plans/2026-04-24-kotlin-codegen-target.md +0 -1265
  549. package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +0 -1993
  550. package/docs/superpowers/plans/2026-04-29-safe-result-api.md +0 -2293
  551. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +0 -1391
  552. package/docs/superpowers/plans/2026-05-08-create-http.md +0 -3355
  553. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +0 -3365
  554. package/docs/superpowers/plans/2026-06-05-dx-feedback-round.md +0 -1292
  555. package/docs/superpowers/plans/2026-06-06-shared-models-convention-and-diagnostics.md +0 -659
  556. package/docs/superpowers/plans/2026-06-08-codegen-dx-surfacing.md +0 -428
  557. package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +0 -401
  558. package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +0 -314
  559. package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +0 -264
  560. package/docs/superpowers/specs/2026-04-29-safe-result-api-design.md +0 -324
  561. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +0 -252
  562. package/docs/superpowers/specs/2026-05-08-create-http-design.md +0 -409
  563. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +0 -411
  564. package/docs/superpowers/specs/2026-06-05-dx-feedback-round-design.md +0 -285
  565. package/docs/superpowers/specs/2026-06-08-dx-feedback-round-2-design.md +0 -376
  566. package/src/create-http-stream.ts +0 -191
  567. package/src/create-http.ts +0 -210
  568. package/src/create-stream.ts +0 -228
  569. package/src/create.ts +0 -172
  570. package/src/implementations/http/README.md +0 -390
  571. package/src/implementations/http/error-dispatch.test.ts +0 -283
  572. package/src/implementations/http/error-dispatch.ts +0 -176
  573. package/src/implementations/http/hono/handlers/http-stream.ts +0 -152
  574. package/src/implementations/http/hono/handlers/http.ts +0 -145
  575. package/src/implementations/http/hono/handlers/rpc.ts +0 -54
  576. package/src/implementations/http/hono/path.test.ts +0 -96
  577. package/src/index.ts +0 -101
  578. package/src/schema/extract-json-schema.test.ts +0 -25
  579. package/src/schema/extract-json-schema.ts +0 -15
  580. package/src/schema/parser.test.ts +0 -182
  581. package/src/schema/parser.ts +0 -265
  582. package/src/schema/resolve-schema-lib.test.ts +0 -19
  583. package/src/schema/resolve-schema-lib.ts +0 -29
  584. package/src/schema/types.ts +0 -20
  585. package/src/types.ts +0 -133
  586. /package/build/{implementations/http → adapters}/astro/astro-context.d.ts +0 -0
  587. /package/build/{implementations/http → adapters}/astro/astro-context.js +0 -0
  588. /package/build/{implementations/http → adapters}/astro/create-handler.d.ts +0 -0
  589. /package/build/{implementations/http → adapters}/astro/create-handler.js +0 -0
  590. /package/build/{implementations/http → adapters}/astro/index.d.ts +0 -0
  591. /package/build/{implementations/http → adapters}/astro/index.js +0 -0
  592. /package/build/{implementations/http → adapters}/astro/index.test.d.ts +0 -0
  593. /package/build/{implementations/http → adapters}/astro/rewrite-request.d.ts +0 -0
  594. /package/build/{implementations/http → adapters}/astro/rewrite-request.js +0 -0
  595. /package/build/{create-http-stream.test.d.ts → adapters/hono/envelope-parity.test.d.ts} +0 -0
  596. /package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.d.ts +0 -0
  597. /package/build/{implementations/http → adapters}/hono/handlers/http.test.d.ts +0 -0
  598. /package/build/{implementations/http → adapters}/hono/handlers/rpc.test.d.ts +0 -0
  599. /package/build/{implementations/http → adapters}/hono/handlers/stream.test.d.ts +0 -0
  600. /package/build/{implementations/http → adapters}/hono/index.test.d.ts +0 -0
  601. /package/build/{implementations/http → adapters/hono}/on-request-error.test.d.ts +0 -0
  602. /package/build/{implementations/http → adapters/hono}/route-errors.test.d.ts +0 -0
  603. /package/build/{create-http.test.d.ts → client/freeze.test.d.ts} +0 -0
  604. /package/build/{create-stream.test.d.ts → codegen/goldens.test.d.ts} +0 -0
  605. /package/build/{create.test.d.ts → core/create-http-stream.test.d.ts} +0 -0
  606. /package/build/{doc-envelope.test.d.ts → core/create-http.test.d.ts} +0 -0
  607. /package/build/{errors.test.d.ts → core/create-stream.test.d.ts} +0 -0
  608. /package/build/{implementations/http/doc-registry.test.d.ts → core/create.test.d.ts} +0 -0
  609. /package/build/{implementations/http/error-dispatch.test.d.ts → core/definition-site.test.d.ts} +0 -0
  610. /package/build/{implementations/http/error-taxonomy.test.d.ts → core/errors.test.d.ts} +0 -0
  611. /package/build/{errors.test.js → core/errors.test.js} +0 -0
  612. /package/build/{implementations/http/hono/path.test.d.ts → core/factory-options.test.d.ts} +0 -0
  613. /package/build/{migration.test.d.ts → core/migration.test.d.ts} +0 -0
  614. /package/build/{index.test.d.ts → core/procedures.test.d.ts} +0 -0
  615. /package/build/{implementations/http/hono → core}/types.js +0 -0
  616. /package/build/schema/{extract-json-schema.test.d.ts → adapter.test.d.ts} +0 -0
  617. /package/build/schema/{parser.test.d.ts → compile.test.d.ts} +0 -0
  618. /package/build/schema/{resolve-schema-lib.test.d.ts → typebox.test.d.ts} +0 -0
  619. /package/build/{stack-utils.test.d.ts → server/context.test.d.ts} +0 -0
  620. /package/build/{doc-envelope.js → server/doc-envelope.js} +0 -0
  621. /package/build/{doc-envelope.test.js → server/doc-envelope.test.js} +0 -0
  622. /package/build/{implementations → server}/types.js +0 -0
  623. /package/src/{implementations/http → adapters}/astro/README.md +0 -0
  624. /package/src/{implementations/http → adapters}/astro/astro-context.ts +0 -0
  625. /package/src/{implementations/http → adapters}/astro/create-handler.ts +0 -0
  626. /package/src/{implementations/http → adapters}/astro/index.ts +0 -0
  627. /package/src/{implementations/http → adapters}/astro/rewrite-request.ts +0 -0
@@ -0,0 +1,55 @@
1
+ import type { Context, Hono } from 'hono';
2
+ import type { ErrorTaxonomy, UnknownErrorConfig } from '../../server/errors/taxonomy.js';
3
+ import type { OnRequestErrorObserver, OnMidStreamError, PreStreamOnError, PreStreamErrorConfig, MidStreamErrorConfig } from '../../server/errors/dispatch.js';
4
+ import type { QueryParser } from '../../server/request/query.js';
5
+ import type { FactoryContextInit } from '../../server/context.js';
6
+ import type { ProceduresFactory, ExtractContext, StreamMode, AnyHttpRouteDoc, RPCHttpRouteDoc, APIHttpRouteDoc, StreamHttpRouteDoc, HttpStreamRouteDoc } from '../../server/types.js';
7
+ import type { AnyProcedureRegistration, TProcedureRegistration, TStreamProcedureRegistration, THttpProcedureRegistration, THttpStreamProcedureRegistration } from '../../core/types.js';
8
+ export type { QueryParser } from '../../server/request/query.js';
9
+ export type OnRequestErrorContext = {
10
+ err: unknown;
11
+ procedure: AnyProcedureRegistration<any, any>;
12
+ raw: Context;
13
+ };
14
+ export type ExtendProcedureDoc = (params: {
15
+ base: RPCHttpRouteDoc | APIHttpRouteDoc | StreamHttpRouteDoc | HttpStreamRouteDoc;
16
+ procedure: AnyProcedureRegistration<any, any>;
17
+ }) => Record<string, unknown>;
18
+ export type HonoFactoryItem<TFactory extends ProceduresFactory = ProceduresFactory> = {
19
+ factory: TFactory;
20
+ factoryContext: FactoryContextInit<ExtractContext<TFactory>, Context>;
21
+ streamMode?: StreamMode;
22
+ extendProcedureDoc?: ExtendProcedureDoc;
23
+ };
24
+ export type HonoAppBuilderConfig<TStreamErrorData = unknown> = {
25
+ /** Existing Hono app. If omitted, a new instance is created. */
26
+ app?: Hono;
27
+ /** Path prefix applied to every route across all kinds. */
28
+ pathPrefix?: string;
29
+ errors?: ErrorTaxonomy;
30
+ unknownError?: UnknownErrorConfig;
31
+ onError?: PreStreamOnError<Context, Response>;
32
+ /** Cross-cutting observer — fires for every caught error before dispatch. */
33
+ onRequestError?: OnRequestErrorObserver<Context>;
34
+ onRequestStart?: (c: Context) => void;
35
+ onRequestEnd?: (c: Context) => void;
36
+ rpc?: {
37
+ onSuccess?: (procedure: TProcedureRegistration<any, any>, c: Context) => void;
38
+ };
39
+ api?: {
40
+ queryParser?: QueryParser;
41
+ onSuccess?: (procedure: THttpProcedureRegistration<any>, c: Context) => void;
42
+ };
43
+ stream?: {
44
+ /** Default for both rpc-stream and http-stream. */
45
+ defaultStreamMode?: StreamMode;
46
+ onStreamStart?: (procedure: TStreamProcedureRegistration<any, any> | THttpStreamProcedureRegistration<any>, c: Context, streamMode: StreamMode) => void;
47
+ onStreamEnd?: (procedure: TStreamProcedureRegistration<any, any> | THttpStreamProcedureRegistration<any>, c: Context, streamMode: StreamMode) => void;
48
+ onMidStreamError?: OnMidStreamError<TStreamErrorData, Context>;
49
+ };
50
+ };
51
+ export type DocAccumulator = AnyHttpRouteDoc[];
52
+ /** The pre-stream slice of the builder config, passed to dispatch. */
53
+ export declare function preStreamErrorConfig(cfg: HonoAppBuilderConfig<any>): PreStreamErrorConfig<Context, Response>;
54
+ /** The mid-stream slice of the builder config, passed to dispatch. */
55
+ export declare function midStreamErrorConfig<TStreamErrorData>(cfg: HonoAppBuilderConfig<TStreamErrorData>): MidStreamErrorConfig<TStreamErrorData, Context>;
@@ -0,0 +1,19 @@
1
+ /** The pre-stream slice of the builder config, passed to dispatch. */
2
+ export function preStreamErrorConfig(cfg) {
3
+ return {
4
+ errors: cfg.errors,
5
+ unknownError: cfg.unknownError,
6
+ onError: cfg.onError,
7
+ onRequestError: cfg.onRequestError,
8
+ };
9
+ }
10
+ /** The mid-stream slice of the builder config, passed to dispatch. */
11
+ export function midStreamErrorConfig(cfg) {
12
+ return {
13
+ errors: cfg.errors,
14
+ unknownError: cfg.unknownError,
15
+ onMidStreamError: cfg.stream?.onMidStreamError,
16
+ onRequestError: cfg.onRequestError,
17
+ };
18
+ }
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/hono/types.ts"],"names":[],"mappings":"AA6FA,sEAAsE;AACtE,MAAM,UAAU,oBAAoB,CAClC,GAA8B;IAE9B,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,cAAc,EAAE,GAAG,CAAC,cAAc;KACnC,CAAA;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,oBAAoB,CAClC,GAA2C;IAE3C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB;QAC9C,cAAc,EAAE,GAAG,CAAC,cAAc;KACnC,CAAA;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { describe, expect, it } from 'vitest';
6
+ /**
7
+ * The client runtime is CONTENT-FROZEN for v9.
8
+ *
9
+ * Self-contained codegen (the default) bundles these source files verbatim
10
+ * (imports stripped) into the generated `_client.ts` / `_types.ts`. The v9
11
+ * hard requirement is byte-identical generated output vs v8.6.0, so these
12
+ * files must not change. If you intentionally change one, you are changing
13
+ * generated output for every downstream app: re-capture the codegen goldens,
14
+ * verify the diff is wanted, and update the hash here.
15
+ *
16
+ * Hashes recorded from v8.6.0 `src/client/*.ts`.
17
+ */
18
+ const FROZEN_FILES = [
19
+ ['errors.ts', 'abcdee64e22e748d870efdac68f03a05cd0666c65ec3f3b5217acd9c22f72a4d'],
20
+ ['classify-error.ts', '28062fdc3be39461eeec4cc96e3edcf46377922bac6fb3cc7b54111b42199773'],
21
+ ['error-dispatch.ts', '1bdd89319239e8aca0f186714c15b77ae5f4a9ac2c257416ddaf36d965dbe141'],
22
+ ['request-builder.ts', 'ac15485e6786de00386e6c4a425dbab503589bc012af6ef6515b1c3e4176a51e'],
23
+ ['resolve-options.ts', 'a0e6d745a630176696c0221f5166958bfc5255e50168e5f3cf021bbf4a8aaffc'],
24
+ ['hooks.ts', '15d67ba827dbb6e38407af606c05a459ec27e3b1e738aac868233d0f10478aa7'],
25
+ ['call.ts', 'b7afeadb3b338cb45ab09273a1729c25ea0f6429670664d197d91ee47cc0a3dc'],
26
+ ['stream.ts', '655af96f789150e3fedb7b345aae70d58b1d3b3cad9eb8b341d5a4780d5760ce'],
27
+ ['fetch-adapter.ts', 'c5a6ebdeecac3a5efc3d77f346135609e23c5eebc671a08456175901106655a2'],
28
+ ['index.ts', '8e33080aba85ba9af52f8b7232c01c82fae167742facb250f5d6800d51544d65'],
29
+ ['types.ts', 'e236213020290fd187a80cdf060fcb3d67e734e94aa060c736f142cbefd4ced7'],
30
+ ];
31
+ const clientDir = dirname(fileURLToPath(import.meta.url));
32
+ describe('client runtime freeze (codegen bundling contract)', () => {
33
+ it.each(FROZEN_FILES)('%s matches its v8.6.0 content hash', async (file, expected) => {
34
+ const content = await readFile(resolve(clientDir, file), 'utf-8');
35
+ const actual = createHash('sha256').update(content).digest('hex');
36
+ expect(actual, `${file} diverged from the frozen v8.6.0 content — this changes generated _client.ts/_types.ts output`).toBe(expected);
37
+ });
38
+ });
39
+ //# sourceMappingURL=freeze.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freeze.test.js","sourceRoot":"","sources":["../../src/client/freeze.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAA2D;IAC3E,CAAC,WAAW,EAAE,kEAAkE,CAAC;IACjF,CAAC,mBAAmB,EAAE,kEAAkE,CAAC;IACzF,CAAC,mBAAmB,EAAE,kEAAkE,CAAC;IACzF,CAAC,oBAAoB,EAAE,kEAAkE,CAAC;IAC1F,CAAC,oBAAoB,EAAE,kEAAkE,CAAC;IAC1F,CAAC,UAAU,EAAE,kEAAkE,CAAC;IAChF,CAAC,SAAS,EAAE,kEAAkE,CAAC;IAC/E,CAAC,WAAW,EAAE,kEAAkE,CAAC;IACjF,CAAC,kBAAkB,EAAE,kEAAkE,CAAC;IACxF,CAAC,UAAU,EAAE,kEAAkE,CAAC;IAChF,CAAC,UAAU,EAAE,kEAAkE,CAAC;CACjF,CAAA;AAED,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,oCAAoC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACnF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,+FAA+F,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvI,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, test } from 'vitest';
2
2
  import { Type } from 'typebox';
3
- import { Procedures } from '../index.js';
4
- import { HonoAppBuilder, defineErrorTaxonomy } from '../implementations/http/hono/index.js';
3
+ import { Procedures } from '../core/procedures.js';
4
+ import { HonoAppBuilder, defineErrorTaxonomy } from '../adapters/hono/index.js';
5
5
  import { createClient } from './index.js';
6
6
  import { ClientRequestError } from './errors.js';
7
7
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"typed-error-dispatch.test.js","sourceRoot":"","sources":["../../src/client/typed-error-dispatch.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typed-error-dispatch.test.js","sourceRoot":"","sources":["../../src/client/typed-error-dispatch.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { APIHttpRouteDoc, DocEnvelope, ErrorDoc, HeaderDoc, HttpMethod, RPCHttpRouteDoc } from '../../implementations/types.js';
1
+ import type { APIHttpRouteDoc, DocEnvelope, ErrorDoc, HeaderDoc, HttpMethod, RPCHttpRouteDoc } from '../../server/types.js';
2
2
  /**
3
3
  * Typed builders for codegen test envelopes.
4
4
  *
@@ -62,6 +62,11 @@ export interface ParsedArgs {
62
62
  * Throws on parse errors.
63
63
  */
64
64
  export declare function loadConfigFile(configPath?: string): Promise<CodegenConfig | undefined>;
65
+ /**
66
+ * The set of flags parseArgs can dispatch — exported so a test can pin it
67
+ * equal to KNOWN_FLAGS (i.e. FLAG_SPECS), keeping catalog and parser in sync.
68
+ */
69
+ export declare const PARSE_HANDLED_FLAGS: readonly string[];
65
70
  /**
66
71
  * Parses CLI argv (pass process.argv.slice(2)).
67
72
  * Throws with a descriptive message on validation errors.
@@ -3,7 +3,7 @@ import { readFile } from 'node:fs/promises';
3
3
  import { resolve } from 'node:path';
4
4
  import { createHash } from 'node:crypto';
5
5
  import { generateClient } from '../index.js';
6
- import { KNOWN_FLAGS, formatHelp } from './flag-specs.js';
6
+ import { KNOWN_FLAGS, FLAG_SPEC_BY_NAME, formatHelp } from './flag-specs.js';
7
7
  // ---------------------------------------------------------------------------
8
8
  // Config file loading
9
9
  // ---------------------------------------------------------------------------
@@ -87,9 +87,79 @@ function closestKnownFlag(unknown) {
87
87
  }
88
88
  return best != null && best.distance <= 3 ? best.flag : undefined;
89
89
  }
90
- // ---------------------------------------------------------------------------
91
- // parseArgs
92
- // ---------------------------------------------------------------------------
90
+ /** Renders an allowed-values list the way the CLI errors phrase it: `'a' or 'b'` / `'a', 'b', or 'c'`. */
91
+ function humanizeAllowed(allowed) {
92
+ const quoted = allowed.map((v) => `'${v}'`);
93
+ if (quoted.length === 2)
94
+ return `${quoted[0]} or ${quoted[1]}`;
95
+ return `${quoted.slice(0, -1).join(', ')}, or ${quoted[quoted.length - 1]}`;
96
+ }
97
+ /** Builds a handler for a value flag restricted to a closed set; invalid/missing values throw. */
98
+ function enumValueFlag(flag, allowed, assign) {
99
+ return (state, value) => {
100
+ if (value !== undefined && allowed.includes(value)) {
101
+ assign(state, value);
102
+ }
103
+ else {
104
+ throw new Error(`Invalid ${flag} value: ${value ?? '(missing)'} (expected ${humanizeAllowed(allowed)})`);
105
+ }
106
+ };
107
+ }
108
+ /**
109
+ * Per-flag parse behavior, keyed by flag name. Arity (does the flag consume a
110
+ * value token?) comes from FLAG_SPECS.takesValue — this table only says what to
111
+ * do with the flag once recognized. Every key here MUST have a FLAG_SPECS entry
112
+ * and vice versa; parseArgs refuses to dispatch a flag missing from either
113
+ * side, and a test pins the two sets equal.
114
+ */
115
+ const FLAG_HANDLERS = {
116
+ '--url': (s, v) => { s.url = v; },
117
+ '--file': (s, v) => { s.file = v; },
118
+ '--out': (s, v) => { s.outDir = v; },
119
+ '--watch': (s) => { s.watch = true; },
120
+ '--interval': (s, v) => { s.interval = parseInt(v ?? '3000', 10); },
121
+ // Invalid --enum-style values are silently ignored (legacy lenience), unlike
122
+ // the enumValueFlag flags below which throw.
123
+ '--enum-style': (s, v) => {
124
+ if (v === 'union' || v === 'enum') {
125
+ s.ajsc.enumStyle = v;
126
+ }
127
+ },
128
+ '--depluralize': (s) => { s.ajsc.depluralize = true; },
129
+ '--array-item-naming': (s, v) => { s.ajsc.arrayItemNaming = v === 'false' ? false : v; },
130
+ '--uncountable-words': (s, v) => {
131
+ s.ajsc.uncountableWords = (v ?? '').split(',').map((w) => w.trim()).filter(Boolean);
132
+ },
133
+ '--jsdoc': (s) => { s.ajsc.jsdoc = true; },
134
+ '--no-jsdoc': (s) => { s.ajsc.jsdoc = false; },
135
+ '--client-import-path': (s, v) => { s.clientImportPath = v; },
136
+ '--dry-run': (s) => { s.dryRun = true; },
137
+ '--namespace-types': (s) => { s.namespaceTypes = true; },
138
+ '--no-namespace-types': (s) => { s.namespaceTypes = false; },
139
+ '--self-contained': (s) => { s.selfContained = true; },
140
+ '--no-self-contained': (s) => { s.selfContained = false; },
141
+ '--service-name': (s, v) => { s.serviceName = v; },
142
+ '--clean-out-dir': (s) => { s.cleanOutDir = true; },
143
+ '--no-clean-out-dir': (s) => { s.cleanOutDir = false; },
144
+ '--target': enumValueFlag('--target', ['ts', 'kotlin', 'swift'], (s, v) => { s.target = v; }),
145
+ '--kotlin-package': (s, v) => { s.kotlinPackage = v; },
146
+ '--kotlin-serializer': enumValueFlag('--kotlin-serializer', ['kotlinx', 'none'], (s, v) => { s.kotlinSerializer = v; }),
147
+ '--swift-serializer': enumValueFlag('--swift-serializer', ['codable', 'none'], (s, v) => { s.swiftSerializer = v; }),
148
+ '--swift-access-level': enumValueFlag('--swift-access-level', ['public', 'internal'], (s, v) => { s.swiftAccessLevel = v; }),
149
+ '--unsupported-unions': enumValueFlag('--unsupported-unions', ['throw', 'fallback'], (s, v) => { s.unsupportedUnions = v; }),
150
+ '--share-models': (s) => { s.shareModels = true; },
151
+ '--no-share-models': (s) => { s.shareModels = false; },
152
+ '--shared-models-module': (s, v) => { s.sharedModelsModule = v; },
153
+ '--strict-shared-models': (s) => { s.strictSharedModels = true; },
154
+ // configPath is consumed by the caller (main) before parseArgs is called with the loaded config.
155
+ // When called from main, config is already loaded. When called directly (tests), configPath is ignored.
156
+ '--config': (s, v) => { s.configPath = v; },
157
+ };
158
+ /**
159
+ * The set of flags parseArgs can dispatch — exported so a test can pin it
160
+ * equal to KNOWN_FLAGS (i.e. FLAG_SPECS), keeping catalog and parser in sync.
161
+ */
162
+ export const PARSE_HANDLED_FLAGS = Object.keys(FLAG_HANDLERS);
93
163
  /**
94
164
  * Parses CLI argv (pass process.argv.slice(2)).
95
165
  * Throws with a descriptive message on validation errors.
@@ -98,159 +168,40 @@ function closestKnownFlag(unknown) {
98
168
  * and CLI flags override them.
99
169
  */
100
170
  export function parseArgs(argv, config) {
101
- let url = config?.url;
102
- let file = config?.file;
103
- let outDir = config?.outDir;
104
- let watch = config?.watch ?? false;
105
- let interval = config?.interval ?? 3000;
106
- const ajsc = { jsdoc: true, ...config?.ajsc };
107
- let clientImportPath = config?.clientImportPath;
108
- let dryRun = config?.dryRun ?? false;
109
- let namespaceTypes = config?.namespaceTypes ?? true;
110
- let selfContained = config?.selfContained ?? true;
111
- let serviceName = config?.serviceName;
112
- let cleanOutDir = config?.cleanOutDir ?? true;
113
- let target = config?.target;
114
- let kotlinPackage = config?.kotlin?.package;
115
- let kotlinSerializer = config?.kotlin?.serializer;
116
- let swiftSerializer = config?.swift?.serializer;
117
- let swiftAccessLevel = config?.swift?.accessLevel;
118
- let unsupportedUnions = config?.unsupportedUnions;
119
- let shareModels = config?.shareModels ?? true;
171
+ const state = {
172
+ url: config?.url,
173
+ file: config?.file,
174
+ outDir: config?.outDir,
175
+ watch: config?.watch ?? false,
176
+ interval: config?.interval ?? 3000,
177
+ ajsc: { jsdoc: true, ...config?.ajsc },
178
+ clientImportPath: config?.clientImportPath,
179
+ dryRun: config?.dryRun ?? false,
180
+ namespaceTypes: config?.namespaceTypes ?? true,
181
+ selfContained: config?.selfContained ?? true,
182
+ serviceName: config?.serviceName,
183
+ cleanOutDir: config?.cleanOutDir ?? true,
184
+ target: config?.target,
185
+ kotlinPackage: config?.kotlin?.package,
186
+ kotlinSerializer: config?.kotlin?.serializer,
187
+ swiftSerializer: config?.swift?.serializer,
188
+ swiftAccessLevel: config?.swift?.accessLevel,
189
+ unsupportedUnions: config?.unsupportedUnions,
190
+ shareModels: config?.shareModels ?? true,
191
+ sharedModelsModule: config?.sharedModelsModule,
192
+ strictSharedModels: config?.strictSharedModels ?? false,
193
+ configPath: undefined,
194
+ };
120
195
  const sharedTypesImport = config?.sharedTypesImport;
121
- let sharedModelsModule = config?.sharedModelsModule;
122
- let strictSharedModels = config?.strictSharedModels ?? false;
123
- let configPath;
124
196
  for (let i = 0; i < argv.length; i++) {
125
197
  const arg = argv[i];
126
- if (arg === '--url') {
127
- url = argv[++i];
128
- }
129
- else if (arg === '--file') {
130
- file = argv[++i];
131
- }
132
- else if (arg === '--out') {
133
- outDir = argv[++i];
134
- }
135
- else if (arg === '--watch') {
136
- watch = true;
137
- }
138
- else if (arg === '--interval') {
139
- interval = parseInt(argv[++i] ?? '3000', 10);
140
- }
141
- else if (arg === '--enum-style') {
142
- const val = argv[++i];
143
- if (val === 'union' || val === 'enum') {
144
- ajsc.enumStyle = val;
145
- }
146
- }
147
- else if (arg === '--depluralize') {
148
- ajsc.depluralize = true;
149
- }
150
- else if (arg === '--array-item-naming') {
151
- const val = argv[++i];
152
- ajsc.arrayItemNaming = val === 'false' ? false : val;
153
- }
154
- else if (arg === '--uncountable-words') {
155
- ajsc.uncountableWords = (argv[++i] ?? '').split(',').map((w) => w.trim()).filter(Boolean);
156
- }
157
- else if (arg === '--jsdoc') {
158
- ajsc.jsdoc = true;
159
- }
160
- else if (arg === '--no-jsdoc') {
161
- ajsc.jsdoc = false;
162
- }
163
- else if (arg === '--client-import-path') {
164
- clientImportPath = argv[++i];
165
- }
166
- else if (arg === '--dry-run') {
167
- dryRun = true;
168
- }
169
- else if (arg === '--namespace-types') {
170
- namespaceTypes = true;
171
- }
172
- else if (arg === '--no-namespace-types') {
173
- namespaceTypes = false;
174
- }
175
- else if (arg === '--self-contained') {
176
- selfContained = true;
177
- }
178
- else if (arg === '--no-self-contained') {
179
- selfContained = false;
180
- }
181
- else if (arg === '--service-name') {
182
- serviceName = argv[++i];
183
- }
184
- else if (arg === '--clean-out-dir') {
185
- cleanOutDir = true;
186
- }
187
- else if (arg === '--no-clean-out-dir') {
188
- cleanOutDir = false;
189
- }
190
- else if (arg === '--target') {
191
- const val = argv[++i];
192
- if (val === 'ts' || val === 'kotlin' || val === 'swift') {
193
- target = val;
194
- }
195
- else {
196
- throw new Error(`Invalid --target value: ${val ?? '(missing)'} (expected 'ts', 'kotlin', or 'swift')`);
197
- }
198
- }
199
- else if (arg === '--kotlin-package') {
200
- kotlinPackage = argv[++i];
201
- }
202
- else if (arg === '--kotlin-serializer') {
203
- const val = argv[++i];
204
- if (val === 'kotlinx' || val === 'none') {
205
- kotlinSerializer = val;
206
- }
207
- else {
208
- throw new Error(`Invalid --kotlin-serializer value: ${val ?? '(missing)'} (expected 'kotlinx' or 'none')`);
209
- }
210
- }
211
- else if (arg === '--swift-serializer') {
212
- const val = argv[++i];
213
- if (val === 'codable' || val === 'none') {
214
- swiftSerializer = val;
215
- }
216
- else {
217
- throw new Error(`Invalid --swift-serializer value: ${val ?? '(missing)'} (expected 'codable' or 'none')`);
218
- }
219
- }
220
- else if (arg === '--swift-access-level') {
221
- const val = argv[++i];
222
- if (val === 'public' || val === 'internal') {
223
- swiftAccessLevel = val;
224
- }
225
- else {
226
- throw new Error(`Invalid --swift-access-level value: ${val ?? '(missing)'} (expected 'public' or 'internal')`);
227
- }
228
- }
229
- else if (arg === '--unsupported-unions') {
230
- const val = argv[++i];
231
- if (val === 'throw' || val === 'fallback') {
232
- unsupportedUnions = val;
233
- }
234
- else {
235
- throw new Error(`Invalid --unsupported-unions value: ${val ?? '(missing)'} (expected 'throw' or 'fallback')`);
236
- }
237
- }
238
- else if (arg === '--share-models') {
239
- shareModels = true;
240
- }
241
- else if (arg === '--no-share-models') {
242
- shareModels = false;
243
- }
244
- else if (arg === '--shared-models-module') {
245
- sharedModelsModule = argv[++i];
246
- }
247
- else if (arg === '--strict-shared-models') {
248
- strictSharedModels = true;
249
- }
250
- else if (arg === '--config') {
251
- configPath = argv[++i];
252
- }
253
- else if (arg !== undefined && arg.startsWith('--')) {
198
+ // Non-flag tokens (positionals) are silently ignored, matching the
199
+ // historical behavior. Value tokens never reach this check — they are
200
+ // consumed via ++i by the flag that owns them.
201
+ if (arg === undefined || !arg.startsWith('--'))
202
+ continue;
203
+ const spec = FLAG_SPEC_BY_NAME.get(arg);
204
+ if (spec === undefined) {
254
205
  // Reject unknown flags loudly. Silently ignoring them led to a downstream
255
206
  // bug where a misspelled `--targt` produced an empty envelope with no
256
207
  // user-visible cause. Suggest the closest known flag when the typo is
@@ -261,9 +212,15 @@ export function parseArgs(argv, config) {
261
212
  : ' See the README for the supported flag set.';
262
213
  throw new Error(`[ts-procedures-codegen] Unknown CLI flag: ${arg}.${tail}`);
263
214
  }
215
+ const handler = FLAG_HANDLERS[arg];
216
+ if (handler === undefined) {
217
+ // Drift guard: the flag is cataloged (so --help and did-you-mean know it)
218
+ // but nobody taught parseArgs what it does. The parity test catches this
219
+ // in CI; this throw catches it if the test is skipped.
220
+ throw new Error(`[ts-procedures-codegen] Internal error: ${arg} is cataloged in FLAG_SPECS but has no parseArgs handler.`);
221
+ }
222
+ handler(state, spec.takesValue ? argv[++i] : undefined);
264
223
  }
265
- // configPath is consumed by the caller (main) before parseArgs is called with the loaded config.
266
- // When called from main, config is already loaded. When called directly (tests), configPath is ignored.
267
224
  // ---------------------------------------------------------------------------
268
225
  // Validation — fails fast on user-controllable errors before envelope resolve.
269
226
  // Runtime checks (emitter availability, etc.) happen later in pipeline.ts;
@@ -271,54 +228,54 @@ export function parseArgs(argv, config) {
271
228
  // The CLI resolves emitters before invoking `runPipeline`, so users only ever
272
229
  // see flag-shape errors from this block, not pipeline-internal throws.
273
230
  // ---------------------------------------------------------------------------
274
- if (outDir === undefined) {
231
+ if (state.outDir === undefined) {
275
232
  throw new Error('Missing required argument: --out <dir>');
276
233
  }
277
- if (url === undefined && file === undefined) {
234
+ if (state.url === undefined && state.file === undefined) {
278
235
  throw new Error('Missing required input source: provide --url <url> or --file <path>');
279
236
  }
280
237
  // Kotlin target requires a package; surface this before any I/O happens.
281
- if (target === 'kotlin' && (kotlinPackage === undefined || kotlinPackage === '')) {
238
+ if (state.target === 'kotlin' && (state.kotlinPackage === undefined || state.kotlinPackage === '')) {
282
239
  throw new Error('Missing required argument: --kotlin-package <pkg> (required when --target kotlin)');
283
240
  }
284
241
  // Swift target currently has no required flags. If that changes, add the
285
242
  // guard here so the failure mode stays consistent (flag-shape errors fire
286
243
  // from parseArgs; runtime/emitter wiring errors fire from pipeline.ts).
287
244
  return {
288
- url,
289
- file,
290
- outDir,
291
- watch,
292
- interval,
293
- ajsc,
294
- ...(clientImportPath !== undefined ? { clientImportPath } : {}),
295
- dryRun,
296
- namespaceTypes,
297
- selfContained,
298
- ...(serviceName !== undefined ? { serviceName } : {}),
299
- cleanOutDir,
300
- ...(target !== undefined ? { target } : {}),
301
- ...(kotlinPackage !== undefined
245
+ url: state.url,
246
+ file: state.file,
247
+ outDir: state.outDir,
248
+ watch: state.watch,
249
+ interval: state.interval,
250
+ ajsc: state.ajsc,
251
+ ...(state.clientImportPath !== undefined ? { clientImportPath: state.clientImportPath } : {}),
252
+ dryRun: state.dryRun,
253
+ namespaceTypes: state.namespaceTypes,
254
+ selfContained: state.selfContained,
255
+ ...(state.serviceName !== undefined ? { serviceName: state.serviceName } : {}),
256
+ cleanOutDir: state.cleanOutDir,
257
+ ...(state.target !== undefined ? { target: state.target } : {}),
258
+ ...(state.kotlinPackage !== undefined
302
259
  ? {
303
260
  kotlin: {
304
- package: kotlinPackage,
305
- ...(kotlinSerializer !== undefined ? { serializer: kotlinSerializer } : {}),
261
+ package: state.kotlinPackage,
262
+ ...(state.kotlinSerializer !== undefined ? { serializer: state.kotlinSerializer } : {}),
306
263
  },
307
264
  }
308
265
  : {}),
309
- ...(swiftSerializer !== undefined || swiftAccessLevel !== undefined
266
+ ...(state.swiftSerializer !== undefined || state.swiftAccessLevel !== undefined
310
267
  ? {
311
268
  swift: {
312
- ...(swiftSerializer !== undefined ? { serializer: swiftSerializer } : {}),
313
- ...(swiftAccessLevel !== undefined ? { accessLevel: swiftAccessLevel } : {}),
269
+ ...(state.swiftSerializer !== undefined ? { serializer: state.swiftSerializer } : {}),
270
+ ...(state.swiftAccessLevel !== undefined ? { accessLevel: state.swiftAccessLevel } : {}),
314
271
  },
315
272
  }
316
273
  : {}),
317
- ...(unsupportedUnions !== undefined ? { unsupportedUnions } : {}),
318
- shareModels,
274
+ ...(state.unsupportedUnions !== undefined ? { unsupportedUnions: state.unsupportedUnions } : {}),
275
+ shareModels: state.shareModels,
319
276
  ...(sharedTypesImport !== undefined ? { sharedTypesImport } : {}),
320
- ...(sharedModelsModule !== undefined ? { sharedModelsModule } : {}),
321
- strictSharedModels,
277
+ ...(state.sharedModelsModule !== undefined ? { sharedModelsModule: state.sharedModelsModule } : {}),
278
+ strictSharedModels: state.strictSharedModels,
322
279
  };
323
280
  }
324
281
  /**