@lovrozagar/honey 0.6.8 → 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 +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 +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 +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 +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,173 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { builtinModules } from "node:module";
3
+ import { extname, resolve } from "node:path";
4
+ import { detectFeaturesInSource, FEATURES, featurePrelude, scanProgram } from "../feature-detect.js";
5
+ /* ---- Entry helpers ---- */
6
+ function importApp(entry, exportName) {
7
+ if (exportName === "default")
8
+ return `import app from "./${entry}"`;
9
+ return `import { ${exportName} as app } from "./${entry}"`;
10
+ }
11
+ /* server targets start through the same code path as `app.serve()`: WS adapter, env, hostname */
12
+ function serverEntry(config, runtime, env, port) {
13
+ return [
14
+ 'import { startHoneyServer } from "@lovrozagar/honey/serve"',
15
+ importApp(config.entry, config.export),
16
+ "",
17
+ `const port = Number(${port})`,
18
+ `await startHoneyServer(app, { env: ${env}, hostname: "0.0.0.0", port, runtime: "${runtime}" })`,
19
+ ].join("\n");
20
+ }
21
+ /* ---- Adapter definitions ---- */
22
+ const adapters = {
23
+ bun: {
24
+ entry: (config) => serverEntry(config, "bun", "process.env", `process.env.PORT ?? ${config.port}`),
25
+ noExternal: false,
26
+ skipFeatures: [],
27
+ ssrTarget: "node",
28
+ },
29
+ cloudflare: {
30
+ entry(config) {
31
+ return [
32
+ importApp(config.entry, config.export),
33
+ "",
34
+ "export default {",
35
+ " fetch: (req, env, ctx) => app.fetch(req, env, ctx),",
36
+ "}",
37
+ ].join("\n");
38
+ },
39
+ noExternal: true,
40
+ /* a Worker cannot listen; serve would pull node:http into the bundle */
41
+ skipFeatures: ["serve"],
42
+ ssrTarget: "webworker",
43
+ },
44
+ deno: {
45
+ entry: (config) => serverEntry(config, "deno", "Deno.env.toObject()", `Deno.env.get("PORT") ?? "${config.port}"`),
46
+ noExternal: true,
47
+ skipFeatures: [],
48
+ ssrTarget: "webworker",
49
+ },
50
+ node: {
51
+ entry: (config) => serverEntry(config, "node", "process.env", `process.env.PORT ?? ${config.port}`),
52
+ noExternal: false,
53
+ skipFeatures: [],
54
+ ssrTarget: "node",
55
+ },
56
+ };
57
+ /* ---- Feature detection over the import graph ---- */
58
+ const SCANNED_EXT = /\.(?:[cm]?[jt]sx?)$/;
59
+ function langOf(file) {
60
+ const ext = extname(file);
61
+ if (ext === ".tsx")
62
+ return "tsx";
63
+ if (ext === ".jsx")
64
+ return "jsx";
65
+ return /^\.[cm]?ts$/.test(ext) ? "ts" : "js";
66
+ }
67
+ /**
68
+ * Walks the app's own modules (never node_modules) from `entry`, following static and dynamic
69
+ * imports, and collects feature calls. Comments and strings do not count.
70
+ */
71
+ async function detectGraphFeatures(ctx, entry) {
72
+ const features = new Set();
73
+ const seen = new Set();
74
+ const queue = [entry];
75
+ while (queue.length > 0) {
76
+ const file = queue.pop();
77
+ if (seen.has(file))
78
+ continue;
79
+ seen.add(file);
80
+ if (!SCANNED_EXT.test(file) || file.includes("node_modules") || !existsSync(file))
81
+ continue;
82
+ const code = readFileSync(file, "utf-8");
83
+ let imports = [];
84
+ let program;
85
+ try {
86
+ program = ctx.parse?.(code, { lang: langOf(file) });
87
+ }
88
+ catch {
89
+ program = undefined;
90
+ }
91
+ if (program) {
92
+ const scanned = scanProgram(program);
93
+ for (const f of scanned.features)
94
+ features.add(f);
95
+ imports = scanned.imports;
96
+ }
97
+ else {
98
+ for (const f of detectFeaturesInSource(code))
99
+ features.add(f);
100
+ }
101
+ if (!ctx.resolve)
102
+ continue;
103
+ for (const source of imports) {
104
+ const resolved = await ctx.resolve(source, file).catch(() => null);
105
+ if (!resolved || resolved.external || resolved.id.startsWith("\0"))
106
+ continue;
107
+ queue.push(resolved.id.split("?")[0]);
108
+ }
109
+ }
110
+ return features;
111
+ }
112
+ /* ---- Virtual module constants ---- */
113
+ const VIRTUAL_BUILD_ENTRY = "virtual:honey-build-entry";
114
+ const RESOLVED_BUILD_ENTRY = `\0${VIRTUAL_BUILD_ENTRY}`;
115
+ /* ---- Build plugin factory ---- */
116
+ export function createBuildPlugin(buildConfig, shared) {
117
+ const adapter = adapters[buildConfig.target];
118
+ const resolvedConfig = {
119
+ entry: shared.entry,
120
+ export: shared.export,
121
+ port: buildConfig.port ?? 3000,
122
+ };
123
+ let root = "";
124
+ return {
125
+ apply: "build",
126
+ config() {
127
+ return {
128
+ build: {
129
+ emptyOutDir: false,
130
+ minify: buildConfig.minify ?? true,
131
+ outDir: buildConfig.outDir ?? "./dist",
132
+ rolldownOptions: {
133
+ external: [...builtinModules, ...builtinModules.map((m) => `node:${m}`), ...(buildConfig.external ?? [])],
134
+ input: VIRTUAL_BUILD_ENTRY,
135
+ output: { entryFileNames: "index.js" },
136
+ },
137
+ ssr: true,
138
+ },
139
+ ssr: {
140
+ /* node and bun install dependencies next to the bundle; inlining them would also inline native addons */
141
+ ...(adapter.noExternal ? { noExternal: true } : {}),
142
+ target: adapter.ssrTarget,
143
+ },
144
+ };
145
+ },
146
+ configResolved(cfg) {
147
+ root = cfg.root;
148
+ },
149
+ async load(id) {
150
+ if (id !== RESOLVED_BUILD_ENTRY)
151
+ return undefined;
152
+ const appPath = resolve(root || ".", shared.entry);
153
+ const detected = await detectGraphFeatures(this ?? {}, appPath);
154
+ const features = FEATURES.filter((feature) => {
155
+ if (adapter.skipFeatures.includes(feature))
156
+ return false;
157
+ return buildConfig.features?.[feature] ?? detected.has(feature);
158
+ });
159
+ const prelude = featurePrelude(features);
160
+ return {
161
+ code: `${prelude ? `${prelude}\n` : ""}${adapter.entry(resolvedConfig)}`,
162
+ moduleType: "js",
163
+ };
164
+ },
165
+ name: "honey:build",
166
+ resolveId(id) {
167
+ if (id === VIRTUAL_BUILD_ENTRY)
168
+ return RESOLVED_BUILD_ENTRY;
169
+ return undefined;
170
+ },
171
+ };
172
+ }
173
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/build/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /** Argument parsing for the `honey` CLI. Not a package export. */
2
+ export declare const USAGE = "Usage: honey generate [options]\n honey init [--cf] [--force]\n\ngenerate options:\n --config <path> Vite config holding honey() (default: vite.config.{ts,mts,js,mjs,\u2026})\n --plugin <n> Which honey() plugin in the config, 0-based (when there are several)\n --app <path> App entry; overrides the config's app, or replaces the config\n --watch Regenerate when files next to the app change\n --tree --types --manifest --sdk\n Turn on an output\n --merge-tree <path> Route tree source for a gateway\n --cli --cli-out <dir> --cli-binary-name <name> [--cli-config-name <name>]\n [--cli-default-base-url <url>] [--cli-env-prefix <prefix>] [--cli-module-path <path>]\n [--cli-sdk-module-path <path>]\n Generate the Go CLI\n -h, --help Show this help";
3
+ export declare class UsageError extends Error {
4
+ }
5
+ export type CliFlags = {
6
+ app?: string;
7
+ cli?: boolean;
8
+ cliBinaryName?: string;
9
+ cliConfigName?: string;
10
+ cliDefaultBaseUrl?: string;
11
+ cliEnvPrefix?: string;
12
+ cliModulePath?: string;
13
+ cliOut?: string;
14
+ cliSdkModulePath?: string;
15
+ config?: string;
16
+ help?: boolean;
17
+ manifest?: boolean;
18
+ mergeTree?: string;
19
+ plugin?: number;
20
+ sdk?: boolean;
21
+ tree?: boolean;
22
+ types?: boolean;
23
+ watch?: boolean;
24
+ };
25
+ /** Strict: unknown flags, stray positionals and missing values are errors. Accepts `--k v` and `--k=v`. */
26
+ export declare function parseGenerateArgs(args: string[]): CliFlags;
27
+ /** `honey init` flags. `--cloudflare` is an alias of `--cf`. */
28
+ export type InitFlags = {
29
+ cf: boolean;
30
+ force: boolean;
31
+ };
32
+ export declare function parseInitFlags(args: string[]): InitFlags;
33
+ //# sourceMappingURL=cli-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,eAAO,MAAM,KAAK,+3BAewB,CAAA;AAE1C,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAExC,MAAM,MAAM,QAAQ,GAAG;IACtB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AA0BD,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAuC1D;AAED,gEAAgE;AAChE,MAAM,MAAM,SAAS,GAAG;IACvB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;CACd,CAAA;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAQxD"}
@@ -0,0 +1,102 @@
1
+ /** Argument parsing for the `honey` CLI. Not a package export. */
2
+ export const USAGE = `Usage: honey generate [options]
3
+ honey init [--cf] [--force]
4
+
5
+ generate options:
6
+ --config <path> Vite config holding honey() (default: vite.config.{ts,mts,js,mjs,…})
7
+ --plugin <n> Which honey() plugin in the config, 0-based (when there are several)
8
+ --app <path> App entry; overrides the config's app, or replaces the config
9
+ --watch Regenerate when files next to the app change
10
+ --tree --types --manifest --sdk
11
+ Turn on an output
12
+ --merge-tree <path> Route tree source for a gateway
13
+ --cli --cli-out <dir> --cli-binary-name <name> [--cli-config-name <name>]
14
+ [--cli-default-base-url <url>] [--cli-env-prefix <prefix>] [--cli-module-path <path>]
15
+ [--cli-sdk-module-path <path>]
16
+ Generate the Go CLI
17
+ -h, --help Show this help`;
18
+ export class UsageError extends Error {
19
+ }
20
+ const BOOLEAN_FLAGS = {
21
+ cli: "cli",
22
+ help: "help",
23
+ manifest: "manifest",
24
+ sdk: "sdk",
25
+ tree: "tree",
26
+ types: "types",
27
+ watch: "watch",
28
+ };
29
+ const VALUE_FLAGS = {
30
+ app: "app",
31
+ "cli-binary-name": "cliBinaryName",
32
+ "cli-config-name": "cliConfigName",
33
+ "cli-default-base-url": "cliDefaultBaseUrl",
34
+ "cli-env-prefix": "cliEnvPrefix",
35
+ "cli-module-path": "cliModulePath",
36
+ "cli-out": "cliOut",
37
+ "cli-sdk-module-path": "cliSdkModulePath",
38
+ config: "config",
39
+ "merge-tree": "mergeTree",
40
+ plugin: "plugin",
41
+ };
42
+ /** Strict: unknown flags, stray positionals and missing values are errors. Accepts `--k v` and `--k=v`. */
43
+ export function parseGenerateArgs(args) {
44
+ const flags = {};
45
+ for (let i = 0; i < args.length; i++) {
46
+ const arg = args[i];
47
+ if (arg === "-h") {
48
+ flags.help = true;
49
+ continue;
50
+ }
51
+ if (!arg.startsWith("--") || arg === "--")
52
+ throw new UsageError(`unexpected argument: ${arg}`);
53
+ const eq = arg.indexOf("=");
54
+ const name = eq === -1 ? arg.slice(2) : arg.slice(2, eq);
55
+ const inline = eq === -1 ? undefined : arg.slice(eq + 1);
56
+ const bool = BOOLEAN_FLAGS[name];
57
+ if (bool) {
58
+ if (inline === undefined || inline === "true")
59
+ flags[bool] = true;
60
+ else if (inline === "false")
61
+ flags[bool] = false;
62
+ else
63
+ throw new UsageError(`--${name} takes no value (got "${inline}")`);
64
+ continue;
65
+ }
66
+ const key = VALUE_FLAGS[name];
67
+ if (!key)
68
+ throw new UsageError(`unknown option: --${name}`);
69
+ let value = inline;
70
+ if (value === undefined) {
71
+ const next = args[i + 1];
72
+ if (next === undefined || next.startsWith("--"))
73
+ throw new UsageError(`--${name} requires a value`);
74
+ value = next;
75
+ i++;
76
+ }
77
+ if (value === "")
78
+ throw new UsageError(`--${name} requires a value`);
79
+ if (key === "plugin") {
80
+ if (!/^\d+$/.test(value))
81
+ throw new UsageError(`--plugin takes a non-negative integer (got "${value}")`);
82
+ flags.plugin = Number(value);
83
+ }
84
+ else {
85
+ flags[key] = value;
86
+ }
87
+ }
88
+ return flags;
89
+ }
90
+ export function parseInitFlags(args) {
91
+ const flags = { cf: false, force: false };
92
+ for (const arg of args) {
93
+ if (arg === "--cf" || arg === "--cloudflare")
94
+ flags.cf = true;
95
+ else if (arg === "--force")
96
+ flags.force = true;
97
+ else
98
+ throw new UsageError(arg.startsWith("-") ? `unknown option: ${arg}` : `unexpected argument: ${arg}`);
99
+ }
100
+ return flags;
101
+ }
102
+ //# sourceMappingURL=cli-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ // Code generated by honey. DO NOT EDIT.
2
+ package cli
3
+
4
+ import (
5
+ "errors"
6
+ "net/http"
7
+ )
8
+
9
+ // ErrMissingAPIKey is returned when no API key can be found via flags, env, or config file.
10
+ var ErrMissingAPIKey = errors.New("api key required: set --api-key, env var, or config file")
11
+
12
+ // ResolveAPIKey returns the resolved API key or ErrMissingAPIKey if none is available.
13
+ func ResolveAPIKey(cfg Config) (string, error) {
14
+ if cfg.APIKey != "" {
15
+ return cfg.APIKey, nil
16
+ }
17
+ return "", ErrMissingAPIKey
18
+ }
19
+
20
+ // ApplyAuth sets the auth header for apiKey: prefix + key under headerName.
21
+ func ApplyAuth(h http.Header, headerName, prefix, apiKey string) {
22
+ if apiKey == "" {
23
+ return
24
+ }
25
+ h.Set(headerName, prefix+apiKey)
26
+ }
@@ -0,0 +1,192 @@
1
+ // Code generated by honey. DO NOT EDIT.
2
+ package cli
3
+
4
+ import (
5
+ "errors"
6
+ "fmt"
7
+ "io"
8
+ "io/fs"
9
+ "os"
10
+ "path/filepath"
11
+ "runtime"
12
+
13
+ "github.com/pelletier/go-toml/v2"
14
+ "github.com/spf13/pflag"
15
+ )
16
+
17
+ // Config holds resolved runtime values for the CLI binary.
18
+ //
19
+ // Precedence (high → low) — see LoadConfig below:
20
+ //
21
+ // 1. --api-key / --base-url / --output / … flag set on the command line.
22
+ // 2. Env var: <ENV_PREFIX>_API_KEY / _BASE_URL / _OUTPUT / …
23
+ // 3. Config file from --config, $<ENV_PREFIX>_CONFIG, $XDG_CONFIG_HOME/<name>/config.toml,
24
+ // $HOME/.config/<name>/config.toml, os.UserConfigDir()/<name>/config.toml.
25
+ // 4. Built-in defaults.
26
+ // 5. (missing api-key → ErrMissingAPIKey, mapped to exit 4).
27
+ type Config struct {
28
+ APIKey string
29
+ BaseURL string
30
+ Output string
31
+ Timeout string
32
+ Verbose bool
33
+ ConfigPath string
34
+ }
35
+
36
+ type tomlConfig struct {
37
+ APIKey string `toml:"api_key"`
38
+ BaseURL string `toml:"base_url"`
39
+ Output string `toml:"output"`
40
+ Timeout string `toml:"timeout"`
41
+ }
42
+
43
+ // LoadConfig merges flag values, env vars, and a TOML config file into a Config.
44
+ //
45
+ // The resolution order matches the Config doc-comment precedence list.
46
+ func LoadConfig(flags *pflag.FlagSet, envPrefix, configName string) (Config, error) {
47
+ var cfg Config
48
+
49
+ cfgPath := ""
50
+ explicit := false
51
+ if flags.Changed("config") {
52
+ v, _ := flags.GetString("config")
53
+ cfgPath = v
54
+ explicit = true
55
+ } else if v := os.Getenv(envPrefix + "_CONFIG"); v != "" {
56
+ cfgPath = v
57
+ explicit = true
58
+ } else {
59
+ cfgPath = defaultConfigPath(configName)
60
+ }
61
+
62
+ var fromFile tomlConfig
63
+ if cfgPath != "" {
64
+ data, err := os.ReadFile(cfgPath)
65
+ switch {
66
+ case err == nil:
67
+ if err := toml.Unmarshal(data, &fromFile); err != nil {
68
+ return cfg, Usage(fmt.Errorf("parse config %s: %w", cfgPath, err))
69
+ }
70
+ warnIfReadableByOthers(cfgPath, fromFile.APIKey != "")
71
+ case explicit || !errors.Is(err, fs.ErrNotExist):
72
+ /* a config the user named must exist; only the default path may be absent */
73
+ return cfg, Usage(fmt.Errorf("read config %s: %w", cfgPath, err))
74
+ }
75
+ }
76
+ cfg.ConfigPath = cfgPath
77
+
78
+ cfg.APIKey = fromFile.APIKey
79
+ if v := os.Getenv(envPrefix + "_API_KEY"); v != "" {
80
+ cfg.APIKey = v
81
+ }
82
+ if flags.Changed("api-key") {
83
+ v, _ := flags.GetString("api-key")
84
+ cfg.APIKey = v
85
+ }
86
+
87
+ cfg.BaseURL = fromFile.BaseURL
88
+ if v := os.Getenv(envPrefix + "_BASE_URL"); v != "" {
89
+ cfg.BaseURL = v
90
+ }
91
+ if flags.Changed("base-url") {
92
+ v, _ := flags.GetString("base-url")
93
+ cfg.BaseURL = v
94
+ }
95
+
96
+ cfg.Output = fromFile.Output
97
+ if v := os.Getenv(envPrefix + "_OUTPUT"); v != "" {
98
+ cfg.Output = v
99
+ }
100
+ if flags.Changed("output") {
101
+ v, _ := flags.GetString("output")
102
+ cfg.Output = v
103
+ }
104
+ if cfg.Output == "" {
105
+ cfg.Output = "json"
106
+ }
107
+
108
+ cfg.Timeout = fromFile.Timeout
109
+ if v := os.Getenv(envPrefix + "_TIMEOUT"); v != "" {
110
+ cfg.Timeout = v
111
+ }
112
+ if flags.Changed("timeout") {
113
+ v, _ := flags.GetString("timeout")
114
+ cfg.Timeout = v
115
+ }
116
+ if cfg.Timeout == "" {
117
+ cfg.Timeout = "30s"
118
+ }
119
+
120
+ if flags.Changed("verbose") {
121
+ v, _ := flags.GetBool("verbose")
122
+ cfg.Verbose = v
123
+ }
124
+
125
+ return cfg, nil
126
+ }
127
+
128
+ // warnIfReadableByOthers warns when a config file holding an API key can be
129
+ // read by group or other users.
130
+ func warnIfReadableByOthers(path string, hasKey bool) {
131
+ if !hasKey || runtime.GOOS == "windows" {
132
+ return
133
+ }
134
+ info, err := os.Stat(path)
135
+ if err != nil {
136
+ return
137
+ }
138
+ if info.Mode().Perm()&0o077 != 0 {
139
+ fmt.Fprintf(os.Stderr, "warning: %s holds an API key and is readable by other users; run: chmod 600 %s\n", path, path)
140
+ }
141
+ }
142
+
143
+ func defaultConfigPath(configName string) string {
144
+ if configName == "" {
145
+ return ""
146
+ }
147
+ if xdg := os.Getenv("XDG_CONFIG_HOME"); xdg != "" {
148
+ return filepath.Join(xdg, configName, "config.toml")
149
+ }
150
+ if home := os.Getenv("HOME"); home != "" {
151
+ return filepath.Join(home, ".config", configName, "config.toml")
152
+ }
153
+ if dir, err := os.UserConfigDir(); err == nil {
154
+ return filepath.Join(dir, configName, "config.toml")
155
+ }
156
+ return ""
157
+ }
158
+
159
+ // readDataFlag resolves the value of a --data flag into raw bytes.
160
+ //
161
+ // Rules:
162
+ // - "@path" → reads file at path.
163
+ // - "-" → reads os.Stdin.
164
+ // - "" → returns nil, nil (caller decides whether required).
165
+ // - anything else → treats val as literal JSON.
166
+ //
167
+ // Exported as ReadDataFlag for use from cmd/*.go.
168
+ func ReadDataFlag(val string) ([]byte, error) {
169
+ return readDataFlag(val)
170
+ }
171
+
172
+ func readDataFlag(val string) ([]byte, error) {
173
+ if val == "" {
174
+ return nil, nil
175
+ }
176
+ if val == "-" {
177
+ data, err := io.ReadAll(os.Stdin)
178
+ if err != nil {
179
+ return nil, fmt.Errorf("read stdin: %w", err)
180
+ }
181
+ return data, nil
182
+ }
183
+ if val[0] == '@' {
184
+ path := val[1:]
185
+ data, err := os.ReadFile(path)
186
+ if err != nil {
187
+ return nil, fmt.Errorf("read data file %s: %w", path, err)
188
+ }
189
+ return data, nil
190
+ }
191
+ return []byte(val), nil
192
+ }
@@ -0,0 +1,75 @@
1
+ // Code generated by honey. DO NOT EDIT.
2
+ package cli
3
+
4
+ import (
5
+ "context"
6
+ "errors"
7
+ "net"
8
+ )
9
+
10
+ // UsageError marks bad flags, bad config and invalid input; it maps to exit 4.
11
+ type UsageError struct{ Err error }
12
+
13
+ func (e *UsageError) Error() string { return e.Err.Error() }
14
+ func (e *UsageError) Unwrap() error { return e.Err }
15
+
16
+ // Usage wraps err as a UsageError.
17
+ func Usage(err error) error {
18
+ if err == nil {
19
+ return nil
20
+ }
21
+ return &UsageError{Err: err}
22
+ }
23
+
24
+ // ExitFor maps a CLI-level error to a process exit code.
25
+ //
26
+ // Codes:
27
+ //
28
+ // 0 success
29
+ // 1 4xx client error
30
+ // 2 5xx server error
31
+ // 3 network / transport failure or timeout
32
+ // 4 bad flags / bad config / missing api key
33
+ // 5 3xx unexpected redirect
34
+ func ExitFor(err error) int {
35
+ if err == nil {
36
+ return 0
37
+ }
38
+ if errors.Is(err, ErrMissingAPIKey) {
39
+ return 4
40
+ }
41
+ var usage *UsageError
42
+ if errors.As(err, &usage) {
43
+ return 4
44
+ }
45
+
46
+ /* SDK errors expose Status() (APIError) */
47
+ var apiErr interface{ Status() int }
48
+ if errors.As(err, &apiErr) {
49
+ return exitForStatus(apiErr.Status())
50
+ }
51
+
52
+ if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) {
53
+ return 3
54
+ }
55
+ var netErr net.Error
56
+ if errors.As(err, &netErr) {
57
+ return 3
58
+ }
59
+ return 3
60
+ }
61
+
62
+ func exitForStatus(status int) int {
63
+ switch {
64
+ case status == 0:
65
+ return 3
66
+ case status >= 300 && status < 400:
67
+ return 5
68
+ case status >= 400 && status < 500:
69
+ return 1
70
+ case status >= 500 && status < 600:
71
+ return 2
72
+ default:
73
+ return 1
74
+ }
75
+ }