@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
@@ -7,14 +7,28 @@ import (
7
7
  "net"
8
8
  )
9
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
+
10
24
  // ExitFor maps a CLI-level error to a process exit code.
11
25
  //
12
26
  // Codes:
13
27
  //
14
28
  // 0 success
15
- // 1 4xx client error (status < 500)
16
- // 2 5xx server error (status >= 500)
17
- // 3 network / transport failure or status == 0
29
+ // 1 4xx client error
30
+ // 2 5xx server error
31
+ // 3 network / transport failure or timeout
18
32
  // 4 bad flags / bad config / missing api key
19
33
  // 5 3xx unexpected redirect
20
34
  func ExitFor(err error) int {
@@ -24,20 +38,24 @@ func ExitFor(err error) int {
24
38
  if errors.Is(err, ErrMissingAPIKey) {
25
39
  return 4
26
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
+
27
52
  if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) {
28
53
  return 3
29
54
  }
30
-
31
55
  var netErr net.Error
32
56
  if errors.As(err, &netErr) {
33
57
  return 3
34
58
  }
35
-
36
- var apiErr interface{ StatusCode() int }
37
- if errors.As(err, &apiErr) {
38
- return exitForStatus(apiErr.StatusCode())
39
- }
40
-
41
59
  return 3
42
60
  }
43
61
 
@@ -2,54 +2,78 @@
2
2
  package cli
3
3
 
4
4
  import (
5
- "bytes"
6
5
  "fmt"
7
6
  "io"
8
7
  "mime/multipart"
9
8
  "os"
10
9
  "path/filepath"
10
+ "sort"
11
11
  )
12
12
 
13
- // BuildMultipart assembles a multipart/form-data body.
13
+ // BuildMultipart streams a multipart/form-data body: files are read as the
14
+ // request is sent, not buffered in memory.
14
15
  //
15
- // fields are written as plain form fields.
16
- // files are keyed by form-field-name → absolute-or-relative file path.
16
+ // fields are written as plain form fields; files are keyed by form-field-name →
17
+ // file path. Every file is opened up front so a bad path fails before sending.
17
18
  //
18
19
  // Returns the body reader, the Content-Type header value (including boundary),
19
20
  // and any error.
20
21
  func BuildMultipart(fields map[string]string, files map[string]string) (io.Reader, string, error) {
21
- var buf bytes.Buffer
22
- writer := multipart.NewWriter(&buf)
22
+ fieldNames := sortedNames(fields)
23
+ fileNames := sortedNames(files)
23
24
 
24
- for name, val := range fields {
25
- if err := writer.WriteField(name, val); err != nil {
26
- return nil, "", fmt.Errorf("write field %q: %w", name, err)
27
- }
28
- }
29
-
30
- for name, path := range files {
25
+ opened := make(map[string]*os.File, len(files))
26
+ for _, name := range fileNames {
27
+ path := files[name]
31
28
  if path == "" {
29
+ closeAll(opened)
32
30
  return nil, "", fmt.Errorf("missing file path for field %q", name)
33
31
  }
34
- file, err := os.Open(path)
32
+ f, err := os.Open(path)
35
33
  if err != nil {
36
- return nil, "", fmt.Errorf("open file %s: %w", path, err)
34
+ closeAll(opened)
35
+ return nil, "", Usage(fmt.Errorf("open file %s: %w", path, err))
37
36
  }
38
- part, err := writer.CreateFormFile(name, filepath.Base(path))
39
- if err != nil {
40
- file.Close()
41
- return nil, "", fmt.Errorf("create form file %q: %w", name, err)
37
+ opened[name] = f
38
+ }
39
+
40
+ pr, pw := io.Pipe()
41
+ writer := multipart.NewWriter(pw)
42
+ go func() {
43
+ defer closeAll(opened)
44
+ for _, name := range fieldNames {
45
+ if err := writer.WriteField(name, fields[name]); err != nil {
46
+ pw.CloseWithError(fmt.Errorf("write field %q: %w", name, err))
47
+ return
48
+ }
42
49
  }
43
- if _, err := io.Copy(part, file); err != nil {
44
- file.Close()
45
- return nil, "", fmt.Errorf("copy file %s: %w", path, err)
50
+ for _, name := range fileNames {
51
+ part, err := writer.CreateFormFile(name, filepath.Base(files[name]))
52
+ if err != nil {
53
+ pw.CloseWithError(fmt.Errorf("create form file %q: %w", name, err))
54
+ return
55
+ }
56
+ if _, err := io.Copy(part, opened[name]); err != nil {
57
+ pw.CloseWithError(fmt.Errorf("copy file %s: %w", files[name], err))
58
+ return
59
+ }
46
60
  }
47
- file.Close()
48
- }
61
+ pw.CloseWithError(writer.Close())
62
+ }()
63
+ return pr, writer.FormDataContentType(), nil
64
+ }
49
65
 
50
- if err := writer.Close(); err != nil {
51
- return nil, "", fmt.Errorf("close multipart writer: %w", err)
66
+ func sortedNames(m map[string]string) []string {
67
+ names := make([]string, 0, len(m))
68
+ for k := range m {
69
+ names = append(names, k)
52
70
  }
71
+ sort.Strings(names)
72
+ return names
73
+ }
53
74
 
54
- return &buf, writer.FormDataContentType(), nil
75
+ func closeAll(files map[string]*os.File) {
76
+ for _, f := range files {
77
+ f.Close()
78
+ }
55
79
  }
@@ -2,16 +2,66 @@
2
2
  package cli
3
3
 
4
4
  import (
5
+ "bytes"
5
6
  "encoding/json"
6
7
  "fmt"
7
8
  "io"
8
9
  "sort"
9
10
  "strings"
10
11
  "text/tabwriter"
12
+ "unicode"
11
13
 
12
14
  "sigs.k8s.io/yaml"
13
15
  )
14
16
 
17
+ // DecodeJSON decodes a response body keeping numbers exact (json.Number), so a
18
+ // 64-bit id is printed as sent instead of as a rounded float.
19
+ func DecodeJSON(body []byte) (any, error) {
20
+ if len(body) == 0 {
21
+ return nil, nil
22
+ }
23
+ dec := json.NewDecoder(bytes.NewReader(body))
24
+ dec.UseNumber()
25
+ var out any
26
+ if err := dec.Decode(&out); err != nil {
27
+ return nil, err
28
+ }
29
+ return out, nil
30
+ }
31
+
32
+ // Sanitize drops control characters (ESC, CR, tabs, …) so server-controlled
33
+ // text cannot drive the terminal or break table layout.
34
+ func Sanitize(s string) string {
35
+ return strings.Map(func(r rune) rune {
36
+ if r == '\n' {
37
+ return ' '
38
+ }
39
+ if unicode.IsControl(r) {
40
+ return -1
41
+ }
42
+ return r
43
+ }, s)
44
+ }
45
+
46
+ func cell(v any) string {
47
+ switch t := v.(type) {
48
+ case nil:
49
+ return ""
50
+ case string:
51
+ return Sanitize(t)
52
+ case json.Number:
53
+ return t.String()
54
+ case map[string]any, []any:
55
+ enc, err := json.Marshal(t)
56
+ if err != nil {
57
+ return Sanitize(fmt.Sprint(t))
58
+ }
59
+ return Sanitize(string(enc))
60
+ default:
61
+ return Sanitize(fmt.Sprint(t))
62
+ }
63
+ }
64
+
15
65
  // Emit writes data to w in the requested mode.
16
66
  //
17
67
  // Supported modes: json (pretty, 2-space indent), ndjson, yaml, table.
@@ -67,11 +117,15 @@ func printTable(data any, w io.Writer) error {
67
117
  }
68
118
  keys := collectKeys(rows)
69
119
  tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0)
70
- fmt.Fprintln(tw, strings.Join(keys, "\t"))
120
+ header := make([]string, len(keys))
121
+ for i, k := range keys {
122
+ header[i] = Sanitize(k)
123
+ }
124
+ fmt.Fprintln(tw, strings.Join(header, "\t"))
71
125
  for _, row := range rows {
72
126
  cols := make([]string, len(keys))
73
127
  for i, k := range keys {
74
- cols[i] = fmt.Sprintf("%v", row[k])
128
+ cols[i] = cell(row[k])
75
129
  }
76
130
  fmt.Fprintln(tw, strings.Join(cols, "\t"))
77
131
  }
@@ -84,11 +138,11 @@ func printTable(data any, w io.Writer) error {
84
138
  sort.Strings(keys)
85
139
  tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0)
86
140
  for _, k := range keys {
87
- fmt.Fprintf(tw, "%s\t%v\n", k, v[k])
141
+ fmt.Fprintf(tw, "%s\t%s\n", Sanitize(k), cell(v[k]))
88
142
  }
89
143
  return tw.Flush()
90
144
  default:
91
- _, err := fmt.Fprintln(w, data)
145
+ _, err := fmt.Fprintln(w, cell(data))
92
146
  return err
93
147
  }
94
148
  }
@@ -20,7 +20,7 @@ func NewRoot(binaryName, version string) *cobra.Command {
20
20
  Use: binaryName,
21
21
  Version: version,
22
22
  }
23
- root.PersistentFlags().String("api-key", "", "API key (overrides env + config file)")
23
+ root.PersistentFlags().String("api-key", "", "API key (overrides env + config file; visible to other local users in the process list, prefer the env var)")
24
24
  root.PersistentFlags().String("base-url", "", "Override API base URL")
25
25
  root.PersistentFlags().String("output", "json", "Output mode: json|ndjson|yaml|table")
26
26
  root.PersistentFlags().Bool("verbose", false, "Print request metadata to stderr")
@@ -1,5 +1,5 @@
1
1
  // Code generated by honey. DO NOT EDIT.
2
2
  package cli
3
3
 
4
- // Version is overridable at build time via -ldflags.
5
- const Version = "dev"
4
+ // Version is set at build time: go build -ldflags "-X <module>/internal/cli.Version=1.2.3".
5
+ var Version = "dev"
package/src/cli.ts CHANGED
@@ -1,82 +1,14 @@
1
- #!/usr/bin/env bun
1
+ #!/usr/bin/env node
2
2
  import { existsSync, statSync, watch } from "node:fs"
3
3
  import { dirname, resolve } from "node:path"
4
- import { parseInitFlags, runInit } from "./init.ts"
5
- import type { HoneyGoCliConfig, HoneyVitePluginConfig } from "./plugin.ts"
6
- import { generateAndWrite, type getLastHoneyConfig, resolveHoneyConfig } from "./plugin.ts"
7
-
8
- const USAGE =
9
- "Usage: honey generate [--watch] [--config <path>] [--app <path>] [flags]\n" + " honey init [--cf] [--force]"
10
-
11
- type CliFlags = {
12
- app?: string
13
- cli?: boolean
14
- cliBinaryName?: string
15
- cliConfigName?: string
16
- cliDefaultBaseUrl?: string
17
- cliEnvPrefix?: string
18
- cliModulePath?: string
19
- cliOut?: string
20
- cliSdkModulePath?: string
21
- config?: string
22
- manifest?: boolean
23
- mergeTree?: string
24
- sdk?: boolean
25
- tree?: boolean
26
- types?: boolean
27
- watch?: boolean
28
- }
29
-
30
- const BOOLEAN_FLAGS = new Set(["cli", "manifest", "sdk", "tree", "types", "watch"])
31
-
32
- function parseArgs(args: string[]): CliFlags {
33
- const parsed: Record<string, string> = {}
34
- for (let i = 0; i < args.length; i++) {
35
- const arg = args[i]
36
- if (!arg.startsWith("--")) continue
37
- const key = arg.slice(2)
38
- if (BOOLEAN_FLAGS.has(key)) {
39
- parsed[key] = "true"
40
- } else if (i + 1 < args.length) {
41
- parsed[key] = args[i + 1]
42
- i++
43
- }
44
- }
45
-
46
- return {
47
- app: parsed.app,
48
- cli: parsed.cli !== undefined,
49
- cliBinaryName: parsed["cli-binary-name"],
50
- cliConfigName: parsed["cli-config-name"],
51
- cliDefaultBaseUrl: parsed["cli-default-base-url"],
52
- cliEnvPrefix: parsed["cli-env-prefix"],
53
- cliModulePath: parsed["cli-module-path"],
54
- cliOut: parsed["cli-out"],
55
- cliSdkModulePath: parsed["cli-sdk-module-path"],
56
- config: parsed.config,
57
- manifest: parsed.manifest !== undefined,
58
- mergeTree: parsed["merge-tree"],
59
- sdk: parsed.sdk !== undefined,
60
- tree: parsed.tree !== undefined,
61
- types: parsed.types !== undefined,
62
- watch: parsed.watch !== undefined,
63
- }
64
- }
65
-
66
- async function loadConfigFromVite(configPath: string): Promise<HoneyVitePluginConfig | undefined> {
67
- if (!existsSync(configPath)) return undefined
68
-
69
- const { createJiti } = await import("jiti")
70
- const jiti = createJiti(configPath, { fsCache: false, interopDefault: true, moduleCache: false })
71
-
72
- /* importing the config executes honey() which stashes config */
73
- await jiti.import(configPath)
74
-
75
- /* read stashed config from the same module graph */
76
- const pluginMod = (await jiti.import("@lovrozagar/honey/plugin")) as Record<string, unknown>
77
- const getter = pluginMod.getLastHoneyConfig as typeof getLastHoneyConfig | undefined
78
- return getter?.()
79
- }
4
+ import { createModuleLoader, findViteConfig, loadHoneyPluginConfigs, type ModuleLoader } from "./codegen-load.ts"
5
+ import { runCli } from "./gen-process.ts"
6
+ import { type CliFlags, parseGenerateArgs, parseInitFlags, USAGE, UsageError } from "./cli-args.ts"
7
+ import { runInit } from "./init.ts"
8
+ import type { HoneyGoCliConfig, HoneyVitePluginConfig, ResolvedHoneyConfig } from "./plugin.ts"
9
+ import { generateAndWrite, generatedOutputs, isGeneratedOutput, resolveHoneyConfig } from "./plugin.ts"
10
+ import { WATCH_IGNORE_RE } from "./glob.ts"
11
+ import { setCodegenProcess } from "./serve-slot.ts"
80
12
 
81
13
  function applyCodegenFlags(target: HoneyVitePluginConfig, flags: CliFlags): void {
82
14
  if (!target.codegen) target.codegen = {}
@@ -90,17 +22,10 @@ function applyCodegenFlags(target: HoneyVitePluginConfig, flags: CliFlags): void
90
22
  if (cliOverride) cg.cli = cliOverride
91
23
  }
92
24
 
93
- function mergeCliOverrides(base: HoneyVitePluginConfig, flags: CliFlags): HoneyVitePluginConfig {
94
- const merged = { ...base }
95
- if (flags.app) merged.app = flags.app
96
- applyCodegenFlags(merged, flags)
97
- return merged
98
- }
99
-
100
25
  function buildCliConfigFromFlags(flags: CliFlags): HoneyGoCliConfig | undefined {
101
26
  if (!flags.cli && !flags.cliOut && !flags.cliBinaryName) return undefined
102
27
  if (!flags.cliOut || !flags.cliBinaryName) {
103
- throw new Error("--cli requires --cli-out and --cli-binary-name")
28
+ throw new UsageError("--cli requires --cli-out and --cli-binary-name")
104
29
  }
105
30
  return {
106
31
  binaryName: flags.cliBinaryName,
@@ -113,91 +38,172 @@ function buildCliConfigFromFlags(flags: CliFlags): HoneyGoCliConfig | undefined
113
38
  }
114
39
  }
115
40
 
116
- function configFromFlags(flags: CliFlags): HoneyVitePluginConfig | undefined {
117
- if (!flags.app) return undefined
118
- const config: HoneyVitePluginConfig = { app: flags.app }
119
- applyCodegenFlags(config, flags)
120
- return config
41
+ /** Picks one honey() config: `--plugin` by index, else the only one, else the one whose app is `--app`. */
42
+ function selectPluginConfig(
43
+ configs: HoneyVitePluginConfig[],
44
+ flags: CliFlags,
45
+ configPath: string,
46
+ ): HoneyVitePluginConfig | undefined {
47
+ if (flags.plugin !== undefined) {
48
+ const picked = configs[flags.plugin]
49
+ if (!picked) {
50
+ throw new UsageError(`--plugin ${flags.plugin}: ${configPath} has ${configs.length} honey() plugin(s)`)
51
+ }
52
+ return picked
53
+ }
54
+ if (configs.length <= 1) return configs[0]
55
+ const byApp = flags.app ? configs.filter((c) => c.app && resolve(c.app) === resolve(flags.app as string)) : []
56
+ if (byApp.length === 1) return byApp[0]
57
+ const apps = configs.map((c, i) => ` ${i}: ${c.app ?? "(no app)"}`).join("\n")
58
+ throw new UsageError(`${configPath} has ${configs.length} honey() plugins; pick one with --plugin <n>:\n${apps}`)
121
59
  }
122
60
 
123
- const GEN_IGNORE_RE = /(_gen[/\\]|\.gen\.(tsx?|json|d\.ts)$)/
124
-
125
- async function main() {
126
- const args = process.argv.slice(2)
127
- const command = args[0]
128
-
129
- if (command === "init") {
130
- runInit(process.cwd(), parseInitFlags(args.slice(1)))
131
- return
61
+ async function resolveConfig(cwd: string, flags: CliFlags, load: ModuleLoader): Promise<ResolvedHoneyConfig> {
62
+ const configPath = flags.config ? resolve(cwd, flags.config) : findViteConfig(cwd)
63
+ if (flags.config && !existsSync(configPath as string)) {
64
+ throw new UsageError(`config file not found: ${flags.config}`)
132
65
  }
133
66
 
134
- if (command !== "generate") {
135
- console.error(USAGE)
136
- process.exit(1)
67
+ let raw: HoneyVitePluginConfig | undefined
68
+ if (configPath) {
69
+ const command = process.env.HONEY_VITE_COMMAND === "serve" ? "serve" : "build"
70
+ const mode = process.env.HONEY_VITE_MODE ?? (command === "serve" ? "development" : "production")
71
+ const configs = await loadHoneyPluginConfigs(configPath, load, { command, mode })
72
+ if (configs.length === 0 && (flags.config || flags.plugin !== undefined || !flags.app)) {
73
+ throw new UsageError(`no honey() plugin found in ${configPath}; add honey() to it or pass --app`)
74
+ }
75
+ const picked = selectPluginConfig(configs, flags, configPath)
76
+ if (picked) raw = { ...picked, codegen: { ...picked.codegen } }
137
77
  }
138
78
 
139
- const flags = parseArgs(args.slice(1))
140
- const cwd = process.cwd()
141
-
142
- /* resolve config: vite.config.ts → CLI flags fallback */
143
- const configPath = resolve(cwd, flags.config ?? "vite.config.ts")
144
- let rawConfig: HoneyVitePluginConfig | undefined
145
-
146
- const viteConfig = await loadConfigFromVite(configPath)
147
- if (viteConfig) {
148
- rawConfig = mergeCliOverrides(viteConfig, flags)
79
+ if (raw) {
80
+ if (flags.app) raw.app = flags.app
81
+ } else if (flags.app) {
82
+ raw = { app: flags.app }
149
83
  } else {
150
- rawConfig = configFromFlags(flags)
84
+ throw new UsageError("No config found. Provide a vite.config.ts with honey() or use --app.")
151
85
  }
86
+ applyCodegenFlags(raw, flags)
87
+ return resolveHoneyConfig(raw)
88
+ }
152
89
 
153
- if (!rawConfig) {
154
- console.error("No config found. Provide a vite.config.ts with honey() or use --app flag.")
90
+ /** One generation in this process, then exit: whatever the app left running must not keep it alive. */
91
+ async function generateOnce(cwd: string, flags: CliFlags): Promise<never> {
92
+ setCodegenProcess(true)
93
+ const load = await createModuleLoader({ fresh: false, from: resolve(cwd, "index.ts") })
94
+ const resolved = await resolveConfig(cwd, flags, load)
95
+ try {
96
+ await generateAndWrite(resolved, cwd, { load })
97
+ } catch (err) {
98
+ console.error("honey: generation failed", err)
155
99
  process.exit(1)
156
100
  }
101
+ console.log("honey: generated")
102
+ process.exit(0)
103
+ }
157
104
 
158
- const resolved = resolveHoneyConfig(rawConfig)
159
-
160
- async function generate(): Promise<void> {
105
+ /** Watch mode: every generation runs in a fresh child process, so edits to any imported file are seen. */
106
+ async function watchAndGenerate(cwd: string, flags: CliFlags, args: string[]): Promise<void> {
107
+ setCodegenProcess(true)
108
+ const load = await createModuleLoader({ fresh: true, from: resolve(cwd, "index.ts") })
109
+ const resolved = await resolveConfig(cwd, flags, load)
110
+ if (!resolved.app) throw new UsageError("--watch requires --app or a honey() config with app")
111
+ setCodegenProcess(false)
112
+
113
+ const childArgs = ["generate", ...args.filter((a) => a !== "--watch" && a !== "--watch=true")]
114
+ const outputs = generatedOutputs(resolved, cwd)
115
+ /* a generation creating the directory an output lives in is not an edit */
116
+ const outputParents = new Set(outputs.files.map((file) => dirname(file)))
117
+
118
+ let running = false
119
+ let pending = false
120
+ const generate = async (): Promise<void> => {
121
+ if (running) {
122
+ pending = true
123
+ return
124
+ }
125
+ running = true
161
126
  try {
162
- await generateAndWrite(resolved, cwd)
163
- console.log("honey: generated")
164
- } catch (err) {
165
- console.error("honey: generation failed", err)
166
- if (!flags.watch) process.exit(1)
127
+ await runCli(childArgs, { cwd })
128
+ } catch {
129
+ /* the child already printed why */
130
+ } finally {
131
+ running = false
132
+ }
133
+ if (pending) {
134
+ pending = false
135
+ await generate()
167
136
  }
168
137
  }
169
138
 
139
+ let debounce: ReturnType<typeof setTimeout> | undefined
140
+ const schedule = (): void => {
141
+ clearTimeout(debounce)
142
+ debounce = setTimeout(() => void generate(), 100)
143
+ }
144
+
145
+ /* Arm the watcher and read the poll baseline before saying so and before the first generation:
146
+ * an edit made after "watching" or while the first generation runs queues a rerun instead of
147
+ * landing in the gap before the watcher exists. */
148
+ const appAbs = resolve(cwd, resolved.app)
149
+ const srcDir = dirname(appAbs)
150
+ watch(srcDir, { recursive: true }, (_event, filename) => {
151
+ if (!filename) return
152
+ const abs = resolve(srcDir, String(filename))
153
+ if (WATCH_IGNORE_RE.test(abs) || isGeneratedOutput(abs, outputs) || outputParents.has(abs)) return
154
+ schedule()
155
+ })
156
+ /* recursive fs.watch misses replace-by-rename saves on some platforms; poll the entry too */
157
+ let lastMtime = mtimeOf(appAbs)
158
+ setInterval(() => {
159
+ const mtime = mtimeOf(appAbs)
160
+ if (mtime === lastMtime) return
161
+ lastMtime = mtime
162
+ schedule()
163
+ }, 250)
164
+ console.log(`honey: watching ${srcDir}`)
165
+
170
166
  await generate()
167
+ }
171
168
 
172
- if (flags.watch) {
173
- if (!resolved.app) throw new Error("watch mode requires --app or a vite honey() config")
174
- const appAbs = resolve(cwd, resolved.app)
175
- const srcDir = dirname(appAbs)
176
- let debounceTimer: ReturnType<typeof setTimeout> | undefined
177
- let lastMtime = existsSync(appAbs) ? statSync(appAbs).mtimeMs : 0
169
+ function mtimeOf(path: string): number {
170
+ return existsSync(path) ? statSync(path).mtimeMs : 0
171
+ }
178
172
 
179
- const schedule = (): void => {
180
- clearTimeout(debounceTimer)
181
- debounceTimer = setTimeout(() => generate(), 100)
182
- }
173
+ async function main(): Promise<void> {
174
+ const args = process.argv.slice(2)
175
+ const command = args[0]
183
176
 
184
- console.log(`honey: watching ${srcDir}`)
185
- watch(srcDir, { recursive: true }, (_event, filename) => {
186
- if (!filename || GEN_IGNORE_RE.test(String(filename))) return
187
- schedule()
188
- })
189
- watch(appAbs, schedule)
190
- setInterval(() => {
191
- if (!existsSync(appAbs)) return
192
- const mtime = statSync(appAbs).mtimeMs
193
- if (mtime === lastMtime) return
194
- lastMtime = mtime
195
- schedule()
196
- }, 250)
177
+ if (command === "-h" || command === "--help") {
178
+ console.log(USAGE)
179
+ return
197
180
  }
181
+
182
+ if (command === "init") {
183
+ runInit(process.cwd(), parseInitFlags(args.slice(1)))
184
+ return
185
+ }
186
+
187
+ if (command !== "generate") {
188
+ throw new UsageError(command ? `unknown command: ${command}` : "missing command")
189
+ }
190
+
191
+ const rest = args.slice(1)
192
+ const flags = parseGenerateArgs(rest)
193
+ if (flags.help) {
194
+ console.log(USAGE)
195
+ return
196
+ }
197
+ const cwd = process.cwd()
198
+ if (flags.watch) await watchAndGenerate(cwd, flags, rest)
199
+ else await generateOnce(cwd, flags)
198
200
  }
199
201
 
200
- main().catch((err) => {
201
- console.error(err)
202
+ main().catch((err: unknown) => {
203
+ if (err instanceof UsageError) {
204
+ console.error(`honey: ${err.message}\n\n${USAGE}`)
205
+ } else {
206
+ console.error(err)
207
+ }
202
208
  process.exit(1)
203
209
  })