@lovrozagar/honey 0.6.8 → 0.7.1

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 (674) hide show
  1. package/README.md +514 -192
  2. package/bin/honey.js +25 -0
  3. package/dist/accepts.d.ts +7 -1
  4. package/dist/accepts.d.ts.map +1 -1
  5. package/dist/accepts.js +126 -0
  6. package/dist/accepts.js.map +1 -0
  7. package/dist/body-kind.d.ts +26 -0
  8. package/dist/body-kind.d.ts.map +1 -0
  9. package/dist/body-kind.js +70 -0
  10. package/dist/body-kind.js.map +1 -0
  11. package/dist/body-limit.d.ts +5 -1
  12. package/dist/body-limit.d.ts.map +1 -1
  13. package/dist/body-limit.js +126 -0
  14. package/dist/body-limit.js.map +1 -0
  15. package/dist/build/index.d.ts +19 -3
  16. package/dist/build/index.d.ts.map +1 -1
  17. package/dist/build/index.js +173 -0
  18. package/dist/build/index.js.map +1 -0
  19. package/dist/cli-args.d.ts +33 -0
  20. package/dist/cli-args.d.ts.map +1 -0
  21. package/dist/cli-args.js +102 -0
  22. package/dist/cli-args.js.map +1 -0
  23. package/dist/cli-go/auth.go +26 -0
  24. package/dist/cli-go/config.go +192 -0
  25. package/dist/cli-go/errors.go +75 -0
  26. package/dist/cli-go/multipart.go +79 -0
  27. package/dist/cli-go/output.go +163 -0
  28. package/dist/cli-go/root.go +30 -0
  29. package/dist/cli-go/stream.go +88 -0
  30. package/dist/cli-go/version.go +5 -0
  31. package/dist/cli.d.ts +1 -1
  32. package/dist/cli.js +209 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/client/defaults.js +48 -0
  35. package/dist/client/defaults.js.map +1 -0
  36. package/dist/client/error.d.ts +35 -0
  37. package/dist/client/error.d.ts.map +1 -1
  38. package/dist/client/error.js +71 -0
  39. package/dist/client/error.js.map +1 -0
  40. package/dist/client/http.d.ts +67 -8
  41. package/dist/client/http.d.ts.map +1 -1
  42. package/dist/client/http.js +571 -0
  43. package/dist/client/http.js.map +1 -0
  44. package/dist/client/index.d.ts +3 -2
  45. package/dist/client/index.d.ts.map +1 -1
  46. package/dist/client/index.js +95 -0
  47. package/dist/client/index.js.map +1 -0
  48. package/dist/client/path.d.ts +26 -0
  49. package/dist/client/path.d.ts.map +1 -0
  50. package/dist/client/path.js +163 -0
  51. package/dist/client/path.js.map +1 -0
  52. package/dist/client/redirect-policy.d.ts +12 -0
  53. package/dist/client/redirect-policy.d.ts.map +1 -0
  54. package/dist/client/redirect-policy.js +20 -0
  55. package/dist/client/redirect-policy.js.map +1 -0
  56. package/dist/client/sdk.d.ts +36 -0
  57. package/dist/client/sdk.d.ts.map +1 -1
  58. package/dist/client/sdk.js +292 -0
  59. package/dist/client/sdk.js.map +1 -0
  60. package/dist/client/sse.d.ts +13 -0
  61. package/dist/client/sse.d.ts.map +1 -1
  62. package/dist/client/sse.js +129 -0
  63. package/dist/client/sse.js.map +1 -0
  64. package/dist/client/types.js +2 -0
  65. package/dist/client/types.js.map +1 -0
  66. package/dist/client/ws.d.ts +9 -2
  67. package/dist/client/ws.d.ts.map +1 -1
  68. package/dist/client/ws.js +112 -0
  69. package/dist/client/ws.js.map +1 -0
  70. package/dist/client-go/errors.go +236 -0
  71. package/dist/client-go/export.go +44 -0
  72. package/dist/client-go/invalidation.go +371 -0
  73. package/dist/client-go/nullable.go +62 -0
  74. package/dist/client-go/realtime.go +354 -0
  75. package/dist/client-go/result.go +20 -0
  76. package/dist/client-go/runtime.go +975 -0
  77. package/dist/client-go/sse.go +159 -0
  78. package/dist/client-go/transport.go +495 -0
  79. package/dist/client-go/ws.go +128 -0
  80. package/dist/client-info.d.ts +36 -0
  81. package/dist/client-info.d.ts.map +1 -0
  82. package/dist/client-info.js +53 -0
  83. package/dist/client-info.js.map +1 -0
  84. package/dist/client-mcp/README.md +10 -0
  85. package/dist/client-mcp/server.ts +221 -0
  86. package/dist/client-mcp/types.ts +19 -0
  87. package/dist/client-python/_errors.py +115 -0
  88. package/dist/client-python/_invalidation.py +494 -0
  89. package/dist/client-python/_realtime.py +179 -0
  90. package/dist/client-python/_runtime.py +860 -0
  91. package/dist/client-python/_sse.py +155 -0
  92. package/dist/client-python/_transport.py +366 -0
  93. package/dist/client-python/_ws.py +159 -0
  94. package/dist/client-python/py.typed +0 -0
  95. package/dist/client-rust/errors.rs +220 -0
  96. package/dist/client-rust/invalidation.rs +412 -0
  97. package/dist/client-rust/invalidation_sync.rs +93 -0
  98. package/dist/client-rust/nullable.rs +17 -0
  99. package/dist/client-rust/realtime.rs +702 -0
  100. package/dist/client-rust/result.rs +22 -0
  101. package/dist/client-rust/runtime.rs +980 -0
  102. package/dist/client-rust/runtime_sync.rs +484 -0
  103. package/dist/client-rust/sse.rs +188 -0
  104. package/dist/client-rust/ws.rs +167 -0
  105. package/dist/codegen-go-cli.d.ts.map +1 -1
  106. package/dist/codegen-go-cli.js +964 -0
  107. package/dist/codegen-go-cli.js.map +1 -0
  108. package/dist/codegen-go.d.ts +15 -3
  109. package/dist/codegen-go.d.ts.map +1 -1
  110. package/dist/codegen-go.js +872 -0
  111. package/dist/codegen-go.js.map +1 -0
  112. package/dist/codegen-hash.js +9 -0
  113. package/dist/codegen-hash.js.map +1 -0
  114. package/dist/codegen-ir.d.ts +69 -2
  115. package/dist/codegen-ir.d.ts.map +1 -1
  116. package/dist/codegen-ir.js +661 -0
  117. package/dist/codegen-ir.js.map +1 -0
  118. package/dist/codegen-lang.d.ts +65 -0
  119. package/dist/codegen-lang.d.ts.map +1 -0
  120. package/dist/codegen-lang.js +526 -0
  121. package/dist/codegen-lang.js.map +1 -0
  122. package/dist/codegen-load.d.ts +31 -0
  123. package/dist/codegen-load.d.ts.map +1 -0
  124. package/dist/codegen-load.js +138 -0
  125. package/dist/codegen-load.js.map +1 -0
  126. package/dist/codegen-loaders.js +55 -0
  127. package/dist/codegen-loaders.js.map +1 -0
  128. package/dist/codegen-mcp.d.ts.map +1 -1
  129. package/dist/codegen-mcp.js +368 -0
  130. package/dist/codegen-mcp.js.map +1 -0
  131. package/dist/codegen-python.d.ts +13 -1
  132. package/dist/codegen-python.d.ts.map +1 -1
  133. package/dist/codegen-python.js +828 -0
  134. package/dist/codegen-python.js.map +1 -0
  135. package/dist/codegen-route-tree-intern.d.ts +15 -5
  136. package/dist/codegen-route-tree-intern.d.ts.map +1 -1
  137. package/dist/codegen-route-tree-intern.js +221 -0
  138. package/dist/codegen-route-tree-intern.js.map +1 -0
  139. package/dist/codegen-rust.d.ts.map +1 -1
  140. package/dist/codegen-rust.js +1293 -0
  141. package/dist/codegen-rust.js.map +1 -0
  142. package/dist/codegen-sanitize.d.ts.map +1 -1
  143. package/dist/codegen-sanitize.js +56 -0
  144. package/dist/codegen-sanitize.js.map +1 -0
  145. package/dist/codegen-schema-naming.d.ts +5 -0
  146. package/dist/codegen-schema-naming.d.ts.map +1 -1
  147. package/dist/codegen-schema-naming.js +150 -0
  148. package/dist/codegen-schema-naming.js.map +1 -0
  149. package/dist/codegen-sdk-model.d.ts +71 -0
  150. package/dist/codegen-sdk-model.d.ts.map +1 -0
  151. package/dist/codegen-sdk-model.js +179 -0
  152. package/dist/codegen-sdk-model.js.map +1 -0
  153. package/dist/codegen.d.ts +41 -23
  154. package/dist/codegen.d.ts.map +1 -1
  155. package/dist/codegen.js +4610 -0
  156. package/dist/codegen.js.map +1 -0
  157. package/dist/context.d.ts +36 -6
  158. package/dist/context.d.ts.map +1 -1
  159. package/dist/context.js +242 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/cookie-sign.d.ts +16 -2
  162. package/dist/cookie-sign.d.ts.map +1 -1
  163. package/dist/cookie-sign.js +104 -0
  164. package/dist/cookie-sign.js.map +1 -0
  165. package/dist/cookie.d.ts +12 -0
  166. package/dist/cookie.d.ts.map +1 -1
  167. package/dist/cookie.js +138 -0
  168. package/dist/cookie.js.map +1 -0
  169. package/dist/cors.d.ts +1 -0
  170. package/dist/cors.d.ts.map +1 -1
  171. package/dist/cors.js +87 -0
  172. package/dist/cors.js.map +1 -0
  173. package/dist/crypto.d.ts +6 -1
  174. package/dist/crypto.d.ts.map +1 -1
  175. package/dist/crypto.js +38 -0
  176. package/dist/crypto.js.map +1 -0
  177. package/dist/csrf.d.ts +19 -0
  178. package/dist/csrf.d.ts.map +1 -1
  179. package/dist/csrf.js +79 -0
  180. package/dist/csrf.js.map +1 -0
  181. package/dist/curl-logger.d.ts +14 -3
  182. package/dist/curl-logger.d.ts.map +1 -1
  183. package/dist/curl-logger.js +199 -0
  184. package/dist/curl-logger.js.map +1 -0
  185. package/dist/detect-runtime.js +13 -0
  186. package/dist/detect-runtime.js.map +1 -0
  187. package/dist/dict.d.ts +11 -0
  188. package/dist/dict.d.ts.map +1 -0
  189. package/dist/dict.js +13 -0
  190. package/dist/dict.js.map +1 -0
  191. package/dist/error.d.ts.map +1 -1
  192. package/dist/error.js +44 -0
  193. package/dist/error.js.map +1 -0
  194. package/dist/errors.js +39 -0
  195. package/dist/errors.js.map +1 -0
  196. package/dist/etag.d.ts +2 -0
  197. package/dist/etag.d.ts.map +1 -1
  198. package/dist/etag.js +82 -0
  199. package/dist/etag.js.map +1 -0
  200. package/dist/feature-detect.d.ts +25 -0
  201. package/dist/feature-detect.d.ts.map +1 -0
  202. package/dist/feature-detect.js +144 -0
  203. package/dist/feature-detect.js.map +1 -0
  204. package/dist/feature-load.js +36 -0
  205. package/dist/feature-load.js.map +1 -0
  206. package/dist/feature-slots.d.ts +44 -0
  207. package/dist/feature-slots.d.ts.map +1 -0
  208. package/dist/feature-slots.js +48 -0
  209. package/dist/feature-slots.js.map +1 -0
  210. package/dist/fetch-request.d.ts +10 -0
  211. package/dist/fetch-request.d.ts.map +1 -0
  212. package/dist/fetch-request.js +13 -0
  213. package/dist/fetch-request.js.map +1 -0
  214. package/dist/gen-process.d.ts +15 -0
  215. package/dist/gen-process.d.ts.map +1 -0
  216. package/dist/gen-process.js +43 -0
  217. package/dist/gen-process.js.map +1 -0
  218. package/dist/gen-write.d.ts +19 -0
  219. package/dist/gen-write.d.ts.map +1 -0
  220. package/dist/gen-write.js +120 -0
  221. package/dist/gen-write.js.map +1 -0
  222. package/dist/glob.d.ts +21 -0
  223. package/dist/glob.d.ts.map +1 -0
  224. package/dist/glob.js +115 -0
  225. package/dist/glob.js.map +1 -0
  226. package/dist/go-type-emitter.d.ts +18 -4
  227. package/dist/go-type-emitter.d.ts.map +1 -1
  228. package/dist/go-type-emitter.js +594 -0
  229. package/dist/go-type-emitter.js.map +1 -0
  230. package/dist/honey-response.d.ts.map +1 -1
  231. package/dist/honey-response.js +338 -0
  232. package/dist/honey-response.js.map +1 -0
  233. package/dist/i18n-slot.d.ts +8 -0
  234. package/dist/i18n-slot.d.ts.map +1 -1
  235. package/dist/i18n-slot.js +14 -0
  236. package/dist/i18n-slot.js.map +1 -0
  237. package/dist/i18n.d.ts +3 -0
  238. package/dist/i18n.d.ts.map +1 -1
  239. package/dist/i18n.js +250 -0
  240. package/dist/i18n.js.map +1 -0
  241. package/dist/index.d.ts +408 -148
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +2324 -0
  244. package/dist/index.js.map +1 -0
  245. package/dist/init.d.ts +3 -5
  246. package/dist/init.d.ts.map +1 -1
  247. package/dist/init.js +140 -0
  248. package/dist/init.js.map +1 -0
  249. package/dist/input.js +4 -0
  250. package/dist/input.js.map +1 -0
  251. package/dist/invalidate-check.d.ts +11 -0
  252. package/dist/invalidate-check.d.ts.map +1 -1
  253. package/dist/invalidate-check.js +163 -0
  254. package/dist/invalidate-check.js.map +1 -0
  255. package/dist/invoke-user.d.ts +35 -0
  256. package/dist/invoke-user.d.ts.map +1 -0
  257. package/dist/invoke-user.js +73 -0
  258. package/dist/invoke-user.js.map +1 -0
  259. package/dist/ip-restrict.d.ts +13 -1
  260. package/dist/ip-restrict.d.ts.map +1 -1
  261. package/dist/ip-restrict.js +60 -0
  262. package/dist/ip-restrict.js.map +1 -0
  263. package/dist/ip.d.ts +39 -0
  264. package/dist/ip.d.ts.map +1 -0
  265. package/dist/ip.js +209 -0
  266. package/dist/ip.js.map +1 -0
  267. package/dist/logger.d.ts.map +1 -1
  268. package/dist/logger.js +113 -0
  269. package/dist/logger.js.map +1 -0
  270. package/dist/media-type.d.ts +30 -0
  271. package/dist/media-type.d.ts.map +1 -0
  272. package/dist/media-type.js +97 -0
  273. package/dist/media-type.js.map +1 -0
  274. package/dist/meta-spec-merge.d.ts +32 -0
  275. package/dist/meta-spec-merge.d.ts.map +1 -0
  276. package/dist/meta-spec-merge.js +68 -0
  277. package/dist/meta-spec-merge.js.map +1 -0
  278. package/dist/meta-spec.d.ts +16 -3
  279. package/dist/meta-spec.d.ts.map +1 -1
  280. package/dist/meta-spec.js +535 -0
  281. package/dist/meta-spec.js.map +1 -0
  282. package/dist/middleware.d.ts +23 -6
  283. package/dist/middleware.d.ts.map +1 -1
  284. package/dist/middleware.js +253 -0
  285. package/dist/middleware.js.map +1 -0
  286. package/dist/node-request.d.ts +57 -12
  287. package/dist/node-request.d.ts.map +1 -1
  288. package/dist/node-request.js +407 -0
  289. package/dist/node-request.js.map +1 -0
  290. package/dist/node.d.ts +20 -3
  291. package/dist/node.d.ts.map +1 -1
  292. package/dist/node.js +396 -0
  293. package/dist/node.js.map +1 -0
  294. package/dist/openapi/collect.d.ts +6 -3
  295. package/dist/openapi/collect.d.ts.map +1 -1
  296. package/dist/openapi/collect.js +30 -0
  297. package/dist/openapi/collect.js.map +1 -0
  298. package/dist/openapi/docs-page.d.ts +42 -0
  299. package/dist/openapi/docs-page.d.ts.map +1 -0
  300. package/dist/openapi/docs-page.js +80 -0
  301. package/dist/openapi/docs-page.js.map +1 -0
  302. package/dist/openapi/document.d.ts +4 -0
  303. package/dist/openapi/document.d.ts.map +1 -1
  304. package/dist/openapi/document.js +785 -0
  305. package/dist/openapi/document.js.map +1 -0
  306. package/dist/openapi/json-schema-slot.d.ts +7 -0
  307. package/dist/openapi/json-schema-slot.d.ts.map +1 -1
  308. package/dist/openapi/json-schema-slot.js +38 -0
  309. package/dist/openapi/json-schema-slot.js.map +1 -0
  310. package/dist/openapi/register.d.ts.map +1 -1
  311. package/dist/openapi/register.js +20 -0
  312. package/dist/openapi/register.js.map +1 -0
  313. package/dist/openapi/scalar.d.ts +3 -1
  314. package/dist/openapi/scalar.d.ts.map +1 -1
  315. package/dist/openapi/scalar.js +21 -0
  316. package/dist/openapi/scalar.js.map +1 -0
  317. package/dist/openapi/serve.d.ts +9 -0
  318. package/dist/openapi/serve.d.ts.map +1 -0
  319. package/dist/openapi/serve.js +36 -0
  320. package/dist/openapi/serve.js.map +1 -0
  321. package/dist/openapi/spec-factory.d.ts +30 -1
  322. package/dist/openapi/spec-factory.d.ts.map +1 -1
  323. package/dist/openapi/spec-factory.js +52 -0
  324. package/dist/openapi/spec-factory.js.map +1 -0
  325. package/dist/openapi/spec.d.ts +14 -5
  326. package/dist/openapi/spec.d.ts.map +1 -1
  327. package/dist/openapi/spec.js +50 -0
  328. package/dist/openapi/spec.js.map +1 -0
  329. package/dist/openapi/swagger.d.ts +3 -1
  330. package/dist/openapi/swagger.d.ts.map +1 -1
  331. package/dist/openapi/swagger.js +22 -0
  332. package/dist/openapi/swagger.js.map +1 -0
  333. package/dist/pattern.d.ts +71 -0
  334. package/dist/pattern.d.ts.map +1 -0
  335. package/dist/pattern.js +239 -0
  336. package/dist/pattern.js.map +1 -0
  337. package/dist/peer.d.ts +17 -0
  338. package/dist/peer.d.ts.map +1 -0
  339. package/dist/peer.js +50 -0
  340. package/dist/peer.js.map +1 -0
  341. package/dist/plugin.d.ts +67 -16
  342. package/dist/plugin.d.ts.map +1 -1
  343. package/dist/plugin.js +649 -0
  344. package/dist/plugin.js.map +1 -0
  345. package/dist/powered-by.d.ts.map +1 -1
  346. package/dist/powered-by.js +11 -0
  347. package/dist/powered-by.js.map +1 -0
  348. package/dist/pretty-json.d.ts.map +1 -1
  349. package/dist/pretty-json.js +47 -0
  350. package/dist/pretty-json.js.map +1 -0
  351. package/dist/producer-stream.d.ts +47 -0
  352. package/dist/producer-stream.d.ts.map +1 -0
  353. package/dist/producer-stream.js +267 -0
  354. package/dist/producer-stream.js.map +1 -0
  355. package/dist/proxy.d.ts +47 -8
  356. package/dist/proxy.d.ts.map +1 -1
  357. package/dist/proxy.js +274 -0
  358. package/dist/proxy.js.map +1 -0
  359. package/dist/python-type-emitter.d.ts +14 -1
  360. package/dist/python-type-emitter.d.ts.map +1 -1
  361. package/dist/python-type-emitter.js +157 -0
  362. package/dist/python-type-emitter.js.map +1 -0
  363. package/dist/realtime/bus.d.ts +17 -1
  364. package/dist/realtime/bus.d.ts.map +1 -1
  365. package/dist/realtime/bus.js +112 -0
  366. package/dist/realtime/bus.js.map +1 -0
  367. package/dist/realtime/register.d.ts +3 -0
  368. package/dist/realtime/register.d.ts.map +1 -0
  369. package/dist/realtime/register.js +10 -0
  370. package/dist/realtime/register.js.map +1 -0
  371. package/dist/realtime/route.d.ts +65 -26
  372. package/dist/realtime/route.d.ts.map +1 -1
  373. package/dist/realtime/route.js +72 -0
  374. package/dist/realtime/route.js.map +1 -0
  375. package/dist/realtime/server.d.ts +43 -0
  376. package/dist/realtime/server.d.ts.map +1 -0
  377. package/dist/realtime/server.js +255 -0
  378. package/dist/realtime/server.js.map +1 -0
  379. package/dist/request-id.d.ts +7 -0
  380. package/dist/request-id.d.ts.map +1 -1
  381. package/dist/request-id.js +16 -0
  382. package/dist/request-id.js.map +1 -0
  383. package/dist/request-limits.d.ts +3 -0
  384. package/dist/request-limits.d.ts.map +1 -0
  385. package/dist/request-limits.js +3 -0
  386. package/dist/request-limits.js.map +1 -0
  387. package/dist/request-path.d.ts +33 -0
  388. package/dist/request-path.d.ts.map +1 -0
  389. package/dist/request-path.js +178 -0
  390. package/dist/request-path.js.map +1 -0
  391. package/dist/request-to-curl.d.ts +7 -1
  392. package/dist/request-to-curl.d.ts.map +1 -1
  393. package/dist/request-to-curl.js +48 -0
  394. package/dist/request-to-curl.js.map +1 -0
  395. package/dist/response.d.ts +25 -2
  396. package/dist/response.d.ts.map +1 -1
  397. package/dist/response.js +313 -0
  398. package/dist/response.js.map +1 -0
  399. package/dist/rust-type-emitter.d.ts +14 -2
  400. package/dist/rust-type-emitter.d.ts.map +1 -1
  401. package/dist/rust-type-emitter.js +463 -0
  402. package/dist/rust-type-emitter.js.map +1 -0
  403. package/dist/secure-headers.d.ts.map +1 -1
  404. package/dist/secure-headers.js +53 -0
  405. package/dist/secure-headers.js.map +1 -0
  406. package/dist/serve-register.d.ts +4 -0
  407. package/dist/serve-register.d.ts.map +1 -1
  408. package/dist/serve-register.js +9 -0
  409. package/dist/serve-register.js.map +1 -0
  410. package/dist/serve-slot.d.ts +3 -0
  411. package/dist/serve-slot.d.ts.map +1 -1
  412. package/dist/serve-slot.js +52 -0
  413. package/dist/serve-slot.js.map +1 -0
  414. package/dist/serve.d.ts +18 -1
  415. package/dist/serve.d.ts.map +1 -1
  416. package/dist/serve.js +157 -0
  417. package/dist/serve.js.map +1 -0
  418. package/dist/server-timing.d.ts.map +1 -1
  419. package/dist/server-timing.js +51 -0
  420. package/dist/server-timing.js.map +1 -0
  421. package/dist/static.d.ts +9 -0
  422. package/dist/static.d.ts.map +1 -1
  423. package/dist/static.js +102 -0
  424. package/dist/static.js.map +1 -0
  425. package/dist/telemetry/otel.d.ts +2 -0
  426. package/dist/telemetry/otel.d.ts.map +1 -1
  427. package/dist/telemetry/otel.js +135 -0
  428. package/dist/telemetry/otel.js.map +1 -0
  429. package/dist/testing.d.ts +12 -0
  430. package/dist/testing.d.ts.map +1 -1
  431. package/dist/testing.js +124 -0
  432. package/dist/testing.js.map +1 -0
  433. package/dist/timeout.d.ts +6 -0
  434. package/dist/timeout.d.ts.map +1 -1
  435. package/dist/timeout.js +36 -0
  436. package/dist/timeout.js.map +1 -0
  437. package/dist/tree.d.ts +133 -36
  438. package/dist/tree.d.ts.map +1 -1
  439. package/dist/tree.js +437 -0
  440. package/dist/tree.js.map +1 -0
  441. package/dist/trust.d.ts +21 -0
  442. package/dist/trust.d.ts.map +1 -0
  443. package/dist/trust.js +100 -0
  444. package/dist/trust.js.map +1 -0
  445. package/dist/ts-type-emitter.d.ts.map +1 -1
  446. package/dist/ts-type-emitter.js +150 -0
  447. package/dist/ts-type-emitter.js.map +1 -0
  448. package/dist/type-emitter.d.ts +16 -2
  449. package/dist/type-emitter.d.ts.map +1 -1
  450. package/dist/type-emitter.js +729 -0
  451. package/dist/type-emitter.js.map +1 -0
  452. package/dist/type-extractor.d.ts +8 -4
  453. package/dist/type-extractor.d.ts.map +1 -1
  454. package/dist/type-extractor.js +819 -0
  455. package/dist/type-extractor.js.map +1 -0
  456. package/dist/types.d.ts +7 -0
  457. package/dist/types.d.ts.map +1 -1
  458. package/dist/types.js +96 -0
  459. package/dist/types.js.map +1 -0
  460. package/dist/validation.d.ts +14 -2
  461. package/dist/validation.d.ts.map +1 -1
  462. package/dist/validation.js +335 -0
  463. package/dist/validation.js.map +1 -0
  464. package/dist/with-headers.d.ts +15 -0
  465. package/dist/with-headers.d.ts.map +1 -0
  466. package/dist/with-headers.js +45 -0
  467. package/dist/with-headers.js.map +1 -0
  468. package/dist/ws/bun.d.ts +11 -5
  469. package/dist/ws/bun.d.ts.map +1 -1
  470. package/dist/ws/bun.js +82 -0
  471. package/dist/ws/bun.js.map +1 -0
  472. package/dist/ws/cloudflare.d.ts +25 -3
  473. package/dist/ws/cloudflare.d.ts.map +1 -1
  474. package/dist/ws/cloudflare.js +117 -0
  475. package/dist/ws/cloudflare.js.map +1 -0
  476. package/dist/ws/deno.d.ts +4 -4
  477. package/dist/ws/deno.d.ts.map +1 -1
  478. package/dist/ws/deno.js +133 -0
  479. package/dist/ws/deno.js.map +1 -0
  480. package/dist/ws/node.d.ts +20 -3
  481. package/dist/ws/node.d.ts.map +1 -1
  482. package/dist/ws/node.js +173 -0
  483. package/dist/ws/node.js.map +1 -0
  484. package/dist/ws/session.d.ts +11 -0
  485. package/dist/ws/session.d.ts.map +1 -0
  486. package/dist/ws/session.js +60 -0
  487. package/dist/ws/session.js.map +1 -0
  488. package/dist/ws/shared.d.ts +65 -0
  489. package/dist/ws/shared.d.ts.map +1 -0
  490. package/dist/ws/shared.js +103 -0
  491. package/dist/ws/shared.js.map +1 -0
  492. package/dist/ws-origin.d.ts +20 -0
  493. package/dist/ws-origin.d.ts.map +1 -0
  494. package/dist/ws-origin.js +41 -0
  495. package/dist/ws-origin.js.map +1 -0
  496. package/dist/yaml.d.ts +15 -1
  497. package/dist/yaml.d.ts.map +1 -1
  498. package/dist/yaml.js +101 -0
  499. package/dist/yaml.js.map +1 -0
  500. package/docs/invalidate-spec.md +13 -1
  501. package/docs/meta-spec.md +36 -12
  502. package/docs/packaging.md +43 -24
  503. package/docs/regression-matrix/README.md +32 -0
  504. package/docs/regression-matrix/review.md +44 -0
  505. package/docs/regression-matrix/ws1-3.md +97 -0
  506. package/docs/regression-matrix/ws4-8.md +107 -0
  507. package/docs/regression-matrix/ws9-12.md +266 -0
  508. package/docs/sdk.md +102 -52
  509. package/package.json +183 -52
  510. package/src/accepts.ts +91 -33
  511. package/src/body-kind.ts +67 -0
  512. package/src/body-limit.ts +102 -87
  513. package/src/build/index.ts +104 -54
  514. package/src/cli-args.ts +123 -0
  515. package/src/cli-go/auth.go +12 -1
  516. package/src/cli-go/config.go +29 -2
  517. package/src/cli-go/errors.go +28 -10
  518. package/src/cli-go/multipart.go +51 -27
  519. package/src/cli-go/output.go +58 -4
  520. package/src/cli-go/root.go +1 -1
  521. package/src/cli-go/version.go +2 -2
  522. package/src/cli.ts +154 -148
  523. package/src/client/error.ts +56 -1
  524. package/src/client/http.ts +479 -256
  525. package/src/client/index.ts +55 -17
  526. package/src/client/path.ts +169 -0
  527. package/src/client/redirect-policy.ts +19 -0
  528. package/src/client/sdk.ts +180 -101
  529. package/src/client/sse.ts +92 -66
  530. package/src/client/ws.ts +67 -31
  531. package/src/client-go/errors.go +41 -12
  532. package/src/client-go/export.go +44 -0
  533. package/src/client-go/invalidation.go +52 -54
  534. package/src/client-go/nullable.go +62 -0
  535. package/src/client-go/realtime.go +147 -110
  536. package/src/client-go/runtime.go +646 -88
  537. package/src/client-go/sse.go +104 -94
  538. package/src/client-go/transport.go +67 -27
  539. package/src/client-go/ws.go +49 -25
  540. package/src/client-info.ts +79 -0
  541. package/src/client-mcp/server.ts +133 -3
  542. package/src/client-python/_invalidation.py +207 -291
  543. package/src/client-python/_realtime.py +63 -40
  544. package/src/client-python/_runtime.py +501 -119
  545. package/src/client-python/_sse.py +130 -74
  546. package/src/client-python/_transport.py +37 -9
  547. package/src/client-python/_ws.py +50 -22
  548. package/src/client-rust/errors.rs +21 -1
  549. package/src/client-rust/invalidation.rs +202 -231
  550. package/src/client-rust/invalidation_sync.rs +16 -229
  551. package/src/client-rust/nullable.rs +17 -0
  552. package/src/client-rust/realtime.rs +217 -217
  553. package/src/client-rust/runtime.rs +602 -177
  554. package/src/client-rust/runtime_sync.rs +169 -145
  555. package/src/client-rust/sse.rs +142 -121
  556. package/src/client-rust/ws.rs +61 -37
  557. package/src/codegen-go-cli.ts +607 -728
  558. package/src/codegen-go.ts +710 -770
  559. package/src/codegen-ir.ts +381 -75
  560. package/src/codegen-lang.ts +517 -0
  561. package/src/codegen-load.ts +150 -0
  562. package/src/codegen-mcp.ts +207 -108
  563. package/src/codegen-python.ts +684 -816
  564. package/src/codegen-route-tree-intern.ts +51 -25
  565. package/src/codegen-rust.ts +946 -1240
  566. package/src/codegen-sanitize.ts +0 -4
  567. package/src/codegen-schema-naming.ts +19 -6
  568. package/src/codegen-sdk-model.ts +228 -0
  569. package/src/codegen.ts +1488 -1140
  570. package/src/context.ts +130 -11
  571. package/src/cookie-sign.ts +85 -16
  572. package/src/cookie.ts +66 -11
  573. package/src/cors.ts +55 -54
  574. package/src/crypto.ts +27 -5
  575. package/src/csrf.ts +57 -25
  576. package/src/curl-logger.ts +155 -114
  577. package/src/dict.ts +12 -0
  578. package/src/error.ts +4 -2
  579. package/src/etag.ts +58 -34
  580. package/src/feature-detect.ts +147 -0
  581. package/src/feature-slots.ts +70 -0
  582. package/src/fetch-request.ts +13 -0
  583. package/src/gen-process.ts +42 -0
  584. package/src/gen-write.ts +127 -0
  585. package/src/glob.ts +109 -0
  586. package/src/go-type-emitter.ts +406 -155
  587. package/src/honey-response.ts +36 -9
  588. package/src/i18n-slot.ts +10 -0
  589. package/src/i18n.ts +98 -23
  590. package/src/index.ts +1887 -1756
  591. package/src/init.ts +40 -28
  592. package/src/invalidate-check.ts +42 -4
  593. package/src/invoke-user.ts +95 -0
  594. package/src/ip-restrict.ts +47 -161
  595. package/src/ip.ts +194 -0
  596. package/src/logger.ts +65 -36
  597. package/src/media-type.ts +104 -0
  598. package/src/meta-spec-merge.ts +80 -0
  599. package/src/meta-spec.ts +0 -0
  600. package/src/middleware.ts +112 -12
  601. package/src/node-request.ts +242 -52
  602. package/src/node.ts +318 -75
  603. package/src/openapi/collect.ts +19 -44
  604. package/src/openapi/docs-page.ts +89 -0
  605. package/src/openapi/document.ts +503 -224
  606. package/src/openapi/json-schema-slot.ts +40 -0
  607. package/src/openapi/register.ts +7 -2
  608. package/src/openapi/scalar.ts +11 -10
  609. package/src/openapi/serve.ts +39 -0
  610. package/src/openapi/spec-factory.ts +50 -1
  611. package/src/openapi/spec.ts +53 -30
  612. package/src/openapi/swagger.ts +12 -11
  613. package/src/pattern.ts +245 -0
  614. package/src/peer.ts +53 -0
  615. package/src/plugin.ts +270 -185
  616. package/src/powered-by.ts +2 -2
  617. package/src/pretty-json.ts +25 -9
  618. package/src/producer-stream.ts +296 -0
  619. package/src/proxy.ts +253 -55
  620. package/src/python-type-emitter.ts +68 -56
  621. package/src/realtime/bus.ts +56 -9
  622. package/src/realtime/register.ts +13 -0
  623. package/src/realtime/route.ts +129 -80
  624. package/src/realtime/server.ts +298 -0
  625. package/src/request-id.ts +13 -3
  626. package/src/request-limits.ts +2 -0
  627. package/src/request-path.ts +165 -0
  628. package/src/request-to-curl.ts +28 -7
  629. package/src/response.ts +143 -103
  630. package/src/rust-type-emitter.ts +265 -170
  631. package/src/secure-headers.ts +8 -4
  632. package/src/serve-register.ts +4 -0
  633. package/src/serve-slot.ts +38 -0
  634. package/src/serve.ts +113 -25
  635. package/src/server-timing.ts +11 -7
  636. package/src/static.ts +85 -32
  637. package/src/telemetry/otel.ts +29 -7
  638. package/src/testing.ts +76 -14
  639. package/src/timeout.ts +15 -7
  640. package/src/tree.ts +405 -333
  641. package/src/trust.ts +117 -0
  642. package/src/ts-type-emitter.ts +18 -12
  643. package/src/type-emitter.ts +227 -89
  644. package/src/type-extractor.ts +603 -423
  645. package/src/types.ts +8 -0
  646. package/src/validation.ts +221 -96
  647. package/src/with-headers.ts +45 -0
  648. package/src/ws/bun.ts +53 -15
  649. package/src/ws/cloudflare.ts +81 -19
  650. package/src/ws/deno.ts +124 -36
  651. package/src/ws/node.ts +173 -79
  652. package/src/ws/session.ts +73 -0
  653. package/src/ws/shared.ts +140 -0
  654. package/src/ws-origin.ts +53 -0
  655. package/src/yaml.ts +45 -22
  656. package/dist/client-mcp/server.d.ts +0 -10
  657. package/dist/client-mcp/server.d.ts.map +0 -1
  658. package/dist/client-mcp/types.d.ts +0 -16
  659. package/dist/client-mcp/types.d.ts.map +0 -1
  660. package/dist/cloudflare/realtime.d.ts +0 -30
  661. package/dist/cloudflare/realtime.d.ts.map +0 -1
  662. package/dist/realtime/buffer.d.ts +0 -18
  663. package/dist/realtime/buffer.d.ts.map +0 -1
  664. package/dist/realtime/longpoll.d.ts +0 -23
  665. package/dist/realtime/longpoll.d.ts.map +0 -1
  666. package/dist/realtime/protocol.d.ts +0 -50
  667. package/dist/realtime/protocol.d.ts.map +0 -1
  668. package/dist/realtime/runtime.d.ts +0 -74
  669. package/dist/realtime/runtime.d.ts.map +0 -1
  670. package/src/cloudflare/realtime.ts +0 -234
  671. package/src/realtime/buffer.ts +0 -101
  672. package/src/realtime/longpoll.ts +0 -148
  673. package/src/realtime/protocol.ts +0 -128
  674. package/src/realtime/runtime.ts +0 -427
