@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,199 @@
1
+ import { namedMiddleware } from "./middleware.js";
2
+ import { shellQuote } from "./request-to-curl.js";
3
+ const DEFAULT_BODY_CONTENT_TYPES = ["application/json", "application/x-www-form-urlencoded", "application/xml", "text/"];
4
+ const DEFAULT_MAX_BODY_BYTES = 16_384;
5
+ const REDACTED = "[REDACTED]";
6
+ const SENSITIVE_HEADERS = new Set([
7
+ "authorization",
8
+ "cookie",
9
+ "proxy-authorization",
10
+ "set-cookie",
11
+ "x-api-key",
12
+ "x-auth-token",
13
+ "x-csrf-token",
14
+ "x-xsrf-token",
15
+ ]);
16
+ const SENSITIVE_HEADER_RE = /(?:^|-)(?:token|secret|api-?key|password|session)(?:$|-)/i;
17
+ const SENSITIVE_PARAM_RE = /(?:^|[_.-])(?:access_?token|refresh_?token|id_?token|token|secret|client_?secret|password|passwd|pwd|api_?key|apikey|key|sig|signature|auth|code|session|jwt)$/i;
18
+ function defaultRedactHeader(name, value) {
19
+ const lower = name.toLowerCase();
20
+ if (SENSITIVE_HEADERS.has(lower) || SENSITIVE_HEADER_RE.test(lower))
21
+ return REDACTED;
22
+ return value;
23
+ }
24
+ function defaultRedactQueryParam(name, value) {
25
+ return SENSITIVE_PARAM_RE.test(name) ? REDACTED : value;
26
+ }
27
+ function defaultLog(data) {
28
+ console.log(data.curl);
29
+ }
30
+ function shouldIncludeBody(contentType, allowContentTypes) {
31
+ if (contentType === null || contentType.length === 0)
32
+ return false;
33
+ const lower = contentType.toLowerCase();
34
+ return allowContentTypes.some((allowed) => lower.startsWith(allowed.toLowerCase()));
35
+ }
36
+ function redactUrl(rawUrl, redactQueryParam) {
37
+ let url;
38
+ try {
39
+ url = new URL(rawUrl);
40
+ }
41
+ catch {
42
+ /* a malformed Host (Node builds the URL from it) must not fail the request */
43
+ return rawUrl.split("?")[0] ?? rawUrl;
44
+ }
45
+ if (url.search.length === 0)
46
+ return url.toString();
47
+ const params = new URLSearchParams();
48
+ for (const [name, value] of url.searchParams) {
49
+ const nextValue = redactQueryParam(name, value);
50
+ if (nextValue !== null)
51
+ params.append(name, nextValue);
52
+ }
53
+ url.search = params.toString();
54
+ return url.toString();
55
+ }
56
+ /**
57
+ * A second, independent reader of the request body. On Node the request is
58
+ * re-pointed at one branch of a tee (the same hook `bodyLimit` uses) rather
59
+ * than `clone()`d, so later body readers keep working.
60
+ */
61
+ function teeBody(request) {
62
+ const body = request.body;
63
+ if (body === null)
64
+ return null;
65
+ const replaceBody = request[Symbol.for("honey.replaceBody")];
66
+ if (typeof replaceBody === "function") {
67
+ const [forRequest, forLog] = body.tee();
68
+ replaceBody.call(request, forRequest);
69
+ return forLog;
70
+ }
71
+ return request.clone().body;
72
+ }
73
+ /** Never rejects: a body that cannot be read is logged as omitted. */
74
+ async function readBodyWithinLimit(request, maxBytes) {
75
+ try {
76
+ if (request.body === null)
77
+ return { body: null, omittedReason: "missing" };
78
+ const contentLength = request.headers.get("content-length");
79
+ if (contentLength !== null) {
80
+ const parsedLength = Number.parseInt(contentLength, 10);
81
+ if (!Number.isNaN(parsedLength) && parsedLength > maxBytes) {
82
+ return { body: null, omittedReason: "too-large" };
83
+ }
84
+ }
85
+ const stream = teeBody(request);
86
+ if (stream === null)
87
+ return { body: null, omittedReason: "missing" };
88
+ const reader = stream.getReader();
89
+ const chunks = [];
90
+ let totalBytes = 0;
91
+ while (true) {
92
+ const { done, value } = await reader.read();
93
+ if (done)
94
+ break;
95
+ totalBytes += value.byteLength;
96
+ if (totalBytes > maxBytes) {
97
+ await reader.cancel().catch(() => { });
98
+ return { body: null, omittedReason: "too-large" };
99
+ }
100
+ chunks.push(value);
101
+ }
102
+ const bytes = new Uint8Array(totalBytes);
103
+ let offset = 0;
104
+ for (const chunk of chunks) {
105
+ bytes.set(chunk, offset);
106
+ offset += chunk.byteLength;
107
+ }
108
+ return { body: new TextDecoder().decode(bytes), omittedReason: null };
109
+ }
110
+ catch {
111
+ return { body: null, omittedReason: "read-error" };
112
+ }
113
+ }
114
+ function formatCurl(request, body, opts) {
115
+ const parts = ["curl", "-X", shellQuote(request.method)];
116
+ for (const [name, value] of request.headers.entries()) {
117
+ const redactedValue = opts.redactHeader(name, value);
118
+ if (redactedValue === null)
119
+ continue;
120
+ parts.push("-H", shellQuote(`${name}: ${redactedValue}`));
121
+ }
122
+ if (body !== null && body.body !== null)
123
+ parts.push("--data-raw", shellQuote(body.body));
124
+ parts.push(shellQuote(redactUrl(request.url, opts.redactQueryParam)));
125
+ return parts.join(" ");
126
+ }
127
+ /** Start reading the body (if logged) now, before a handler consumes it. */
128
+ function startBodyRead(request, body) {
129
+ if (body !== true && typeof body !== "object") {
130
+ return Promise.resolve({ body: null, omittedReason: "disabled" });
131
+ }
132
+ const bodyOptions = typeof body === "object" ? body : {};
133
+ const allowContentTypes = bodyOptions.allowContentTypes ?? DEFAULT_BODY_CONTENT_TYPES;
134
+ if (!shouldIncludeBody(request.headers.get("content-type"), allowContentTypes)) {
135
+ return Promise.resolve({ body: null, omittedReason: request.body === null ? "missing" : "content-type" });
136
+ }
137
+ return readBodyWithinLimit(request, bodyOptions.maxBytes ?? DEFAULT_MAX_BODY_BYTES);
138
+ }
139
+ async function buildCurlLogData(request, options) {
140
+ const resolved = {
141
+ redactHeader: options?.redactHeader ?? defaultRedactHeader,
142
+ redactQueryParam: options?.redactQueryParam ?? defaultRedactQueryParam,
143
+ };
144
+ const body = await startBodyRead(request, options?.body);
145
+ return {
146
+ bodyIncluded: body.body !== null,
147
+ bodyOmittedReason: body.omittedReason,
148
+ curl: formatCurl(request, body, resolved),
149
+ };
150
+ }
151
+ function curlLogger(options) {
152
+ const log = options?.log ?? defaultLog;
153
+ const skip = options?.skip;
154
+ const resolved = {
155
+ redactHeader: options?.redactHeader ?? defaultRedactHeader,
156
+ redactQueryParam: options?.redactQueryParam ?? defaultRedactQueryParam,
157
+ };
158
+ return namedMiddleware("curlLogger", async (ctx, next) => {
159
+ const start = performance.now();
160
+ const request = ctx.req;
161
+ const method = request.method;
162
+ const path = ctx.path;
163
+ const rid = ctx["requestId"] ?? null;
164
+ /* the only work before `next()`: the body must be teed before a handler reads it */
165
+ const bodyPromise = startBodyRead(request, options?.body);
166
+ const response = await next();
167
+ const skipData = {
168
+ duration: performance.now() - start,
169
+ method,
170
+ path,
171
+ requestId: rid,
172
+ status: response.status,
173
+ };
174
+ /* a failing redact callback, skip or sink never turns the response into a 500 */
175
+ try {
176
+ if (skip?.(skipData))
177
+ return response;
178
+ const body = await bodyPromise;
179
+ const data = {
180
+ ...skipData,
181
+ bodyIncluded: body.body !== null,
182
+ bodyOmittedReason: body.omittedReason,
183
+ curl: formatCurl(request, body, resolved),
184
+ };
185
+ if (options?.instance) {
186
+ options.instance.info({ ...data }, "request curl");
187
+ }
188
+ else {
189
+ log(data);
190
+ }
191
+ }
192
+ catch (err) {
193
+ console.error("curlLogger: failed to log request", err);
194
+ }
195
+ return response;
196
+ });
197
+ }
198
+ export { buildCurlLogData, curlLogger, defaultRedactHeader, defaultRedactQueryParam };
199
+ //# sourceMappingURL=curl-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curl-logger.js","sourceRoot":"","sources":["../src/curl-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export function detectRuntime(g = globalThis) {
2
+ if (typeof g.Bun !== "undefined")
3
+ return "bun";
4
+ if (typeof g.Deno !== "undefined")
5
+ return "deno";
6
+ const ua = g.navigator?.userAgent ?? "";
7
+ if (ua.includes("Cloudflare-Workers") || ua.includes("workerd"))
8
+ return "cloudflare";
9
+ if (g.process?.versions?.node)
10
+ return "node";
11
+ throw new Error('Honey.serve() could not detect a runtime. Pass runtime: "bun" | "node" | "deno".');
12
+ }
13
+ //# sourceMappingURL=detect-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-runtime.js","sourceRoot":"","sources":["../src/detect-runtime.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,aAAa,CAAC,CAAC,GAAiB,UAAU;IACzD,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,WAAW;QAAE,OAAO,KAAK,CAAA;IAC9C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IAChD,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAA;IACvC,IAAI,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,YAAY,CAAA;IACpF,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI;QAAE,OAAO,MAAM,CAAA;IAC5C,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;AACpG,CAAC"}
package/dist/dict.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * An object for keys that come from request data: search params, form fields, header views,
3
+ * validation field maps. It has no prototype, so a key named `__proto__`, `constructor` or
4
+ * `toString` is plain data — it cannot hit `Object.prototype`, replace the object's prototype,
5
+ * or turn a missing key into a function.
6
+ *
7
+ * Read keys with `key in obj`, `obj[key] !== undefined` or `Object.hasOwn(obj, key)`; the
8
+ * object has no `hasOwnProperty` method of its own.
9
+ */
10
+ export declare function dict<T>(): Record<string, T>;
11
+ //# sourceMappingURL=dict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dict.d.ts","sourceRoot":"","sources":["../src/dict.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAE3C"}
package/dist/dict.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * An object for keys that come from request data: search params, form fields, header views,
3
+ * validation field maps. It has no prototype, so a key named `__proto__`, `constructor` or
4
+ * `toString` is plain data — it cannot hit `Object.prototype`, replace the object's prototype,
5
+ * or turn a missing key into a function.
6
+ *
7
+ * Read keys with `key in obj`, `obj[key] !== undefined` or `Object.hasOwn(obj, key)`; the
8
+ * object has no `hasOwnProperty` method of its own.
9
+ */
10
+ export function dict() {
11
+ return Object.create(null);
12
+ }
13
+ //# sourceMappingURL=dict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dict.js","sourceRoot":"","sources":["../src/dict.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,IAAI;IACnB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAsB,CAAA;AAChD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGvD,qBAAa,UAAW,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;IAE/C,YAAY,IAAI,EAAE;QACjB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,MAAM,EAAE,SAAS,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;KACtC,EASA;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBpD;CACD"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGvD,qBAAa,UAAW,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;IAE/C,YAAY,IAAI,EAAE;QACjB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,MAAM,EAAE,SAAS,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;KACtC,EAWA;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBpD;CACD"}
package/dist/error.js ADDED
@@ -0,0 +1,44 @@
1
+ import { EMPTY_FIELDS, statusKeyToCode } from "./types.js";
2
+ export class HoneyError extends Error {
3
+ data;
4
+ errorKey;
5
+ fields;
6
+ headers;
7
+ status;
8
+ statusKey;
9
+ vars;
10
+ constructor(opts) {
11
+ super(opts.errorKey, opts.cause !== undefined ? { cause: opts.cause } : undefined);
12
+ this.data = opts.data;
13
+ this.errorKey = opts.errorKey;
14
+ this.headers = opts.headers;
15
+ /* an unknown status key must not turn an error into a 200 — it is a 500 */
16
+ const known = Object.hasOwn(statusKeyToCode, opts.status);
17
+ this.statusKey = known ? opts.status : "internal_server_error";
18
+ this.status = known ? statusKeyToCode[opts.status] : 500;
19
+ this.fields = opts.fields ?? EMPTY_FIELDS;
20
+ this.vars = opts.vars;
21
+ }
22
+ static serialize(e) {
23
+ if (!(e instanceof Error))
24
+ return { message: String(e) };
25
+ const obj = {
26
+ message: e.message,
27
+ name: e.name,
28
+ stack: e.stack,
29
+ };
30
+ if (e instanceof HoneyError) {
31
+ obj["errorKey"] = e.errorKey;
32
+ obj["status"] = e.status;
33
+ obj["statusKey"] = e.statusKey;
34
+ if (Object.keys(e.fields).length > 0)
35
+ obj["fields"] = e.fields;
36
+ if (e.vars)
37
+ obj["vars"] = e.vars;
38
+ }
39
+ if (e.cause)
40
+ obj["cause"] = HoneyError.serialize(e.cause);
41
+ return obj;
42
+ }
43
+ }
44
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE1D,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC3B,IAAI,CAAU;IACd,QAAQ,CAAQ;IAChB,MAAM,CAA8B;IACpC,OAAO,CAAyB;IAChC,MAAM,CAAQ;IACd,SAAS,CAAW;IACpB,IAAI,CAAkC;IAE/C,YAAY,IAQX;QACA,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAClF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,2EAA2E;QAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACzD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAA;QAC9D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACxD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAA;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACtB,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAU;QAC1B,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QAExD,MAAM,GAAG,GAA4B;YACpC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;SACd,CAAA;QAED,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;YAC7B,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;YAC5B,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;YACxB,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;YAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;YAC9D,IAAI,CAAC,CAAC,IAAI;gBAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;QACjC,CAAC;QAED,IAAI,CAAC,CAAC,KAAK;YAAE,GAAG,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAEzD,OAAO,GAAG,CAAA;IACX,CAAC;CACD"}
package/dist/errors.js ADDED
@@ -0,0 +1,39 @@
1
+ import { HoneyError } from "./error.js";
2
+ export const ERROR_META = Symbol.for("honey.error.meta");
3
+ export function defineErrors(map) {
4
+ const result = Object.create(null);
5
+ const meta = Object.create(null);
6
+ for (const [key, def] of Object.entries(map)) {
7
+ if (typeof def === "string") {
8
+ /* standard error — string status key */
9
+ meta[key] = { schema: null, statusKey: def };
10
+ result[key] = (opts) => new HoneyError({
11
+ cause: opts?.cause,
12
+ errorKey: key,
13
+ fields: opts?.fields,
14
+ headers: opts?.headers,
15
+ status: def,
16
+ vars: opts?.vars,
17
+ });
18
+ }
19
+ else {
20
+ /* custom schema error — { status, schema } */
21
+ meta[key] = { schema: def.schema, statusKey: def.status };
22
+ result[key] = (data, opts) => new HoneyError({
23
+ cause: opts?.cause,
24
+ data,
25
+ errorKey: key,
26
+ headers: opts?.headers,
27
+ status: def.status,
28
+ });
29
+ }
30
+ }
31
+ Object.defineProperty(result, ERROR_META, {
32
+ configurable: false,
33
+ enumerable: false,
34
+ value: meta,
35
+ writable: false,
36
+ });
37
+ return result;
38
+ }
39
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AA8BvC,MAAM,CAAC,MAAM,UAAU,GAAkB,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;AAYvE,MAAM,UAAU,YAAY,CAG1B,GAAS;IACV,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAA4B,CAAA;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAmC,CAAA;IAElE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC7B,wCAAwC;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;YAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAwD,EAAE,EAAE,CAC1E,IAAI,UAAU,CAAC;gBACd,KAAK,EAAE,IAAI,EAAE,KAAK;gBAClB,QAAQ,EAAE,GAAG;gBACb,MAAM,EAAE,IAAI,EAAE,MAAM;gBACpB,OAAO,EAAE,IAAI,EAAE,OAAO;gBACtB,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,IAAI,EAAE,IAAI;aAChB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACP,8CAA8C;YAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAA;YACzD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAa,EAAE,IAA4D,EAAE,EAAE,CAC7F,IAAI,UAAU,CAAC;gBACd,KAAK,EAAE,IAAI,EAAE,KAAK;gBAClB,IAAI;gBACJ,QAAQ,EAAE,GAAG;gBACb,OAAO,EAAE,IAAI,EAAE,OAAO;gBACtB,MAAM,EAAE,GAAG,CAAC,MAAM;aAClB,CAAC,CAAA;QACJ,CAAC;IACF,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE;QACzC,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,KAAK;KACf,CAAC,CAAA;IAEF,OAAO,MAAiD,CAAA;AACzD,CAAC"}
package/dist/etag.d.ts CHANGED
@@ -2,6 +2,8 @@ import type { MiddlewareFn } from "./middleware.ts";
2
2
  type ETagOptions = {
3
3
  weak?: boolean;
4
4
  };
