ts-procedures 7.3.0 → 8.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 (332) hide show
  1. package/README.md +65 -3
  2. package/agent_config/claude-code/agents/ts-procedures-architect.md +6 -8
  3. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +30 -33
  4. package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +104 -53
  5. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +205 -232
  6. package/agent_config/claude-code/skills/ts-procedures/patterns.md +80 -153
  7. package/agent_config/claude-code/skills/ts-procedures-review/SKILL.md +1 -1
  8. package/agent_config/claude-code/skills/ts-procedures-review/checklist.md +4 -5
  9. package/agent_config/claude-code/skills/ts-procedures-scaffold/SKILL.md +4 -7
  10. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono.md +223 -0
  11. package/agent_config/copilot/copilot-instructions.md +34 -48
  12. package/agent_config/cursor/cursorrules +34 -48
  13. package/build/client/call.js +4 -1
  14. package/build/client/call.js.map +1 -1
  15. package/build/client/call.test.js +23 -0
  16. package/build/client/call.test.js.map +1 -1
  17. package/build/client/fetch-adapter.js +3 -1
  18. package/build/client/fetch-adapter.js.map +1 -1
  19. package/build/client/fetch-adapter.test.js +11 -1
  20. package/build/client/fetch-adapter.test.js.map +1 -1
  21. package/build/client/index.test.js +7 -7
  22. package/build/client/index.test.js.map +1 -1
  23. package/build/client/request-builder.d.ts +1 -1
  24. package/build/client/request-builder.js +2 -2
  25. package/build/client/request-builder.js.map +1 -1
  26. package/build/client/stream.js +13 -2
  27. package/build/client/stream.js.map +1 -1
  28. package/build/client/stream.test.js +32 -7
  29. package/build/client/stream.test.js.map +1 -1
  30. package/build/client/typed-error-dispatch.test.js +8 -92
  31. package/build/client/typed-error-dispatch.test.js.map +1 -1
  32. package/build/client/types.d.ts +21 -3
  33. package/build/codegen/bin/cli.js +0 -0
  34. package/build/codegen/e2e.test.js +418 -23
  35. package/build/codegen/e2e.test.js.map +1 -1
  36. package/build/codegen/emit-errors.integration.test.js +1 -1
  37. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  38. package/build/codegen/emit-scope.js +351 -55
  39. package/build/codegen/emit-scope.js.map +1 -1
  40. package/build/codegen/emit-scope.test.js +540 -110
  41. package/build/codegen/emit-scope.test.js.map +1 -1
  42. package/build/codegen/emit-types.d.ts +6 -2
  43. package/build/codegen/emit-types.js +81 -20
  44. package/build/codegen/emit-types.js.map +1 -1
  45. package/build/codegen/emit-types.test.js +70 -1
  46. package/build/codegen/emit-types.test.js.map +1 -1
  47. package/build/codegen/pipeline.test.js +7 -7
  48. package/build/codegen/pipeline.test.js.map +1 -1
  49. package/build/codegen/resolve-envelope.js +1 -1
  50. package/build/codegen/resolve-envelope.js.map +1 -1
  51. package/build/codegen/resolve-envelope.test.js +5 -5
  52. package/build/codegen/resolve-envelope.test.js.map +1 -1
  53. package/build/codegen/targets/_shared/route-slots.d.ts +8 -3
  54. package/build/codegen/targets/_shared/route-slots.js +49 -8
  55. package/build/codegen/targets/_shared/route-slots.js.map +1 -1
  56. package/build/codegen/targets/_shared/route-slots.test.js +99 -26
  57. package/build/codegen/targets/_shared/route-slots.test.js.map +1 -1
  58. package/build/codegen/targets/kotlin/emit-route-kotlin.test.js +88 -17
  59. package/build/codegen/targets/kotlin/emit-route-kotlin.test.js.map +1 -1
  60. package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js +9 -6
  61. package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js.map +1 -1
  62. package/build/codegen/targets/kotlin/integration.test.js +6 -0
  63. package/build/codegen/targets/kotlin/integration.test.js.map +1 -1
  64. package/build/codegen/targets/swift/access-level.test.js +8 -11
  65. package/build/codegen/targets/swift/access-level.test.js.map +1 -1
  66. package/build/codegen/targets/swift/emit-route-swift.test.js +91 -20
  67. package/build/codegen/targets/swift/emit-route-swift.test.js.map +1 -1
  68. package/build/codegen/targets/swift/emit-scope-swift.test.js +12 -9
  69. package/build/codegen/targets/swift/emit-scope-swift.test.js.map +1 -1
  70. package/build/codegen/targets/swift/integration.test.js +6 -0
  71. package/build/codegen/targets/swift/integration.test.js.map +1 -1
  72. package/build/create-http-stream.d.ts +58 -0
  73. package/build/create-http-stream.js +122 -0
  74. package/build/create-http-stream.js.map +1 -0
  75. package/build/create-http-stream.test.js +88 -0
  76. package/build/create-http-stream.test.js.map +1 -0
  77. package/build/create-http.d.ts +49 -0
  78. package/build/create-http.js +108 -0
  79. package/build/create-http.js.map +1 -0
  80. package/build/create-http.test.js +137 -0
  81. package/build/create-http.test.js.map +1 -0
  82. package/build/create-stream.d.ts +35 -0
  83. package/build/create-stream.js +123 -0
  84. package/build/create-stream.js.map +1 -0
  85. package/build/create-stream.test.js +428 -0
  86. package/build/create-stream.test.js.map +1 -0
  87. package/build/create.d.ts +28 -0
  88. package/build/create.js +82 -0
  89. package/build/create.js.map +1 -0
  90. package/build/create.test.js +483 -0
  91. package/build/create.test.js.map +1 -0
  92. package/build/exports.d.ts +2 -0
  93. package/build/implementations/http/astro/index.test.js +20 -12
  94. package/build/implementations/http/astro/index.test.js.map +1 -1
  95. package/build/implementations/http/doc-registry.js +1 -1
  96. package/build/implementations/http/doc-registry.js.map +1 -1
  97. package/build/implementations/http/doc-registry.test.js +36 -5
  98. package/build/implementations/http/doc-registry.test.js.map +1 -1
  99. package/build/implementations/http/error-dispatch.d.ts +76 -0
  100. package/build/implementations/http/error-dispatch.js +77 -0
  101. package/build/implementations/http/error-dispatch.js.map +1 -0
  102. package/build/implementations/http/error-dispatch.test.js +254 -0
  103. package/build/implementations/http/error-dispatch.test.js.map +1 -0
  104. package/build/implementations/http/error-taxonomy.d.ts +5 -5
  105. package/build/implementations/http/hono/docs/http-doc.d.ts +6 -0
  106. package/build/implementations/http/hono/docs/http-doc.js +42 -0
  107. package/build/implementations/http/hono/docs/http-doc.js.map +1 -0
  108. package/build/implementations/http/hono/docs/http-stream-doc.d.ts +6 -0
  109. package/build/implementations/http/hono/docs/http-stream-doc.js +40 -0
  110. package/build/implementations/http/hono/docs/http-stream-doc.js.map +1 -0
  111. package/build/implementations/http/hono/docs/rpc-doc.d.ts +6 -0
  112. package/build/implementations/http/hono/docs/rpc-doc.js +24 -0
  113. package/build/implementations/http/hono/docs/rpc-doc.js.map +1 -0
  114. package/build/implementations/http/hono/docs/stream-doc.d.ts +6 -0
  115. package/build/implementations/http/hono/docs/stream-doc.js +42 -0
  116. package/build/implementations/http/hono/docs/stream-doc.js.map +1 -0
  117. package/build/implementations/http/hono/handlers/http-stream.d.ts +10 -0
  118. package/build/implementations/http/hono/handlers/http-stream.js +123 -0
  119. package/build/implementations/http/hono/handlers/http-stream.js.map +1 -0
  120. package/build/implementations/http/hono/handlers/http-stream.test.js +128 -0
  121. package/build/implementations/http/hono/handlers/http-stream.test.js.map +1 -0
  122. package/build/implementations/http/hono/handlers/http.d.ts +10 -0
  123. package/build/implementations/http/hono/handlers/http.js +115 -0
  124. package/build/implementations/http/hono/handlers/http.js.map +1 -0
  125. package/build/implementations/http/hono/handlers/http.test.js +118 -0
  126. package/build/implementations/http/hono/handlers/http.test.js.map +1 -0
  127. package/build/implementations/http/hono/handlers/rpc.d.ts +11 -0
  128. package/build/implementations/http/hono/handlers/rpc.js +32 -0
  129. package/build/implementations/http/hono/handlers/rpc.js.map +1 -0
  130. package/build/implementations/http/hono/handlers/rpc.test.js +73 -0
  131. package/build/implementations/http/hono/handlers/rpc.test.js.map +1 -0
  132. package/build/implementations/http/hono/handlers/stream.d.ts +23 -0
  133. package/build/implementations/http/hono/handlers/stream.js +147 -0
  134. package/build/implementations/http/hono/handlers/stream.js.map +1 -0
  135. package/build/implementations/http/hono/handlers/stream.test.d.ts +1 -0
  136. package/build/implementations/http/hono/handlers/stream.test.js +177 -0
  137. package/build/implementations/http/hono/handlers/stream.test.js.map +1 -0
  138. package/build/implementations/http/hono/index.d.ts +57 -0
  139. package/build/implementations/http/hono/index.js +149 -0
  140. package/build/implementations/http/hono/index.js.map +1 -0
  141. package/build/implementations/http/hono/index.test.d.ts +1 -0
  142. package/build/implementations/http/hono/index.test.js +274 -0
  143. package/build/implementations/http/hono/index.test.js.map +1 -0
  144. package/build/implementations/http/hono/path.d.ts +17 -0
  145. package/build/implementations/http/hono/path.js +39 -0
  146. package/build/implementations/http/hono/path.js.map +1 -0
  147. package/build/implementations/http/hono/path.test.d.ts +1 -0
  148. package/build/implementations/http/hono/path.test.js +83 -0
  149. package/build/implementations/http/hono/path.test.js.map +1 -0
  150. package/build/implementations/http/hono/types.d.ts +51 -0
  151. package/build/implementations/http/hono/types.js.map +1 -0
  152. package/build/implementations/http/on-request-error.test.js +6 -96
  153. package/build/implementations/http/on-request-error.test.js.map +1 -1
  154. package/build/implementations/http/route-errors.test.js +11 -59
  155. package/build/implementations/http/route-errors.test.js.map +1 -1
  156. package/build/implementations/types.d.ts +43 -9
  157. package/build/index.d.ts +124 -124
  158. package/build/index.js +10 -221
  159. package/build/index.js.map +1 -1
  160. package/build/index.test.js +20 -919
  161. package/build/index.test.js.map +1 -1
  162. package/build/migration.test.d.ts +1 -0
  163. package/build/migration.test.js +34 -0
  164. package/build/migration.test.js.map +1 -0
  165. package/build/schema/compute-schema.d.ts +11 -3
  166. package/build/schema/compute-schema.js +13 -7
  167. package/build/schema/compute-schema.js.map +1 -1
  168. package/build/schema/parser.d.ts +11 -3
  169. package/build/schema/parser.js +49 -9
  170. package/build/schema/parser.js.map +1 -1
  171. package/build/stack-utils.js +8 -0
  172. package/build/stack-utils.js.map +1 -1
  173. package/build/types.d.ts +142 -0
  174. package/build/types.js.map +1 -0
  175. package/docs/astro-adapter.md +5 -5
  176. package/docs/core.md +15 -17
  177. package/docs/http-integrations.md +83 -170
  178. package/docs/streaming.md +3 -60
  179. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +2 -7
  180. package/docs/superpowers/plans/2026-05-08-create-http.md +3355 -0
  181. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +3365 -0
  182. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +1 -3
  183. package/docs/superpowers/specs/2026-05-08-create-http-design.md +409 -0
  184. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +411 -0
  185. package/package.json +4 -22
  186. package/src/client/call.test.ts +26 -0
  187. package/src/client/call.ts +4 -1
  188. package/src/client/fetch-adapter.test.ts +14 -1
  189. package/src/client/fetch-adapter.ts +3 -1
  190. package/src/client/index.test.ts +7 -7
  191. package/src/client/request-builder.ts +2 -2
  192. package/src/client/stream.test.ts +39 -7
  193. package/src/client/stream.ts +16 -2
  194. package/src/client/typed-error-dispatch.test.ts +7 -97
  195. package/src/client/types.ts +21 -3
  196. package/src/codegen/__fixtures__/users-envelope.json +119 -38
  197. package/src/codegen/e2e.test.ts +452 -24
  198. package/src/codegen/emit-errors.integration.test.ts +1 -1
  199. package/src/codegen/emit-scope.test.ts +581 -110
  200. package/src/codegen/emit-scope.ts +390 -61
  201. package/src/codegen/emit-types.test.ts +73 -1
  202. package/src/codegen/emit-types.ts +82 -21
  203. package/src/codegen/pipeline.test.ts +7 -7
  204. package/src/codegen/resolve-envelope.test.ts +5 -5
  205. package/src/codegen/resolve-envelope.ts +1 -1
  206. package/src/codegen/targets/_shared/route-slots.test.ts +109 -26
  207. package/src/codegen/targets/_shared/route-slots.ts +48 -11
  208. package/src/codegen/targets/kotlin/__fixtures__/users-golden.kt +73 -0
  209. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +100 -17
  210. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +9 -6
  211. package/src/codegen/targets/kotlin/integration.test.ts +19 -0
  212. package/src/codegen/targets/swift/__fixtures__/users-golden.swift +79 -0
  213. package/src/codegen/targets/swift/access-level.test.ts +8 -11
  214. package/src/codegen/targets/swift/emit-route-swift.test.ts +103 -20
  215. package/src/codegen/targets/swift/emit-scope-swift.test.ts +12 -9
  216. package/src/codegen/targets/swift/integration.test.ts +17 -0
  217. package/src/create-http-stream.test.ts +97 -0
  218. package/src/create-http-stream.ts +191 -0
  219. package/src/create-http.test.ts +163 -0
  220. package/src/create-http.ts +211 -0
  221. package/src/create-stream.test.ts +565 -0
  222. package/src/create-stream.ts +228 -0
  223. package/src/create.test.ts +658 -0
  224. package/src/create.ts +172 -0
  225. package/src/exports.ts +2 -0
  226. package/src/implementations/http/README.md +135 -95
  227. package/src/implementations/http/astro/README.md +4 -5
  228. package/src/implementations/http/astro/index.test.ts +25 -18
  229. package/src/implementations/http/doc-registry.test.ts +42 -5
  230. package/src/implementations/http/doc-registry.ts +1 -1
  231. package/src/implementations/http/error-dispatch.test.ts +283 -0
  232. package/src/implementations/http/error-dispatch.ts +176 -0
  233. package/src/implementations/http/error-taxonomy.ts +5 -5
  234. package/src/implementations/http/hono/docs/http-doc.ts +43 -0
  235. package/src/implementations/http/hono/docs/http-stream-doc.ts +44 -0
  236. package/src/implementations/http/hono/docs/rpc-doc.ts +34 -0
  237. package/src/implementations/http/hono/docs/stream-doc.ts +53 -0
  238. package/src/implementations/http/hono/handlers/http-stream.test.ts +150 -0
  239. package/src/implementations/http/hono/handlers/http-stream.ts +152 -0
  240. package/src/implementations/http/hono/handlers/http.test.ts +130 -0
  241. package/src/implementations/http/hono/handlers/http.ts +147 -0
  242. package/src/implementations/http/hono/handlers/rpc.test.ts +81 -0
  243. package/src/implementations/http/hono/handlers/rpc.ts +54 -0
  244. package/src/implementations/http/hono/handlers/stream.test.ts +198 -0
  245. package/src/implementations/http/hono/handlers/stream.ts +208 -0
  246. package/src/implementations/http/hono/index.test.ts +329 -0
  247. package/src/implementations/http/hono/index.ts +204 -0
  248. package/src/implementations/http/hono/path.test.ts +96 -0
  249. package/src/implementations/http/hono/path.ts +59 -0
  250. package/src/implementations/http/hono/types.ts +93 -0
  251. package/src/implementations/http/on-request-error.test.ts +10 -116
  252. package/src/implementations/http/route-errors.test.ts +11 -77
  253. package/src/implementations/types.ts +44 -9
  254. package/src/index.test.ts +22 -1249
  255. package/src/index.ts +49 -485
  256. package/src/migration.test.ts +48 -0
  257. package/src/schema/compute-schema.ts +26 -12
  258. package/src/schema/parser.ts +62 -12
  259. package/src/stack-utils.ts +8 -0
  260. package/src/types.ts +133 -0
  261. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/express-rpc.md +0 -137
  262. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-api.md +0 -173
  263. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-rpc.md +0 -142
  264. package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-stream.md +0 -147
  265. package/build/implementations/http/express-rpc/error-taxonomy.test.js +0 -83
  266. package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +0 -1
  267. package/build/implementations/http/express-rpc/index.d.ts +0 -125
  268. package/build/implementations/http/express-rpc/index.js +0 -216
  269. package/build/implementations/http/express-rpc/index.js.map +0 -1
  270. package/build/implementations/http/express-rpc/index.test.js +0 -684
  271. package/build/implementations/http/express-rpc/index.test.js.map +0 -1
  272. package/build/implementations/http/express-rpc/types.d.ts +0 -11
  273. package/build/implementations/http/express-rpc/types.js.map +0 -1
  274. package/build/implementations/http/hono-api/error-taxonomy.test.js +0 -137
  275. package/build/implementations/http/hono-api/error-taxonomy.test.js.map +0 -1
  276. package/build/implementations/http/hono-api/index.d.ts +0 -151
  277. package/build/implementations/http/hono-api/index.js +0 -344
  278. package/build/implementations/http/hono-api/index.js.map +0 -1
  279. package/build/implementations/http/hono-api/index.test.js +0 -992
  280. package/build/implementations/http/hono-api/index.test.js.map +0 -1
  281. package/build/implementations/http/hono-api/types.d.ts +0 -13
  282. package/build/implementations/http/hono-api/types.js.map +0 -1
  283. package/build/implementations/http/hono-rpc/error-taxonomy.test.js +0 -64
  284. package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +0 -1
  285. package/build/implementations/http/hono-rpc/index.d.ts +0 -130
  286. package/build/implementations/http/hono-rpc/index.js +0 -209
  287. package/build/implementations/http/hono-rpc/index.js.map +0 -1
  288. package/build/implementations/http/hono-rpc/index.test.js +0 -828
  289. package/build/implementations/http/hono-rpc/index.test.js.map +0 -1
  290. package/build/implementations/http/hono-rpc/types.d.ts +0 -11
  291. package/build/implementations/http/hono-rpc/types.js +0 -2
  292. package/build/implementations/http/hono-rpc/types.js.map +0 -1
  293. package/build/implementations/http/hono-stream/error-taxonomy.test.js +0 -159
  294. package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +0 -1
  295. package/build/implementations/http/hono-stream/index.d.ts +0 -171
  296. package/build/implementations/http/hono-stream/index.js +0 -415
  297. package/build/implementations/http/hono-stream/index.js.map +0 -1
  298. package/build/implementations/http/hono-stream/index.test.js +0 -1383
  299. package/build/implementations/http/hono-stream/index.test.js.map +0 -1
  300. package/build/implementations/http/hono-stream/types.d.ts +0 -15
  301. package/build/implementations/http/hono-stream/types.js +0 -2
  302. package/build/implementations/http/hono-stream/types.js.map +0 -1
  303. package/src/implementations/http/express-rpc/README.md +0 -280
  304. package/src/implementations/http/express-rpc/error-taxonomy.test.ts +0 -103
  305. package/src/implementations/http/express-rpc/index.test.ts +0 -957
  306. package/src/implementations/http/express-rpc/index.ts +0 -327
  307. package/src/implementations/http/express-rpc/types.ts +0 -16
  308. package/src/implementations/http/hono-api/README.md +0 -284
  309. package/src/implementations/http/hono-api/error-taxonomy.test.ts +0 -179
  310. package/src/implementations/http/hono-api/index.test.ts +0 -1341
  311. package/src/implementations/http/hono-api/index.ts +0 -519
  312. package/src/implementations/http/hono-api/types.ts +0 -16
  313. package/src/implementations/http/hono-rpc/README.md +0 -357
  314. package/src/implementations/http/hono-rpc/error-taxonomy.test.ts +0 -82
  315. package/src/implementations/http/hono-rpc/index.test.ts +0 -1107
  316. package/src/implementations/http/hono-rpc/index.ts +0 -320
  317. package/src/implementations/http/hono-rpc/types.ts +0 -16
  318. package/src/implementations/http/hono-stream/README.md +0 -559
  319. package/src/implementations/http/hono-stream/error-taxonomy.test.ts +0 -178
  320. package/src/implementations/http/hono-stream/index.test.ts +0 -1804
  321. package/src/implementations/http/hono-stream/index.ts +0 -622
  322. package/src/implementations/http/hono-stream/types.ts +0 -20
  323. /package/build/{implementations/http/express-rpc/error-taxonomy.test.d.ts → create-http-stream.test.d.ts} +0 -0
  324. /package/build/{implementations/http/express-rpc/index.test.d.ts → create-http.test.d.ts} +0 -0
  325. /package/build/{implementations/http/hono-api/error-taxonomy.test.d.ts → create-stream.test.d.ts} +0 -0
  326. /package/build/{implementations/http/hono-api/index.test.d.ts → create.test.d.ts} +0 -0
  327. /package/build/implementations/http/{hono-rpc/error-taxonomy.test.d.ts → error-dispatch.test.d.ts} +0 -0
  328. /package/build/implementations/http/{hono-rpc/index.test.d.ts → hono/handlers/http-stream.test.d.ts} +0 -0
  329. /package/build/implementations/http/{hono-stream/error-taxonomy.test.d.ts → hono/handlers/http.test.d.ts} +0 -0
  330. /package/build/implementations/http/{hono-stream/index.test.d.ts → hono/handlers/rpc.test.d.ts} +0 -0
  331. /package/build/implementations/http/{express-rpc → hono}/types.js +0 -0
  332. /package/build/{implementations/http/hono-api/types.js → types.js} +0 -0