@@ -0,0 +1,135 @@
1
+ /**
2
+ * The request URL without its query string or fragment: queries carry tokens and session ids,
3
+ * and attribute values are exported to whatever backend the tracer feeds.
4
+ */
5
+ function urlWithoutQuery(url) {
6
+ const q = url.indexOf("?");
7
+ const h = url.indexOf("#");
8
+ const end = q === -1 ? h : h === -1 ? q : Math.min(q, h);
9
+ return end === -1 ? url : url.slice(0, end);
10
+ }
11
+ /** Path part of an absolute URL, without the query. */
12
+ function pathOf(url) {
13
+ const bare = urlWithoutQuery(url);
14
+ const scheme = bare.indexOf("//");
15
+ const start = scheme === -1 ? 0 : bare.indexOf("/", scheme + 2);
16
+ return start === -1 ? "/" : bare.slice(start);
17
+ }
18
+ export function otelAdapter(options) {
19
+ const spans = new WeakMap();
20
+ return {
21
+ onError(ctx) {
22
+ try {
23
+ /*
24
+ * onError doesn't receive req — error details are best captured
25
+ * via a standalone span. Per-request root span is in onResponse.
26
+ */
27
+ const span = options.tracer.startSpan("http.error");
28
+ span.setAttribute("error.key", ctx.error.errorKey);
29
+ span.setAttribute("error.status", ctx.error.status);
30
+ span.setAttribute("http.duration_ms", ctx.duration);
31
+ span.end();
32
+ }
33
+ catch {
34
+ /* swallow */
35
+ }
36
+ },
37
+ onHandler(ctx) {
38
+ try {
39
+ const span = options.tracer.startSpan("http.handler");
40
+ span.setAttribute("http.method", ctx.method);
41
+ /* the pattern, never the request path: one series per route, not per id */
42
+ if (ctx.route !== undefined && ctx.route !== "")
43
+ span.setAttribute("http.route", ctx.route);
44
+ span.setAttribute("http.status_code", ctx.status);
45
+ span.setAttribute("http.duration_ms", ctx.duration);
46
+ span.end();
47
+ }
48
+ catch {
49
+ /* swallow */
50
+ }
51
+ },
52
+ onMethodNotAllowed(ctx) {
53
+ try {
54
+ const span = spans.get(ctx.req);
55
+ if (span) {
56
+ span.addEvent("method_not_allowed", {
57
+ "http.allowed_methods": ctx.allowed.join(", "),
58
+ "http.method": ctx.method,
59
+ "url.path": ctx.path,
60
+ });
61
+ }
62
+ }
63
+ catch {
64
+ /* swallow */
65
+ }
66
+ },
67
+ onMiddleware(ctx) {
68
+ try {
69
+ const span = options.tracer.startSpan(`middleware.${ctx.name}`);
70
+ span.setAttribute("middleware.name", ctx.name);
71
+ span.setAttribute("middleware.duration_ms", ctx.duration);
72
+ if (ctx.error)
73
+ span.addEvent("error");
74
+ span.end();
75
+ }
76
+ catch {
77
+ /* swallow */
78
+ }
79
+ },
80
+ onNotFound(ctx) {
81
+ try {
82
+ const span = spans.get(ctx.req);
83
+ if (span) {
84
+ span.addEvent("not_found", {
85
+ "http.method": ctx.method,
86
+ "url.path": ctx.path,
87
+ });
88
+ }
89
+ }
90
+ catch {
91
+ /* swallow */
92
+ }
93
+ },
94
+ onRequest(ctx) {
95
+ try {
96
+ const span = options.tracer.startSpan("http.request");
97
+ span.setAttribute("http.method", ctx.req.method);
98
+ span.setAttribute("http.url", urlWithoutQuery(ctx.req.url));
99
+ span.setAttribute("url.path", pathOf(ctx.req.url));
100
+ spans.set(ctx.req, span);
101
+ }
102
+ catch {
103
+ /* swallow */
104
+ }
105
+ },
106
+ onResponse(ctx) {
107
+ try {
108
+ const span = spans.get(ctx.req);
109
+ if (span) {
110
+ span.setAttribute("http.status_code", ctx.status);
111
+ span.setAttribute("http.duration_ms", ctx.duration);
112
+ span.end();
113
+ spans.delete(ctx.req);
114
+ }
115
+ }
116
+ catch {
117
+ /* swallow */
118
+ }
119
+ },
120
+ onRoute(ctx) {
121
+ try {
122
+ const span = spans.get(ctx.req);
123
+ if (span) {
124
+ span.setAttribute("http.method", ctx.method);
125
+ if (ctx.route !== undefined && ctx.route !== "")
126
+ span.setAttribute("http.route", ctx.route);
127
+ }
128
+ }
129
+ catch {
130
+ /* swallow */
131
+ }
132
+ },
133
+ };
134
+ }
135
+ //# sourceMappingURL=otel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/telemetry/otel.ts"],"names":[],"mappings":"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"}
package/dist/testing.d.ts CHANGED
@@ -2,6 +2,8 @@ import type { Honey } from "./index.ts";
2
2
  type TestRequestOptions = {
3
3
  form?: Record<string, string>;
4
4
  headers?: Record<string, string>;
5
+ /** Peer address the request comes from, as a server adapter would report it (`ctx.ip`). */
6
+ ip?: string;
5
7
  json?: unknown;
6
8
  search?: Record<string, string>;
7
9
  };
