@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
package/dist/node.js ADDED
@@ -0,0 +1,396 @@
1
+ import { createServer, ServerResponse } from "node:http";
2
+ import { Readable } from "node:stream";
3
+ import { pipeline } from "node:stream/promises";
4
+ import { bodyKind, rawBodyOf } from "./body-kind.js";
5
+ import { isHoneyResponse } from "./honey-response.js";
6
+ import { ABORT_REQUEST, BODY_OVERFLOW, DEFAULT_MAX_REQUEST_BODY, incomingToNodeRequest, nodeRequestUrl, } from "./node-request.js";
7
+ /** Buffer known-size bodies up to this many bytes, then `res.end(buf)`. */
8
+ const BUFFER_BODY_MAX = 256 * 1024;
9
+ const DEFAULT_UPGRADE_TIMEOUT = 30_000;
10
+ /**
11
+ * Hop-by-hop headers (RFC 9110 §7.6.1): they describe one connection, so a response from
12
+ * somewhere else (a proxied `fetch()`) must not carry them onto this one. Node writes its own.
13
+ */
14
+ const HOP_BY_HOP = new Set([
15
+ "connection",
16
+ "keep-alive",
17
+ "proxy-connection",
18
+ "te",
19
+ "trailer",
20
+ "transfer-encoding",
21
+ "upgrade",
22
+ ]);
23
+ // Node's `Readable.fromWeb` wants `node:stream/web` streams; DOM/Bun brands do not overlap.
24
+ function asNodeWebStream(stream) {
25
+ return stream;
26
+ }
27
+ /** `null` when the request target or `Host` is invalid (see `nodeRequestUrl`); the caller answers 400. */
28
+ function incomingToRequest(req, opts) {
29
+ const url = nodeRequestUrl(req);
30
+ return url === null ? null : incomingToNodeRequest(req, url, opts);
31
+ }
32
+ function collectNodeHeaders(response, extra) {
33
+ const headerObj = {};
34
+ let hasSetCookie = false;
35
+ /* headers a `Connection` header names are hop-by-hop too */
36
+ const named = response.headers.get("connection");
37
+ const dropNamed = named === null
38
+ ? null
39
+ : named
40
+ .toLowerCase()
41
+ .split(",")
42
+ .map((t) => t.trim());
43
+ response.headers.forEach((value, key) => {
44
+ if (key === "set-cookie") {
45
+ hasSetCookie = true;
46
+ return;
47
+ }
48
+ if (HOP_BY_HOP.has(key) && !(key === "upgrade" && response.status === 101))
49
+ return;
50
+ if (dropNamed !== null && dropNamed.includes(key))
51
+ return;
52
+ headerObj[key] = value;
53
+ });
54
+ if (hasSetCookie) {
55
+ const setCookies = response.headers.getSetCookie();
56
+ if (setCookies.length > 0)
57
+ headerObj["set-cookie"] = setCookies;
58
+ }
59
+ if (extra)
60
+ Object.assign(headerObj, extra);
61
+ return headerObj;
62
+ }
63
+ /**
64
+ * Buffer a body only when its size is known and small: a body Honey built in memory, or one
65
+ * that declares `content-length`. Everything else (SSE, `generate()`, a proxied stream, an
66
+ * untagged `new Response(stream)`) is piped as it is produced, whatever its content type.
67
+ */
68
+ function shouldBufferBody(response) {
69
+ if (bodyKind(response) !== "buffered")
70
+ return false;
71
+ const len = Number(response.headers.get("content-length"));
72
+ return Number.isFinite(len) && len <= BUFFER_BODY_MAX;
73
+ }
74
+ /**
75
+ * Pipe a body to the socket. When the response closes first (client gone, shutdown), the
76
+ * reader is cancelled so the producer stops; nothing is left reading.
77
+ */
78
+ async function pipeBody(stream, res) {
79
+ const readable = Readable.fromWeb(asNodeWebStream(stream));
80
+ const onClose = () => {
81
+ if (!res.writableFinished)
82
+ readable.destroy();
83
+ };
84
+ res.once("close", onClose);
85
+ try {
86
+ await pipeline(readable, res);
87
+ }
88
+ catch {
89
+ if (!res.destroyed)
90
+ res.destroy();
91
+ /* `destroy()` cancels the web reader; this covers a stream that errored on its own */
92
+ stream.cancel().catch(() => { });
93
+ }
94
+ finally {
95
+ res.off("close", onClose);
96
+ }
97
+ }
98
+ function statusMessage(response) {
99
+ return response.statusText === "" ? undefined : response.statusText;
100
+ }
101
+ async function responseToNode(response, res) {
102
+ if (isHoneyResponse(response)) {
103
+ const raw = response.rawBody;
104
+ if (typeof raw === "string" || raw instanceof Uint8Array) {
105
+ const byteLength = typeof raw === "string" ? Buffer.byteLength(raw) : raw.byteLength;
106
+ res.writeHead(response.status, { ...response.plainHeaders, "content-length": String(byteLength) });
107
+ res.end(raw);
108
+ return;
109
+ }
110
+ const stream = response.body;
111
+ if (stream === null) {
112
+ res.writeHead(response.status, response.plainHeaders);
113
+ res.end();
114
+ return;
115
+ }
116
+ res.writeHead(response.status, response.plainHeaders);
117
+ await pipeBody(stream, res);
118
+ return;
119
+ }
120
+ const raw = rawBodyOf(response);
121
+ if (typeof raw === "string" || raw instanceof Uint8Array) {
122
+ const byteLength = typeof raw === "string" ? Buffer.byteLength(raw) : raw.byteLength;
123
+ res.writeHead(response.status, statusMessage(response), collectNodeHeaders(response, { "content-length": String(byteLength) }));
124
+ res.end(raw);
125
+ return;
126
+ }
127
+ const body = response.body;
128
+ if (body === null) {
129
+ res.writeHead(response.status, statusMessage(response), collectNodeHeaders(response));
130
+ res.end();
131
+ return;
132
+ }
133
+ if (shouldBufferBody(response)) {
134
+ const buf = Buffer.from(await response.arrayBuffer());
135
+ if (res.destroyed)
136
+ return;
137
+ res.writeHead(response.status, statusMessage(response), collectNodeHeaders(response, { "content-length": String(buf.byteLength) }));
138
+ res.end(buf);
139
+ return;
140
+ }
141
+ const headers = collectNodeHeaders(response);
142
+ /* a stream's declared length is never trusted (`fetch()` keeps the encoded length of a body it
143
+ * decoded): Node chunks it, so a wrong length cannot truncate it or desynchronize keep-alive */
144
+ delete headers["content-length"];
145
+ res.writeHead(response.status, statusMessage(response), headers);
146
+ await pipeBody(body, res);
147
+ }
148
+ function isWebSocketUpgrade(req) {
149
+ return req.headers.upgrade?.toLowerCase() === "websocket";
150
+ }
151
+ /**
152
+ * The body of a request that came in on Node's `'upgrade'` path but is served as a normal
153
+ * request. Node with `shouldUpgradeCallback` never sends those there; before that,
154
+ * some versions leave the body on the socket (the first bytes in `head`). Only a declared
155
+ * `content-length` can be read back that way.
156
+ */
157
+ function upgradeBodySource(req, socket, head) {
158
+ /* newer Node parses the body into `req` itself */
159
+ if (!req.complete)
160
+ return null;
161
+ if (req.headers["transfer-encoding"] !== undefined)
162
+ return "unsupported";
163
+ const declared = Number(req.headers["content-length"] ?? 0);
164
+ if (!Number.isSafeInteger(declared) || declared <= 0)
165
+ return null;
166
+ return (async function* () {
167
+ let remaining = declared;
168
+ if (head.byteLength > 0) {
169
+ const first = head.subarray(0, remaining);
170
+ remaining -= first.byteLength;
171
+ yield first;
172
+ }
173
+ if (remaining <= 0)
174
+ return;
175
+ for await (const chunk of socket) {
176
+ const part = chunk.subarray(0, remaining);
177
+ remaining -= part.byteLength;
178
+ yield part;
179
+ if (remaining <= 0)
180
+ return;
181
+ }
182
+ })();
183
+ }
184
+ /** Answer on a socket Node handed over through `'upgrade'`, with a real `ServerResponse`. */
185
+ function responseOnSocket(req, socket) {
186
+ const res = new ServerResponse(req);
187
+ /* the connection ends with this response */
188
+ res.shouldKeepAlive = false;
189
+ res.assignSocket(socket);
190
+ res.once("finish", () => {
191
+ res.detachSocket(socket);
192
+ socket.end();
193
+ });
194
+ return res;
195
+ }
196
+ /** A response written before any Request exists (bad target or `Host`): plain text, then close. */
197
+ function writeRawStatus(socket, status, text) {
198
+ if (socket.destroyed)
199
+ return;
200
+ socket.end(`HTTP/1.1 ${status} ${text}\r\nconnection: close\r\ncontent-type: text/plain\r\ncontent-length: ${text.length}\r\n\r\n${text}`);
201
+ }
202
+ export function serve(app, options) {
203
+ const env = options.env;
204
+ const requestOpts = { maxBodySize: options.maxRequestBodySize ?? DEFAULT_MAX_REQUEST_BODY };
205
+ const upgradeTimeout = options.upgradeTimeout ?? DEFAULT_UPGRADE_TIMEOUT;
206
+ const reportError = options.onError ??
207
+ ((err) => {
208
+ console.error("honey: request failed in the Node adapter", err);
209
+ });
210
+ /* in-flight requests and their responses: shutdown aborts their signals */
211
+ const inflight = new Map();
212
+ /* sockets that became WebSockets: shutdown closes them */
213
+ const upgraded = new Set();
214
+ let draining = false;
215
+ const abort = (request, reason) => {
216
+ ;
217
+ request[ABORT_REQUEST]?.(reason);
218
+ };
219
+ const wsAdapter = () => app._graph.settings.wsAdapter;
220
+ /** One HTTP request, whether it came in normally or on the `'upgrade'` path. */
221
+ const handle = async (req, res, bodySource = null) => {
222
+ if (draining) {
223
+ res.writeHead(503, { connection: "close" });
224
+ res.end("Service Unavailable");
225
+ return;
226
+ }
227
+ let request = null;
228
+ try {
229
+ request = incomingToRequest(req, bodySource === null ? requestOpts : { ...requestOpts, bodySource });
230
+ if (request === null) {
231
+ res.writeHead(400, { connection: "close", "content-type": "text/plain" });
232
+ res.end("Bad Request");
233
+ return;
234
+ }
235
+ const tracked = request;
236
+ inflight.set(res, tracked);
237
+ /* the response closed before it finished: the client left (or shutdown cut it) */
238
+ res.once("close", () => {
239
+ if (!res.writableFinished)
240
+ abort(tracked, new DOMException("The client disconnected", "AbortError"));
241
+ });
242
+ const maybe = app.fetch(request, env);
243
+ const response = maybe instanceof Promise ? await maybe : maybe;
244
+ /* while draining, tell keep-alive clients this connection ends with the response */
245
+ if (draining)
246
+ res.shouldKeepAlive = false;
247
+ /* a body over the cap was left unread on the socket: never reuse the connection */
248
+ if (request[BODY_OVERFLOW] === true)
249
+ res.shouldKeepAlive = false;
250
+ await responseToNode(response, res);
251
+ }
252
+ catch (err) {
253
+ reportError(err);
254
+ if (!res.headersSent) {
255
+ res.writeHead(500, { "content-type": "text/plain" });
256
+ res.end("Internal Server Error");
257
+ }
258
+ else if (!res.destroyed) {
259
+ res.destroy();
260
+ }
261
+ }
262
+ finally {
263
+ if (request !== null)
264
+ inflight.delete(res);
265
+ /* a keep-alive connection that just went idle would hold `close()` open until it times out */
266
+ if (draining)
267
+ setImmediate(() => server.closeIdleConnections());
268
+ }
269
+ };
270
+ const server = createServer({
271
+ /* only a WebSocket handshake takes the upgrade path; `Upgrade: h2c` and the like are
272
+ * served as the normal requests they are (where Node has `shouldUpgradeCallback`; older Node ignores the option) */
273
+ shouldUpgradeCallback: isWebSocketUpgrade,
274
+ }, (req, res) => {
275
+ void handle(req, res);
276
+ });
277
+ if (options.headersTimeout !== undefined)
278
+ server.headersTimeout = options.headersTimeout;
279
+ if (options.requestTimeout !== undefined)
280
+ server.requestTimeout = options.requestTimeout;
281
+ if (options.keepAliveTimeout !== undefined)
282
+ server.keepAliveTimeout = options.keepAliveTimeout;
283
+ /** A WebSocket handshake, or (on Node without `shouldUpgradeCallback`) any request with `Upgrade`. */
284
+ const handleUpgrade = async (req, socket, head) => {
285
+ if (!isWebSocketUpgrade(req)) {
286
+ const source = upgradeBodySource(req, socket, head);
287
+ if (source === "unsupported") {
288
+ writeRawStatus(socket, 400, "Bad Request");
289
+ return;
290
+ }
291
+ socket.setTimeout(0);
292
+ await handle(req, responseOnSocket(req, socket), source);
293
+ return;
294
+ }
295
+ if (draining) {
296
+ writeRawStatus(socket, 503, "Service Unavailable");
297
+ return;
298
+ }
299
+ const request = incomingToRequest(req, requestOpts);
300
+ if (request === null) {
301
+ writeRawStatus(socket, 400, "Bad Request");
302
+ return;
303
+ }
304
+ socket.once("close", () => {
305
+ abort(request, new DOMException("The client disconnected", "AbortError"));
306
+ });
307
+ const state = { head, req, socket, upgraded: false };
308
+ const envWithUpgrade = { ...env, __nodeUpgrade: state };
309
+ let response;
310
+ try {
311
+ const maybe = app.fetch(request, envWithUpgrade);
312
+ response = maybe instanceof Promise ? await maybe : maybe;
313
+ }
314
+ catch (err) {
315
+ reportError(err);
316
+ /* once ws wrote the 101 the socket is a WebSocket: an HTTP status would corrupt it */
317
+ if (!state.upgraded) {
318
+ socket.setTimeout(0);
319
+ const res = responseOnSocket(req, socket);
320
+ res.writeHead(500, { "content-type": "text/plain" });
321
+ res.end("Internal Server Error");
322
+ }
323
+ return;
324
+ }
325
+ if (state.upgraded) {
326
+ socket.setTimeout(0);
327
+ upgraded.add(socket);
328
+ socket.once("close", () => upgraded.delete(socket));
329
+ return;
330
+ }
331
+ if (socket.destroyed) {
332
+ await response.body?.cancel().catch(() => { });
333
+ return;
334
+ }
335
+ /* not upgraded (auth rejected, 404, 426, an SSE route…): a real response, streamed, every header kept */
336
+ socket.setTimeout(0);
337
+ try {
338
+ await responseToNode(response, responseOnSocket(req, socket));
339
+ }
340
+ catch (err) {
341
+ reportError(err);
342
+ socket.destroy();
343
+ }
344
+ };
345
+ server.on("upgrade", (req, duplex, head) => {
346
+ const socket = duplex;
347
+ /* first: a reset while the app is still deciding must not become an uncaught 'error' event */
348
+ socket.on("error", () => {
349
+ socket.destroy();
350
+ });
351
+ if (upgradeTimeout > 0)
352
+ socket.setTimeout(upgradeTimeout, () => socket.destroy());
353
+ handleUpgrade(req, socket, head).catch((err) => {
354
+ reportError(err);
355
+ socket.destroy();
356
+ });
357
+ });
358
+ server.listen(options?.port ?? 0, options?.hostname);
359
+ const honeyServer = server;
360
+ /**
361
+ * Stop accepting connections and let in-flight requests finish. Responses already streaming
362
+ * (SSE, `generate()`) never finish on their own, so their `ctx.signal` aborts now and they
363
+ * end; WebSockets get a 1001 close. Handlers still working get until `timeout`; then their
364
+ * signal aborts and every connection, WebSockets included, is closed.
365
+ */
366
+ honeyServer.shutdown = (timeout) => {
367
+ draining = true;
368
+ const shutdownReason = () => new DOMException("The server is shutting down", "AbortError");
369
+ return new Promise((resolve) => {
370
+ let timer;
371
+ /* fires once every connection has closed */
372
+ server.close(() => {
373
+ if (timer !== undefined)
374
+ clearTimeout(timer);
375
+ resolve();
376
+ });
377
+ server.closeIdleConnections();
378
+ for (const [res, request] of inflight) {
379
+ if (res.headersSent)
380
+ abort(request, shutdownReason());
381
+ }
382
+ wsAdapter()?.closeAll?.(1001, "server shutting down");
383
+ if (timeout !== undefined) {
384
+ timer = setTimeout(() => {
385
+ for (const request of inflight.values())
386
+ abort(request, shutdownReason());
387
+ for (const socket of upgraded)
388
+ socket.destroy();
389
+ server.closeAllConnections();
390
+ }, timeout);
391
+ }
392
+ });
393
+ };
394
+ return honeyServer;
395
+ }
396
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { RouteHandler, TreeNode, WSRouteHandler } from "../tree.ts";
1
+ import type { RouteHandler, WSRouteHandler } from "../tree.ts";
2
2
  import type { InputSchemaEntry, StandardSchemaLike } from "../types.ts";