5
+ /** RFC 9110 §13.1.2: `*` or a list of entity tags, compared weakly. */
6
+ export declare function ifNoneMatchHits(header: string | null, etag: string): boolean;
5
7
  export declare function etag(options?: ETagOptions): MiddlewareFn<{
6
8
  req: Request;
7
9
  }, {}>;
@@ -1 +1 @@
1
- {"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../src/etag.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,KAAK,WAAW,GAAG;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAeD,wBAAgB,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,EAAE,CAAC,CAmD9E"}
1
+ {"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../src/etag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,KAAK,WAAW,GAAG;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAmBD,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ5E;AAED,wBAAgB,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,EAAE,CAAC,CA2D9E"}
package/dist/etag.js ADDED
@@ -0,0 +1,82 @@
1
+ import { bodyKind, rawBodyOf } from "./body-kind.js";
2
+ import { replaceResponse } from "./honey-response.js";
3
+ import { namedMiddleware } from "./middleware.js";
4
+ const encoder = new TextEncoder();
5
+ /** Base64url of the first 16 bytes of SHA-256: collision-resistant enough for a strong validator. */
6
+ async function digest(data) {
7
+ const hash = new Uint8Array(await crypto.subtle.digest("SHA-256", data)).subarray(0, 16);
8
+ let binary = "";
9
+ for (let i = 0; i < hash.length; i++)
10
+ binary += String.fromCharCode(hash[i]);
11
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
12
+ }
13
+ const ENTITY_TAG_RE = /(?:W\/)?"[^"]*"/g;
14
+ /** Weak comparison (RFC 9110 §8.8.3.2): opaque tags match regardless of the `W/` prefix. */
15
+ function opaque(tag) {
16
+ return tag.startsWith("W/") ? tag.slice(2) : tag;
17
+ }
18
+ /** RFC 9110 §13.1.2: `*` or a list of entity tags, compared weakly. */
19
+ export function ifNoneMatchHits(header, etag) {
20
+ if (header === null)
21
+ return false;
22
+ if (header.trim() === "*")
23
+ return true;
24
+ const target = opaque(etag.trim());
25
+ for (const tag of header.match(ENTITY_TAG_RE) ?? []) {
26
+ if (opaque(tag) === target)
27
+ return true;
28
+ }
29
+ return false;
30
+ }
31
+ export function etag(options) {
32
+ const weak = options?.weak !== false;
33
+ const mw = async (ctx, next) => {
34
+ const method = ctx.req.method;
35
+ if (method !== "GET" && method !== "HEAD") {
36
+ return next();
37
+ }
38
+ const response = await next();
39
+ /* Only a 200 has a selected representation a 304 can stand in for. */
40
+ if (response.status !== 200)
41
+ return response;
42
+ const ifNoneMatch = ctx.req.headers.get("if-none-match");
43
+ /* A handler-set ETag is authoritative: never overwrite it or hash the body. */
44
+ const existing = response.headers.get("etag");
45
+ if (existing !== null) {
46
+ if (!ifNoneMatchHits(ifNoneMatch, existing))
47
+ return response;
48
+ await response.body?.cancel().catch(() => { });
49
+ return replaceResponse(response, { body: null, headers: response.headers, status: 304 });
50
+ }
51
+ /* Never buffer a stream: SSE and generate() can be endless. */
52
+ if (bodyKind(response) !== "buffered")
53
+ return response;
54
+ let bytes;
55
+ const raw = rawBodyOf(response);
56
+ if (raw !== null) {
57
+ bytes = typeof raw === "string" ? encoder.encode(raw) : new Uint8Array(raw);
58
+ }
59
+ else {
60
+ bytes = new Uint8Array(await response.arrayBuffer());
61
+ }
62
+ /* Nothing to validate; hand back a fresh body (the original may have been read). */
63
+ if (bytes.byteLength === 0) {
64
+ return raw === null ? replaceResponse(response, { body: bytes, headers: response.headers }) : response;
65
+ }
66
+ const hash = await digest(bytes);
67
+ const etagValue = weak ? `W/"${hash}"` : `"${hash}"`;
68
+ const headers = new Headers(response.headers);
69
+ headers.set("etag", etagValue);
70
+ if (ifNoneMatchHits(ifNoneMatch, etagValue)) {
71
+ return replaceResponse(response, { body: null, headers, status: 304 });
72
+ }
73
+ /* The original body was read (or is raw): always hand back a fresh one. */
74
+ return replaceResponse(response, {
75
+ body: typeof raw === "string" ? raw : bytes,
76
+ headers,
77
+ status: response.status,
78
+ });
79
+ };
80
+ return namedMiddleware("etag", mw);
81
+ }
82
+ //# sourceMappingURL=etag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"etag.js","sourceRoot":"","sources":["../src/etag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Detects which optional honey features (`openapi`, `i18n`, `serve`) app code uses, so build
3
+ * tooling can import their entries ahead of the app. A bundle cannot follow the lazy, opaque
4
+ * feature imports honey uses at run time. Not a package export.
5
+ */
6
+ export type HoneyFeature = "i18n" | "openapi" | "serve";
7
+ export declare const FEATURES: readonly HoneyFeature[];
8
+ /**
9
+ * Replaces comments and string, template and regex literal contents with spaces, keeping every
10
+ * newline so offsets and line numbers still line up. A scanner, not a parser; it is only accurate
11
+ * enough to keep `// app.serve(` in a comment from counting as a call.
12
+ */
13
+ export declare function stripCommentsAndStrings(code: string): string;
14
+ /** Feature calls in source text, ignoring comments and strings. */
15
+ export declare function detectFeaturesInSource(code: string): Set<HoneyFeature>;
16
+ /** Feature calls and import specifiers of an ESTree program. */
17
+ export declare function scanProgram(program: unknown): {
18
+ features: Set<HoneyFeature>;
19
+ imports: string[];
20
+ };
21
+ /** `import { enableX } from "…"; enableX();` for each feature, on one line. */
22
+ export declare function featurePrelude(features: Iterable<HoneyFeature>): string;
23
+ /** True when `code` already imports the entry for `feature`. */
24
+ export declare function importsFeatureEntry(code: string, feature: HoneyFeature): boolean;
25
+ //# sourceMappingURL=feature-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-detect.d.ts","sourceRoot":"","sources":["../src/feature-detect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAEvD,eAAO,MAAM,QAAQ,EAAE,SAAS,YAAY,EAAiC,CAAA;AAsB7E;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC5D;AAED,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAWtE;AAQD,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAwChG;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,MAAM,CAQvE;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAEhF"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Detects which optional honey features (`openapi`, `i18n`, `serve`) app code uses, so build
3
+ * tooling can import their entries ahead of the app. A bundle cannot follow the lazy, opaque
4
+ * feature imports honey uses at run time. Not a package export.
5
+ */
6
+ export const FEATURES = ["i18n", "openapi", "serve"];
7
+ const FEATURE_ENTRY = {
8
+ i18n: { enable: "enableI18n", specifier: "@lovrozagar/honey/i18n" },
9
+ openapi: { enable: "enableOpenApi", specifier: "@lovrozagar/honey/openapi" },
10
+ serve: { enable: "enableServe", specifier: "@lovrozagar/honey/serve" },
11
+ };
12
+ const METHOD_FEATURE = {
13
+ errorI18n: "i18n",
14
+ manifest: "openapi",
15
+ openapi: "openapi",
16
+ serve: "serve",
17
+ };
18
+ /** Globals whose `.serve()` is the runtime's own server, not `Honey.serve()`. */
19
+ const RUNTIME_SERVE_OWNERS = new Set(["Bun", "Deno"]);
20
+ function blank(s) {
21
+ return s.replace(/[^\n]/g, " ");
22
+ }
23
+ /**
24
+ * Replaces comments and string, template and regex literal contents with spaces, keeping every
25
+ * newline so offsets and line numbers still line up. A scanner, not a parser; it is only accurate
26
+ * enough to keep `// app.serve(` in a comment from counting as a call.
27
+ */
28
+ export function stripCommentsAndStrings(code) {
29
+ let out = "";
30
+ let i = 0;
31
+ while (i < code.length) {
32
+ const ch = code[i];
33
+ const next = code[i + 1];
34
+ if (ch === "/" && next === "/") {
35
+ const end = code.indexOf("\n", i);
36
+ const stop = end === -1 ? code.length : end;
37
+ out += blank(code.slice(i, stop));
38
+ i = stop;
39
+ }
40
+ else if (ch === "/" && next === "*") {
41
+ const end = code.indexOf("*/", i + 2);
42
+ const stop = end === -1 ? code.length : end + 2;
43
+ out += blank(code.slice(i, stop));
44
+ i = stop;
45
+ }
46
+ else if (ch === '"' || ch === "'" || ch === "`") {
47
+ let j = i + 1;
48
+ while (j < code.length && code[j] !== ch) {
49
+ if (code[j] === "\\")
50
+ j++;
51
+ else if (ch !== "`" && code[j] === "\n")
52
+ break;
53
+ j++;
54
+ }
55
+ const stop = Math.min(j + 1, code.length);
56
+ out += ch + blank(code.slice(i + 1, stop - 1)) + (stop - 1 > i ? (code[stop - 1] ?? "") : "");
57
+ i = stop;
58
+ }
59
+ else {
60
+ out += ch;
61
+ i++;
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ /** Feature calls in source text, ignoring comments and strings. */
67
+ export function detectFeaturesInSource(code) {
68
+ const text = stripCommentsAndStrings(code);
69
+ const found = new Set();
70
+ const re = /(\b[A-Za-z_$][\w$]*\s*)?\.\s*(openapi|manifest|errorI18n|serve)\s*\(/g;
71
+ for (const m of text.matchAll(re)) {
72
+ const owner = m[1]?.trim();
73
+ const method = m[2];
74
+ if (method === "serve" && owner && RUNTIME_SERVE_OWNERS.has(owner))
75
+ continue;
76
+ found.add(METHOD_FEATURE[method]);
77
+ }
78
+ return found;
79
+ }
80
+ function isNode(value) {
81
+ return value !== null && typeof value === "object" && typeof value.type === "string";
82
+ }
83
+ /** Feature calls and import specifiers of an ESTree program. */
84
+ export function scanProgram(program) {
85
+ const features = new Set();
86
+ const imports = [];
87
+ const stack = [program];
88
+ while (stack.length > 0) {
89
+ const node = stack.pop();
90
+ if (Array.isArray(node)) {
91
+ stack.push(...node);
92
+ continue;
93
+ }
94
+ if (!isNode(node))
95
+ continue;
96
+ switch (node.type) {
97
+ case "ImportDeclaration":
98
+ case "ExportAllDeclaration":
99
+ case "ExportNamedDeclaration":
100
+ case "ImportExpression": {
101
+ const source = node.source;
102
+ if (source && typeof source.value === "string")
103
+ imports.push(source.value);
104
+ break;
105
+ }
106
+ case "CallExpression": {
107
+ const callee = node.callee;
108
+ if (callee?.type === "MemberExpression" && !callee.computed) {
109
+ const property = callee.property;
110
+ const feature = typeof property.name === "string" ? METHOD_FEATURE[property.name] : undefined;
111
+ const object = callee.object;
112
+ const runtimeOwned = property.name === "serve" && object.type === "Identifier" && RUNTIME_SERVE_OWNERS.has(String(object.name));
113
+ if (feature && !runtimeOwned)
114
+ features.add(feature);
115
+ }
116
+ break;
117
+ }
118
+ }
119
+ for (const key in node) {
120
+ if (key === "type" || key === "start" || key === "end" || key === "loc" || key === "range")
121
+ continue;
122
+ const value = node[key];
123
+ if (value !== null && typeof value === "object")
124
+ stack.push(value);
125
+ }
126
+ }
127
+ return { features, imports };
128
+ }
129
+ /** `import { enableX } from "…"; enableX();` for each feature, on one line. */
130
+ export function featurePrelude(features) {
131
+ const parts = [];
132
+ for (const feature of FEATURES) {
133
+ if (![...features].includes(feature))
134
+ continue;
135
+ const { enable, specifier } = FEATURE_ENTRY[feature];
136
+ parts.push(`import { ${enable} } from ${JSON.stringify(specifier)}; ${enable}();`);
137
+ }
138
+ return parts.join(" ");
139
+ }
140
+ /** True when `code` already imports the entry for `feature`. */
141
+ export function importsFeatureEntry(code, feature) {
142
+ return code.includes(FEATURE_ENTRY[feature].specifier);
143
+ }
144
+ //# sourceMappingURL=feature-detect.js.map