@@ -14,10 +16,20 @@ type TestClient = {
14
16
  post(path: string, opts?: TestRequestOptions): Promise<Response>;
15
17
  put(path: string, opts?: TestRequestOptions): Promise<Response>;
16
18
  request(method: string, path: string, opts?: TestRequestOptions): Promise<Response>;
19
+ /** Stop the server a `transport: "node"` client started (a no-op otherwise). */
20
+ close(): Promise<void>;
17
21
  };
18
22
  type TestClientOptions<TEnv> = {
19
23
  cookies?: boolean;
20
24
  env: TEnv;
25
+ /** Default peer address for every request; a per-request `ip` wins. Ignored by `transport: "node"`. */
26
+ ip?: string;
27
+ /**
28
+ * `"fetch"` (default) calls `app.fetch()` directly. `"node"` serves the app with honey's Node
29
+ * adapter on a random local port and sends real HTTP, so requests go through the Node
30
+ * `Request` view and response writer. Call `close()` when done.
31
+ */
32
+ transport?: "fetch" | "node";
21
33
  };
22
34
  export declare function testClient<TEnv>(app: Honey<TEnv, unknown, unknown, unknown, unknown, string, string>, options: TestClientOptions<TEnv>): TestClient;
23
35
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,KAAK,kBAAkB,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B,CAAA;AAED,KAAK,UAAU,GAAG;IACjB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAClE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACnF,CAAA;AA4BD,KAAK,iBAAiB,CAAC,IAAI,IAAI;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,IAAI,CAAA;CACT,CAAA;AAWD,wBAAgB,UAAU,CAAC,IAAI,EAC9B,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EACpE,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAC9B,UAAU,CAyCZ"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGvC,KAAK,kBAAkB,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,2FAA2F;IAC3F,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B,CAAA;AAED,KAAK,UAAU,GAAG;IACjB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAClE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnF,gFAAgF;IAChF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB,CAAA;AA4BD,KAAK,iBAAiB,CAAC,IAAI,IAAI;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,IAAI,CAAA;IACT,uGAAuG;IACvG,EAAE,CAAC,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAC5B,CAAA;AA8BD,wBAAgB,UAAU,CAAC,IAAI,EAC9B,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EACpE,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAC9B,UAAU,CAuEZ"}
@@ -0,0 +1,124 @@
1
+ import { setPeerAddress } from "./peer.js";
2
+ function buildRequest(method, path, baseUrl, opts) {
3
+ const url = new URL(path, baseUrl);
4
+ if (opts?.search) {
5
+ for (const [k, v] of Object.entries(opts.search)) {
6
+ url.searchParams.set(k, v);
7
+ }
8
+ }
9
+ const headers = new Headers(opts?.headers);
10
+ let body = null;
11
+ if (opts?.json !== undefined) {
12
+ headers.set("content-type", "application/json");
13
+ body = JSON.stringify(opts.json);
14
+ }
15
+ else if (opts?.form) {
16
+ const formData = new FormData();
17
+ for (const [k, v] of Object.entries(opts.form)) {
18
+ formData.append(k, v);
19
+ }
20
+ body = formData;
21
+ }
22
+ return new Request(url.toString(), { body, headers, method });
23
+ }
24
+ /** Name, value, and whether the cookie is already expired (`Max-Age<=0`, or `Expires` in the past). */
25
+ function parseSetCookie(setCookie, now) {
26
+ const parts = setCookie.split(";");
27
+ const pair = parts[0] ?? "";
28
+ const eq = pair.indexOf("=");
29
+ if (eq === -1)
30
+ return null;
31
+ const name = pair.slice(0, eq).trim();
32
+ if (name === "")
33
+ return null;
34
+ const value = pair.slice(eq + 1).trim();
35
+ let maxAge = null;
36
+ let expires = null;
37
+ for (const attr of parts.slice(1)) {
38
+ const i = attr.indexOf("=");
39
+ const key = (i === -1 ? attr : attr.slice(0, i)).trim().toLowerCase();
40
+ const v = i === -1 ? "" : attr.slice(i + 1).trim();
41
+ if (key === "max-age" && /^-?\d+$/.test(v))
42
+ maxAge = Number(v);
43
+ else if (key === "expires") {
44
+ const t = Date.parse(v);
45
+ if (!Number.isNaN(t))
46
+ expires = t;
47
+ }
48
+ }
49
+ /* Max-Age wins over Expires (RFC 6265 §5.3) */
50
+ const expired = maxAge !== null ? maxAge <= 0 : expires !== null && expires <= now;
51
+ return { expired, name, value };
52
+ }
53
+ export function testClient(app, options) {
54
+ const baseUrl = "http://localhost";
55
+ const jar = new Map();
56
+ let node = null;
57
+ /* a real Node server for `transport: "node"`, started on first use */
58
+ const nodeServer = () => {
59
+ if (node === null) {
60
+ node = (async () => {
61
+ const { serve } = await import("./node.js");
62
+ const server = serve(app, { env: options.env, hostname: "127.0.0.1", port: 0 });
63
+ await new Promise((resolve, reject) => {
64
+ server.once("listening", () => resolve());
65
+ server.once("error", reject);
66
+ });
67
+ const addr = server.address();
68
+ return { close: () => server.shutdown(1_000), url: `http://127.0.0.1:${addr.port}` };
69
+ })();
70
+ }
71
+ return node;
72
+ };
73
+ async function doRequest(method, path, opts) {
74
+ const mergedHeaders = { ...opts?.headers };
75
+ if (options.cookies && jar.size > 0) {
76
+ const existing = mergedHeaders.cookie ?? "";
77
+ const jarStr = Array.from(jar.entries())
78
+ .map(([k, v]) => `${k}=${v}`)
79
+ .join("; ");
80
+ mergedHeaders.cookie = existing ? `${existing}; ${jarStr}` : jarStr;
81
+ }
82
+ let res;
83
+ if (options.transport === "node") {
84
+ const { url } = await nodeServer();
85
+ res = await fetch(buildRequest(method, path, url, { ...opts, headers: mergedHeaders }), { redirect: "manual" });
86
+ }
87
+ else {
88
+ const req = buildRequest(method, path, baseUrl, { ...opts, headers: mergedHeaders });
89
+ const ip = opts?.ip ?? options.ip;
90
+ if (ip !== undefined)
91
+ setPeerAddress(req, ip);
92
+ res = await app.fetch(req, options.env);
93
+ }
94
+ if (options.cookies) {
95
+ const now = Date.now();
96
+ for (const sc of res.headers.getSetCookie()) {
97
+ const parsed = parseSetCookie(sc, now);
98
+ if (parsed === null)
99
+ continue;
100
+ if (parsed.expired)
101
+ jar.delete(parsed.name);
102
+ else
103
+ jar.set(parsed.name, parsed.value);
104
+ }
105
+ }
106
+ return res;
107
+ }
108
+ return {
109
+ async close() {
110
+ if (node !== null)
111
+ await (await node).close();
112
+ node = null;
113
+ },
114
+ delete: (path, opts) => doRequest("DELETE", path, opts),
115
+ get: (path, opts) => doRequest("GET", path, opts),
116
+ head: (path, opts) => doRequest("HEAD", path, opts),
117
+ options: (path, opts) => doRequest("OPTIONS", path, opts),
118
+ patch: (path, opts) => doRequest("PATCH", path, opts),
119
+ post: (path, opts) => doRequest("POST", path, opts),
120
+ put: (path, opts) => doRequest("PUT", path, opts),
121
+ request: (method, path, opts) => doRequest(method, path, opts),
122
+ };
123
+ }
124
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
package/dist/timeout.d.ts CHANGED
@@ -2,6 +2,12 @@ import type { MiddlewareFn } from "./middleware.ts";
2
2
  type TimeoutOptions = {
3
3
  duration: number;
4
4
  };