3
3
  export type CollectedRoute = {
4
4
  handler: RouteHandler;
@@ -9,9 +9,12 @@ export type CollectedWSRoute = {
9
9
  handler: WSRouteHandler;
10
10
  path: string;
11
11
  };
12
+ /** Path parameter names of a route pattern, as OpenAPI names them (wildcards included). */
12
13
  export declare function extractParams(path: string): string[];
13
14
  export declare function toOpenApiPath(path: string): string;
14
- export declare function walkTree(node: TreeNode, currentPath: string, routes: CollectedRoute[], includeSkipped?: boolean): void;
15
- export declare function walkWSRoutes(node: TreeNode, currentPath: string, routes: CollectedWSRoute[]): void;
15
+ /** Every served HTTP route of an app, one entry per concrete path. */
16
+ export declare function collectRoutes(app: unknown, includeSkipped?: boolean): CollectedRoute[];
17
+ /** Every websocket route of an app, one entry per concrete path. */
18
+ export declare function collectWsRoutes(app: unknown): CollectedWSRoute[];
16
19
  export declare function unwrapEntry(entry: InputSchemaEntry): StandardSchemaLike;
17
20
  //# sourceMappingURL=collect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/openapi/collect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,QAAQ,CACvB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EAAE,EACxB,cAAc,CAAC,EAAE,OAAO,GACtB,IAAI,CAsBN;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAUlG;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,CAKvE"}
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/openapi/collect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAOD,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,cAAc,EAAE,CAEtF;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAEhE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,CAKvE"}
@@ -0,0 +1,30 @@
1
+ import { parsePattern, toOpenApiTemplate, UNNAMED_WILDCARD } from "../pattern.js";
2
+ /** Path parameter names of a route pattern, as OpenAPI names them (wildcards included). */
3
+ export function extractParams(path) {
4
+ const out = [];
5
+ for (const seg of parsePattern(path)) {
6
+ if (seg.k === "param")
7
+ out.push(seg.n);
8
+ else if (seg.k === "wildcard")
9
+ out.push(seg.n === UNNAMED_WILDCARD ? "wildcard" : seg.n);
10
+ }
11
+ return out;
12
+ }
13
+ export function toOpenApiPath(path) {
14
+ return toOpenApiTemplate(parsePattern(path));
15
+ }
16
+ /** Every served HTTP route of an app, one entry per concrete path. */
17
+ export function collectRoutes(app, includeSkipped) {
18
+ return app._collectRoutes(includeSkipped);
19
+ }
20
+ /** Every websocket route of an app, one entry per concrete path. */
21
+ export function collectWsRoutes(app) {
22
+ return app._collectWsRoutes();
23
+ }
24
+ export function unwrapEntry(entry) {
25
+ if ("_tag" in entry) {
26
+ return entry.schema;
27
+ }
28
+ return entry;
29
+ }
30
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/openapi/collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAejF,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,GAAG,CAAC,CAAC,KAAK,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;aACjC,IAAI,GAAG,CAAC,CAAC,KAAK,UAAU;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACzF,CAAC;IACD,OAAO,GAAG,CAAA;AACX,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;AAC7C,CAAC;AAOD,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,cAAwB;IACnE,OAAQ,GAAmB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;AAC3D,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAAC,GAAY;IAC3C,OAAQ,GAAmB,CAAC,gBAAgB,EAAE,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IAClD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,MAA4B,CAAA;IAC1C,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { TypedResponse } from "../response.ts";
2
+ /**
3
+ * Pinned docs UI assets with Subresource Integrity. The page runs on the API's own origin, so
4
+ * an unpinned CDN script could read anything the origin can; a pinned version with an
5
+ * integrity hash can only ever be these bytes.
6
+ */
7
+ export declare const SWAGGER_UI: {
8
+ readonly css: {
9
+ readonly integrity: "sha384-Ov4/wv3j2bmct8cDc5X4ngJZohVPzEmc6uDPH8WeljUxO5vtoykvMEfbu9Vh6RaW";
10
+ readonly url: "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.33.1/swagger-ui.css";
11
+ };
12
+ readonly js: {
13
+ readonly integrity: "sha384-ZPehFMQommnnuaZ4rpxgkgTT2DKFVp4hZC/7pLit+9Lek9T1YGSo23eHFbvNkXkw";
14
+ readonly url: "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.33.1/swagger-ui-bundle.js";
15
+ };
16
+ };
17
+ export declare const SCALAR: {
18
+ readonly js: {
19
+ readonly integrity: "sha384-kYDGzV91Jnn3TbHINV3nt54riK2uMJDfN5Al8dAkz4FssELTBWbD8rgw32sTKfOi";
20
+ readonly url: "https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.73.1/dist/browser/standalone.js";
21
+ };
22
+ };
23
+ /**
24
+ * JSON for an inline `<script>`: `<` cannot end the element, and U+2028/U+2029 cannot end a
25
+ * string literal in older engines.
26
+ */
27
+ export declare function inlineJson(value: unknown): string;
28
+ export declare function escapeAttribute(value: string): string;
29
+ type DocsCtx = {
30
+ res: {
31
+ html(sk: "ok", body: string, opts?: {
32
+ headers?: Record<string, string>;
33
+ }): TypedResponse;
34
+ };
35
+ };
36
+ /**
37
+ * A docs page handler: a fresh script nonce per response, a CSP that allows only that inline
38
+ * script and the pinned CDN, and `nosniff`.
39
+ */
40
+ export declare function docsPage(render: (nonce: string) => string): (ctx: DocsCtx) => TypedResponse;
41
+ export {};
42
+ //# sourceMappingURL=docs-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-page.d.ts","sourceRoot":"","sources":["../../src/openapi/docs-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD;;;;GAIG;AACH,eAAO,MAAM,UAAU;aACtB,GAAG;iBACF,SAAS,EAAE,yEAAyE;iBACpF,GAAG,EAAE,oEAAoE;;aAE1E,EAAE;iBACD,SAAS,EAAE,yEAAyE;iBACpF,GAAG,EAAE,0EAA0E;;CAEvE,CAAA;AAEV,eAAO,MAAM,MAAM;aAClB,EAAE;iBACD,SAAS,EAAE,yEAAyE;iBACpF,GAAG,EAAE,sFAAsF;;CAEnF,CAAA;AAQV;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAUD,KAAK,OAAO,GAAG;IAAE,GAAG,EAAE;QAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,GAAG,aAAa,CAAA;KAAE,CAAA;CAAE,CAAA;AAEpH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,aAAa,CA0B3F"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Pinned docs UI assets with Subresource Integrity. The page runs on the API's own origin, so
3
+ * an unpinned CDN script could read anything the origin can; a pinned version with an
4
+ * integrity hash can only ever be these bytes.
5
+ */
6
+ export const SWAGGER_UI = {
7
+ css: {
8
+ integrity: "sha384-Ov4/wv3j2bmct8cDc5X4ngJZohVPzEmc6uDPH8WeljUxO5vtoykvMEfbu9Vh6RaW",
9
+ url: "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.33.1/swagger-ui.css",
10
+ },
11
+ js: {
12
+ integrity: "sha384-ZPehFMQommnnuaZ4rpxgkgTT2DKFVp4hZC/7pLit+9Lek9T1YGSo23eHFbvNkXkw",
13
+ url: "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.33.1/swagger-ui-bundle.js",
14
+ },
15
+ };
16
+ export const SCALAR = {
17
+ js: {
18
+ integrity: "sha384-kYDGzV91Jnn3TbHINV3nt54riK2uMJDfN5Al8dAkz4FssELTBWbD8rgw32sTKfOi",
19
+ url: "https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.73.1/dist/browser/standalone.js",
20
+ },
21
+ };
22
+ const CDN_ORIGIN = "https://cdn.jsdelivr.net";
23
+ /* built from char codes: a formatter may turn an escape in a literal into the raw separator */
24
+ const LINE_SEPARATOR = String.fromCharCode(0x2028);
25
+ const PARAGRAPH_SEPARATOR = String.fromCharCode(0x2029);
26
+ /**
27
+ * JSON for an inline `<script>`: `<` cannot end the element, and U+2028/U+2029 cannot end a
28
+ * string literal in older engines.
29
+ */
30
+ export function inlineJson(value) {
31
+ return JSON.stringify(value)
32
+ .replace(/</g, "\\u003c")
33
+ .replace(/>/g, "\\u003e")
34
+ .replace(/&/g, "\\u0026")
35
+ .replaceAll(LINE_SEPARATOR, "\\u2028")
36
+ .replaceAll(PARAGRAPH_SEPARATOR, "\\u2029");
37
+ }
38
+ export function escapeAttribute(value) {
39
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
40
+ }
41
+ function nonce() {
42
+ const bytes = new Uint8Array(16);
43
+ crypto.getRandomValues(bytes);
44
+ let s = "";
45
+ for (const b of bytes)
46
+ s += String.fromCharCode(b);
47
+ return btoa(s);
48
+ }
49
+ /**
50
+ * A docs page handler: a fresh script nonce per response, a CSP that allows only that inline
51
+ * script and the pinned CDN, and `nosniff`.
52
+ */
53
+ export function docsPage(render) {
54
+ const handler = (ctx) => {
55
+ const n = nonce();
56
+ const csp = [
57
+ "default-src 'none'",
58
+ `script-src 'nonce-${n}' ${CDN_ORIGIN}`,
59
+ `style-src 'self' 'unsafe-inline' ${CDN_ORIGIN}`,
60
+ "img-src 'self' data: https:",
61
+ "font-src 'self' data: https:",
62
+ "connect-src 'self' https:",
63
+ "worker-src blob:",
64
+ "base-uri 'none'",
65
+ "form-action 'none'",
66
+ "frame-ancestors 'self'",
67
+ "object-src 'none'",
68
+ ].join("; ");
69
+ return ctx.res.html("ok", render(n), {
70
+ headers: {
71
+ "content-security-policy": csp,
72
+ "referrer-policy": "no-referrer",
73
+ "x-content-type-options": "nosniff",
74
+ },
75
+ });
76
+ };
77
+ Object.defineProperty(handler, Symbol.for("honey.internal"), { value: true });
78
+ return handler;
79
+ }
80
+ //# sourceMappingURL=docs-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-page.js","sourceRoot":"","sources":["../../src/openapi/docs-page.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,GAAG,EAAE;QACJ,SAAS,EAAE,yEAAyE;QACpF,GAAG,EAAE,oEAAoE;KACzE;IACD,EAAE,EAAE;QACH,SAAS,EAAE,yEAAyE;QACpF,GAAG,EAAE,0EAA0E;KAC/E;CACQ,CAAA;AAEV,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,EAAE,EAAE;QACH,SAAS,EAAE,yEAAyE;QACpF,GAAG,EAAE,sFAAsF;KAC3F;CACQ,CAAA;AAEV,MAAM,UAAU,GAAG,0BAA0B,CAAA;AAE7C,+FAA+F;AAC/F,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;AAClD,MAAM,mBAAmB,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;AAEvD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC1B,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC;SACrC,UAAU,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACxG,CAAC;AAED,SAAS,KAAK;IACb,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,CAAC,GAAG,EAAE,CAAA;IACV,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAClD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;AACf,CAAC;AAID;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAiC;IACzD,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE;QAChC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAA;QACjB,MAAM,GAAG,GAAG;YACX,oBAAoB;YACpB,qBAAqB,CAAC,KAAK,UAAU,EAAE;YACvC,oCAAoC,UAAU,EAAE;YAChD,6BAA6B;YAC7B,8BAA8B;YAC9B,2BAA2B;YAC3B,kBAAkB;YAClB,iBAAiB;YACjB,oBAAoB;YACpB,wBAAwB;YACxB,mBAAmB;SACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;YACpC,OAAO,EAAE;gBACR,yBAAyB,EAAE,GAAG;gBAC9B,iBAAiB,EAAE,aAAa;gBAChC,wBAAwB,EAAE,SAAS;aACnC;SACD,CAAC,CAAA;IACH,CAAC,CAAA;IACD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7E,OAAO,OAAO,CAAA;AACf,CAAC"}
@@ -17,6 +17,10 @@ export type OpenApiSpec = {
17
17
  info: OpenApiInfo;
18
18
  openapi: string;
19
19
  paths: Record<string, Record<string, Record<string, unknown>>>;
20
+ servers?: Array<{
21
+ description?: string;
22
+ url: string;
23
+ }>;
20
24
  };
21
25
  export declare const DEFAULT_ERROR_JSON_SCHEMA: Record<string, unknown>;
22
26
  export declare function generateOpenApiFromTree<TMeta = unknown>(app: unknown, options: {
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/openapi/document.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,wBAAwB,CAAA;AAsB7F,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,IAAI;IAC/C,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,UAAU,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACzC,CAAA;IACD,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAC9D,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAyB7D,CAAA;AAwND,wBAAgB,uBAAuB,CAAC,KAAK,GAAG,OAAO,EACtD,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE;IACR,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,OAAO,CAAA;IAC1D,IAAI,EAAE,WAAW,CAAA;IACjB,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACzC,GACC,WAAW,CA4Tb"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/openapi/document.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,wBAAwB,CAAA;AAyB7F,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,IAAI;IAC/C,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,UAAU,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACzC,CAAA;IACD,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IAC9D,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACtD,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAyB7D,CAAA;AAibD,wBAAgB,uBAAuB,CAAC,KAAK,GAAG,OAAO,EACtD,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE;IACR,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,OAAO,CAAA;IAC1D,IAAI,EAAE,WAAW,CAAA;IACjB,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACzC,GACC,WAAW,CAkQb"}