@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
@@ -3,21 +3,70 @@ import type { StandardSchemaLike } from "./types.ts"
3
3
  const SAFE_KEY_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/
4
4
  const LAZY_ALIAS_CAP = 64
5
5
 
6
- function quoteKey(key: string): string {
7
- return SAFE_KEY_RE.test(key) ? key : `"${key}"`
6
+ /** A property key in a type literal: bare when it is an identifier, a string literal otherwise. */
7
+ export function quoteKey(key: string): string {
8
+ return SAFE_KEY_RE.test(key) ? key : JSON.stringify(key)
8
9
  }
9
10
 
10
- /** Wrap element type in parens when it contains union/intersection before appending [] */
11
- function arrayOf(el: string): string {
12
- return el.includes("|") || el.includes("&") ? `(${el})[]` : `${el}[]`
11
+ /** A TypeScript literal type for a runtime value; anything without one widens to its type. */
12
+ export function literalType(value: unknown): string {
13
+ if (value === null) return "null"
14
+ if (value === undefined) return "undefined"
15
+ if (typeof value === "string") return JSON.stringify(value)
16
+ if (typeof value === "boolean") return String(value)
17
+ if (typeof value === "bigint") return `${value}n`
18
+ if (typeof value === "number") return Number.isFinite(value) ? String(value) : "number"
19
+ if (typeof value === "symbol") return "symbol"
20
+ return "unknown"
21
+ }
22
+
23
+ /**
24
+ * Does `type` contain `token` outside every bracket and string? `A | B` does; `{ a: A | B }`
25
+ * and `Array<A | B>` do not. Used to parenthesize only where precedence needs it.
26
+ */
27
+ function hasTopLevel(type: string, token: "|" | "&" | "=>"): boolean {
28
+ let depth = 0
29
+ let quote: string | null = null
30
+ for (let i = 0; i < type.length; i++) {
31
+ const c = type[i]
32
+ if (quote !== null) {
33
+ if (c === "\\") i++
34
+ else if (c === quote) quote = null
35
+ continue
36
+ }
37
+ if (c === '"' || c === "'" || c === "`") quote = c
38
+ else if (c === "(" || c === "{" || c === "[" || c === "<") depth++
39
+ else if (c === ")" || c === "}" || c === "]" || (c === ">" && type[i - 1] !== "=")) depth--
40
+ else if (depth === 0 && type.startsWith(token, i)) return true
41
+ }
42
+ return false
43
+ }
44
+
45
+ /** Wrap element type in parens when union, intersection or function binds looser than `[]` */
46
+ export function arrayOf(el: string): string {
47
+ return hasTopLevel(el, "|") || hasTopLevel(el, "&") || hasTopLevel(el, "=>") ? `(${el})[]` : `${el}[]`
48
+ }
49
+
50
+ export function unionOf(parts: string[]): string {
51
+ const unique = [...new Set(parts)]
52
+ if (unique.length === 0) return "never"
53
+ return unique.map((p) => (hasTopLevel(p, "=>") ? `(${p})` : p)).join(" | ")
54
+ }
55
+
56
+ /** `(A | B) & C`, never `A | B & C` — `&` binds tighter than `|`. */
57
+ export function intersectionOf(parts: string[]): string {
58
+ return parts.map((p) => (hasTopLevel(p, "|") || hasTopLevel(p, "=>") ? `(${p})` : p)).join(" & ")
13
59
  }
14
60
 
15
61
  /**
16
- * Collects named aliases for recursive `z.lazy` schemas so `generateTypes`
17
- * can hoist `type _LazyN = …` before `Routes`.
62
+ * Collects named aliases for recursive schemas — `z.lazy`, and Zod 4 getter recursion
63
+ * (`get children() { return z.array(Node) }`) — so `generateTypes` can hoist `type _LazyN = …`
64
+ * before `Routes`.
18
65
  */
19
66
  export type TypeEmitState = {
20
67
  aliases: Map<string, string>
68
+ /** Schemas being emitted right now; re-entering one is recursion and gets a name */
69
+ inProgress: Map<object, { name: string | null }>
21
70
  lazyNames: WeakMap<object, string>
22
71
  nextId: number
23
72
  reserved: Set<string>
@@ -26,6 +75,7 @@ export type TypeEmitState = {
26
75
  export function createTypeEmitState(): TypeEmitState {
27
76
  return {
28
77
  aliases: new Map(),
78
+ inProgress: new Map(),
29
79
  lazyNames: new WeakMap(),
30
80
  nextId: 0,
31
81
  reserved: new Set(),
@@ -43,7 +93,7 @@ export function createTypeEmitState(): TypeEmitState {
43
93
  export function emitSchemaType(schema: StandardSchemaLike, state?: TypeEmitState): string {
44
94
  const vendor = schema["~standard"].vendor
45
95
  if (vendor === "zod") return emitZod(schema, state ?? createTypeEmitState())
46
- if (vendor === "valibot") return emitValibot(schema)
96
+ if (vendor === "valibot") return emitValibot(schema, 0)
47
97
  if (vendor === "arktype") return emitArkType(schema)
48
98
  if (vendor === "yup") return emitYup(schema)
49
99
  if (vendor === "effect") return emitEffect(schema)
@@ -62,7 +112,9 @@ function zodIsOptional(def: Record<string, unknown>): boolean {
62
112
  t === "ZodDefault" ||
63
113
  t === "default" ||
64
114
  t === "ZodCatch" ||
65
- t === "catch"
115
+ t === "catch" ||
116
+ t === "ZodReadonly" ||
117
+ t === "readonly"
66
118
  ) {
67
119
  const inner = def.innerType as unknown
68
120
  if (inner) return zodIsOptional(zodDef(inner))
@@ -129,7 +181,46 @@ function typeRefersToReserved(typeStr: string, state: TypeEmitState): boolean {
129
181
  return false
130
182
  }
131
183
 
184
+ /** Values of a TS enum object, without the reverse mappings numeric enums carry (`{ A: 0, "0": "A" }`). */
185
+ function enumValues(entries: Record<string, unknown>): unknown[] {
186
+ return Object.keys(entries)
187
+ .filter((k) => typeof entries[entries[k] as string] !== "number")
188
+ .map((k) => entries[k])
189
+ }
190
+
191
+ /**
192
+ * Recursion guard for schemas that refer to themselves without `z.lazy` (Zod 4 getters). The
193
+ * first visit emits the body; a visit while the body is still being emitted names the schema,
194
+ * and the finished body becomes that alias.
195
+ */
132
196
  function emitZod(schema: unknown, state: TypeEmitState): string {
197
+ if (schema === null || typeof schema !== "object") return emitZodNode(schema, state)
198
+ /* a z.lazy names itself before emitting its body */
199
+ const known = state.lazyNames.get(schema)
200
+ if (known !== undefined) return known
201
+ const active = state.inProgress.get(schema)
202
+ if (active !== undefined) {
203
+ if (active.name === null) {
204
+ if (state.nextId >= LAZY_ALIAS_CAP) return "unknown"
205
+ active.name = `_Lazy${state.nextId++}`
206
+ state.reserved.add(active.name)
207
+ }
208
+ return active.name
209
+ }
210
+ const entry: { name: string | null } = { name: null }
211
+ state.inProgress.set(schema, entry)
212
+ try {
213
+ const body = emitZodNode(schema, state)
214
+ if (entry.name === null) return body
215
+ state.aliases.set(entry.name, body)
216
+ state.lazyNames.set(schema, entry.name)
217
+ return entry.name
218
+ } finally {
219
+ state.inProgress.delete(schema)
220
+ }
221
+ }
222
+
223
+ function emitZodNode(schema: unknown, state: TypeEmitState): string {
133
224
  const stamped = zodTsTypeMeta(schema)
134
225
  if (stamped) return stamped
135
226
 
@@ -140,19 +231,27 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
140
231
  switch (typeName) {
141
232
  case "ZodString":
142
233
  case "string":
234
+ case "template_literal":
143
235
  return "string"
144
236
  case "ZodNumber":
145
237
  case "number":
238
+ case "nan":
146
239
  return "number"
147
240
  case "ZodBoolean":
148
241
  case "boolean":
242
+ case "success":
149
243
  return "boolean"
150
244
  case "ZodBigInt":
151
245
  case "bigint":
152
246
  return "bigint"
247
+ case "ZodSymbol":
248
+ case "symbol":
249
+ return "symbol"
153
250
  case "ZodDate":
154
251
  case "date":
155
252
  return "Date"
253
+ case "file":
254
+ return "File"
156
255
  case "ZodUndefined":
157
256
  case "undefined":
158
257
  return "undefined"
@@ -166,30 +265,23 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
166
265
  case "ZodUnknown":
167
266
  case "any":
168
267
  case "unknown":
268
+ case "custom":
169
269
  return "unknown"
170
270
  case "ZodNever":
171
271
  case "never":
172
272
  return "never"
173
273
  case "ZodLiteral":
174
274
  case "literal": {
175
- /* v4: single value, v3: values array */
176
- const val = def.value as unknown
177
- if (val !== undefined) return typeof val === "string" ? `"${val}"` : String(val)
178
- const values = def.values as unknown[]
179
- if (values.length === 1) {
180
- const v0 = values[0]
181
- return typeof v0 === "string" ? `"${v0}"` : String(v0)
182
- }
183
- return values.map((v0) => (typeof v0 === "string" ? `"${v0}"` : String(v0))).join(" | ")
275
+ /* v4: values array, v3: single value */
276
+ const values = Array.isArray(def.values) ? (def.values as unknown[]) : [def.value]
277
+ return unionOf(values.map(literalType))
184
278
  }
185
279
  case "ZodEnum":
186
280
  case "enum": {
187
- /* v4: values array, v3/mini: entries record */
281
+ /* v4: entries record, v3: values array */
188
282
  const vals = (def.values ?? def.entries) as unknown
189
- if (Array.isArray(vals)) return vals.map((v0) => `"${v0}"`).join(" | ")
190
- return Object.values(vals as Record<string, string>)
191
- .map((v0) => `"${v0}"`)
192
- .join(" | ")
283
+ const list = Array.isArray(vals) ? vals : enumValues(vals as Record<string, unknown>)
284
+ return unionOf(list.map(literalType))
193
285
  }
194
286
  case "ZodObject":
195
287
  case "object": {
@@ -210,28 +302,46 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
210
302
  return arrayOf(emitZod((def.type ?? def.element) as unknown, state))
211
303
  case "array":
212
304
  return arrayOf(emitZod(def.element as unknown, state))
305
+ case "ZodSet":
306
+ case "set":
307
+ return `Set<${emitZod(def.valueType as unknown, state)}>`
308
+ case "ZodMap":
309
+ case "map":
310
+ return `Map<${emitZod(def.keyType as unknown, state)}, ${emitZod(def.valueType as unknown, state)}>`
311
+ case "ZodPromise":
312
+ case "promise":
313
+ return `Promise<${emitZod(def.innerType as unknown, state)}>`
314
+ case "ZodFunction":
315
+ case "function":
316
+ return "(...args: never[]) => unknown"
213
317
  case "ZodOptional":
214
318
  case "optional":
215
- return `${emitZod(def.innerType as unknown, state)} | undefined`
319
+ return unionOf([emitZod(def.innerType as unknown, state), "undefined"])
320
+ case "nonoptional":
321
+ return `Exclude<${emitZod(def.innerType as unknown, state)}, undefined>`
216
322
  case "ZodNullable":
217
323
  case "nullable":
218
- return `${emitZod(def.innerType as unknown, state)} | null`
324
+ return unionOf([emitZod(def.innerType as unknown, state), "null"])
219
325
  case "ZodUnion":
220
326
  case "ZodDiscriminatedUnion":
221
327
  case "union":
222
- return (def.options as unknown[]).map((o) => emitZod(o, state)).join(" | ")
328
+ return unionOf((def.options as unknown[]).map((o) => emitZod(o, state)))
223
329
  case "ZodIntersection":
224
330
  case "intersection":
225
- return `${emitZod(def.left as unknown, state)} & ${emitZod(def.right as unknown, state)}`
331
+ return intersectionOf([emitZod(def.left as unknown, state), emitZod(def.right as unknown, state)])
226
332
  case "ZodRecord":
227
333
  case "record":
228
334
  return emitZodRecord(emitZod(def.keyType as unknown, state), emitZod(def.valueType as unknown, state), state)
229
335
  case "ZodTuple":
230
- case "tuple":
231
- return `[${(def.items as unknown[]).map((i) => emitZod(i, state)).join(", ")}]`
336
+ case "tuple": {
337
+ const items = (def.items as unknown[]).map((i) => emitZod(i, state))
338
+ if (def.rest) items.push(`...${arrayOf(emitZod(def.rest as unknown, state))}`)
339
+ return `[${items.join(", ")}]`
340
+ }
232
341
  case "ZodDefault":
233
342
  case "ZodCatch":
234
343
  case "default":
344
+ case "prefault":
235
345
  case "catch":
236
346
  return emitZod(def.innerType as unknown, state)
237
347
  case "ZodReadonly":
@@ -246,6 +356,7 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
246
356
  case "lazy":
247
357
  return emitZodLazy(schema, def, state)
248
358
  default:
359
+ /* a transform's output is whatever the function returns — the schema cannot say */
249
360
  return "unknown"
250
361
  }
251
362
  }
@@ -280,22 +391,35 @@ function emitZodLazy(schema: unknown, def: Record<string, unknown>, state: TypeE
280
391
 
281
392
  /* ---- Valibot emitter ---- */
282
393
 
283
- function emitValibot(schema: unknown): string {
394
+ const VALIBOT_OPTIONAL = new Set(["exact_optional", "nullish", "optional", "undefinedable"])
395
+ /** Lazy schemas can recurse without end; past this depth a node is `unknown`. */
396
+ const VALIBOT_MAX_DEPTH = 32
397
+
398
+ function emitValibot(schema: unknown, depth: number): string {
399
+ if (depth > VALIBOT_MAX_DEPTH) return "unknown"
284
400
  const s = schema as Record<string, unknown>
285
401
  const type = s.type as string | undefined
286
402
  if (!type) return "unknown"
403
+ const walk = (child: unknown): string => emitValibot(child, depth + 1)
287
404
 
288
405
  switch (type) {
289
406
  case "string":
290
407
  return "string"
291
408
  case "number":
409
+ case "nan":
292
410
  return "number"
293
411
  case "boolean":
294
412
  return "boolean"
295
413
  case "bigint":
296
414
  return "bigint"
415
+ case "symbol":
416
+ return "symbol"
297
417
  case "date":
298
418
  return "Date"
419
+ case "file":
420
+ return "File"
421
+ case "blob":
422
+ return "Blob"
299
423
  case "undefined":
300
424
  return "undefined"
301
425
  case "null":
@@ -307,48 +431,68 @@ function emitValibot(schema: unknown): string {
307
431
  return "unknown"
308
432
  case "never":
309
433
  return "never"
310
- case "literal": {
311
- const val = s.literal as unknown
312
- return typeof val === "string" ? `"${val}"` : String(val)
313
- }
314
- case "enum": {
315
- const enumObj = s.enum as Record<string, string>
316
- return Object.values(enumObj)
317
- .map((val) => `"${val}"`)
318
- .join(" | ")
319
- }
320
- case "picklist": {
321
- const options = s.options as unknown[]
322
- return options.map((val) => (typeof val === "string" ? `"${val}"` : String(val))).join(" | ")
323
- }
324
- case "object": {
434
+ case "literal":
435
+ return literalType(s.literal)
436
+ case "enum":
437
+ return unionOf(enumValues(s.enum as Record<string, unknown>).map(literalType))
438
+ case "picklist":
439
+ return unionOf((s.options as unknown[]).map(literalType))
440
+ case "object":
441
+ case "strict_object":
442
+ case "loose_object":
443
+ case "object_with_rest": {
325
444
  const entries = s.entries as Record<string, unknown>
326
445
  const keys = Object.keys(entries)
327
- if (keys.length === 0) return "{}"
328
- return `{ ${keys
329
- .map((k) => {
330
- const propType = (entries[k] as Record<string, unknown>).type as string | undefined
331
- const isOpt = propType === "optional" || propType === "nullish"
332
- return `${quoteKey(k)}${isOpt ? "?" : ""}: ${emitValibot(entries[k])}`
333
- })
334
- .join("; ")} }`
446
+ const fields = keys.map((k) => {
447
+ const propType = (entries[k] as Record<string, unknown>).type as string | undefined
448
+ const isOpt = propType !== undefined && VALIBOT_OPTIONAL.has(propType)
449
+ return `${quoteKey(k)}${isOpt ? "?" : ""}: ${walk(entries[k])}`
450
+ })
451
+ if (type === "loose_object") fields.push("[key: string]: unknown")
452
+ if (type === "object_with_rest") fields.push(`[key: string]: ${unionOf([walk(s.rest), "unknown"])}`)
453
+ if (fields.length === 0) return "{}"
454
+ return `{ ${fields.join("; ")} }`
335
455
  }
336
456
  case "array":
337
- return arrayOf(emitValibot(s.item as unknown))
457
+ return arrayOf(walk(s.item))
458
+ case "set":
459
+ return `Set<${walk(s.value)}>`
460
+ case "map":
461
+ return `Map<${walk(s.key)}, ${walk(s.value)}>`
338
462
  case "optional":
339
- return `${emitValibot(s.wrapped as unknown)} | undefined`
463
+ case "exact_optional":
464
+ case "undefinedable":
465
+ return unionOf([walk(s.wrapped), "undefined"])
340
466
  case "nullable":
341
- return `${emitValibot(s.wrapped as unknown)} | null`
467
+ return unionOf([walk(s.wrapped), "null"])
342
468
  case "nullish":
343
- return `${emitValibot(s.wrapped as unknown)} | null | undefined`
469
+ return unionOf([walk(s.wrapped), "null", "undefined"])
470
+ case "non_optional":
471
+ return `Exclude<${walk(s.wrapped)}, undefined>`
472
+ case "non_nullable":
473
+ return `Exclude<${walk(s.wrapped)}, null>`
474
+ case "non_nullish":
475
+ return `NonNullable<${walk(s.wrapped)}>`
344
476
  case "union":
345
- return (s.options as unknown[]).map((o) => emitValibot(o)).join(" | ")
477
+ case "variant":
478
+ return unionOf((s.options as unknown[]).map(walk))
346
479
  case "intersect":
347
- return (s.options as unknown[]).map((o) => emitValibot(o)).join(" & ")
480
+ return intersectionOf((s.options as unknown[]).map(walk))
348
481
  case "record":
349
- return `Record<${emitValibot(s.key as unknown)}, ${emitValibot(s.value as unknown)}>`
482
+ return `Record<${walk(s.key)}, ${walk(s.value)}>`
350
483
  case "tuple":
351
- return `[${(s.items as unknown[]).map((i) => emitValibot(i)).join(", ")}]`
484
+ case "strict_tuple":
485
+ case "loose_tuple":
486
+ case "tuple_with_rest": {
487
+ const items = (s.items as unknown[]).map(walk)
488
+ if (type === "tuple_with_rest") items.push(`...${arrayOf(walk(s.rest))}`)
489
+ if (type === "loose_tuple") items.push("...unknown[]")
490
+ return `[${items.join(", ")}]`
491
+ }
492
+ case "lazy": {
493
+ const getter = s.getter as ((input: unknown) => unknown) | undefined
494
+ return typeof getter === "function" ? walk(getter(undefined)) : "unknown"
495
+ }
352
496
  default:
353
497
  return "unknown"
354
498
  }
@@ -382,17 +526,16 @@ function emitArkJson(node: unknown): string {
382
526
  if (Array.isArray(node)) {
383
527
  if (node.length === 0) return "never"
384
528
  if (isBooleanUnion(node)) return "boolean"
385
- return node.map((n) => emitArkJson(n)).join(" | ")
529
+ return unionOf(node.map((n) => emitArkJson(n)))
386
530
  }
387
531
 
388
532
  const obj = node as Record<string, unknown>
389
533
 
390
534
  if ("unit" in obj) {
391
535
  const val = obj.unit
392
- if (val === null) return "null"
393
536
  /* arktype serializes undefined as the string "undefined" in JSON */
394
537
  if (val === "undefined") return "undefined"
395
- return typeof val === "string" ? `"${val}"` : String(val)
538
+ return literalType(val)
396
539
  }
397
540
 
398
541
  if ("sequence" in obj) {
@@ -486,9 +629,8 @@ function emitYup(schema: unknown): string {
486
629
  }
487
630
 
488
631
  function emitYupDesc(desc: YupDesc): string {
489
- let base = emitYupBase(desc)
490
- if (desc.nullable) base = `${base} | null`
491
- return base
632
+ const base = emitYupBase(desc)
633
+ return desc.nullable ? unionOf([base, "null"]) : base
492
634
  }
493
635
 
494
636
  function emitYupBase(desc: YupDesc): string {
@@ -522,9 +664,7 @@ function emitYupBase(desc: YupDesc): string {
522
664
  return `[${desc.innerType.map((i) => emitYupDesc(i)).join(", ")}]`
523
665
  }
524
666
  case "mixed": {
525
- if (desc.oneOf && desc.oneOf.length > 0) {
526
- return desc.oneOf.map((val) => (typeof val === "string" ? `"${val}"` : String(val))).join(" | ")
527
- }
667
+ if (desc.oneOf && desc.oneOf.length > 0) return unionOf(desc.oneOf.map(literalType))
528
668
  return "unknown"
529
669
  }
530
670
  case "lazy":
@@ -543,7 +683,7 @@ type EffectAST = {
543
683
  literal?: unknown
544
684
  propertySignatures?: Array<{
545
685
  isOptional: boolean
546
- name: string
686
+ name: string | symbol
547
687
  type: EffectAST
548
688
  }>
549
689
  rest?: Array<{ type: EffectAST }>
@@ -580,13 +720,10 @@ function emitEffectAst(ast: EffectAST): string {
580
720
  return "never"
581
721
  case "ObjectKeyword":
582
722
  return "object"
583
- case "Literal": {
584
- const val = ast.literal
585
- if (val === null) return "null"
586
- return typeof val === "string" ? `"${val}"` : String(val)
587
- }
723
+ case "Literal":
724
+ return literalType(ast.literal)
588
725
  case "Union":
589
- return (ast.types ?? []).map((t) => emitEffectAst(t)).join(" | ")
726
+ return unionOf((ast.types ?? []).map((t) => emitEffectAst(t)))
590
727
  case "TypeLiteral": {
591
728
  const props = ast.propertySignatures ?? []
592
729
  const idxSigs = ast.indexSignatures ?? []
@@ -594,23 +731,24 @@ function emitEffectAst(ast: EffectAST): string {
594
731
  if (props.length === 0 && idxSigs.length === 1) {
595
732
  return `Record<${emitEffectAst(idxSigs[0].parameter)}, ${emitEffectAst(idxSigs[0].type)}>`
596
733
  }
597
- const parts = props.map((p) => {
598
- const opt = p.isOptional ? "?" : ""
599
- return `${quoteKey(p.name as string)}${opt}: ${emitEffectAst(p.type)}`
600
- })
734
+ const parts = props
735
+ .filter((p) => typeof p.name === "string")
736
+ .map((p) => {
737
+ const opt = p.isOptional ? "?" : ""
738
+ return `${quoteKey(p.name as string)}${opt}: ${emitEffectAst(p.type)}`
739
+ })
601
740
  return `{ ${parts.join("; ")} }`
602
741
  }
603
742
  case "TupleType": {
604
743
  const elems = ast.elements ?? []
605
- const rest = ast.rest
606
- if (elems.length === 0 && rest && rest.length === 1) {
607
- return arrayOf(emitEffectAst(rest[0].type))
608
- }
609
- if (elems.length > 0 && (!rest || rest.length === 0)) {
610
- return `[${elems.map((e) => emitEffectAst(e.type)).join(", ")}]`
744
+ const rest = ast.rest ?? []
745
+ const items = elems.map((e) => `${emitEffectAst(e.type)}${e.isOptional ? "?" : ""}`)
746
+ if (rest.length > 0) {
747
+ if (items.length === 0 && rest.length === 1) return arrayOf(emitEffectAst(rest[0].type))
748
+ items.push(`...${arrayOf(emitEffectAst(rest[0].type))}`)
749
+ for (const tail of rest.slice(1)) items.push(emitEffectAst(tail.type))
611
750
  }
612
- if (elems.length === 0) return "unknown[]"
613
- return `[${elems.map((e) => emitEffectAst(e.type)).join(", ")}]`
751
+ return `[${items.join(", ")}]`
614
752
  }
615
753
  case "Declaration":
616
754
  return "unknown"