@lovrozagar/honey 0.6.8 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/README.md +514 -192
  2. package/bin/honey.js +25 -0
  3. package/dist/accepts.d.ts +7 -1
  4. package/dist/accepts.d.ts.map +1 -1
  5. package/dist/accepts.js +126 -0
  6. package/dist/accepts.js.map +1 -0
  7. package/dist/body-kind.d.ts +26 -0
  8. package/dist/body-kind.d.ts.map +1 -0
  9. package/dist/body-kind.js +70 -0
  10. package/dist/body-kind.js.map +1 -0
  11. package/dist/body-limit.d.ts +5 -1
  12. package/dist/body-limit.d.ts.map +1 -1
  13. package/dist/body-limit.js +126 -0
  14. package/dist/body-limit.js.map +1 -0
  15. package/dist/build/index.d.ts +19 -3
  16. package/dist/build/index.d.ts.map +1 -1
  17. package/dist/build/index.js +173 -0
  18. package/dist/build/index.js.map +1 -0
  19. package/dist/cli-args.d.ts +33 -0
  20. package/dist/cli-args.d.ts.map +1 -0
  21. package/dist/cli-args.js +102 -0
  22. package/dist/cli-args.js.map +1 -0
  23. package/dist/cli-go/auth.go +26 -0
  24. package/dist/cli-go/config.go +192 -0
  25. package/dist/cli-go/errors.go +75 -0
  26. package/dist/cli-go/multipart.go +79 -0
  27. package/dist/cli-go/output.go +163 -0
  28. package/dist/cli-go/root.go +30 -0
  29. package/dist/cli-go/stream.go +88 -0
  30. package/dist/cli-go/version.go +5 -0
  31. package/dist/cli.d.ts +1 -1
  32. package/dist/cli.js +209 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/client/defaults.js +48 -0
  35. package/dist/client/defaults.js.map +1 -0
  36. package/dist/client/error.d.ts +35 -0
  37. package/dist/client/error.d.ts.map +1 -1
  38. package/dist/client/error.js +71 -0
  39. package/dist/client/error.js.map +1 -0
  40. package/dist/client/http.d.ts +67 -8
  41. package/dist/client/http.d.ts.map +1 -1
  42. package/dist/client/http.js +571 -0
  43. package/dist/client/http.js.map +1 -0
  44. package/dist/client/index.d.ts +3 -2
  45. package/dist/client/index.d.ts.map +1 -1
  46. package/dist/client/index.js +95 -0
  47. package/dist/client/index.js.map +1 -0
  48. package/dist/client/path.d.ts +26 -0
  49. package/dist/client/path.d.ts.map +1 -0
  50. package/dist/client/path.js +163 -0
  51. package/dist/client/path.js.map +1 -0
  52. package/dist/client/redirect-policy.d.ts +12 -0
  53. package/dist/client/redirect-policy.d.ts.map +1 -0
  54. package/dist/client/redirect-policy.js +20 -0
  55. package/dist/client/redirect-policy.js.map +1 -0
  56. package/dist/client/sdk.d.ts +36 -0
  57. package/dist/client/sdk.d.ts.map +1 -1
  58. package/dist/client/sdk.js +292 -0
  59. package/dist/client/sdk.js.map +1 -0
  60. package/dist/client/sse.d.ts +13 -0
  61. package/dist/client/sse.d.ts.map +1 -1
  62. package/dist/client/sse.js +129 -0
  63. package/dist/client/sse.js.map +1 -0
  64. package/dist/client/types.js +2 -0
  65. package/dist/client/types.js.map +1 -0
  66. package/dist/client/ws.d.ts +9 -2
  67. package/dist/client/ws.d.ts.map +1 -1
  68. package/dist/client/ws.js +112 -0
  69. package/dist/client/ws.js.map +1 -0
  70. package/dist/client-go/errors.go +236 -0
  71. package/dist/client-go/export.go +44 -0
  72. package/dist/client-go/invalidation.go +371 -0
  73. package/dist/client-go/nullable.go +62 -0
  74. package/dist/client-go/realtime.go +354 -0
  75. package/dist/client-go/result.go +20 -0
  76. package/dist/client-go/runtime.go +975 -0
  77. package/dist/client-go/sse.go +159 -0
  78. package/dist/client-go/transport.go +495 -0
  79. package/dist/client-go/ws.go +128 -0
  80. package/dist/client-info.d.ts +36 -0
  81. package/dist/client-info.d.ts.map +1 -0
  82. package/dist/client-info.js +53 -0
  83. package/dist/client-info.js.map +1 -0
  84. package/dist/client-mcp/README.md +10 -0
  85. package/dist/client-mcp/server.ts +221 -0
  86. package/dist/client-mcp/types.ts +19 -0
  87. package/dist/client-python/_errors.py +115 -0
  88. package/dist/client-python/_invalidation.py +494 -0
  89. package/dist/client-python/_realtime.py +179 -0
  90. package/dist/client-python/_runtime.py +860 -0
  91. package/dist/client-python/_sse.py +155 -0
  92. package/dist/client-python/_transport.py +366 -0
  93. package/dist/client-python/_ws.py +159 -0
  94. package/dist/client-python/py.typed +0 -0
  95. package/dist/client-rust/errors.rs +220 -0
  96. package/dist/client-rust/invalidation.rs +412 -0
  97. package/dist/client-rust/invalidation_sync.rs +93 -0
  98. package/dist/client-rust/nullable.rs +17 -0
  99. package/dist/client-rust/realtime.rs +702 -0
  100. package/dist/client-rust/result.rs +22 -0
  101. package/dist/client-rust/runtime.rs +980 -0
  102. package/dist/client-rust/runtime_sync.rs +484 -0
  103. package/dist/client-rust/sse.rs +188 -0
  104. package/dist/client-rust/ws.rs +167 -0
  105. package/dist/codegen-go-cli.d.ts.map +1 -1
  106. package/dist/codegen-go-cli.js +964 -0
  107. package/dist/codegen-go-cli.js.map +1 -0
  108. package/dist/codegen-go.d.ts +15 -3
  109. package/dist/codegen-go.d.ts.map +1 -1
  110. package/dist/codegen-go.js +872 -0
  111. package/dist/codegen-go.js.map +1 -0
  112. package/dist/codegen-hash.js +9 -0
  113. package/dist/codegen-hash.js.map +1 -0
  114. package/dist/codegen-ir.d.ts +69 -2
  115. package/dist/codegen-ir.d.ts.map +1 -1
  116. package/dist/codegen-ir.js +661 -0
  117. package/dist/codegen-ir.js.map +1 -0
  118. package/dist/codegen-lang.d.ts +65 -0
  119. package/dist/codegen-lang.d.ts.map +1 -0
  120. package/dist/codegen-lang.js +526 -0
  121. package/dist/codegen-lang.js.map +1 -0
  122. package/dist/codegen-load.d.ts +31 -0
  123. package/dist/codegen-load.d.ts.map +1 -0
  124. package/dist/codegen-load.js +138 -0
  125. package/dist/codegen-load.js.map +1 -0
  126. package/dist/codegen-loaders.js +55 -0
  127. package/dist/codegen-loaders.js.map +1 -0
  128. package/dist/codegen-mcp.d.ts.map +1 -1
  129. package/dist/codegen-mcp.js +368 -0
  130. package/dist/codegen-mcp.js.map +1 -0
  131. package/dist/codegen-python.d.ts +13 -1
  132. package/dist/codegen-python.d.ts.map +1 -1
  133. package/dist/codegen-python.js +828 -0
  134. package/dist/codegen-python.js.map +1 -0
  135. package/dist/codegen-route-tree-intern.d.ts +15 -5
  136. package/dist/codegen-route-tree-intern.d.ts.map +1 -1
  137. package/dist/codegen-route-tree-intern.js +221 -0
  138. package/dist/codegen-route-tree-intern.js.map +1 -0
  139. package/dist/codegen-rust.d.ts.map +1 -1
  140. package/dist/codegen-rust.js +1293 -0
  141. package/dist/codegen-rust.js.map +1 -0
  142. package/dist/codegen-sanitize.d.ts.map +1 -1
  143. package/dist/codegen-sanitize.js +56 -0
  144. package/dist/codegen-sanitize.js.map +1 -0
  145. package/dist/codegen-schema-naming.d.ts +5 -0
  146. package/dist/codegen-schema-naming.d.ts.map +1 -1
  147. package/dist/codegen-schema-naming.js +150 -0
  148. package/dist/codegen-schema-naming.js.map +1 -0
  149. package/dist/codegen-sdk-model.d.ts +71 -0
  150. package/dist/codegen-sdk-model.d.ts.map +1 -0
  151. package/dist/codegen-sdk-model.js +179 -0
  152. package/dist/codegen-sdk-model.js.map +1 -0
  153. package/dist/codegen.d.ts +41 -23
  154. package/dist/codegen.d.ts.map +1 -1
  155. package/dist/codegen.js +4610 -0
  156. package/dist/codegen.js.map +1 -0
  157. package/dist/context.d.ts +36 -6
  158. package/dist/context.d.ts.map +1 -1
  159. package/dist/context.js +242 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/cookie-sign.d.ts +16 -2
  162. package/dist/cookie-sign.d.ts.map +1 -1
  163. package/dist/cookie-sign.js +104 -0
  164. package/dist/cookie-sign.js.map +1 -0
  165. package/dist/cookie.d.ts +12 -0
  166. package/dist/cookie.d.ts.map +1 -1
  167. package/dist/cookie.js +138 -0
  168. package/dist/cookie.js.map +1 -0
  169. package/dist/cors.d.ts +1 -0
  170. package/dist/cors.d.ts.map +1 -1
  171. package/dist/cors.js +87 -0
  172. package/dist/cors.js.map +1 -0
  173. package/dist/crypto.d.ts +6 -1
  174. package/dist/crypto.d.ts.map +1 -1
  175. package/dist/crypto.js +38 -0
  176. package/dist/crypto.js.map +1 -0
  177. package/dist/csrf.d.ts +19 -0
  178. package/dist/csrf.d.ts.map +1 -1
  179. package/dist/csrf.js +79 -0
  180. package/dist/csrf.js.map +1 -0
  181. package/dist/curl-logger.d.ts +14 -3
  182. package/dist/curl-logger.d.ts.map +1 -1
  183. package/dist/curl-logger.js +199 -0
  184. package/dist/curl-logger.js.map +1 -0
  185. package/dist/detect-runtime.js +13 -0
  186. package/dist/detect-runtime.js.map +1 -0
  187. package/dist/dict.d.ts +11 -0
  188. package/dist/dict.d.ts.map +1 -0
  189. package/dist/dict.js +13 -0
  190. package/dist/dict.js.map +1 -0
  191. package/dist/error.d.ts.map +1 -1
  192. package/dist/error.js +44 -0
  193. package/dist/error.js.map +1 -0
  194. package/dist/errors.js +39 -0
  195. package/dist/errors.js.map +1 -0
  196. package/dist/etag.d.ts +2 -0
  197. package/dist/etag.d.ts.map +1 -1
  198. package/dist/etag.js +82 -0
  199. package/dist/etag.js.map +1 -0
  200. package/dist/feature-detect.d.ts +25 -0
  201. package/dist/feature-detect.d.ts.map +1 -0
  202. package/dist/feature-detect.js +144 -0
  203. package/dist/feature-detect.js.map +1 -0
  204. package/dist/feature-load.js +36 -0
  205. package/dist/feature-load.js.map +1 -0
  206. package/dist/feature-slots.d.ts +44 -0
  207. package/dist/feature-slots.d.ts.map +1 -0
  208. package/dist/feature-slots.js +48 -0
  209. package/dist/feature-slots.js.map +1 -0
  210. package/dist/fetch-request.d.ts +10 -0
  211. package/dist/fetch-request.d.ts.map +1 -0
  212. package/dist/fetch-request.js +13 -0
  213. package/dist/fetch-request.js.map +1 -0
  214. package/dist/gen-process.d.ts +15 -0
  215. package/dist/gen-process.d.ts.map +1 -0
  216. package/dist/gen-process.js +43 -0
  217. package/dist/gen-process.js.map +1 -0
  218. package/dist/gen-write.d.ts +19 -0
  219. package/dist/gen-write.d.ts.map +1 -0
  220. package/dist/gen-write.js +120 -0
  221. package/dist/gen-write.js.map +1 -0
  222. package/dist/glob.d.ts +21 -0
  223. package/dist/glob.d.ts.map +1 -0
  224. package/dist/glob.js +115 -0
  225. package/dist/glob.js.map +1 -0
  226. package/dist/go-type-emitter.d.ts +18 -4
  227. package/dist/go-type-emitter.d.ts.map +1 -1
  228. package/dist/go-type-emitter.js +594 -0
  229. package/dist/go-type-emitter.js.map +1 -0
  230. package/dist/honey-response.d.ts.map +1 -1
  231. package/dist/honey-response.js +338 -0
  232. package/dist/honey-response.js.map +1 -0
  233. package/dist/i18n-slot.d.ts +8 -0
  234. package/dist/i18n-slot.d.ts.map +1 -1
  235. package/dist/i18n-slot.js +14 -0
  236. package/dist/i18n-slot.js.map +1 -0
  237. package/dist/i18n.d.ts +3 -0
  238. package/dist/i18n.d.ts.map +1 -1
  239. package/dist/i18n.js +250 -0
  240. package/dist/i18n.js.map +1 -0
  241. package/dist/index.d.ts +408 -148
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +2324 -0
  244. package/dist/index.js.map +1 -0
  245. package/dist/init.d.ts +3 -5
  246. package/dist/init.d.ts.map +1 -1
  247. package/dist/init.js +140 -0
  248. package/dist/init.js.map +1 -0
  249. package/dist/input.js +4 -0
  250. package/dist/input.js.map +1 -0
  251. package/dist/invalidate-check.d.ts +11 -0
  252. package/dist/invalidate-check.d.ts.map +1 -1
  253. package/dist/invalidate-check.js +163 -0
  254. package/dist/invalidate-check.js.map +1 -0
  255. package/dist/invoke-user.d.ts +35 -0
  256. package/dist/invoke-user.d.ts.map +1 -0
  257. package/dist/invoke-user.js +73 -0
  258. package/dist/invoke-user.js.map +1 -0
  259. package/dist/ip-restrict.d.ts +13 -1
  260. package/dist/ip-restrict.d.ts.map +1 -1
  261. package/dist/ip-restrict.js +60 -0
  262. package/dist/ip-restrict.js.map +1 -0
  263. package/dist/ip.d.ts +39 -0
  264. package/dist/ip.d.ts.map +1 -0
  265. package/dist/ip.js +209 -0
  266. package/dist/ip.js.map +1 -0
  267. package/dist/logger.d.ts.map +1 -1
  268. package/dist/logger.js +113 -0
  269. package/dist/logger.js.map +1 -0
  270. package/dist/media-type.d.ts +30 -0
  271. package/dist/media-type.d.ts.map +1 -0
  272. package/dist/media-type.js +97 -0
  273. package/dist/media-type.js.map +1 -0
  274. package/dist/meta-spec-merge.d.ts +32 -0
  275. package/dist/meta-spec-merge.d.ts.map +1 -0
  276. package/dist/meta-spec-merge.js +68 -0
  277. package/dist/meta-spec-merge.js.map +1 -0
  278. package/dist/meta-spec.d.ts +16 -3
  279. package/dist/meta-spec.d.ts.map +1 -1
  280. package/dist/meta-spec.js +535 -0
  281. package/dist/meta-spec.js.map +1 -0
  282. package/dist/middleware.d.ts +23 -6
  283. package/dist/middleware.d.ts.map +1 -1
  284. package/dist/middleware.js +253 -0
  285. package/dist/middleware.js.map +1 -0
  286. package/dist/node-request.d.ts +57 -12
  287. package/dist/node-request.d.ts.map +1 -1
  288. package/dist/node-request.js +407 -0
  289. package/dist/node-request.js.map +1 -0
  290. package/dist/node.d.ts +20 -3
  291. package/dist/node.d.ts.map +1 -1
  292. package/dist/node.js +396 -0
  293. package/dist/node.js.map +1 -0
  294. package/dist/openapi/collect.d.ts +6 -3
  295. package/dist/openapi/collect.d.ts.map +1 -1
  296. package/dist/openapi/collect.js +30 -0
  297. package/dist/openapi/collect.js.map +1 -0
  298. package/dist/openapi/docs-page.d.ts +42 -0
  299. package/dist/openapi/docs-page.d.ts.map +1 -0
  300. package/dist/openapi/docs-page.js +80 -0
  301. package/dist/openapi/docs-page.js.map +1 -0
  302. package/dist/openapi/document.d.ts +4 -0
  303. package/dist/openapi/document.d.ts.map +1 -1
  304. package/dist/openapi/document.js +785 -0
  305. package/dist/openapi/document.js.map +1 -0
  306. package/dist/openapi/json-schema-slot.d.ts +7 -0
  307. package/dist/openapi/json-schema-slot.d.ts.map +1 -1
  308. package/dist/openapi/json-schema-slot.js +38 -0
  309. package/dist/openapi/json-schema-slot.js.map +1 -0
  310. package/dist/openapi/register.d.ts.map +1 -1
  311. package/dist/openapi/register.js +20 -0
  312. package/dist/openapi/register.js.map +1 -0
  313. package/dist/openapi/scalar.d.ts +3 -1
  314. package/dist/openapi/scalar.d.ts.map +1 -1
  315. package/dist/openapi/scalar.js +21 -0
  316. package/dist/openapi/scalar.js.map +1 -0
  317. package/dist/openapi/serve.d.ts +9 -0
  318. package/dist/openapi/serve.d.ts.map +1 -0
  319. package/dist/openapi/serve.js +36 -0
  320. package/dist/openapi/serve.js.map +1 -0
  321. package/dist/openapi/spec-factory.d.ts +30 -1
  322. package/dist/openapi/spec-factory.d.ts.map +1 -1
  323. package/dist/openapi/spec-factory.js +52 -0
  324. package/dist/openapi/spec-factory.js.map +1 -0
  325. package/dist/openapi/spec.d.ts +14 -5
  326. package/dist/openapi/spec.d.ts.map +1 -1
  327. package/dist/openapi/spec.js +50 -0
  328. package/dist/openapi/spec.js.map +1 -0
  329. package/dist/openapi/swagger.d.ts +3 -1
  330. package/dist/openapi/swagger.d.ts.map +1 -1
  331. package/dist/openapi/swagger.js +22 -0
  332. package/dist/openapi/swagger.js.map +1 -0
  333. package/dist/pattern.d.ts +71 -0
  334. package/dist/pattern.d.ts.map +1 -0
  335. package/dist/pattern.js +239 -0
  336. package/dist/pattern.js.map +1 -0
  337. package/dist/peer.d.ts +17 -0
  338. package/dist/peer.d.ts.map +1 -0
  339. package/dist/peer.js +50 -0
  340. package/dist/peer.js.map +1 -0
  341. package/dist/plugin.d.ts +67 -16
  342. package/dist/plugin.d.ts.map +1 -1
  343. package/dist/plugin.js +649 -0
  344. package/dist/plugin.js.map +1 -0
  345. package/dist/powered-by.d.ts.map +1 -1
  346. package/dist/powered-by.js +11 -0
  347. package/dist/powered-by.js.map +1 -0
  348. package/dist/pretty-json.d.ts.map +1 -1
  349. package/dist/pretty-json.js +47 -0
  350. package/dist/pretty-json.js.map +1 -0
  351. package/dist/producer-stream.d.ts +47 -0
  352. package/dist/producer-stream.d.ts.map +1 -0
  353. package/dist/producer-stream.js +267 -0
  354. package/dist/producer-stream.js.map +1 -0
  355. package/dist/proxy.d.ts +47 -8
  356. package/dist/proxy.d.ts.map +1 -1
  357. package/dist/proxy.js +274 -0
  358. package/dist/proxy.js.map +1 -0
  359. package/dist/python-type-emitter.d.ts +14 -1
  360. package/dist/python-type-emitter.d.ts.map +1 -1
  361. package/dist/python-type-emitter.js +157 -0
  362. package/dist/python-type-emitter.js.map +1 -0
  363. package/dist/realtime/bus.d.ts +17 -1
  364. package/dist/realtime/bus.d.ts.map +1 -1
  365. package/dist/realtime/bus.js +112 -0
  366. package/dist/realtime/bus.js.map +1 -0
  367. package/dist/realtime/register.d.ts +3 -0
  368. package/dist/realtime/register.d.ts.map +1 -0
  369. package/dist/realtime/register.js +10 -0
  370. package/dist/realtime/register.js.map +1 -0
  371. package/dist/realtime/route.d.ts +65 -26
  372. package/dist/realtime/route.d.ts.map +1 -1
  373. package/dist/realtime/route.js +72 -0
  374. package/dist/realtime/route.js.map +1 -0
  375. package/dist/realtime/server.d.ts +43 -0
  376. package/dist/realtime/server.d.ts.map +1 -0
  377. package/dist/realtime/server.js +255 -0
  378. package/dist/realtime/server.js.map +1 -0
  379. package/dist/request-id.d.ts +7 -0
  380. package/dist/request-id.d.ts.map +1 -1
  381. package/dist/request-id.js +16 -0
  382. package/dist/request-id.js.map +1 -0
  383. package/dist/request-limits.d.ts +3 -0
  384. package/dist/request-limits.d.ts.map +1 -0
  385. package/dist/request-limits.js +3 -0
  386. package/dist/request-limits.js.map +1 -0
  387. package/dist/request-path.d.ts +33 -0
  388. package/dist/request-path.d.ts.map +1 -0
  389. package/dist/request-path.js +178 -0
  390. package/dist/request-path.js.map +1 -0
  391. package/dist/request-to-curl.d.ts +7 -1
  392. package/dist/request-to-curl.d.ts.map +1 -1
  393. package/dist/request-to-curl.js +48 -0
  394. package/dist/request-to-curl.js.map +1 -0
  395. package/dist/response.d.ts +25 -2
  396. package/dist/response.d.ts.map +1 -1
  397. package/dist/response.js +313 -0
  398. package/dist/response.js.map +1 -0
  399. package/dist/rust-type-emitter.d.ts +14 -2
  400. package/dist/rust-type-emitter.d.ts.map +1 -1
  401. package/dist/rust-type-emitter.js +463 -0
  402. package/dist/rust-type-emitter.js.map +1 -0
  403. package/dist/secure-headers.d.ts.map +1 -1
  404. package/dist/secure-headers.js +53 -0
  405. package/dist/secure-headers.js.map +1 -0
  406. package/dist/serve-register.d.ts +4 -0
  407. package/dist/serve-register.d.ts.map +1 -1
  408. package/dist/serve-register.js +9 -0
  409. package/dist/serve-register.js.map +1 -0
  410. package/dist/serve-slot.d.ts +3 -0
  411. package/dist/serve-slot.d.ts.map +1 -1
  412. package/dist/serve-slot.js +52 -0
  413. package/dist/serve-slot.js.map +1 -0
  414. package/dist/serve.d.ts +18 -1
  415. package/dist/serve.d.ts.map +1 -1
  416. package/dist/serve.js +157 -0
  417. package/dist/serve.js.map +1 -0
  418. package/dist/server-timing.d.ts.map +1 -1
  419. package/dist/server-timing.js +51 -0
  420. package/dist/server-timing.js.map +1 -0
  421. package/dist/static.d.ts +9 -0
  422. package/dist/static.d.ts.map +1 -1
  423. package/dist/static.js +102 -0
  424. package/dist/static.js.map +1 -0
  425. package/dist/telemetry/otel.d.ts +2 -0
  426. package/dist/telemetry/otel.d.ts.map +1 -1
  427. package/dist/telemetry/otel.js +135 -0
  428. package/dist/telemetry/otel.js.map +1 -0
  429. package/dist/testing.d.ts +12 -0
  430. package/dist/testing.d.ts.map +1 -1
  431. package/dist/testing.js +124 -0
  432. package/dist/testing.js.map +1 -0
  433. package/dist/timeout.d.ts +6 -0
  434. package/dist/timeout.d.ts.map +1 -1
  435. package/dist/timeout.js +36 -0
  436. package/dist/timeout.js.map +1 -0
  437. package/dist/tree.d.ts +133 -36
  438. package/dist/tree.d.ts.map +1 -1
  439. package/dist/tree.js +437 -0
  440. package/dist/tree.js.map +1 -0
  441. package/dist/trust.d.ts +21 -0
  442. package/dist/trust.d.ts.map +1 -0
  443. package/dist/trust.js +100 -0
  444. package/dist/trust.js.map +1 -0
  445. package/dist/ts-type-emitter.d.ts.map +1 -1
  446. package/dist/ts-type-emitter.js +150 -0
  447. package/dist/ts-type-emitter.js.map +1 -0
  448. package/dist/type-emitter.d.ts +16 -2
  449. package/dist/type-emitter.d.ts.map +1 -1
  450. package/dist/type-emitter.js +729 -0
  451. package/dist/type-emitter.js.map +1 -0
  452. package/dist/type-extractor.d.ts +8 -4
  453. package/dist/type-extractor.d.ts.map +1 -1
  454. package/dist/type-extractor.js +819 -0
  455. package/dist/type-extractor.js.map +1 -0
  456. package/dist/types.d.ts +7 -0
  457. package/dist/types.d.ts.map +1 -1
  458. package/dist/types.js +96 -0
  459. package/dist/types.js.map +1 -0
  460. package/dist/validation.d.ts +14 -2
  461. package/dist/validation.d.ts.map +1 -1
  462. package/dist/validation.js +335 -0
  463. package/dist/validation.js.map +1 -0
  464. package/dist/with-headers.d.ts +15 -0
  465. package/dist/with-headers.d.ts.map +1 -0
  466. package/dist/with-headers.js +45 -0
  467. package/dist/with-headers.js.map +1 -0
  468. package/dist/ws/bun.d.ts +11 -5
  469. package/dist/ws/bun.d.ts.map +1 -1
  470. package/dist/ws/bun.js +82 -0
  471. package/dist/ws/bun.js.map +1 -0
  472. package/dist/ws/cloudflare.d.ts +25 -3
  473. package/dist/ws/cloudflare.d.ts.map +1 -1
  474. package/dist/ws/cloudflare.js +117 -0
  475. package/dist/ws/cloudflare.js.map +1 -0
  476. package/dist/ws/deno.d.ts +4 -4
  477. package/dist/ws/deno.d.ts.map +1 -1
  478. package/dist/ws/deno.js +133 -0
  479. package/dist/ws/deno.js.map +1 -0
  480. package/dist/ws/node.d.ts +20 -3
  481. package/dist/ws/node.d.ts.map +1 -1
  482. package/dist/ws/node.js +173 -0
  483. package/dist/ws/node.js.map +1 -0
  484. package/dist/ws/session.d.ts +11 -0
  485. package/dist/ws/session.d.ts.map +1 -0
  486. package/dist/ws/session.js +60 -0
  487. package/dist/ws/session.js.map +1 -0
  488. package/dist/ws/shared.d.ts +65 -0
  489. package/dist/ws/shared.d.ts.map +1 -0
  490. package/dist/ws/shared.js +103 -0
  491. package/dist/ws/shared.js.map +1 -0
  492. package/dist/ws-origin.d.ts +20 -0
  493. package/dist/ws-origin.d.ts.map +1 -0
  494. package/dist/ws-origin.js +41 -0
  495. package/dist/ws-origin.js.map +1 -0
  496. package/dist/yaml.d.ts +15 -1
  497. package/dist/yaml.d.ts.map +1 -1
  498. package/dist/yaml.js +101 -0
  499. package/dist/yaml.js.map +1 -0
  500. package/docs/invalidate-spec.md +13 -1
  501. package/docs/meta-spec.md +36 -12
  502. package/docs/packaging.md +43 -24
  503. package/docs/regression-matrix/README.md +32 -0
  504. package/docs/regression-matrix/review.md +44 -0
  505. package/docs/regression-matrix/ws1-3.md +97 -0
  506. package/docs/regression-matrix/ws4-8.md +107 -0
  507. package/docs/regression-matrix/ws9-12.md +266 -0
  508. package/docs/sdk.md +102 -52
  509. package/package.json +183 -52
  510. package/src/accepts.ts +91 -33
  511. package/src/body-kind.ts +67 -0
  512. package/src/body-limit.ts +102 -87
  513. package/src/build/index.ts +104 -54
  514. package/src/cli-args.ts +123 -0
  515. package/src/cli-go/auth.go +12 -1
  516. package/src/cli-go/config.go +29 -2
  517. package/src/cli-go/errors.go +28 -10
  518. package/src/cli-go/multipart.go +51 -27
  519. package/src/cli-go/output.go +58 -4
  520. package/src/cli-go/root.go +1 -1
  521. package/src/cli-go/version.go +2 -2
  522. package/src/cli.ts +154 -148
  523. package/src/client/error.ts +56 -1
  524. package/src/client/http.ts +479 -256
  525. package/src/client/index.ts +55 -17
  526. package/src/client/path.ts +169 -0
  527. package/src/client/redirect-policy.ts +19 -0
  528. package/src/client/sdk.ts +180 -101
  529. package/src/client/sse.ts +92 -66
  530. package/src/client/ws.ts +67 -31
  531. package/src/client-go/errors.go +41 -12
  532. package/src/client-go/export.go +44 -0
  533. package/src/client-go/invalidation.go +52 -54
  534. package/src/client-go/nullable.go +62 -0
  535. package/src/client-go/realtime.go +147 -110
  536. package/src/client-go/runtime.go +646 -88
  537. package/src/client-go/sse.go +104 -94
  538. package/src/client-go/transport.go +67 -27
  539. package/src/client-go/ws.go +49 -25
  540. package/src/client-info.ts +79 -0
  541. package/src/client-mcp/server.ts +133 -3
  542. package/src/client-python/_invalidation.py +207 -291
  543. package/src/client-python/_realtime.py +63 -40
  544. package/src/client-python/_runtime.py +501 -119
  545. package/src/client-python/_sse.py +130 -74
  546. package/src/client-python/_transport.py +37 -9
  547. package/src/client-python/_ws.py +50 -22
  548. package/src/client-rust/errors.rs +21 -1
  549. package/src/client-rust/invalidation.rs +202 -231
  550. package/src/client-rust/invalidation_sync.rs +16 -229
  551. package/src/client-rust/nullable.rs +17 -0
  552. package/src/client-rust/realtime.rs +217 -217
  553. package/src/client-rust/runtime.rs +602 -177
  554. package/src/client-rust/runtime_sync.rs +169 -145
  555. package/src/client-rust/sse.rs +142 -121
  556. package/src/client-rust/ws.rs +61 -37
  557. package/src/codegen-go-cli.ts +607 -728
  558. package/src/codegen-go.ts +710 -770
  559. package/src/codegen-ir.ts +381 -75
  560. package/src/codegen-lang.ts +517 -0
  561. package/src/codegen-load.ts +150 -0
  562. package/src/codegen-mcp.ts +207 -108
  563. package/src/codegen-python.ts +684 -816
  564. package/src/codegen-route-tree-intern.ts +51 -25
  565. package/src/codegen-rust.ts +946 -1240
  566. package/src/codegen-sanitize.ts +0 -4
  567. package/src/codegen-schema-naming.ts +19 -6
  568. package/src/codegen-sdk-model.ts +228 -0
  569. package/src/codegen.ts +1488 -1140
  570. package/src/context.ts +130 -11
  571. package/src/cookie-sign.ts +85 -16
  572. package/src/cookie.ts +66 -11
  573. package/src/cors.ts +55 -54
  574. package/src/crypto.ts +27 -5
  575. package/src/csrf.ts +57 -25
  576. package/src/curl-logger.ts +155 -114
  577. package/src/dict.ts +12 -0
  578. package/src/error.ts +4 -2
  579. package/src/etag.ts +58 -34
  580. package/src/feature-detect.ts +147 -0
  581. package/src/feature-slots.ts +70 -0
  582. package/src/fetch-request.ts +13 -0
  583. package/src/gen-process.ts +42 -0
  584. package/src/gen-write.ts +127 -0
  585. package/src/glob.ts +109 -0
  586. package/src/go-type-emitter.ts +406 -155
  587. package/src/honey-response.ts +36 -9
  588. package/src/i18n-slot.ts +10 -0
  589. package/src/i18n.ts +98 -23
  590. package/src/index.ts +1887 -1756
  591. package/src/init.ts +40 -28
  592. package/src/invalidate-check.ts +42 -4
  593. package/src/invoke-user.ts +95 -0
  594. package/src/ip-restrict.ts +47 -161
  595. package/src/ip.ts +194 -0
  596. package/src/logger.ts +65 -36
  597. package/src/media-type.ts +104 -0
  598. package/src/meta-spec-merge.ts +80 -0
  599. package/src/meta-spec.ts +0 -0
  600. package/src/middleware.ts +112 -12
  601. package/src/node-request.ts +242 -52
  602. package/src/node.ts +318 -75
  603. package/src/openapi/collect.ts +19 -44
  604. package/src/openapi/docs-page.ts +89 -0
  605. package/src/openapi/document.ts +503 -224
  606. package/src/openapi/json-schema-slot.ts +40 -0
  607. package/src/openapi/register.ts +7 -2
  608. package/src/openapi/scalar.ts +11 -10
  609. package/src/openapi/serve.ts +39 -0
  610. package/src/openapi/spec-factory.ts +50 -1
  611. package/src/openapi/spec.ts +53 -30
  612. package/src/openapi/swagger.ts +12 -11
  613. package/src/pattern.ts +245 -0
  614. package/src/peer.ts +53 -0
  615. package/src/plugin.ts +270 -185
  616. package/src/powered-by.ts +2 -2
  617. package/src/pretty-json.ts +25 -9
  618. package/src/producer-stream.ts +296 -0
  619. package/src/proxy.ts +253 -55
  620. package/src/python-type-emitter.ts +68 -56
  621. package/src/realtime/bus.ts +56 -9
  622. package/src/realtime/register.ts +13 -0
  623. package/src/realtime/route.ts +129 -80
  624. package/src/realtime/server.ts +298 -0
  625. package/src/request-id.ts +13 -3
  626. package/src/request-limits.ts +2 -0
  627. package/src/request-path.ts +165 -0
  628. package/src/request-to-curl.ts +28 -7
  629. package/src/response.ts +143 -103
  630. package/src/rust-type-emitter.ts +265 -170
  631. package/src/secure-headers.ts +8 -4
  632. package/src/serve-register.ts +4 -0
  633. package/src/serve-slot.ts +38 -0
  634. package/src/serve.ts +113 -25
  635. package/src/server-timing.ts +11 -7
  636. package/src/static.ts +85 -32
  637. package/src/telemetry/otel.ts +29 -7
  638. package/src/testing.ts +76 -14
  639. package/src/timeout.ts +15 -7
  640. package/src/tree.ts +405 -333
  641. package/src/trust.ts +117 -0
  642. package/src/ts-type-emitter.ts +18 -12
  643. package/src/type-emitter.ts +227 -89
  644. package/src/type-extractor.ts +603 -423
  645. package/src/types.ts +8 -0
  646. package/src/validation.ts +221 -96
  647. package/src/with-headers.ts +45 -0
  648. package/src/ws/bun.ts +53 -15
  649. package/src/ws/cloudflare.ts +81 -19
  650. package/src/ws/deno.ts +124 -36
  651. package/src/ws/node.ts +173 -79
  652. package/src/ws/session.ts +73 -0
  653. package/src/ws/shared.ts +140 -0
  654. package/src/ws-origin.ts +53 -0
  655. package/src/yaml.ts +45 -22
  656. package/dist/client-mcp/server.d.ts +0 -10
  657. package/dist/client-mcp/server.d.ts.map +0 -1
  658. package/dist/client-mcp/types.d.ts +0 -16
  659. package/dist/client-mcp/types.d.ts.map +0 -1
  660. package/dist/cloudflare/realtime.d.ts +0 -30
  661. package/dist/cloudflare/realtime.d.ts.map +0 -1
  662. package/dist/realtime/buffer.d.ts +0 -18
  663. package/dist/realtime/buffer.d.ts.map +0 -1
  664. package/dist/realtime/longpoll.d.ts +0 -23
  665. package/dist/realtime/longpoll.d.ts.map +0 -1
  666. package/dist/realtime/protocol.d.ts +0 -50
  667. package/dist/realtime/protocol.d.ts.map +0 -1
  668. package/dist/realtime/runtime.d.ts +0 -74
  669. package/dist/realtime/runtime.d.ts.map +0 -1
  670. package/src/cloudflare/realtime.ts +0 -234
  671. package/src/realtime/buffer.ts +0 -101
  672. package/src/realtime/longpoll.ts +0 -148
  673. package/src/realtime/protocol.ts +0 -128
  674. package/src/realtime/runtime.ts +0 -427
