@lovrozagar/honey 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +410 -149
  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 +776 -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 +1893 -1761
  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 +271 -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 +562 -424
  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,65 @@
1
+ /**
2
+ * Options every WebSocket adapter takes, with the same meaning and defaults on Node, Bun, Deno
3
+ * and Workers. Each adapter enforces what its runtime does not.
4
+ */
5
+ export type WSAdapterOptions = {
6
+ /**
7
+ * Largest inbound message in bytes. A bigger one closes the connection with 1009.
8
+ * Default 1 MiB.
9
+ */
10
+ maxPayload?: number;
11
+ /**
12
+ * Outbound bytes a socket may hold unsent before `backpressurePolicy` applies to the next
13
+ * `send()`. Default 8 MiB.
14
+ */
15
+ backpressureLimit?: number;
16
+ /**
17
+ * Over `backpressureLimit`: `"close"` closes the connection with 1013 (try again later),
18
+ * `"drop"` discards the message. Default `"close"`.
19
+ */
20
+ backpressurePolicy?: "close" | "drop";
21
+ /**
22
+ * Close a connection that has received nothing (no message, no pong) for this many
23
+ * milliseconds. Idle peers are pinged first where the runtime allows it. `0` disables.
24
+ * Default 120 000 (Bun's default). Deno and Bun take whole seconds.
25
+ */
26
+ idleTimeout?: number;
27
+ /**
28
+ * Choose the subprotocol from the ones the client offered (`Sec-WebSocket-Protocol`).
29
+ * Return `null` or `undefined` for none. Default: the first one offered.
30
+ */
31
+ protocol?: (offered: string[], req: Request) => string | null | undefined;
32
+ };
33
+ export type ResolvedWSOptions = {
34
+ backpressureLimit: number;
35
+ backpressurePolicy: "close" | "drop";
36
+ idleTimeout: number;
37
+ maxPayload: number;
38
+ protocol: (offered: string[], req: Request) => string | null | undefined;
39
+ };
40
+ export declare const DEFAULT_MAX_PAYLOAD: number;
41
+ export declare const DEFAULT_BACKPRESSURE_LIMIT: number;
42
+ export declare const DEFAULT_IDLE_TIMEOUT = 120000;
43
+ /** Close codes the adapters and the realtime server use. */
44
+ export declare const CLOSE_NORMAL = 1000;
45
+ export declare const CLOSE_GOING_AWAY = 1001;
46
+ export declare const CLOSE_POLICY = 1008;
47
+ export declare const CLOSE_TOO_BIG = 1009;
48
+ export declare const CLOSE_INTERNAL = 1011;
49
+ export declare const CLOSE_TRY_AGAIN = 1013;
50
+ /** Longest close reason a frame can carry (125-byte control payload minus the 2-byte code). */
51
+ export declare const MAX_CLOSE_REASON = 123;
52
+ export declare function resolveWSOptions(opts: WSAdapterOptions | undefined): ResolvedWSOptions;
53
+ /** The subprotocols the client offered, in order. */
54
+ export declare function offeredProtocols(req: Request): string[];
55
+ /** The subprotocol to answer with, or `null`. A choice the client did not offer is ignored. */
56
+ export declare function selectProtocol(req: Request, opts: ResolvedWSOptions): string | null;
57
+ /** Outbound bytes the runtime holds for this socket, when it reports them. */
58
+ export declare function bufferedAmountOf(raw: unknown): number;
59
+ /** Whether an inbound message is larger than `limit` bytes. */
60
+ export declare function exceedsPayload(data: ArrayBuffer | ArrayBufferView | Blob | string, limit: number): boolean;
61
+ /** `data` as an `ArrayBuffer` holding exactly its bytes (a pooled Buffer's backing store is larger). */
62
+ export declare function toArrayBuffer(data: ArrayBuffer | ArrayBufferView): ArrayBuffer;
63
+ /** A close code a server may send: 1000, 1001-1014 except the reserved ones, or 3000-4999. */
64
+ export declare function sendableCloseCode(code: number | undefined): number;
65
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/ws/shared.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC9B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACrC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACzE,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC/B,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAA;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACxE,CAAA;AAED,eAAO,MAAM,mBAAmB,QAAc,CAAA;AAC9C,eAAO,MAAM,0BAA0B,QAAkB,CAAA;AACzD,eAAO,MAAM,oBAAoB,SAAU,CAAA;AAE3C,4DAA4D;AAC5D,eAAO,MAAM,YAAY,OAAO,CAAA;AAChC,eAAO,MAAM,gBAAgB,OAAO,CAAA;AACpC,eAAO,MAAM,YAAY,OAAO,CAAA;AAChC,eAAO,MAAM,aAAa,OAAO,CAAA;AACjC,eAAO,MAAM,cAAc,OAAO,CAAA;AAClC,eAAO,MAAM,eAAe,OAAO,CAAA;AAEnC,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAYnC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,GAAG,iBAAiB,CActF;AAED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CASvD;AAED,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAKnF;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQrD;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAS1G;AAED,wGAAwG;AACxG,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,WAAW,CAK9E;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKlE"}
@@ -0,0 +1,103 @@
1
+ export const DEFAULT_MAX_PAYLOAD = 1024 * 1024;
2
+ export const DEFAULT_BACKPRESSURE_LIMIT = 8 * 1024 * 1024;
3
+ export const DEFAULT_IDLE_TIMEOUT = 120_000;
4
+ /** Close codes the adapters and the realtime server use. */
5
+ export const CLOSE_NORMAL = 1000;
6
+ export const CLOSE_GOING_AWAY = 1001;
7
+ export const CLOSE_POLICY = 1008;
8
+ export const CLOSE_TOO_BIG = 1009;
9
+ export const CLOSE_INTERNAL = 1011;
10
+ export const CLOSE_TRY_AGAIN = 1013;
11
+ /** Longest close reason a frame can carry (125-byte control payload minus the 2-byte code). */
12
+ export const MAX_CLOSE_REASON = 123;
13
+ const firstOffered = (offered) => offered[0] ?? null;
14
+ function nonNegative(name, value, fallback) {
15
+ if (value === undefined)
16
+ return fallback;
17
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
18
+ throw new TypeError(`WebSocket adapter: ${name} must be a non-negative number`);
19
+ }
20
+ return value;
21
+ }
22
+ export function resolveWSOptions(opts) {
23
+ const policy = opts?.backpressurePolicy ?? "close";
24
+ if (policy !== "close" && policy !== "drop") {
25
+ throw new TypeError('WebSocket adapter: backpressurePolicy must be "close" or "drop"');
26
+ }
27
+ const maxPayload = nonNegative("maxPayload", opts?.maxPayload, DEFAULT_MAX_PAYLOAD);
28
+ if (maxPayload === 0)
29
+ throw new TypeError("WebSocket adapter: maxPayload must be positive");
30
+ return {
31
+ backpressureLimit: nonNegative("backpressureLimit", opts?.backpressureLimit, DEFAULT_BACKPRESSURE_LIMIT),
32
+ backpressurePolicy: policy,
33
+ idleTimeout: nonNegative("idleTimeout", opts?.idleTimeout, DEFAULT_IDLE_TIMEOUT),
34
+ maxPayload,
35
+ protocol: opts?.protocol ?? firstOffered,
36
+ };
37
+ }
38
+ /** The subprotocols the client offered, in order. */
39
+ export function offeredProtocols(req) {
40
+ const raw = req.headers.get("sec-websocket-protocol");
41
+ if (raw === null)
42
+ return [];
43
+ const out = [];
44
+ for (const part of raw.split(",")) {
45
+ const p = part.trim();
46
+ if (p !== "")
47
+ out.push(p);
48
+ }
49
+ return out;
50
+ }
51
+ /** The subprotocol to answer with, or `null`. A choice the client did not offer is ignored. */
52
+ export function selectProtocol(req, opts) {
53
+ const offered = offeredProtocols(req);
54
+ if (offered.length === 0)
55
+ return null;
56
+ const chosen = opts.protocol(offered, req);
57
+ return typeof chosen === "string" && offered.includes(chosen) ? chosen : null;
58
+ }
59
+ /** Outbound bytes the runtime holds for this socket, when it reports them. */
60
+ export function bufferedAmountOf(raw) {
61
+ if (raw === null || typeof raw !== "object")
62
+ return 0;
63
+ const r = raw;
64
+ if (typeof r.getBufferedAmount === "function") {
65
+ const n = r.getBufferedAmount();
66
+ return typeof n === "number" ? n : 0;
67
+ }
68
+ return typeof r.bufferedAmount === "number" ? r.bufferedAmount : 0;
69
+ }
70
+ /** Whether an inbound message is larger than `limit` bytes. */
71
+ export function exceedsPayload(data, limit) {
72
+ if (typeof data === "string") {
73
+ if (data.length > limit)
74
+ return true;
75
+ /* a UTF-16 unit is at most 3 UTF-8 bytes, so most strings need no encode */
76
+ if (data.length * 3 <= limit)
77
+ return false;
78
+ return new TextEncoder().encode(data).byteLength > limit;
79
+ }
80
+ if (typeof Blob !== "undefined" && data instanceof Blob)
81
+ return data.size > limit;
82
+ return data.byteLength > limit;
83
+ }
84
+ /** `data` as an `ArrayBuffer` holding exactly its bytes (a pooled Buffer's backing store is larger). */
85
+ export function toArrayBuffer(data) {
86
+ if (data instanceof ArrayBuffer)
87
+ return data;
88
+ const { buffer, byteLength, byteOffset } = data;
89
+ if (byteOffset === 0 && byteLength === buffer.byteLength && buffer instanceof ArrayBuffer)
90
+ return buffer;
91
+ return buffer.slice(byteOffset, byteOffset + byteLength);
92
+ }
93
+ /** A close code a server may send: 1000, 1001-1014 except the reserved ones, or 3000-4999. */
94
+ export function sendableCloseCode(code) {
95
+ if (code === undefined)
96
+ return 1000;
97
+ if (code === 1000 || (code >= 3000 && code <= 4999))
98
+ return code;
99
+ if (code >= 1001 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006)
100
+ return code;
101
+ return 1000;
102
+ }
103
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/ws/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Which browser origins may open a WebSocket. A browser lets any page open a socket to any host
3
+ * and sends that host's cookies with it, so a cookie-authenticated socket is open to cross-site
4
+ * hijacking unless the server checks `Origin`.
5
+ *
6
+ * - `"*"`: every origin.
7
+ * - a list: those exact origins (`https://app.example.com`), plus same-origin.
8
+ * - a function: called with the `Origin` value; same-origin always passes.
9
+ * - unset (the default): same-origin always passes; a cross-origin upgrade is rejected when it
10
+ * carries credentials (`Cookie` or `Authorization`), since that is what hijacking needs. A
11
+ * request without `Origin` (not a browser) passes.
12
+ */
13
+ export type WSOriginPolicy = "*" | readonly string[] | ((origin: string) => boolean);
14
+ export declare function validateOriginPolicy(policy: unknown): WSOriginPolicy;
15
+ /**
16
+ * Whether an upgrade from `origin` may proceed. `host` is the host the client asked for
17
+ * (`clientInfo(ctx).host`, which follows `trustProxy`).
18
+ */
19
+ export declare function originAllowed(policy: WSOriginPolicy | null, origin: string | null, host: string | null, hasCredentials: boolean): boolean;
20
+ //# sourceMappingURL=ws-origin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-origin.d.ts","sourceRoot":"","sources":["../src/ws-origin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,SAAS,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAA;AAWpF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAUpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,cAAc,EAAE,OAAO,GACrB,OAAO,CAQT"}
@@ -0,0 +1,41 @@
1
+ function originHost(origin) {
2
+ if (origin === "null")
3
+ return null;
4
+ try {
5
+ return new URL(origin).host.toLowerCase();
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ }
11
+ export function validateOriginPolicy(policy) {
12
+ if (policy === "*" || typeof policy === "function")
13
+ return policy;
14
+ if (Array.isArray(policy) && policy.every((o) => typeof o === "string")) {
15
+ for (const o of policy) {
16
+ if (originHost(o) === null)
17
+ throw new TypeError(`allowedOrigins: "${o}" is not an origin like https://example.com`);
18
+ }
19
+ return Object.freeze([...policy]);
20
+ }
21
+ throw new TypeError('allowedOrigins must be "*", a list of origins, or a function');
22
+ }
23
+ /**
24
+ * Whether an upgrade from `origin` may proceed. `host` is the host the client asked for
25
+ * (`clientInfo(ctx).host`, which follows `trustProxy`).
26
+ */
27
+ export function originAllowed(policy, origin, host, hasCredentials) {
28
+ if (policy === "*")
29
+ return true;
30
+ if (origin === null)
31
+ return true;
32
+ const oh = originHost(origin);
33
+ if (oh !== null && host !== null && oh === host.toLowerCase())
34
+ return true;
35
+ if (policy === null)
36
+ return !hasCredentials;
37
+ if (typeof policy === "function")
38
+ return policy(origin) === true;
39
+ return policy.includes(origin);
40
+ }
41
+ //# sourceMappingURL=ws-origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-origin.js","sourceRoot":"","sources":["../src/ws-origin.ts"],"names":[],"mappings":"AAcA,SAAS,UAAU,CAAC,MAAc;IACjC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAClC,IAAI,CAAC;QACJ,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAe;IACnD,IAAI,MAAM,KAAK,GAAG,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAwB,CAAA;IACnF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QACzE,KAAK,MAAM,CAAC,IAAI,MAAkB,EAAE,CAAC;YACpC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI;gBACzB,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,6CAA6C,CAAC,CAAA;QACzF,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAI,MAAmB,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAA;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC5B,MAA6B,EAC7B,MAAqB,EACrB,IAAmB,EACnB,cAAuB;IAEvB,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAChC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAA;IAC1E,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,CAAC,cAAc,CAAA;IAC3C,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAChE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC/B,CAAC"}
package/dist/yaml.d.ts CHANGED
@@ -1,4 +1,18 @@
1
- /** JSON-compatible YAML 1.2 emitter — same document as JSON.stringify, different encoding. */
1
+ /**
2
+ * JSON-compatible YAML 1.2 emitter: the same document as `JSON.stringify`, in a
3
+ * different encoding. Input is first normalized through JSON (so `undefined` keys
4
+ * are skipped, `Date` becomes its ISO string, `NaN` becomes `null`), then every
5
+ * string that is not plainly safe is written as a double-quoted scalar, which
6
+ * also reads the same under YAML 1.1 parsers.
7
+ */
2
8
  export declare function yamlSiblingPath(jsonPath: string): string;
9
+ /**
10
+ * Where an OpenAPI output configured at `path` is written. A `.yaml`/`.yml` path is that YAML file
11
+ * alone; any other path is JSON there plus its YAML sibling.
12
+ */
13
+ export declare function openApiOutputPaths(path: string): {
14
+ json: string | null;
15
+ yaml: string;
16
+ };
3
17
  export declare function toYaml(value: unknown): string;
4
18
  //# sourceMappingURL=yaml.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAI9F,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C"}
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAGtF;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK7C"}
package/dist/yaml.js ADDED
@@ -0,0 +1,101 @@
1
+ /**
2
+ * JSON-compatible YAML 1.2 emitter: the same document as `JSON.stringify`, in a
3
+ * different encoding. Input is first normalized through JSON (so `undefined` keys
4
+ * are skipped, `Date` becomes its ISO string, `NaN` becomes `null`), then every
5
+ * string that is not plainly safe is written as a double-quoted scalar, which
6
+ * also reads the same under YAML 1.1 parsers.
7
+ */
8
+ const INDENT = " ";
9
+ export function yamlSiblingPath(jsonPath) {
10
+ if (jsonPath.endsWith(".yaml") || jsonPath.endsWith(".yml"))
11
+ return jsonPath.replace(/\.yml$/, ".yaml");
12
+ return jsonPath.endsWith(".json") ? `${jsonPath.slice(0, -5)}.yaml` : `${jsonPath}.yaml`;
13
+ }
14
+ /**
15
+ * Where an OpenAPI output configured at `path` is written. A `.yaml`/`.yml` path is that YAML file
16
+ * alone; any other path is JSON there plus its YAML sibling.
17
+ */
18
+ export function openApiOutputPaths(path) {
19
+ if (path.endsWith(".yaml") || path.endsWith(".yml"))
20
+ return { json: null, yaml: path };
21
+ return { json: path, yaml: yamlSiblingPath(path) };
22
+ }
23
+ export function toYaml(value) {
24
+ const json = JSON.stringify(value);
25
+ /* JSON.stringify(undefined) is undefined; emit the JSON equivalent of "nothing". */
26
+ const normalized = json === undefined ? null : JSON.parse(json);
27
+ return `${emit(normalized, 0)}\n`;
28
+ }
29
+ function emit(value, indent) {
30
+ if (value === null)
31
+ return "null";
32
+ if (typeof value === "boolean")
33
+ return value ? "true" : "false";
34
+ if (typeof value === "number")
35
+ return String(value);
36
+ if (typeof value === "string")
37
+ return emitString(value);
38
+ if (Array.isArray(value))
39
+ return emitArray(value, indent);
40
+ return emitObject(value, indent);
41
+ }
42
+ /*
43
+ * A plain scalar is used only for a conservative shape: starts with a letter,
44
+ * `_`, `/` or `$`; contains only word characters, `.`, `/`, `$`, `-`, `+`,
45
+ * `{}`, `()` and inner spaces. That excludes every indicator, `: `, ` #`,
46
+ * leading digits (numbers, YAML 1.1 octal and sexagesimal), and `.inf`/`.nan`.
47
+ */
48
+ const PLAIN_RE = /^[A-Za-z_/$](?:[\w./${}()+-]| (?! ))*$/;
49
+ /* Words YAML 1.1 or 1.2 resolves to null or a boolean. */
50
+ const RESERVED_RE = /^(?:y|n|yes|no|on|off|true|false|null|~)$/i;
51
+ function emitString(value) {
52
+ if (PLAIN_RE.test(value) && !value.endsWith(" ") && !RESERVED_RE.test(value))
53
+ return value;
54
+ return quote(value);
55
+ }
56
+ /*
57
+ * JSON string syntax is a valid YAML double-quoted scalar, except that YAML
58
+ * forbids raw DEL, C1 controls (other than NEL) and the BOM/non-characters.
59
+ */
60
+ function quote(value) {
61
+ return JSON.stringify(value).replace(/[\u007f-\u0084\u0086-\u009f￾￿]/g, (ch) => `\\u${ch.charCodeAt(0).toString(16).padStart(4, "0")}`);
62
+ }
63
+ function isNonEmptyCollection(value) {
64
+ if (Array.isArray(value))
65
+ return value.length > 0;
66
+ return value !== null && typeof value === "object" && Object.keys(value).length > 0;
67
+ }
68
+ function emitArray(value, indent) {
69
+ if (value.length === 0)
70
+ return "[]";
71
+ const pad = INDENT.repeat(indent);
72
+ const childPad = INDENT.repeat(indent + 1);
73
+ return value
74
+ .map((item) => {
75
+ if (isNonEmptyCollection(item)) {
76
+ const inner = emit(item, indent + 1);
77
+ const lines = inner.split("\n");
78
+ const first = lines[0]?.startsWith(childPad) ? lines[0].slice(childPad.length) : (lines[0] ?? "");
79
+ return [`${pad}- ${first}`, ...lines.slice(1)].join("\n");
80
+ }
81
+ return `${pad}- ${emit(item, 0)}`;
82
+ })
83
+ .join("\n");
84
+ }
85
+ function emitObject(value, indent) {
86
+ const keys = Object.keys(value);
87
+ if (keys.length === 0)
88
+ return "{}";
89
+ const pad = INDENT.repeat(indent);
90
+ return keys
91
+ .map((key) => {
92
+ const child = value[key];
93
+ const renderedKey = emitString(key);
94
+ if (isNonEmptyCollection(child)) {
95
+ return `${pad}${renderedKey}:\n${emit(child, indent + 1)}`;
96
+ }
97
+ return `${pad}${renderedKey}: ${emit(child, 0)}`;
98
+ })
99
+ .join("\n");
100
+ }
101
+ //# sourceMappingURL=yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.js","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,9 @@
2
2
 
3
3
  ## Status
4
4
 
5
- Draft
5
+ Implemented. Generated route types narrow `invalidate` to the selector union, and generation
6
+ validates every authored selector against the route graph (a selector that names no route fails
7
+ `honey generate`; duplicates are removed). See "Validation Rules".
6
8
 
7
9
  ## Goal
8
10
 
@@ -74,6 +76,8 @@ Reason:
74
76
 
75
77
  ### Mutation Invalidating Collection Read
76
78
 
79
+ <!-- snippet:skip -->
80
+
77
81
  ```ts
78
82
  .meta({
79
83
  operationId: "project.create",
@@ -83,6 +87,8 @@ Reason:
83
87
 
84
88
  ### Mutation Invalidating Collection And Entity Reads
85
89
 
90
+ <!-- snippet:skip -->
91
+
86
92
  ```ts
87
93
  .meta({
88
94
  operationId: "project.update",
@@ -95,6 +101,8 @@ Reason:
95
101
 
96
102
  ### Mutation Invalidating Query-Like POST Reads
97
103
 
104
+ <!-- snippet:skip -->
105
+
98
106
  ```ts
99
107
  .meta({
100
108
  operationId: "project.import",
@@ -148,12 +156,16 @@ type GeneratedInvalidateRoute =
148
156
 
149
157
  Then the generated meta type becomes effectively:
150
158
 
159
+ <!-- snippet:skip -->
160
+
151
161
  ```ts
152
162
  invalidate?: readonly GeneratedInvalidateRoute[] | null
153
163
  ```
154
164
 
155
165
  If generated route-aware types are unavailable, the type falls back to:
156
166
 
167
+ <!-- snippet:skip -->
168
+
157
169
  ```ts
158
170
  readonly string[] | null
159
171
  ```
package/docs/meta-spec.md CHANGED
@@ -7,6 +7,8 @@ Status: implemented in `@lovrozagar/honey` (tree of record: `packages/core`).
7
7
  Before this feature, `generateOpenApi` mapped route meta onto the operation object with a
8
8
  hardcoded allowlist of eight fields:
9
9
 
10
+ <!-- snippet:skip -->
11
+
10
12
  ```ts
11
13
  summary, description, tags, deprecated, operationId, security, invalidate → x-invalidate, mcp → x-mcp
12
14
  ```
@@ -141,6 +143,8 @@ response, the query descriptor on the search input.
141
143
  `read` plus `match` expresses that. Several entries read one key and are told apart by the union's
142
144
  discriminant:
143
145
 
146
+ <!-- snippet:skip -->
147
+
144
148
  ```ts
145
149
  schema: {
146
150
  entityFacts: {
@@ -202,6 +206,8 @@ design assumes.
202
206
 
203
207
  ### 2.4 Profiles (multi-document)
204
208
 
209
+ <!-- snippet:skip -->
210
+
205
211
  ```ts
206
212
  profiles: {
207
213
  public: { include: ["x-entity", "x-query"] }, // default-deny — preferred
@@ -224,6 +230,8 @@ things to withhold is genuinely shorter than the list to publish.
224
230
 
225
231
  - A document selects a profile:
226
232
 
233
+ <!-- snippet:skip -->
234
+
227
235
  ```ts
228
236
  codegen: {
229
237
  openApi: [
@@ -245,6 +253,8 @@ covers "never, anywhere".
245
253
 
246
254
  `OpenApiMeta` now carries:
247
255
 
256
+ <!-- snippet:skip -->
257
+
248
258
  ```ts
249
259
  extensions?: Record<`x-${string}`, unknown>
250
260
  ```
@@ -263,6 +273,8 @@ separation, and fails on nothing.
263
273
  A fact enforced by middleware should not be retyped on every route it protects. Middleware can
264
274
  contribute meta to every route that mounts it:
265
275
 
276
+ <!-- snippet:skip -->
277
+
266
278
  ```ts
267
279
  export const shard = createMiddleware(fn, { meta: { tenant: "project_id" } })
268
280
  // or: defineMiddleware({ fn, errors: […], meta: { tenant: "project_id" } })
@@ -279,26 +291,26 @@ one, because it makes a consumer confident about the wrong parameter.
279
291
  Rules:
280
292
 
281
293
  - **Explicit always wins.** Chain `.meta()` and route `.meta()` both outrank a contributed value.
282
- Among middleware, later mount order wins.
294
+ Among middleware, the one that runs later wins: chain, then scoped, then route level.
283
295
  - **Contributed meta is real meta.** It lands in the route's `mt`, so it appears on `ctx.meta`, in
284
296
  the manifest, and — critically — it is subject to the policy. A middleware cannot smuggle an
285
297
  untagged fact into the document: with `strict: "error"`, contributing `sla` with no policy entry
286
298
  fails the build exactly as writing it on a route would.
287
- - **A scoped middleware registered after its routes still reaches them.** `.use("/prefix", mw)`
288
- back-fills already-registered handlers, mirroring what honey already does for scoped error keys.
289
- A tag missing where enforcement happens is the failure direction that matters.
299
+ - **A scoped middleware registered after its routes still reaches them.** Meta is resolved from
300
+ the chain each route runs when the app finalizes, so registration order does not matter, and a
301
+ route mounted with `.route(sub)` gets the meta of the chain it is mounted on. A tag missing where
302
+ enforcement happens is the failure direction that matters.
290
303
  - **`internal` may not be contributed.** It controls whether a route appears in generated artifacts
291
304
  at all; a middleware that removed 104 routes from the document would be invisible in both the
292
305
  route and the middleware. `createMiddleware` throws.
293
306
 
294
- ### Why it is resolved at registration, not per request
307
+ ### Why it is resolved at finalize, not per request
295
308
 
296
- The precompiled route tree bakes `mt` as a JSON literal (`mw` is never serialized), and
297
- `.routeTree()` patch mode deliberately does not overwrite `mt` — the baked value is what production
298
- serves. Contributed meta is therefore collected once, when the route registers, so the JIT and
299
- precompiled paths cannot disagree. A lazily-derived value would produce one answer in development
300
- and a different, stale one in production — the exact class of divergence this feature exists to
301
- remove. The usual contract applies: change what a middleware contributes, regenerate.
309
+ Contributed meta is collected once, when the app finalizes (first request, `toRouteTree()` or
310
+ codegen), from the same resolved chain the route runs — so the request path, `ctx.meta`, the
311
+ manifest and the document cannot disagree, with or without a loaded route tree. A lazily-derived
312
+ value per request would make the served meta depend on timing. The generated `routes.gen.ts` carries
313
+ the meta of the generating build; change what a middleware contributes, then regenerate.
302
314
 
303
315
  ### Two things to put in a release note
304
316
 
@@ -326,6 +338,8 @@ stamped with `searchable: null` or `tenantColumn: null` means _"I don't know"_,
326
338
  straight through publishes `"x-searchable": null`, which a consumer reads as _"nothing is
327
339
  searchable"_ — a confident wrong answer, worse than silence. Normalize in the policy:
328
340
 
341
+ <!-- snippet:skip -->
342
+
329
343
  ```ts
330
344
  expand: (e) => ({
331
345
  "x-entity": e.table,
@@ -423,6 +437,8 @@ Every message carries `method`, `path`, source key and target key.
423
437
 
424
438
  ## 6. Validating what is emitted
425
439
 
440
+ <!-- snippet:skip -->
441
+
426
442
  ```ts
427
443
  rateLimit: {
428
444
  key: "x-rate-limit",
@@ -451,9 +467,17 @@ eight mappings, unchanged, with the same truthiness gates and the same emit orde
451
467
  | `security` | `security` (normalized) | truthy | ✓ | — |
452
468
  | `invalidate` | `x-invalidate` | array, non-empty | ✓ | — |
453
469
  | `mcp` | `x-mcp` | `=== true` | ✓ | — |
454
- | `internal` | _hidden_ | — | — | — |
470
+ | `internal` | _route left out_ | `=== true` | — | — |
455
471
  | `extensions` | verbatim passthrough | — | ✓ | ✓ |
456
472
 
473
+ A route with `internal: true` is left out of the served and generated OpenAPI document and the
474
+ served `/manifest.json`; it still serves requests and still appears in `types.gen.d.ts`, so
475
+ services can type against it. `security` must be a scheme name, a list of names, a list of name
476
+ groups, or standard requirement objects — anything else fails generation instead of documenting the
477
+ route as public — and every scheme it names must be in `securitySchemes`. `invalidate` selectors
478
+ must name a registered route (`"GET /users/:id"`); a selector that names nothing fails generation
479
+ unless the document is generated with `invalidate: "off"`.
480
+
457
481
  The WS column reproduces the previous WS mapping exactly (it was a strict subset). App entries
458
482
  default to `on: "both"`; the asymmetry is preserved only for the built-ins.
459
483