@@ -1,344 +0,0 @@
1
- import { Hono } from 'hono';
2
- import { defineErrorTaxonomy, resolveErrorResponse, } from '../error-taxonomy.js';
3
- export { defineErrorTaxonomy };
4
- /** Default query parser using native URLSearchParams. */
5
- function parseQueryNative(queryString) {
6
- const searchParams = new URLSearchParams(queryString);
7
- const result = {};
8
- for (const key of new Set(searchParams.keys())) {
9
- const values = searchParams.getAll(key);
10
- result[key] = values.length > 1 ? values : values[0];
11
- }
12
- return result;
13
- }
14
- /** Extract path parameter names from a route pattern (e.g., '/users/:id' → ['id']) */
15
- function extractPathParamNames(path) {
16
- const matches = path.match(/:([a-zA-Z_][a-zA-Z0-9_]*)/g);
17
- return matches ? matches.map((m) => m.slice(1)) : [];
18
- }
19
- /** Default success status codes by HTTP method */
20
- function defaultSuccessStatus(method) {
21
- switch (method) {
22
- case 'post':
23
- return 201;
24
- case 'delete':
25
- return 204;
26
- default:
27
- return 200;
28
- }
29
- }
30
- /** HTTP methods that typically carry a request body */
31
- const BODY_METHODS = ['post', 'put', 'patch'];
32
- /** Extracts the raw query string from a URL and runs it through the resolved parser. */
33
- function extractQuery(url, queryParser) {
34
- const questionMark = url.indexOf('?');
35
- if (questionMark === -1)
36
- return {};
37
- const rawQuery = url.slice(questionMark + 1);
38
- if (!rawQuery)
39
- return {};
40
- return queryParser(rawQuery);
41
- }
42
- /**
43
- * Builder class for creating a Hono application with REST-style API routes.
44
- *
45
- * Uses `schema.input` for per-channel type safety:
46
- * - `input.pathParams` → validated path parameters
47
- * - `input.query` → validated query string parameters
48
- * - `input.body` → validated request body
49
- * - `input.headers` → validated request headers
50
- *
51
- * Usage:
52
- * const API = Procedures<MyContext, APIConfig>()
53
- *
54
- * API.Create('GetUser', {
55
- * path: '/users/:id',
56
- * method: 'get',
57
- * schema: {
58
- * input: {
59
- * pathParams: Type.Object({ id: Type.String() }),
60
- * query: Type.Object({ include: Type.Optional(Type.String()) }),
61
- * },
62
- * returnType: Type.Object({ id: Type.String(), name: Type.String() }),
63
- * }
64
- * }, async (ctx, { pathParams, query }) => {
65
- * return { id: pathParams.id, name: 'John' }
66
- * })
67
- *
68
- * const apiApp = new HonoAPIAppBuilder()
69
- * .register(API, (c) => ({ ... }))
70
- * .build()
71
- */
72
- export class HonoAPIAppBuilder {
73
- config;
74
- constructor(config) {
75
- this.config = config;
76
- if (config?.app) {
77
- this._app = config.app;
78
- }
79
- if (config?.onRequestStart) {
80
- this._app.use('*', async (c, next) => {
81
- config.onRequestStart(c);
82
- await next();
83
- });
84
- }
85
- if (config?.onRequestEnd) {
86
- this._app.use('*', async (c, next) => {
87
- await next();
88
- config.onRequestEnd(c);
89
- });
90
- }
91
- }
92
- factories = [];
93
- _app = new Hono();
94
- _docs = [];
95
- get app() {
96
- return this._app;
97
- }
98
- get docs() {
99
- return this._docs;
100
- }
101
- /**
102
- * Registers a procedure factory with its context.
103
- * @param factory - The procedure factory created by Procedures<Context, APIConfig>()
104
- * @param factoryContext - Context for handlers. Direct value, sync function, or async function.
105
- * @param extendProcedureDoc - Custom function to extend the generated route documentation.
106
- */
107
- register(factory, factoryContext, extendProcedureDoc) {
108
- this.factories.push({ factory, factoryContext, extendProcedureDoc });
109
- return this;
110
- }
111
- /**
112
- * Resolves the full path for a route, combining pathPrefix and the procedure's path.
113
- */
114
- resolveFullPath(procedurePath) {
115
- const prefix = this.config?.pathPrefix;
116
- const normalizedPrefix = prefix ? (prefix.startsWith('/') ? prefix : `/${prefix}`) : '';
117
- const normalizedPath = procedurePath.startsWith('/') ? procedurePath : `/${procedurePath}`;
118
- return `${normalizedPrefix}${normalizedPath}`;
119
- }
120
- /**
121
- * Builds and returns the Hono application with registered API routes.
122
- */
123
- build() {
124
- const queryParser = this.config?.queryParser ?? parseQueryNative;
125
- this.factories.forEach(({ factory, factoryContext, extendProcedureDoc }) => {
126
- factory.getProcedures().map((procedure) => {
127
- const { config } = procedure;
128
- const fullPath = this.resolveFullPath(config.path);
129
- const inputSchema = procedure.config.schema?.input;
130
- // Validate consistency: path params in path template must match schema.input.pathParams
131
- this.validatePathParamConsistency(procedure.name, config.path, inputSchema);
132
- const route = this.buildApiHttpRouteDoc(procedure, fullPath, extendProcedureDoc);
133
- this._docs.push(route);
134
- const method = config.method;
135
- const handler = this.createRouteHandler(procedure, factoryContext, config, inputSchema, queryParser);
136
- this._app.on(method.toUpperCase(), fullPath, handler);
137
- });
138
- });
139
- return this._app;
140
- }
141
- /**
142
- * Validates that path parameter names in the path template match the schema.input.pathParams declaration.
143
- */
144
- validatePathParamConsistency(procedureName, path, inputSchema) {
145
- // Only validate when schema.input is used; schema.params (flat mode) skips this check
146
- if (!inputSchema)
147
- return;
148
- const pathParamNames = extractPathParamNames(path);
149
- if (pathParamNames.length > 0 && !inputSchema.pathParams) {
150
- throw new Error(`Path "${path}" has path parameters [${pathParamNames.join(', ')}] but schema.input.pathParams is not defined for procedure "${procedureName}". ` +
151
- `Define schema.input.pathParams to validate path parameters.`);
152
- }
153
- if (inputSchema.pathParams && pathParamNames.length === 0) {
154
- throw new Error(`schema.input.pathParams is defined for procedure "${procedureName}" but path "${path}" has no path parameters. ` +
155
- `Remove schema.input.pathParams or add path parameters to the path.`);
156
- }
157
- // Deep validation: verify schema property names match the :param names in the path
158
- if (inputSchema.pathParams && pathParamNames.length > 0) {
159
- const pathParamsJsonSchema = inputSchema.pathParams;
160
- const schemaProperties = pathParamsJsonSchema.properties;
161
- if (schemaProperties) {
162
- const schemaKeys = Object.keys(schemaProperties);
163
- const missingInSchema = pathParamNames.filter((p) => !schemaKeys.includes(p));
164
- const extraInSchema = schemaKeys.filter((k) => !pathParamNames.includes(k));
165
- if (missingInSchema.length > 0 || extraInSchema.length > 0) {
166
- const parts = [];
167
- if (missingInSchema.length > 0) {
168
- parts.push(`path has [${missingInSchema.join(', ')}] but they are missing from schema`);
169
- }
170
- if (extraInSchema.length > 0) {
171
- parts.push(`schema has [${extraInSchema.join(', ')}] but they are not in the path`);
172
- }
173
- throw new Error(`Path param mismatch for procedure "${procedureName}": ${parts.join('; ')}. ` +
174
- `Path "${path}" expects [${pathParamNames.join(', ')}], schema defines [${schemaKeys.join(', ')}].`);
175
- }
176
- }
177
- }
178
- }
179
- /**
180
- * Creates the async route handler for a procedure.
181
- */
182
- createRouteHandler(procedure, factoryContext, config, inputSchema, queryParser) {
183
- const successStatus = config.successStatus ?? defaultSuccessStatus(config.method);
184
- return async (c) => {
185
- try {
186
- const context = typeof factoryContext === 'function'
187
- ? await factoryContext(c)
188
- : factoryContext;
189
- let params;
190
- if (inputSchema) {
191
- // schema.input mode: build structured params from HTTP sources
192
- params = await this.extractInputParams(c, config.method, inputSchema, queryParser);
193
- }
194
- else if (procedure.config.schema?.params) {
195
- // schema.params mode: extract from body or query based on method
196
- if (BODY_METHODS.includes(config.method)) {
197
- params = await c.req.json().catch(() => ({}));
198
- }
199
- else {
200
- params = extractQuery(c.req.url, queryParser);
201
- }
202
- }
203
- else {
204
- params = await c.req.json().catch(() => undefined);
205
- }
206
- const result = await procedure.handler({ ...context, signal: c.req.raw.signal }, params);
207
- if (this.config?.onSuccess) {
208
- this.config.onSuccess(procedure, c);
209
- }
210
- // 204 No Content returns no body
211
- if (successStatus === 204) {
212
- return c.body(null, 204);
213
- }
214
- return c.json(result, successStatus);
215
- }
216
- catch (error) {
217
- // Observer fires first — cross-cutting, cannot alter dispatch or the
218
- // response. Swallow any throw from the observer so instrumentation
219
- // bugs never break the primary error-response flow.
220
- if (this.config?.onRequestError) {
221
- try {
222
- await this.config.onRequestError({ err: error, procedure, raw: c });
223
- }
224
- catch (observerErr) {
225
- console.error('[ts-procedures hono-api] onRequestError threw — swallowed:', observerErr);
226
- }
227
- }
228
- // Dispatch: taxonomy → onError → hard default. The two modes are
229
- // peers; apps configure whichever fits (or both, in which case the
230
- // taxonomy handles what it covers and `onError` handles the tail).
231
- if (this.config?.errors || this.config?.unknownError) {
232
- const resolved = resolveErrorResponse({
233
- err: error,
234
- userTaxonomy: this.config.errors,
235
- unknownError: this.config.unknownError,
236
- procedure,
237
- raw: c,
238
- });
239
- if (resolved) {
240
- await resolved.runOnCatch();
241
- return c.json(resolved.body, resolved.statusCode);
242
- }
243
- }
244
- if (this.config?.onError) {
245
- return this.config.onError(procedure, c, error);
246
- }
247
- return c.json({ error: error.message }, 500);
248
- }
249
- };
250
- }
251
- /**
252
- * Extracts and assembles structured input params from HTTP request sources.
253
- * Each channel (pathParams, query, body, headers) is extracted from its HTTP source.
254
- * The core validates each channel independently via schema.input validators.
255
- */
256
- async extractInputParams(c, method, inputSchema, queryParser) {
257
- const params = {};
258
- const channelNames = Object.keys(inputSchema);
259
- for (const channel of channelNames) {
260
- switch (channel) {
261
- case 'pathParams':
262
- params.pathParams = c.req.param();
263
- break;
264
- case 'query':
265
- params.query = extractQuery(c.req.url, queryParser);
266
- break;
267
- case 'body':
268
- if (BODY_METHODS.includes(method)) {
269
- params.body = await c.req.json().catch(() => ({}));
270
- }
271
- break;
272
- case 'headers': {
273
- // Pass all request headers; AJV's removeAdditional strips non-declared keys
274
- const headersObj = {};
275
- c.req.raw.headers.forEach((value, key) => {
276
- headersObj[key] = value;
277
- });
278
- params.headers = headersObj;
279
- break;
280
- }
281
- default:
282
- // Unknown channel — pass through empty. Core validation will catch mismatches.
283
- params[channel] = undefined;
284
- break;
285
- }
286
- }
287
- return params;
288
- }
289
- /**
290
- * Generates the API HTTP route documentation for the given procedure.
291
- */
292
- buildApiHttpRouteDoc(procedure, fullPath, extendProcedureDoc) {
293
- const { config } = procedure;
294
- const inputSchema = config.schema?.input;
295
- const jsonSchema = {};
296
- // Populate per-channel JSON schemas from schema.input
297
- if (inputSchema) {
298
- if (inputSchema.pathParams)
299
- jsonSchema.pathParams = inputSchema.pathParams;
300
- if (inputSchema.query)
301
- jsonSchema.query = inputSchema.query;
302
- if (inputSchema.body)
303
- jsonSchema.body = inputSchema.body;
304
- if (inputSchema.headers)
305
- jsonSchema.headers = inputSchema.headers;
306
- }
307
- else if (config.schema?.params) {
308
- // Fallback: schema.params treated as body/query depending on method
309
- if (BODY_METHODS.includes(config.method)) {
310
- jsonSchema.body = config.schema.params;
311
- }
312
- else {
313
- jsonSchema.query = config.schema.params;
314
- }
315
- }
316
- if (config.schema?.returnType) {
317
- jsonSchema.response = config.schema.returnType;
318
- }
319
- const base = {
320
- kind: 'api',
321
- name: procedure.name,
322
- scope: config.scope,
323
- path: config.path,
324
- method: config.method,
325
- fullPath,
326
- jsonSchema,
327
- };
328
- if (config.successStatus) {
329
- base.successStatus = config.successStatus;
330
- }
331
- if (config.errors && config.errors.length > 0) {
332
- base.errors = [...config.errors];
333
- }
334
- let extendedDoc = {};
335
- if (extendProcedureDoc) {
336
- extendedDoc = extendProcedureDoc({ base, procedure });
337
- }
338
- return {
339
- ...extendedDoc,
340
- ...base,
341
- };
342
- }
343
- }
344
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono-api/index.ts"],"names":[],"mappings":"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"}