@@ -0,0 +1,819 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join, relative, resolve, sep } from "node:path";
3
+ import { canonical, expandOptional, joinPatterns, parsePattern } from "./pattern.js";
4
+ import { quoteKey } from "./type-emitter.js";
5
+ /**
6
+ * The tsconfig that governs the entry: the nearest one walking up, but never past the
7
+ * project root (the nearest directory with a package.json) — a stray tsconfig in a parent
8
+ * directory or the home folder is not this project's.
9
+ */
10
+ function findTsConfig(fromPath) {
11
+ let dir = dirname(resolve(fromPath));
12
+ let prev = "";
13
+ while (dir !== prev) {
14
+ const p = resolve(dir, "tsconfig.json");
15
+ if (existsSync(p))
16
+ return p;
17
+ if (existsSync(resolve(dir, "package.json")))
18
+ return undefined;
19
+ prev = dir;
20
+ dir = dirname(dir);
21
+ }
22
+ return undefined;
23
+ }
24
+ /* ts-morph bundles a different TS version — structurally identical at runtime */
25
+ function bridge(value) {
26
+ return value;
27
+ }
28
+ /**
29
+ * Load the entry and find the app export: `export const app = …`, any other exported
30
+ * declaration of that name, or `export default honey()` for `exportName: "default"`.
31
+ */
32
+ async function loadEntry(options) {
33
+ const { Project, ts: tsLib } = await import("ts-morph");
34
+ const tsConfigFilePath = options.tsconfigPath ?? findTsConfig(options.entryPath);
35
+ const project = new Project({ skipAddingFilesFromTsConfig: true, tsConfigFilePath });
36
+ project.addSourceFilesAtPaths(options.entryPath);
37
+ project.resolveSourceFileDependencies();
38
+ const sourceFile = project.getSourceFileOrThrow(options.entryPath);
39
+ const declarations = sourceFile.getExportedDeclarations().get(options.exportName);
40
+ const decl = declarations?.[0] ?? sourceFile.getVariableDeclaration(options.exportName);
41
+ if (!decl) {
42
+ throw new Error(`Export "${options.exportName}" not found in ${options.entryPath}`);
43
+ }
44
+ const checker = bridge(project.getTypeChecker().compilerObject);
45
+ const node = bridge(decl.compilerNode);
46
+ const compiler = bridge(tsLib);
47
+ /* `export default <expr>` declares an ExportAssignment; its type is the expression's */
48
+ const target = compiler.isExportAssignment(node) ? node.expression : node;
49
+ const appType = checker.getTypeAtLocation(target);
50
+ return { appType, checker, compiler, node: target, project, sourceFile };
51
+ }
52
+ /**
53
+ * Uses ts-morph to extract the middleware context type from a Honey app export.
54
+ * Returns inline type strings so the gen file has zero imports from user code.
55
+ */
56
+ export async function extractBaseCtx(options) {
57
+ const { appType, checker, compiler, node } = await loadEntry(options);
58
+ const ser = new Serializer(checker, node, compiler);
59
+ const typeOfProp = (name) => {
60
+ const sym = appType.getProperty(name);
61
+ return sym ? checker.getTypeOfSymbolAtLocation(sym, node) : null;
62
+ };
63
+ /* extract $env */
64
+ const envT = typeOfProp("$env");
65
+ const envType = envT ? ser.serialize(envT) : "Record<string, unknown>";
66
+ /* extract $ctx and isolate middleware additions */
67
+ const ctxType = typeOfProp("$ctx");
68
+ if (!ctxType) {
69
+ throw new Error(`Export "${options.exportName}" has no $ctx — not a Honey instance`);
70
+ }
71
+ const middlewareType = propsType(extractMiddlewareProps(ctxType, ser));
72
+ /* extract $taps — typed tap payloads declared via .taps<T>() */
73
+ let tapsType = null;
74
+ const tapsT = typeOfProp("$taps");
75
+ if (tapsT) {
76
+ const tapsStr = ser.serialize(tapsT);
77
+ if (tapsStr !== "{}" && tapsStr !== "Record<string, unknown>")
78
+ tapsType = tapsStr;
79
+ }
80
+ const sanitize = (s) => sanitizeImportPaths(s, options.outputDir);
81
+ return {
82
+ envType: sanitize(envType),
83
+ middlewareType: middlewareType ? sanitize(middlewareType) : null,
84
+ tapsType: tapsType ? sanitize(tapsType) : null,
85
+ };
86
+ }
87
+ /* properties that live on HoneyContext — everything else is middleware-added */
88
+ const HONEY_CTX_PROPS = new Set([
89
+ "background",
90
+ "cookies",
91
+ "env",
92
+ "errors",
93
+ "executionCtx",
94
+ "headers",
95
+ "meta",
96
+ "params",
97
+ "path",
98
+ "req",
99
+ "res",
100
+ "routePattern",
101
+ "search",
102
+ "searchAll",
103
+ "tap",
104
+ ]);
105
+ function propsType(props) {
106
+ if (props.length === 0)
107
+ return null;
108
+ return `{ ${props.map((p) => `${quoteKey(p.name)}${p.opt ? "?" : ""}: ${p.type}`).join("; ")} }`;
109
+ }
110
+ /** Is a property name something a type literal can spell and a consumer can see? */
111
+ function isPublicName(name) {
112
+ /* `#secret` private fields surface as `__#123@#secret` — never part of a type */
113
+ return !name.startsWith("#") && !name.startsWith("__#");
114
+ }
115
+ function extractMiddlewareProps(ctxType, ser) {
116
+ const { checker, compiler, node } = ser;
117
+ const mwProps = ctxType.getProperties().filter((p) => {
118
+ const name = p.getName();
119
+ if (HONEY_CTX_PROPS.has(name))
120
+ return false;
121
+ /* skip internal/private properties (underscore-prefixed) */
122
+ if (name.startsWith("_"))
123
+ return false;
124
+ return isPublicName(name);
125
+ });
126
+ return mwProps.map((p) => {
127
+ const t = checker.getTypeOfSymbolAtLocation(p, p.valueDeclaration ?? node);
128
+ const opt = (p.flags & compiler.SymbolFlags.Optional) !== 0;
129
+ /* 1. try declaration-site TypeReference (explicit annotation on property or variable) */
130
+ let typeStr;
131
+ const mwDecl = p.valueDeclaration ?? p.declarations?.[0];
132
+ typeStr = ser.refFromDeclaration(mwDecl);
133
+ /* 1b. shorthand property — trace to the underlying variable's type annotation */
134
+ if (!typeStr && mwDecl && compiler.isShorthandPropertyAssignment(mwDecl)) {
135
+ const varSym = checker.getShorthandAssignmentValueSymbol(mwDecl);
136
+ if (varSym) {
137
+ const varDecl = varSym.valueDeclaration ?? varSym.declarations?.[0];
138
+ typeStr = ser.refFromDeclaration(varDecl);
139
+ /* 1c. destructured binding (e.g. const { shardDb } = openShardSession(...))
140
+ * — trace through the function return type to find the original type annotation */
141
+ if (!typeStr && varDecl && compiler.isBindingElement(varDecl)) {
142
+ let parent = varDecl.parent;
143
+ while (parent && !compiler.isVariableDeclaration(parent))
144
+ parent = parent.parent;
145
+ if (parent && compiler.isVariableDeclaration(parent)) {
146
+ const initializer = parent.initializer;
147
+ if (initializer) {
148
+ const initType = checker.getTypeAtLocation(initializer);
149
+ const retProp = initType.getProperty(p.getName());
150
+ if (retProp?.valueDeclaration && compiler.isShorthandPropertyAssignment(retProp.valueDeclaration)) {
151
+ const innerSym = checker.getShorthandAssignmentValueSymbol(retProp.valueDeclaration);
152
+ if (innerSym) {
153
+ const innerDecl = innerSym.valueDeclaration ?? innerSym.declarations?.[0];
154
+ typeStr = ser.refFromDeclaration(innerDecl);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ /* 2. a named type as an import() reference; 3. structural */
163
+ typeStr ??= ser.asRef(t) ?? ser.serialize(t);
164
+ return { name: p.getName(), opt, type: typeStr };
165
+ });
166
+ }
167
+ /** Check if a symbol is exported from its source file */
168
+ function isExportedFromFile(sym, sf, checker) {
169
+ /* .d.ts module types are always accessible */
170
+ if (sf.isDeclarationFile)
171
+ return true;
172
+ const moduleSym = checker.getSymbolAtLocation(sf);
173
+ if (!moduleSym)
174
+ return false;
175
+ const exports = checker.getExportsOfModule(moduleSym);
176
+ return exports.some((e) => e.getName() === sym.getName());
177
+ }
178
+ /** Lib types every program has in scope; their names are written as is, never imported. */
179
+ function isLibFile(fileName) {
180
+ return /(?:^|[\\/])lib\.[\w.-]*\.d\.ts$/.test(fileName) || /[\\/]typescript[\\/]lib[\\/]/.test(fileName);
181
+ }
182
+ /**
183
+ * TypeScript types → type source text.
184
+ *
185
+ * Named types become `import("…").Name<Args>` references when the declaring module exports
186
+ * them; everything else is written structurally. The structural writer is precise about the
187
+ * things a reader relies on: optional and rest parameters, generic signatures, tuple rest and
188
+ * optional elements, literal types (quoted), boolean literals, quoted keys, and precedence
189
+ * (`(() => void)[]`, `(A | B) & C`). A type it is still expanding when it meets itself again
190
+ * is written as `unknown` there, never expanded without end.
191
+ */
192
+ class Serializer {
193
+ checker;
194
+ compiler;
195
+ node;
196
+ #active = new Set();
197
+ /* type parameters of the signatures being written: inside them a parameter keeps its name */
198
+ #bound = new Set();
199
+ constructor(checker, node, compiler) {
200
+ this.checker = checker;
201
+ this.node = node;
202
+ this.compiler = compiler;
203
+ }
204
+ /** An `import()` reference with type arguments for an annotation like `x: Foo<Bar>`. */
205
+ refFromDeclaration(decl) {
206
+ const { checker, compiler } = this;
207
+ if (!decl)
208
+ return undefined;
209
+ const typeRef = decl.type;
210
+ if (!typeRef || !compiler.isTypeReferenceNode(typeRef))
211
+ return undefined;
212
+ let refSym = checker.getSymbolAtLocation(typeRef.typeName);
213
+ while (refSym && refSym.flags & compiler.SymbolFlags.Alias)
214
+ refSym = checker.getAliasedSymbol(refSym);
215
+ if (!refSym?.declarations?.length)
216
+ return undefined;
217
+ const srcFile = refSym.declarations[0].getSourceFile();
218
+ if (isLibFile(srcFile.fileName))
219
+ return undefined;
220
+ if (!isExportedFromFile(refSym, srcFile, checker))
221
+ return undefined;
222
+ const args = typeRef.typeArguments?.map((a) => {
223
+ const t = checker.getTypeFromTypeNode(a);
224
+ return this.asRef(t) ?? this.serialize(t);
225
+ });
226
+ const argText = args && args.length > 0 ? `<${args.join(", ")}>` : "";
227
+ return `import("${srcFile.fileName}").${refSym.getName()}${argText}`;
228
+ }
229
+ /**
230
+ * `import("path").TypeName<Args>` for a named type whose module exports it, else null.
231
+ * Globals (Promise, Map, …) are left to `serialize`.
232
+ */
233
+ asRef(type, depth = 0) {
234
+ const { checker, compiler } = this;
235
+ if (depth > 6)
236
+ return null;
237
+ /* union with never members (from intersection narrowing) — simplify first */
238
+ if (type.isUnion()) {
239
+ const nonNever = type.types.filter((t) => !(t.flags & compiler.TypeFlags.Never));
240
+ if (nonNever.length === 1)
241
+ return this.asRef(nonNever[0], depth);
242
+ }
243
+ const sym = type.aliasSymbol ?? type.getSymbol();
244
+ if (!sym)
245
+ return null;
246
+ const name = sym.getName();
247
+ if (!name || name.startsWith("__") || name === "Object")
248
+ return null;
249
+ const decls = sym.declarations;
250
+ if (!decls?.length)
251
+ return null;
252
+ const sf = decls[0].getSourceFile();
253
+ if (isLibFile(sf.fileName))
254
+ return null;
255
+ const named = (sym.flags &
256
+ (compiler.SymbolFlags.TypeAlias |
257
+ compiler.SymbolFlags.Interface |
258
+ compiler.SymbolFlags.Class |
259
+ compiler.SymbolFlags.Enum)) !==
260
+ 0;
261
+ /* only reference .d.ts symbols or explicitly declared named types from .ts files */
262
+ if (!sf.isDeclarationFile && !named)
263
+ return null;
264
+ const typeArgs = type.aliasSymbol ? type.aliasTypeArguments : type.typeArguments;
265
+ /* a class or interface reference carries its `this` type as a trailing argument */
266
+ const declared = sym.declarations?.[0];
267
+ const paramCount = declared && "typeParameters" in declared
268
+ ? (declared.typeParameters?.length ?? 0)
269
+ : (typeArgs?.length ?? 0);
270
+ const args = (typeArgs ?? []).slice(0, paramCount);
271
+ const withArgs = (ref) => args.length > 0
272
+ ? `${ref}<${args.map((arg) => this.asRef(arg, depth + 1) ?? this.serialize(arg)).join(", ")}>`
273
+ : ref;
274
+ /* a global type (an ambient script such as wrangler's worker-configuration.d.ts, or
275
+ * `declare global`) is in scope wherever the app compiles: write its name. Expanding it
276
+ * loses overloads and generics, and the copy is not assignable back to the original. */
277
+ if (named) {
278
+ const globalName = this.#globalName(sym, decls[0]);
279
+ if (globalName !== null)
280
+ return withArgs(globalName);
281
+ }
282
+ /* any other ambient script declaration has no import() path */
283
+ if (sf.isDeclarationFile && !sf.externalModuleIndicator) {
284
+ return null;
285
+ }
286
+ /* skip non-exported symbols — import() on them resolves to `any` */
287
+ if (!isExportedFromFile(sym, sf, checker))
288
+ return null;
289
+ return withArgs(`import("${sf.fileName}").${name}`);
290
+ }
291
+ /** The name a global declaration is reachable by (`Cloudflare.Env`), or null if it is module-scoped. */
292
+ #globalName(sym, decl) {
293
+ const { compiler } = this;
294
+ let global = false;
295
+ for (let n = decl.parent; n; n = n.parent) {
296
+ if (compiler.isModuleDeclaration(n) && n.flags & compiler.NodeFlags.GlobalAugmentation) {
297
+ global = true;
298
+ break;
299
+ }
300
+ if (compiler.isSourceFile(n)) {
301
+ global = !n.externalModuleIndicator;
302
+ break;
303
+ }
304
+ }
305
+ if (!global)
306
+ return null;
307
+ /* a `declare global` member is qualified as `global.Name`; in scope it is `Name` */
308
+ const name = this.checker.getFullyQualifiedName(sym).replace(/^global\./, "");
309
+ return /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(name) ? name : null;
310
+ }
311
+ serialize(type) {
312
+ if (this.#active.has(type))
313
+ return "unknown";
314
+ this.#active.add(type);
315
+ try {
316
+ return this.#serialize(type);
317
+ }
318
+ finally {
319
+ this.#active.delete(type);
320
+ }
321
+ }
322
+ #serialize(type) {
323
+ const { checker, compiler, node } = this;
324
+ const F = compiler.TypeFlags;
325
+ const next = (t) => this.serialize(t);
326
+ /* an enum is nominal: keep its name when it can be referenced */
327
+ const enumSym = type.getSymbol();
328
+ if (enumSym && enumSym.flags & compiler.SymbolFlags.Enum) {
329
+ const ref = this.asRef(type);
330
+ if (ref)
331
+ return ref;
332
+ }
333
+ /* primitives */
334
+ if (type.flags & F.String)
335
+ return "string";
336
+ if (type.flags & F.Number)
337
+ return "number";
338
+ if (type.flags & F.Boolean)
339
+ return "boolean";
340
+ if (type.flags & F.BigInt)
341
+ return "bigint";
342
+ if (type.flags & F.ESSymbol)
343
+ return "symbol";
344
+ if (type.flags & F.UniqueESSymbol)
345
+ return "symbol";
346
+ if (type.flags & F.Void)
347
+ return "void";
348
+ if (type.flags & F.Undefined)
349
+ return "undefined";
350
+ if (type.flags & F.Null)
351
+ return "null";
352
+ if (type.flags & F.Never)
353
+ return "never";
354
+ if (type.flags & F.Unknown)
355
+ return "unknown";
356
+ if (type.flags & F.Any)
357
+ return "unknown";
358
+ if (type.flags & F.NonPrimitive)
359
+ return "object";
360
+ /* literals */
361
+ if (type.isStringLiteral())
362
+ return JSON.stringify(type.value);
363
+ if (type.isNumberLiteral())
364
+ return `${type.value}`;
365
+ if (type.flags & F.BigIntLiteral) {
366
+ const v = type.value;
367
+ return `${v.negative ? "-" : ""}${v.base10Value}n`;
368
+ }
369
+ if (type.flags & F.BooleanLiteral)
370
+ return checker.typeToString(type);
371
+ if (type.flags & F.TemplateLiteral)
372
+ return "string";
373
+ /* a type parameter: by name inside the signature that declares it, else its constraint or unknown */
374
+ if (type.flags & F.TypeParameter) {
375
+ if (type.symbol && this.#bound.has(type.symbol))
376
+ return type.symbol.getName();
377
+ const constraint = checker.getBaseConstraintOfType(type);
378
+ return constraint && constraint !== type ? next(constraint) : "unknown";
379
+ }
380
+ /* union */
381
+ if (type.isUnion())
382
+ return unionText(type.types.map(next));
383
+ /* intersection */
384
+ if (type.isIntersection())
385
+ return intersectionText(type.types.map(next));
386
+ /* array */
387
+ if (checker.isArrayType(type)) {
388
+ const args = checker.getTypeArguments(type);
389
+ const readonlyArray = type.getSymbol()?.getName() === "ReadonlyArray";
390
+ const el = args.length > 0 ? arrayText(next(args[0])) : "unknown[]";
391
+ return readonlyArray ? `readonly ${el}` : el;
392
+ }
393
+ /* tuple — rest and optional elements kept */
394
+ if (checker.isTupleType(type)) {
395
+ const ref = type;
396
+ const args = checker.getTypeArguments(ref);
397
+ const target = ref.target;
398
+ const parts = args.map((arg, i) => {
399
+ const flags = target.elementFlags?.[i] ?? compiler.ElementFlags.Required;
400
+ if (flags & compiler.ElementFlags.Rest)
401
+ return `...${arrayText(next(arg))}`;
402
+ if (flags & compiler.ElementFlags.Variadic)
403
+ return `...${next(arg)}`;
404
+ if (flags & compiler.ElementFlags.Optional)
405
+ return `${next(arg)}?`;
406
+ return next(arg);
407
+ });
408
+ return `${target.readonly ? "readonly " : ""}[${parts.join(", ")}]`;
409
+ }
410
+ /* function (pure callable, no data properties) */
411
+ const sigs = type.getCallSignatures();
412
+ if (sigs.length > 0 && type.getProperties().length === 0) {
413
+ const parts = sigs.map((sig) => this.#signature(sig));
414
+ return parts.length === 1 ? parts[0] : parts.map((p) => `(${p})`).join(" & ");
415
+ }
416
+ /* well-known globals — keep name, serialize type args */
417
+ const sym = type.getSymbol();
418
+ if (sym) {
419
+ const name = sym.getName();
420
+ const decl = sym.declarations?.[0];
421
+ if (decl && isLibFile(decl.getSourceFile().fileName) && name !== "Object" && !name.startsWith("__")) {
422
+ const args = type.typeArguments ?? [];
423
+ const declaredParams = decl.typeParameters?.length ?? args.length;
424
+ const kept = args.slice(0, declaredParams);
425
+ return kept.length > 0 ? `${name}<${kept.map(next).join(", ")}>` : name;
426
+ }
427
+ /* named types — prefer import() reference over structural expansion */
428
+ if (name && !name.startsWith("__") && name !== "Object") {
429
+ const ref = this.asRef(type);
430
+ if (ref)
431
+ return ref;
432
+ }
433
+ }
434
+ const aliasRef = type.aliasSymbol ? this.asRef(type) : null;
435
+ if (aliasRef)
436
+ return aliasRef;
437
+ /* Record<string, V> — index signature only */
438
+ const stringIdx = type.getStringIndexType();
439
+ if (stringIdx && type.getProperties().length === 0) {
440
+ return `Record<string, ${next(stringIdx)}>`;
441
+ }
442
+ /* object — expand to structural form */
443
+ const props = type.getProperties().filter((p) => isPublicName(p.getName()));
444
+ const entries = [];
445
+ for (const p of props) {
446
+ const decls = p.getDeclarations();
447
+ if (decls?.length) {
448
+ const flags = compiler.getCombinedModifierFlags(decls[0]);
449
+ if (flags & (compiler.ModifierFlags.Private | compiler.ModifierFlags.Protected))
450
+ continue;
451
+ }
452
+ const pt = checker.getTypeOfSymbolAtLocation(p, decls?.[0] ?? node);
453
+ const opt = (p.flags & compiler.SymbolFlags.Optional) !== 0;
454
+ const ro = decls?.some((d) => (compiler.getCombinedModifierFlags(d) & compiler.ModifierFlags.Readonly) !== 0) ?? false;
455
+ entries.push(`${ro ? "readonly " : ""}${quoteKey(p.getName())}${opt ? "?" : ""}: ${next(pt)}`);
456
+ }
457
+ if (stringIdx)
458
+ entries.push(`[key: string]: ${next(stringIdx)}`);
459
+ for (const sig of sigs)
460
+ entries.push(this.#signature(sig, true));
461
+ if (entries.length > 0)
462
+ return `{ ${entries.join("; ")} }`;
463
+ if (props.length === 0)
464
+ return "{}";
465
+ return "unknown";
466
+ }
467
+ /** `<T extends X>(a: A, b?: B, ...rest: C[]) => R`, or the call-signature member form */
468
+ #signature(sig, member = false) {
469
+ const typeParams = sig.getTypeParameters() ?? [];
470
+ const added = typeParams.map((t) => t.symbol).filter((s) => s !== undefined && !this.#bound.has(s));
471
+ for (const s of added)
472
+ this.#bound.add(s);
473
+ try {
474
+ return this.#signatureText(sig, typeParams, member);
475
+ }
476
+ finally {
477
+ for (const s of added)
478
+ this.#bound.delete(s);
479
+ }
480
+ }
481
+ #signatureText(sig, typeParams, member) {
482
+ const { checker, compiler, node } = this;
483
+ const tp = typeParams.length > 0
484
+ ? `<${typeParams
485
+ .map((t) => {
486
+ const c = t.getConstraint();
487
+ return `${t.symbol.getName()}${c ? ` extends ${this.#typeParamText(c)}` : ""}`;
488
+ })
489
+ .join(", ")}>`
490
+ : "";
491
+ const params = sig.getParameters().map((p) => {
492
+ const pt = checker.getTypeOfSymbolAtLocation(p, p.valueDeclaration ?? node);
493
+ const decl = p.valueDeclaration;
494
+ const param = decl && compiler.isParameter(decl) ? decl : undefined;
495
+ const isRest = param?.dotDotDotToken !== undefined;
496
+ const optional = !isRest && param !== undefined && checker.isOptionalParameter(param);
497
+ /* an optional parameter's type carries `| undefined`; `?` already says so */
498
+ const text = optional ? this.#typeParamText(checker.getNonNullableType(pt)) : this.#typeParamText(pt);
499
+ return `${isRest ? "..." : ""}${p.getName()}${optional ? "?" : ""}: ${text}`;
500
+ });
501
+ const ret = this.#typeParamText(checker.getReturnTypeOfSignature(sig));
502
+ return member ? `${tp}(${params.join(", ")}): ${ret}` : `${tp}(${params.join(", ")}) => ${ret}`;
503
+ }
504
+ /** A type inside a signature: a bare type parameter stays by name, bound by the signature. */
505
+ #typeParamText(t) {
506
+ if (t.flags & this.compiler.TypeFlags.TypeParameter)
507
+ return t.symbol.getName();
508
+ return this.asRef(t) ?? this.serialize(t);
509
+ }
510
+ }
511
+ /**
512
+ * Does `type` contain `token` outside every bracket and string? Used to parenthesize only
513
+ * where precedence needs it.
514
+ */
515
+ function hasTopLevel(type, token) {
516
+ let depth = 0;
517
+ let quote = null;
518
+ for (let i = 0; i < type.length; i++) {
519
+ const c = type[i];
520
+ if (quote !== null) {
521
+ if (c === "\\")
522
+ i++;
523
+ else if (c === quote)
524
+ quote = null;
525
+ continue;
526
+ }
527
+ if (c === '"' || c === "'" || c === "`")
528
+ quote = c;
529
+ else if (c === "(" || c === "{" || c === "[" || c === "<")
530
+ depth++;
531
+ else if (c === ")" || c === "}" || c === "]" || (c === ">" && type[i - 1] !== "="))
532
+ depth--;
533
+ else if (depth === 0 && type.startsWith(token, i))
534
+ return true;
535
+ }
536
+ return false;
537
+ }
538
+ function arrayText(el) {
539
+ return hasTopLevel(el, "|") || hasTopLevel(el, "&") || hasTopLevel(el, "=>") || el.startsWith("readonly ")
540
+ ? `(${el})[]`
541
+ : `${el}[]`;
542
+ }
543
+ function unionText(parts) {
544
+ return [...new Set(parts)].map((p) => (hasTopLevel(p, "=>") ? `(${p})` : p)).join(" | ");
545
+ }
546
+ function intersectionText(parts) {
547
+ return parts.map((p) => (hasTopLevel(p, "|") || hasTopLevel(p, "=>") ? `(${p})` : p)).join(" & ");
548
+ }
549
+ const packageCache = new Map();
550
+ function nearestPackage(fromFile) {
551
+ let dir = dirname(fromFile);
552
+ const visited = [];
553
+ let found = null;
554
+ let prev = "";
555
+ while (dir !== prev) {
556
+ const cached = packageCache.get(dir);
557
+ if (cached !== undefined) {
558
+ found = cached;
559
+ break;
560
+ }
561
+ visited.push(dir);
562
+ const file = join(dir, "package.json");
563
+ if (existsSync(file)) {
564
+ try {
565
+ const json = JSON.parse(readFileSync(file, "utf8"));
566
+ /* a package.json without a name (a "type": "module" marker) is not a package boundary */
567
+ if (typeof json.name === "string") {
568
+ found = { dir, json };
569
+ break;
570
+ }
571
+ }
572
+ catch {
573
+ /* unreadable — keep walking */
574
+ }
575
+ }
576
+ prev = dir;
577
+ dir = dirname(dir);
578
+ }
579
+ for (const d of visited)
580
+ packageCache.set(d, found);
581
+ return found;
582
+ }
583
+ /** Every file an `exports` value can point at, with the subpath that names it. */
584
+ function exportTargets(exports) {
585
+ const out = [];
586
+ const collect = (subpath, value) => {
587
+ if (typeof value === "string")
588
+ out.push({ subpath, target: value });
589
+ else if (Array.isArray(value))
590
+ for (const v of value)
591
+ collect(subpath, v);
592
+ else if (value !== null && typeof value === "object") {
593
+ for (const v of Object.values(value))
594
+ collect(subpath, v);
595
+ }
596
+ };
597
+ if (typeof exports === "string" || Array.isArray(exports))
598
+ collect(".", exports);
599
+ else if (exports !== null && typeof exports === "object") {
600
+ const entries = Object.entries(exports);
601
+ if (entries.length > 0 && entries.every(([k]) => !k.startsWith(".")))
602
+ collect(".", exports);
603
+ else
604
+ for (const [k, v] of entries)
605
+ collect(k, v);
606
+ }
607
+ return out;
608
+ }
609
+ function stripTypeExtension(path) {
610
+ return path
611
+ .replace(/\.d\.[mc]?ts$/, "")
612
+ .replace(/\.[mc]?tsx?$/, "")
613
+ .replace(/\.[mc]?js$/, "");
614
+ }
615
+ /** `@types/foo` types the `foo` package; `@types/scope__name` types `@scope/name`. */
616
+ function typedPackageName(name) {
617
+ if (!name.startsWith("@types/"))
618
+ return name;
619
+ const bare = name.slice("@types/".length);
620
+ return bare.includes("__") ? `@${bare.replace("__", "/")}` : bare;
621
+ }
622
+ /**
623
+ * The specifier a generated file should use to import `filePath`.
624
+ *
625
+ * A file of another package is named through that package — its `exports` subpath when one
626
+ * points at the file (any condition: `types`, `default`, or a source condition), its `types`
627
+ * entry, or (no `exports` map) its path without extension; an `@types` package by the package it
628
+ * types. A file of the output's own package is a relative path. Lib files never get here.
629
+ */
630
+ function moduleSpecifier(filePath, outputDir) {
631
+ const pkg = nearestPackage(filePath);
632
+ const ownPkg = outputDir ? nearestPackage(join(outputDir, "_")) : null;
633
+ const relativeSpecifier = () => {
634
+ if (!outputDir)
635
+ return filePath;
636
+ let rel = relative(outputDir, filePath).split(sep).join("/");
637
+ if (!rel.startsWith("."))
638
+ rel = `./${rel}`;
639
+ return rel;
640
+ };
641
+ if (!pkg || (ownPkg && pkg.dir === ownPkg.dir))
642
+ return relativeSpecifier();
643
+ const name = typedPackageName(String(pkg.json.name));
644
+ const rel = `./${relative(pkg.dir, filePath).split(sep).join("/")}`;
645
+ if (pkg.json.exports !== undefined) {
646
+ const match = exportTargets(pkg.json.exports).find((e) => e.target === rel || stripTypeExtension(e.target) === stripTypeExtension(rel));
647
+ if (match)
648
+ return match.subpath === "." ? name : `${name}/${match.subpath.replace(/^\.\//, "")}`;
649
+ /* the package does not export this file — a path into it would not resolve */
650
+ return relativeSpecifier();
651
+ }
652
+ const typesEntry = pkg.json.types ?? pkg.json.typings;
653
+ if (typeof typesEntry === "string" &&
654
+ stripTypeExtension(`./${typesEntry.replace(/^\.\//, "")}`) === stripTypeExtension(rel)) {
655
+ return name;
656
+ }
657
+ const sub = stripTypeExtension(rel.slice(2)).replace(/\/index$/, "");
658
+ return sub === "index" || sub === "" ? name : `${name}/${sub}`;
659
+ }
660
+ /**
661
+ * Rewrite absolute `import("…")` paths into resolvable module specifiers, and drop the
662
+ * `import()` around lib types (`Date`, `Promise`), which are global.
663
+ */
664
+ function sanitizeImportPaths(str, outputDir) {
665
+ return str.replace(/import\("([^"]+)"\)\./g, (_match, filePath) => {
666
+ if (isLibFile(filePath))
667
+ return "";
668
+ return `import("${moduleSpecifier(filePath, outputDir)}").`;
669
+ });
670
+ }
671
+ const HTTP_METHODS = new Set(["all", "delete", "get", "head", "options", "patch", "post", "put"]);
672
+ /**
673
+ * Extracts base ctx and per-route middleware additions from sub-chains.
674
+ *
675
+ * Every source file of the program is scanned for HTTP method calls (`.get()`, `.post()`, …)
676
+ * on a Honey instance. A route is keyed by its full path — the receiver's `$basePath` type
677
+ * joined with the literal path, exactly as the router registers it — so `v1.get("/items")`
678
+ * and `pub.get("/items")` never share an entry. A receiver whose base path is not a literal
679
+ * type cannot be keyed and is skipped: a route without an entry gets the base ctx, never
680
+ * another route's.
681
+ */
682
+ export async function extractChainTypes(options) {
683
+ const { appType, checker, compiler, node: baseNode, project } = await loadEntry(options);
684
+ const ser = new Serializer(checker, baseNode, compiler);
685
+ function getCtxType(tsType, locationNode) {
686
+ const sym = tsType.getProperty("$ctx");
687
+ if (!sym)
688
+ return null;
689
+ return checker.getTypeOfSymbolAtLocation(sym, locationNode ?? sym.valueDeclaration ?? baseNode);
690
+ }
691
+ function basePathOf(tsType, locationNode) {
692
+ const sym = tsType.getProperty("$basePath");
693
+ if (!sym)
694
+ return null;
695
+ const t = checker.getTypeOfSymbolAtLocation(sym, locationNode);
696
+ return t.isStringLiteral() ? t.value : null;
697
+ }
698
+ /* extract base ctx */
699
+ let envType = "Record<string, unknown>";
700
+ const envSym = appType.getProperty("$env");
701
+ if (envSym)
702
+ envType = ser.serialize(checker.getTypeOfSymbolAtLocation(envSym, baseNode));
703
+ const baseCtxType = getCtxType(appType, baseNode);
704
+ if (!baseCtxType) {
705
+ throw new Error(`Export "${options.exportName}" has no $ctx — not a Honey instance`);
706
+ }
707
+ const baseMwProps = extractMiddlewareProps(baseCtxType, ser);
708
+ const baseMiddlewareType = propsType(baseMwProps);
709
+ /* build name→type map for reusing base type references in route middleware */
710
+ const basePropTypeByName = new Map();
711
+ for (const p of baseMwProps)
712
+ basePropTypeByName.set(p.name, p.type);
713
+ /* collect base middleware property names for diffing */
714
+ const baseMwPropNames = new Set();
715
+ for (const p of baseCtxType.getProperties()) {
716
+ const name = p.getName();
717
+ if (!HONEY_CTX_PROPS.has(name) && !name.startsWith("_"))
718
+ baseMwPropNames.add(name);
719
+ }
720
+ const sanitize = (s) => sanitizeImportPaths(s, options.outputDir);
721
+ const routeMiddleware = Object.create(null);
722
+ const routeMiddlewareProps = Object.create(null);
723
+ function visitNode(node) {
724
+ if (compiler.isCallExpression(node) && compiler.isPropertyAccessExpression(node.expression)) {
725
+ const methodName = node.expression.name.text;
726
+ const pathArg = node.arguments[0];
727
+ if (HTTP_METHODS.has(methodName) && pathArg && compiler.isStringLiteralLike(pathArg)) {
728
+ const receiverExpr = node.expression.expression;
729
+ const receiverType = checker.getTypeAtLocation(receiverExpr);
730
+ const ctxType = getCtxType(receiverType, receiverExpr);
731
+ const basePath = ctxType ? basePathOf(receiverType, receiverExpr) : null;
732
+ if (ctxType && basePath !== null) {
733
+ for (const variant of fullPaths(basePath, pathArg.text))
734
+ recordRoute(`${methodName} ${variant}`, ctxType);
735
+ }
736
+ }
737
+ }
738
+ compiler.forEachChild(node, visitNode);
739
+ }
740
+ /** The paths the router serves for this registration — an optional last param yields two. */
741
+ function fullPaths(basePath, path) {
742
+ try {
743
+ return expandOptional(parsePattern(joinPatterns(basePath, path))).map((segments) => canonical(segments));
744
+ }
745
+ catch {
746
+ /* a pattern the router would refuse registers nothing */
747
+ return [];
748
+ }
749
+ }
750
+ function recordRoute(key, ctxType) {
751
+ /* extract extra middleware props by iterating intersection MEMBERS individually.
752
+ * This preserves source-level declarations (e.g. ShorthandPropertyAssignment)
753
+ * that get lost when extracting from the flattened intersection. */
754
+ const extraEntries = [];
755
+ const dupeNames = new Set();
756
+ const members = ctxType.isIntersection() ? ctxType.types : [ctxType];
757
+ for (const member of members) {
758
+ for (const rp of extractMiddlewareProps(member, ser)) {
759
+ if (baseMwPropNames.has(rp.name))
760
+ continue;
761
+ if (extraEntries.some((e) => e.name === rp.name)) {
762
+ dupeNames.add(rp.name);
763
+ continue;
764
+ }
765
+ extraEntries.push(rp);
766
+ }
767
+ }
768
+ /* a property in several intersection members (e.g. auth narrowed by a later middleware)
769
+ * is read from the flattened intersection, so TypeScript computes the intersected type */
770
+ for (const dupeName of dupeNames) {
771
+ const sym = ctxType.getProperty(dupeName);
772
+ if (!sym)
773
+ continue;
774
+ const t = checker.getTypeOfSymbolAtLocation(sym, sym.valueDeclaration ?? baseNode);
775
+ const typeStr = ser.asRef(t) ?? ser.serialize(t);
776
+ const idx = extraEntries.findIndex((e) => e.name === dupeName);
777
+ if (idx !== -1)
778
+ extraEntries[idx] = { ...extraEntries[idx], type: typeStr };
779
+ }
780
+ if (extraEntries.length === 0)
781
+ return;
782
+ /* reuse compact base type references when the route has the same property
783
+ * (e.g. shardDb: ShardDb from base → reuse import ref instead of structural expansion) */
784
+ const entries = extraEntries.map((e) => {
785
+ const baseRef = basePropTypeByName.get(e.name);
786
+ return baseRef && baseRef.length < e.type.length ? { ...e, type: baseRef } : e;
787
+ });
788
+ routeMiddleware[key] = sanitize(propsType(entries) ?? "{}");
789
+ routeMiddlewareProps[key] = entries.map((e) => ({ name: e.name, opt: e.opt, type: sanitize(e.type) }));
790
+ }
791
+ /* every source file of the program, not only the entry: routes are often registered in
792
+ modules the entry imports */
793
+ for (const sf of project.getSourceFiles()) {
794
+ const compilerSf = bridge(sf.compilerNode);
795
+ if (compilerSf.isDeclarationFile)
796
+ continue;
797
+ if (/[\\/]node_modules[\\/]/.test(compilerSf.fileName))
798
+ continue;
799
+ visitNode(compilerSf);
800
+ }
801
+ /* extract $taps */
802
+ let tapsType = null;
803
+ const tapsSym = appType.getProperty("$taps");
804
+ if (tapsSym) {
805
+ const tapsStr = ser.serialize(checker.getTypeOfSymbolAtLocation(tapsSym, baseNode));
806
+ if (tapsStr !== "{}" && tapsStr !== "Record<string, unknown>")
807
+ tapsType = tapsStr;
808
+ }
809
+ return {
810
+ base: {
811
+ envType: sanitize(envType),
812
+ middlewareType: baseMiddlewareType ? sanitize(baseMiddlewareType) : null,
813
+ tapsType: tapsType ? sanitize(tapsType) : null,
814
+ },
815
+ routeMiddleware: { ...routeMiddleware },
816
+ routeMiddlewareProps: { ...routeMiddlewareProps },
817
+ };
818
+ }
819
+ //# sourceMappingURL=type-extractor.js.map