5
+ /**
6
+ * Answer 504 when the rest of the chain has not produced a response within `duration` ms, and
7
+ * abort `ctx.signal` so the handler's work stops: a `fetch()`, query or stream that takes the
8
+ * signal ends instead of running on after the 504. Work that ignores the signal still runs to
9
+ * completion; its response is discarded.
10
+ */
5
11
  export declare function timeout(opts: TimeoutOptions): MiddlewareFn<{}, {}>;
6
12
  export {};
7
13
  //# sourceMappingURL=timeout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,KAAK,cAAc,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CA2BlE"}
1
+ {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,KAAK,cAAc,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CA2BlE"}
@@ -0,0 +1,36 @@
1
+ import { abortRequest } from "./context.js";
2
+ import { namedMiddleware } from "./middleware.js";
3
+ import { HoneyError } from "./error.js";
4
+ import { EK, SK } from "./types.js";
5
+ /**
6
+ * Answer 504 when the rest of the chain has not produced a response within `duration` ms, and
7
+ * abort `ctx.signal` so the handler's work stops: a `fetch()`, query or stream that takes the
8
+ * signal ends instead of running on after the 504. Work that ignores the signal still runs to
9
+ * completion; its response is discarded.
10
+ */
11
+ export function timeout(opts) {
12
+ const { duration } = opts;
13
+ const mw = (ctx, next) => {
14
+ return new Promise((resolve, reject) => {
15
+ const timer = setTimeout(() => {
16
+ const error = new HoneyError({
17
+ errorKey: EK.request_timeout,
18
+ status: SK.gateway_timeout,
19
+ });
20
+ reject(error);
21
+ abortRequest(ctx, new DOMException("request timed out", "TimeoutError"));
22
+ }, duration);
23
+ Promise.resolve(next())
24
+ .then((res) => {
25
+ clearTimeout(timer);
26
+ resolve(res);
27
+ })
28
+ .catch((err) => {
29
+ clearTimeout(timer);
30
+ reject(err);
31
+ });
32
+ });
33
+ };
34
+ return namedMiddleware("timeout", mw);
35
+ }
36
+ //# sourceMappingURL=timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAMnC;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAoB;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAEzB,MAAM,EAAE,GAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9C,OAAO,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC;oBAC5B,QAAQ,EAAE,EAAE,CAAC,eAAe;oBAC5B,MAAM,EAAE,EAAE,CAAC,eAAe;iBAC1B,CAAC,CAAA;gBACF,MAAM,CAAC,KAAK,CAAC,CAAA;gBACb,YAAY,CAAC,GAA8B,EAAE,IAAI,YAAY,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC,CAAA;YACpG,CAAC,EAAE,QAAQ,CAAC,CAAA;YAEZ,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;iBACrB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,YAAY,CAAC,KAAK,CAAC,CAAA;gBACnB,OAAO,CAAC,GAAG,CAAC,CAAA;YACb,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACd,YAAY,CAAC,KAAK,CAAC,CAAA;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAA;YACZ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACH,CAAC,CAAA;IAED,OAAO,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;AACtC,CAAC"}
package/dist/tree.d.ts CHANGED
@@ -1,96 +1,193 @@
1
+ import type { RouteId, Segment } from "./pattern.ts";
1
2
  import type { HttpMethod, InputSchemasDef, OutputSchemaDef } from "./types.ts";
2
3
  import type { WSHandler } from "./ws/cloudflare.ts";
3
- export type { HttpMethod };
4
+ import type { WSOriginPolicy } from "./ws-origin.ts";
5
+ export type { HttpMethod, RouteId };
4
6
  export type OutputValidator = (statusKey: string, data: unknown) => Promise<void>;
5
- export type RouteHandler = {
6
- /** cached compiled middleware chain (set lazily at first request) */
7
- _compiled?: (ctx: object) => Response | Promise<Response>;
8
- /** internal route — excluded from codegen output */
7
+ type ChainMiddleware = (ctx: Record<string, unknown>, next: (additions?: Record<string, unknown>) => Promise<Response>) => Promise<Response>;
8
+ /**
9
+ * What a route was registered with, before the app resolves it. Finalize derives the
10
+ * resolved fields (`ek`, `mt`, `mw`, `bek`, `ef`) from these, so they never depend on the
11
+ * order of registration and are recomputed whenever the route graph changes.
12
+ */
13
+ type RecordSource = {
14
+ /** chain middleware captured at registration (plus any mounting chain) */
15
+ cm?: ChainMiddleware[];
16
+ /** `.context()` values of the registering handle (merged with the mounting handle's) */
17
+ cv?: Record<string, unknown> | null;
18
+ /** error keys the route declared itself (`.errors()`, `.boundary()`) */
19
+ dk?: Set<string>;
20
+ /** the settings of the app the route was registered on — opaque here */
21
+ own?: unknown;
22
+ /** route-level boundary key (`.boundary()`) */
23
+ rb?: string | null;
24
+ /** route-level middleware (`.get(...).use(mw)`) */
25
+ rm?: ChainMiddleware[];
26
+ /** explicit meta: chain `.meta()` overlaid by route `.meta()` */
27
+ xm?: Record<string, unknown> | null;
28
+ };
29
+ /**
30
+ * A route record — everything one registered route runs. Records live in a per-app table
31
+ * keyed by `RouteId`; the tree only holds ids, so two apps that load the same tree never
32
+ * share a record.
33
+ */
34
+ export type RouteHandler = RecordSource & {
35
+ /** internal route (spec, docs, manifest) — excluded from codegen output, never mounted into a parent */
9
36
  _skip?: boolean;
10
37
  /** boundary error key — wraps undeclared/unexpected errors (null = use default or internal_server_error) */
11
38
  bek: string | null;
12
- /** pre-computed error factory subset (omit/`null` = use global factory) */
39
+ /** gateway catch-all: dispatches delegated routes, never matched for a path of its own */
40
+ ca?: boolean;
41
+ /** delegated route: a tree leaf with no local handler, served by the gateway catch-all */
42
+ dl?: boolean;
43
+ /** resolved error factory subset exposed as `ctx.errors` (omit/`null` = none) */
13
44
  ef?: Record<string, (...args: never[]) => unknown> | null;
14
- /** declared error keys for this route — used for runtime enforcement */
45
+ /** declared error keys — resolved at finalize from the route, its middleware and the app defaults */
15
46
  ek: Set<string>;
47
+ /** resolved error factory — the route's own app's, or the serving app's */
48
+ fac?: Record<string, (...args: never[]) => unknown> | null;
16
49
  /** handler function */
17
50
  fn: (ctx: unknown) => Response | Promise<Response>;
18
- /** input validation schemas — intern trees omit; missing/`null` = no validation */
51
+ /** route identity: `METHOD /canonical/pattern` */
52
+ id?: RouteId;
53
+ /** input validation schemas — missing/`null` = no validation */
19
54
  iv?: InputSchemasDef | null;
20
55
  /** route metadata — frozen object, accessible via ctx.meta */
21
56
  mt: Record<string, unknown> | null;
22
- /** middleware chain — same as RuntimeMiddleware, inlined to avoid circular dep */
23
- mw: Array<(ctx: Record<string, unknown>, next: (additions?: Record<string, unknown>) => Promise<Response>) => Promise<Response>>;
24
- /** output schemas by content-type — intern trees omit; missing/`null` = no validation */
57
+ /** resolved middleware chain, in run order: chain, scoped, route */
58
+ mw: ChainMiddleware[];
59
+ /** output schemas by content-type — missing/`null` = no validation */
25
60
  os?: OutputSchemaDef | null;
26
61
  /** output validator function — validates response body against schema */
27
62
  ov?: OutputValidator | null;
28
- /** registered path pattern (e.g. "/users/:id"); intern trees omit this */
63
+ /** canonical route pattern (e.g. "/users/:id") */
29
64
  rp?: string;
30
65
  };
31
66
  export type { OutputSchemaDef };
32
- export type WSRouteHandler = {
67
+ export type WSRouteHandler = RecordSource & {
33
68
  bek: string | null;
34
69
  ek: Set<string>;
70
+ ef?: Record<string, (...args: never[]) => unknown> | null;
71
+ fac?: Record<string, (...args: never[]) => unknown> | null;
35
72
  fn: WSHandler<unknown>;
73
+ id?: RouteId;
36
74
  iv: InputSchemasDef | null;
37
75
  mt: Record<string, unknown> | null;
38
- mw: Array<(ctx: Record<string, unknown>, next: (additions?: Record<string, unknown>) => Promise<Response>) => Promise<Response>>;
39
- /** registered ws path pattern — used by scoped-mw prefix filter */
76
+ mw: ChainMiddleware[];
77
+ /** browser origins allowed to open the socket (`.origins()`); `null` = same-origin when credentialed */
78
+ og?: WSOriginPolicy | null;
79
+ /** canonical ws path pattern */
40
80
  rp: string;
41
81
  };
82
+ /**
83
+ * Router topology. Leaves are `RouteId`s, never handler objects: what a leaf runs is looked
84
+ * up in the serving app's own route table.
85
+ */
42
86
  export type TreeNode = {
43
87
  /** dynamic param child — { n: param name, c: child subtree } */
44
88
  d: {
45
89
  c: TreeNode;
46
90
  n: string;
47
91
  } | null;
48
- /** route-graph generation — bumped on insert/merge so served specs can invalidate */
49
- g?: number;
50
- /** method handlers — maps HTTP method (or ALL) to route handler */
51
- m: Record<HttpMethod | "ALL", RouteHandler> | null;
52
- /** static children — maps literal path segment to child subtree */
92
+ /** method → route id at this exact path */
93
+ m: Record<string, RouteId> | null;
94
+ /** static children — maps literal path segment to child subtree (null-prototype) */
53
95
  s: Record<string, TreeNode>;
54
- /** wildcard handler — { n: wildcard name, m: method→handler map } */
96
+ /** wildcard — { n: wildcard name, m: method → route id } */
55
97
  w: {
56
- m: Record<HttpMethod | "ALL", RouteHandler>;
98
+ m: Record<string, RouteId>;
57
99
  n: string;
58
100
  } | null;
59
- /** websocket handler for this path */
60
- ws: WSRouteHandler | null;
101
+ /** websocket route id for this path */
102
+ ws: RouteId | null;
103
+ };
104
+ /** Descriptive data for one route in a tree. Generated files carry only this. */
105
+ export type RouteEntry = {
106
+ /** boundary error key */
107
+ bek?: string | null;
108
+ /** declared error keys */
109
+ ek?: readonly string[];
110
+ /** live record — only in `app.toRouteTree()` snapshots, never in generated files */
111
+ h?: RouteHandler | WSRouteHandler;
112
+ /** internal route (spec, docs, manifest) */
113
+ i?: 1 | true;
114
+ /** input schemas — only in live snapshots */
115
+ iv?: InputSchemasDef | null;
116
+ /** route meta */
117
+ mt?: Record<string, unknown> | null;
118
+ /** output schemas — only in live snapshots */
119
+ os?: OutputSchemaDef | null;
61
120
  };
62
- export declare function bumpGeneration(root: TreeNode): number;
63
121
  export type MatchResult = {
64
122
  allowed: HttpMethod[];
65
123
  matched: false;
66
124
  } | {
67
- handler: RouteHandler;
125
+ id: RouteId;
68
126
  matched: true;
69
127
  params: Record<string, string>;
70
128
  } | null;
71
129
  export interface RouteMeta {
72
130
  }
131
+ /** Format of route trees: topology + per-route data. */
132
+ export declare const ROUTE_TREE_VERSION = 2;
73
133
  export type RouteTree = {
74
- handlers?: Record<string, RouteHandler>;
75
134
  meta: Record<string, RouteMeta>;
76
135
  root: TreeNode;
136
+ routes: Record<RouteId, RouteEntry>;
137
+ v?: number;
77
138
  };
78
139
  export declare function createNode(): TreeNode;
79
- export declare function insertRoute(root: TreeNode, method: HttpMethod | "ALL", path: string, handler: RouteHandler): void;
80
- export declare function matchRoute(root: TreeNode, method: HttpMethod, path: string): MatchResult;
81
- export declare function insertWsRoute(root: TreeNode, path: string, handler: WSRouteHandler): void;
140
+ /**
141
+ * Put `id` at the leaf for `segments` × `method` (`"WS"` for the websocket slot). The same id
142
+ * already there is a no-op; any other id is a duplicate. Optional params must be expanded by
143
+ * the caller — every call places exactly one leaf.
144
+ */
145
+ export declare function insertLeaf(root: TreeNode, segments: readonly Segment[], method: string, id: RouteId): void;
146
+ /**
147
+ * Place a route's leaves by pattern (an optional last param places two). The leaf holds
148
+ * `id`, by default the route's `RouteId`, which is returned.
149
+ */
150
+ export declare function insertRoute(root: TreeNode, method: HttpMethod | "ALL", path: string, id?: RouteId): RouteId;
151
+ /** Place a websocket route's leaf by pattern; returns its `RouteId`. */
152
+ export declare function insertWsRoute(root: TreeNode, path: string, id?: RouteId): RouteId;
153
+ /** Exact lookup: the id at the leaf for `segments` × `method`, without matching params against values. */
154
+ export declare function findLeaf(root: TreeNode, segments: readonly Segment[], method: string): RouteId | undefined;
155
+ export declare function matchRoute(root: TreeNode, method: HttpMethod | string, path: string): MatchResult;
82
156
  export declare function matchWsRoute(root: TreeNode, path: string): {
83
- handler: WSRouteHandler;
157
+ id: RouteId;
84
158
  params: Record<string, string>;
85
159
  } | null;
160
+ /** True when the tree holds at least one websocket leaf. */
161
+ export declare function hasWsLeaf(node: TreeNode): boolean;
162
+ /** Every leaf, with its concrete path pattern (optional params already expanded by insertion). */
163
+ export declare function forEachLeaf(node: TreeNode, cb: (method: string, path: string, id: RouteId) => void, prefix?: string): void;
164
+ /** Deep copy into fresh null-prototype nodes. */
165
+ export declare function cloneTree(node: TreeNode): TreeNode;
166
+ /** Deep-freeze a loaded tree so no app can mutate a module other apps also import. */
167
+ export declare function freezeTree(node: TreeNode): TreeNode;
86
168
  /**
87
- * Copy input/output schemas from `source` onto matching routes in `target` that lack them.
88
- * Generate-time only: a gateway app serves an intern tree (no schemas) while its merge source
89
- * (`mergeTree` over downstream `app.toRouteTree()`) still carries them for OpenAPI.
169
+ * Reject a tree whose leaves are not route ids — a `routes.gen.ts` written by an older honey
170
+ * holds handler objects there.
90
171
  */
91
- export declare function overlaySchemas(target: TreeNode, source: TreeNode): void;
92
- /** Merge source tree nodes into target tree (mutates target) */
172
+ export declare function assertTreeFormat(tree: {
173
+ root?: unknown;
174
+ routes?: unknown;
175
+ v?: unknown;
176
+ }): void;
177
+ /** Merge `source` topology into `target` (mutates target; never shares source nodes). */
93
178
  export declare function mergeInto(target: TreeNode, source: TreeNode): void;
94
179
  type TreeInput = RouteTree | [RouteTree, Record<string, unknown>];
180
+ /**
181
+ * Merge several trees into a new one. Inputs are never mutated; extra meta given per tree is
182
+ * applied to copies of its route entries.
183
+ */
95
184
  export declare function mergeTree(...trees: TreeInput[]): RouteTree;
185
+ /**
186
+ * Copy input/output schemas from `source` onto `target`'s routes that lack them.
187
+ * Generate-time only: a gateway app serves its generated tree (no schemas) while its merge
188
+ * source (`mergeTree` over downstream `app.toRouteTree()`) still carries them for OpenAPI.
189
+ */
190
+ export declare function overlaySchemas(target: {
191
+ _overlaySchemas(source: RouteTree): void;
192
+ }, source: RouteTree): void;
96
193
  //# sourceMappingURL=tree.d.ts.map