@timber-js/app 0.2.0-alpha.8 → 0.2.0-alpha.81

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 (571) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-Dg-ANYHb.js +421 -0
  3. package/dist/_chunks/actions-Dg-ANYHb.js.map +1 -0
  4. package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
  5. package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
  6. package/dist/_chunks/chunk-DYhsFzuS.js +33 -0
  7. package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
  8. package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
  9. package/dist/_chunks/define-C77ScO0m.js +106 -0
  10. package/dist/_chunks/define-C77ScO0m.js.map +1 -0
  11. package/dist/_chunks/define-CZqDwhSu.js +199 -0
  12. package/dist/_chunks/define-CZqDwhSu.js.map +1 -0
  13. package/dist/_chunks/define-cookie-C2IkoFGN.js +94 -0
  14. package/dist/_chunks/define-cookie-C2IkoFGN.js.map +1 -0
  15. package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
  16. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
  17. package/dist/_chunks/format-CYBGxKtc.js +14 -0
  18. package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
  19. package/dist/_chunks/{interception-BOoWmLUA.js → interception-Dpn_UfAD.js} +171 -97
  20. package/dist/_chunks/interception-Dpn_UfAD.js.map +1 -0
  21. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
  22. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
  23. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
  24. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
  25. package/dist/_chunks/request-context-qMsWgy9C.js +478 -0
  26. package/dist/_chunks/request-context-qMsWgy9C.js.map +1 -0
  27. package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
  28. package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
  29. package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
  30. package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
  31. package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
  32. package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
  33. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
  34. package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
  35. package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
  36. package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
  37. package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
  38. package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
  39. package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
  40. package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
  41. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-Lo_s_pw2.js} +4 -4
  42. package/dist/_chunks/use-query-states-Lo_s_pw2.js.map +1 -0
  43. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  44. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  45. package/dist/adapters/cloudflare-dev.js +73 -0
  46. package/dist/adapters/cloudflare-dev.js.map +1 -0
  47. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  48. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  49. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  50. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  51. package/dist/adapters/cloudflare.d.ts +148 -12
  52. package/dist/adapters/cloudflare.d.ts.map +1 -1
  53. package/dist/adapters/cloudflare.js +135 -11
  54. package/dist/adapters/cloudflare.js.map +1 -1
  55. package/dist/adapters/compress-module.d.ts.map +1 -1
  56. package/dist/adapters/nitro.d.ts +17 -1
  57. package/dist/adapters/nitro.d.ts.map +1 -1
  58. package/dist/adapters/nitro.js +56 -13
  59. package/dist/adapters/nitro.js.map +1 -1
  60. package/dist/cache/cache-api.d.ts +24 -0
  61. package/dist/cache/cache-api.d.ts.map +1 -0
  62. package/dist/cache/handler-store.d.ts +31 -0
  63. package/dist/cache/handler-store.d.ts.map +1 -0
  64. package/dist/cache/index.d.ts +23 -7
  65. package/dist/cache/index.d.ts.map +1 -1
  66. package/dist/cache/index.js +142 -80
  67. package/dist/cache/index.js.map +1 -1
  68. package/dist/cache/singleflight.d.ts +18 -1
  69. package/dist/cache/singleflight.d.ts.map +1 -1
  70. package/dist/cache/sizeof.d.ts +22 -0
  71. package/dist/cache/sizeof.d.ts.map +1 -0
  72. package/dist/cache/timber-cache.d.ts +1 -1
  73. package/dist/cache/timber-cache.d.ts.map +1 -1
  74. package/dist/cli.d.ts +6 -1
  75. package/dist/cli.d.ts.map +1 -1
  76. package/dist/cli.js +8 -3
  77. package/dist/cli.js.map +1 -1
  78. package/dist/client/browser-dev.d.ts +27 -1
  79. package/dist/client/browser-dev.d.ts.map +1 -1
  80. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  81. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  82. package/dist/client/browser-entry/hmr.d.ts +21 -0
  83. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  84. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  85. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  86. package/dist/client/browser-entry/index.d.ts +30 -0
  87. package/dist/client/browser-entry/index.d.ts.map +1 -0
  88. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  89. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  90. package/dist/client/browser-entry/router-init.d.ts +23 -0
  91. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  92. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  93. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  94. package/dist/client/browser-entry/scroll.d.ts +19 -0
  95. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  96. package/dist/client/error-boundary.d.ts +12 -5
  97. package/dist/client/error-boundary.d.ts.map +1 -1
  98. package/dist/client/error-boundary.js +10 -4
  99. package/dist/client/error-boundary.js.map +1 -1
  100. package/dist/client/error-reconstituter.d.ts +54 -0
  101. package/dist/client/error-reconstituter.d.ts.map +1 -0
  102. package/dist/client/form.d.ts +3 -3
  103. package/dist/client/form.d.ts.map +1 -1
  104. package/dist/client/history.d.ts +19 -4
  105. package/dist/client/history.d.ts.map +1 -1
  106. package/dist/client/index.d.ts +7 -21
  107. package/dist/client/index.d.ts.map +1 -1
  108. package/dist/client/index.js +210 -1017
  109. package/dist/client/index.js.map +1 -1
  110. package/dist/client/internal.d.ts +18 -0
  111. package/dist/client/internal.d.ts.map +1 -0
  112. package/dist/client/internal.js +890 -0
  113. package/dist/client/internal.js.map +1 -0
  114. package/dist/client/link-pending-store.d.ts +63 -0
  115. package/dist/client/link-pending-store.d.ts.map +1 -0
  116. package/dist/client/link.d.ts +90 -32
  117. package/dist/client/link.d.ts.map +1 -1
  118. package/dist/client/nav-link-store.d.ts +36 -0
  119. package/dist/client/nav-link-store.d.ts.map +1 -0
  120. package/dist/client/navigation-api-types.d.ts +90 -0
  121. package/dist/client/navigation-api-types.d.ts.map +1 -0
  122. package/dist/client/navigation-api.d.ts +115 -0
  123. package/dist/client/navigation-api.d.ts.map +1 -0
  124. package/dist/client/navigation-context.d.ts +13 -2
  125. package/dist/client/navigation-context.d.ts.map +1 -1
  126. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  127. package/dist/client/navigation-root.d.ts.map +1 -0
  128. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  129. package/dist/client/router-ref.d.ts +1 -1
  130. package/dist/client/router.d.ts +70 -4
  131. package/dist/client/router.d.ts.map +1 -1
  132. package/dist/client/rsc-fetch.d.ts +38 -3
  133. package/dist/client/rsc-fetch.d.ts.map +1 -1
  134. package/dist/client/segment-cache.d.ts +1 -1
  135. package/dist/client/segment-cache.d.ts.map +1 -1
  136. package/dist/client/segment-outlet.d.ts +63 -0
  137. package/dist/client/segment-outlet.d.ts.map +1 -0
  138. package/dist/client/ssr-data.d.ts +13 -4
  139. package/dist/client/ssr-data.d.ts.map +1 -1
  140. package/dist/client/stale-reload.d.ts +15 -0
  141. package/dist/client/stale-reload.d.ts.map +1 -1
  142. package/dist/client/top-loader.d.ts +5 -5
  143. package/dist/client/top-loader.d.ts.map +1 -1
  144. package/dist/client/use-link-status.d.ts +5 -5
  145. package/dist/client/use-link-status.d.ts.map +1 -1
  146. package/dist/client/use-params.d.ts +6 -4
  147. package/dist/client/use-params.d.ts.map +1 -1
  148. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  149. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  150. package/dist/client/use-query-states.d.ts +1 -1
  151. package/dist/client/use-query-states.d.ts.map +1 -1
  152. package/dist/client/use-router.d.ts +1 -1
  153. package/dist/codec.d.ts +33 -0
  154. package/dist/codec.d.ts.map +1 -0
  155. package/dist/codec.js +2 -0
  156. package/dist/config-types.d.ts +227 -0
  157. package/dist/config-types.d.ts.map +1 -0
  158. package/dist/content/index.d.ts +1 -10
  159. package/dist/content/index.d.ts.map +1 -1
  160. package/dist/content/index.js +0 -2
  161. package/dist/cookies/define-cookie.d.ts +35 -14
  162. package/dist/cookies/define-cookie.d.ts.map +1 -1
  163. package/dist/cookies/index.js +1 -83
  164. package/dist/fonts/css.d.ts +1 -0
  165. package/dist/fonts/css.d.ts.map +1 -1
  166. package/dist/index.d.ts +45 -192
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +12357 -11925
  169. package/dist/index.js.map +1 -1
  170. package/dist/plugin-context.d.ts +107 -0
  171. package/dist/plugin-context.d.ts.map +1 -0
  172. package/dist/plugins/adapter-build.d.ts +1 -1
  173. package/dist/plugins/adapter-build.d.ts.map +1 -1
  174. package/dist/plugins/build-manifest.d.ts +2 -2
  175. package/dist/plugins/build-manifest.d.ts.map +1 -1
  176. package/dist/plugins/build-report.d.ts +3 -3
  177. package/dist/plugins/build-report.d.ts.map +1 -1
  178. package/dist/plugins/client-chunks.d.ts +32 -0
  179. package/dist/plugins/client-chunks.d.ts.map +1 -0
  180. package/dist/plugins/content.d.ts +1 -1
  181. package/dist/plugins/content.d.ts.map +1 -1
  182. package/dist/plugins/dev-browser-logs.d.ts +84 -0
  183. package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
  184. package/dist/plugins/dev-error-overlay.d.ts +26 -1
  185. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  186. package/dist/plugins/dev-logs.d.ts +1 -1
  187. package/dist/plugins/dev-logs.d.ts.map +1 -1
  188. package/dist/plugins/dev-server.d.ts +1 -1
  189. package/dist/plugins/dev-server.d.ts.map +1 -1
  190. package/dist/plugins/entries.d.ts +1 -1
  191. package/dist/plugins/entries.d.ts.map +1 -1
  192. package/dist/plugins/fonts.d.ts +19 -5
  193. package/dist/plugins/fonts.d.ts.map +1 -1
  194. package/dist/plugins/mdx.d.ts +1 -1
  195. package/dist/plugins/mdx.d.ts.map +1 -1
  196. package/dist/plugins/routing.d.ts +1 -1
  197. package/dist/plugins/routing.d.ts.map +1 -1
  198. package/dist/plugins/server-bundle.d.ts.map +1 -1
  199. package/dist/plugins/shims.d.ts +6 -5
  200. package/dist/plugins/shims.d.ts.map +1 -1
  201. package/dist/plugins/static-build.d.ts +4 -4
  202. package/dist/plugins/static-build.d.ts.map +1 -1
  203. package/dist/routing/codegen.d.ts +2 -2
  204. package/dist/routing/codegen.d.ts.map +1 -1
  205. package/dist/routing/index.d.ts +2 -0
  206. package/dist/routing/index.d.ts.map +1 -1
  207. package/dist/routing/index.js +3 -2
  208. package/dist/routing/scanner.d.ts.map +1 -1
  209. package/dist/routing/segment-classify.d.ts +46 -0
  210. package/dist/routing/segment-classify.d.ts.map +1 -0
  211. package/dist/routing/status-file-lint.d.ts +2 -1
  212. package/dist/routing/status-file-lint.d.ts.map +1 -1
  213. package/dist/routing/types.d.ts +16 -4
  214. package/dist/routing/types.d.ts.map +1 -1
  215. package/dist/rsc-runtime/rsc.d.ts +1 -1
  216. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  217. package/dist/rsc-runtime/ssr.d.ts +12 -0
  218. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  219. package/dist/schema-bridge.d.ts +76 -0
  220. package/dist/schema-bridge.d.ts.map +1 -0
  221. package/dist/search-params/define.d.ts +139 -0
  222. package/dist/search-params/define.d.ts.map +1 -0
  223. package/dist/search-params/index.d.ts +4 -7
  224. package/dist/search-params/index.d.ts.map +1 -1
  225. package/dist/search-params/index.js +32 -441
  226. package/dist/search-params/index.js.map +1 -1
  227. package/dist/search-params/registry.d.ts +2 -2
  228. package/dist/search-params/registry.d.ts.map +1 -1
  229. package/dist/search-params/wrappers.d.ts +53 -0
  230. package/dist/search-params/wrappers.d.ts.map +1 -0
  231. package/dist/segment-params/define.d.ts +78 -0
  232. package/dist/segment-params/define.d.ts.map +1 -0
  233. package/dist/segment-params/index.d.ts +3 -0
  234. package/dist/segment-params/index.d.ts.map +1 -0
  235. package/dist/segment-params/index.js +2 -0
  236. package/dist/server/access-gate.d.ts +4 -0
  237. package/dist/server/access-gate.d.ts.map +1 -1
  238. package/dist/server/action-client.d.ts +25 -6
  239. package/dist/server/action-client.d.ts.map +1 -1
  240. package/dist/server/action-encryption.d.ts +76 -0
  241. package/dist/server/action-encryption.d.ts.map +1 -0
  242. package/dist/server/action-handler.d.ts.map +1 -1
  243. package/dist/server/actions.d.ts +3 -6
  244. package/dist/server/actions.d.ts.map +1 -1
  245. package/dist/server/als-registry.d.ts +32 -4
  246. package/dist/server/als-registry.d.ts.map +1 -1
  247. package/dist/server/build-manifest.d.ts +2 -2
  248. package/dist/server/build-manifest.d.ts.map +1 -1
  249. package/dist/server/debug.d.ts +1 -1
  250. package/dist/server/default-logger.d.ts +22 -0
  251. package/dist/server/default-logger.d.ts.map +1 -0
  252. package/dist/server/deny-page-resolver.d.ts +52 -0
  253. package/dist/server/deny-page-resolver.d.ts.map +1 -0
  254. package/dist/server/deny-renderer.d.ts.map +1 -1
  255. package/dist/server/dev-holding-server.d.ts +52 -0
  256. package/dist/server/dev-holding-server.d.ts.map +1 -0
  257. package/dist/server/dev-warnings.d.ts +1 -21
  258. package/dist/server/dev-warnings.d.ts.map +1 -1
  259. package/dist/server/early-hints.d.ts +13 -5
  260. package/dist/server/early-hints.d.ts.map +1 -1
  261. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  262. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  263. package/dist/server/fallback-error.d.ts +4 -3
  264. package/dist/server/fallback-error.d.ts.map +1 -1
  265. package/dist/server/flight-injection-state.d.ts +66 -0
  266. package/dist/server/flight-injection-state.d.ts.map +1 -0
  267. package/dist/server/flight-scripts.d.ts +42 -0
  268. package/dist/server/flight-scripts.d.ts.map +1 -0
  269. package/dist/server/flush.d.ts.map +1 -1
  270. package/dist/server/form-data.d.ts +29 -0
  271. package/dist/server/form-data.d.ts.map +1 -1
  272. package/dist/server/html-injectors.d.ts +51 -11
  273. package/dist/server/html-injectors.d.ts.map +1 -1
  274. package/dist/server/index.d.ts +5 -43
  275. package/dist/server/index.d.ts.map +1 -1
  276. package/dist/server/index.js +37 -2798
  277. package/dist/server/index.js.map +1 -1
  278. package/dist/server/internal.d.ts +46 -0
  279. package/dist/server/internal.d.ts.map +1 -0
  280. package/dist/server/internal.js +2883 -0
  281. package/dist/server/internal.js.map +1 -0
  282. package/dist/server/logger.d.ts +25 -7
  283. package/dist/server/logger.d.ts.map +1 -1
  284. package/dist/server/middleware-runner.d.ts +19 -4
  285. package/dist/server/middleware-runner.d.ts.map +1 -1
  286. package/dist/server/node-stream-transforms.d.ts +113 -0
  287. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  288. package/dist/server/page-deny-boundary.d.ts +31 -0
  289. package/dist/server/page-deny-boundary.d.ts.map +1 -0
  290. package/dist/server/pipeline-interception.d.ts +1 -1
  291. package/dist/server/pipeline-interception.d.ts.map +1 -1
  292. package/dist/server/pipeline-metadata.d.ts +6 -0
  293. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  294. package/dist/server/pipeline.d.ts +42 -10
  295. package/dist/server/pipeline.d.ts.map +1 -1
  296. package/dist/server/primitives.d.ts +69 -18
  297. package/dist/server/primitives.d.ts.map +1 -1
  298. package/dist/server/render-timeout.d.ts +51 -0
  299. package/dist/server/render-timeout.d.ts.map +1 -0
  300. package/dist/server/request-context.d.ts +112 -43
  301. package/dist/server/request-context.d.ts.map +1 -1
  302. package/dist/server/route-element-builder.d.ts +27 -1
  303. package/dist/server/route-element-builder.d.ts.map +1 -1
  304. package/dist/server/route-handler.d.ts.map +1 -1
  305. package/dist/server/route-matcher.d.ts +9 -2
  306. package/dist/server/route-matcher.d.ts.map +1 -1
  307. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  308. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  309. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  310. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  311. package/dist/server/rsc-entry/helpers.d.ts +48 -5
  312. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  313. package/dist/server/rsc-entry/index.d.ts +8 -3
  314. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  315. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  316. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  317. package/dist/server/rsc-entry/rsc-stream.d.ts +4 -1
  318. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  319. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  320. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  321. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  322. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  323. package/dist/server/safe-load.d.ts +46 -0
  324. package/dist/server/safe-load.d.ts.map +1 -0
  325. package/dist/server/sitemap-generator.d.ts +129 -0
  326. package/dist/server/sitemap-generator.d.ts.map +1 -0
  327. package/dist/server/sitemap-handler.d.ts +22 -0
  328. package/dist/server/sitemap-handler.d.ts.map +1 -0
  329. package/dist/server/slot-resolver.d.ts +1 -1
  330. package/dist/server/slot-resolver.d.ts.map +1 -1
  331. package/dist/server/ssr-entry.d.ts +22 -0
  332. package/dist/server/ssr-entry.d.ts.map +1 -1
  333. package/dist/server/ssr-render.d.ts +39 -21
  334. package/dist/server/ssr-render.d.ts.map +1 -1
  335. package/dist/server/ssr-wrappers.d.ts +50 -0
  336. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  337. package/dist/server/status-code-resolver.d.ts +1 -1
  338. package/dist/server/status-code-resolver.d.ts.map +1 -1
  339. package/dist/server/stream-utils.d.ts +36 -0
  340. package/dist/server/stream-utils.d.ts.map +1 -0
  341. package/dist/server/tracing.d.ts +4 -4
  342. package/dist/server/tracing.d.ts.map +1 -1
  343. package/dist/server/tree-builder.d.ts +22 -19
  344. package/dist/server/tree-builder.d.ts.map +1 -1
  345. package/dist/server/types.d.ts +1 -4
  346. package/dist/server/types.d.ts.map +1 -1
  347. package/dist/server/version-skew.d.ts +61 -0
  348. package/dist/server/version-skew.d.ts.map +1 -0
  349. package/dist/shared/merge-search-params.d.ts +22 -0
  350. package/dist/shared/merge-search-params.d.ts.map +1 -0
  351. package/dist/shims/font-google.d.ts +1 -1
  352. package/dist/shims/font-google.d.ts.map +1 -1
  353. package/dist/shims/font-google.js +42 -0
  354. package/dist/shims/font-google.js.map +1 -0
  355. package/dist/shims/font-local.d.ts +26 -0
  356. package/dist/shims/font-local.d.ts.map +1 -0
  357. package/dist/shims/font-local.js +20 -0
  358. package/dist/shims/font-local.js.map +1 -0
  359. package/dist/shims/headers.d.ts +2 -1
  360. package/dist/shims/headers.d.ts.map +1 -1
  361. package/dist/shims/navigation-client.d.ts +1 -1
  362. package/dist/shims/navigation-client.d.ts.map +1 -1
  363. package/dist/shims/navigation.d.ts +3 -2
  364. package/dist/shims/navigation.d.ts.map +1 -1
  365. package/dist/utils/directive-parser.d.ts +5 -2
  366. package/dist/utils/directive-parser.d.ts.map +1 -1
  367. package/dist/utils/state-machine.d.ts +80 -0
  368. package/dist/utils/state-machine.d.ts.map +1 -0
  369. package/package.json +56 -22
  370. package/src/adapters/cloudflare-dev.ts +177 -0
  371. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  372. package/src/adapters/cloudflare.ts +342 -28
  373. package/src/adapters/compress-module.ts +24 -4
  374. package/src/adapters/nitro.ts +52 -8
  375. package/src/adapters/wrangler.d.ts +7 -0
  376. package/src/cache/cache-api.ts +38 -0
  377. package/src/cache/handler-store.ts +68 -0
  378. package/src/cache/index.ts +81 -18
  379. package/src/cache/singleflight.ts +62 -4
  380. package/src/cache/sizeof.ts +31 -0
  381. package/src/cache/timber-cache.ts +24 -20
  382. package/src/cli.ts +16 -6
  383. package/src/client/browser-dev.ts +128 -1
  384. package/src/client/browser-entry/action-dispatch.ts +116 -0
  385. package/src/client/browser-entry/hmr.ts +81 -0
  386. package/src/client/browser-entry/hydrate.ts +145 -0
  387. package/src/client/browser-entry/index.ts +138 -0
  388. package/src/client/browser-entry/post-hydration.ts +119 -0
  389. package/src/client/browser-entry/router-init.ts +193 -0
  390. package/src/client/browser-entry/rsc-stream.ts +157 -0
  391. package/src/client/browser-entry/scroll.ts +27 -0
  392. package/src/client/error-boundary.tsx +48 -16
  393. package/src/client/error-reconstituter.tsx +65 -0
  394. package/src/client/form.tsx +9 -7
  395. package/src/client/history.ts +26 -4
  396. package/src/client/index.ts +19 -38
  397. package/src/client/internal.ts +57 -0
  398. package/src/client/link-pending-store.ts +111 -0
  399. package/src/client/link.tsx +329 -97
  400. package/src/client/nav-link-store.ts +47 -0
  401. package/src/client/navigation-api-types.ts +112 -0
  402. package/src/client/navigation-api.ts +332 -0
  403. package/src/client/navigation-context.ts +31 -6
  404. package/src/client/navigation-root.tsx +342 -0
  405. package/src/client/nuqs-adapter.tsx +16 -3
  406. package/src/client/router-ref.ts +1 -1
  407. package/src/client/router.ts +299 -72
  408. package/src/client/rsc-fetch.ts +97 -8
  409. package/src/client/segment-cache.ts +1 -1
  410. package/src/client/segment-outlet.tsx +86 -0
  411. package/src/client/ssr-data.ts +13 -5
  412. package/src/client/stale-reload.ts +72 -3
  413. package/src/client/top-loader.tsx +16 -8
  414. package/src/client/use-link-status.ts +7 -7
  415. package/src/client/use-params.ts +7 -5
  416. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  417. package/src/client/use-query-states.ts +3 -3
  418. package/src/client/use-router.ts +1 -1
  419. package/src/codec.ts +49 -0
  420. package/src/config-types.ts +225 -0
  421. package/src/content/index.ts +5 -13
  422. package/src/cookies/define-cookie.ts +78 -25
  423. package/src/cookies/index.ts +8 -0
  424. package/src/fonts/css.ts +2 -1
  425. package/src/index.ts +295 -354
  426. package/src/plugin-context.ts +240 -0
  427. package/src/plugins/adapter-build.ts +9 -3
  428. package/src/plugins/build-manifest.ts +13 -2
  429. package/src/plugins/build-report.ts +3 -3
  430. package/src/plugins/client-chunks.ts +65 -0
  431. package/src/plugins/content.ts +1 -1
  432. package/src/plugins/dev-browser-logs.ts +288 -0
  433. package/src/plugins/dev-error-overlay.ts +70 -1
  434. package/src/plugins/dev-logs.ts +1 -1
  435. package/src/plugins/dev-server.ts +70 -9
  436. package/src/plugins/entries.ts +71 -10
  437. package/src/plugins/fonts.ts +168 -61
  438. package/src/plugins/mdx.ts +1 -1
  439. package/src/plugins/routing.ts +57 -17
  440. package/src/plugins/server-action-exports.ts +1 -1
  441. package/src/plugins/server-bundle.ts +32 -1
  442. package/src/plugins/shims.ts +135 -35
  443. package/src/plugins/static-build.ts +17 -11
  444. package/src/routing/codegen.ts +165 -105
  445. package/src/routing/index.ts +2 -0
  446. package/src/routing/scanner.ts +93 -23
  447. package/src/routing/segment-classify.ts +89 -0
  448. package/src/routing/status-file-lint.ts +3 -2
  449. package/src/routing/types.ts +17 -4
  450. package/src/rsc-runtime/rsc.ts +2 -0
  451. package/src/rsc-runtime/ssr.ts +50 -0
  452. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  453. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  454. package/src/search-params/define.ts +482 -0
  455. package/src/search-params/index.ts +14 -20
  456. package/src/search-params/registry.ts +2 -2
  457. package/src/search-params/wrappers.ts +85 -0
  458. package/src/segment-params/define.ts +279 -0
  459. package/src/segment-params/index.ts +9 -0
  460. package/src/server/access-gate.tsx +70 -29
  461. package/src/server/action-client.ts +46 -11
  462. package/src/server/action-encryption.ts +144 -0
  463. package/src/server/action-handler.ts +21 -4
  464. package/src/server/actions.ts +10 -9
  465. package/src/server/als-registry.ts +34 -6
  466. package/src/server/build-manifest.ts +10 -4
  467. package/src/server/compress.ts +25 -7
  468. package/src/server/debug.ts +1 -1
  469. package/src/server/default-logger.ts +99 -0
  470. package/src/server/deny-page-resolver.ts +154 -0
  471. package/src/server/deny-renderer.ts +24 -38
  472. package/src/server/dev-holding-server.ts +185 -0
  473. package/src/server/dev-warnings.ts +4 -49
  474. package/src/server/early-hints.ts +36 -15
  475. package/src/server/error-boundary-wrapper.ts +74 -22
  476. package/src/server/fallback-error.ts +31 -15
  477. package/src/server/flight-injection-state.ts +113 -0
  478. package/src/server/flight-scripts.ts +62 -0
  479. package/src/server/flush.ts +2 -1
  480. package/src/server/form-data.ts +76 -0
  481. package/src/server/html-injectors.ts +280 -120
  482. package/src/server/index.ts +25 -177
  483. package/src/server/internal.ts +169 -0
  484. package/src/server/logger.ts +44 -36
  485. package/src/server/middleware-runner.ts +31 -4
  486. package/src/server/node-stream-transforms.ts +509 -0
  487. package/src/server/page-deny-boundary.tsx +56 -0
  488. package/src/server/pipeline-interception.ts +17 -16
  489. package/src/server/pipeline-metadata.ts +13 -0
  490. package/src/server/pipeline.ts +227 -62
  491. package/src/server/primitives.ts +111 -28
  492. package/src/server/render-timeout.ts +108 -0
  493. package/src/server/request-context.ts +293 -132
  494. package/src/server/route-element-builder.ts +283 -191
  495. package/src/server/route-handler.ts +24 -4
  496. package/src/server/route-matcher.ts +24 -20
  497. package/src/server/rsc-entry/api-handler.ts +15 -16
  498. package/src/server/rsc-entry/error-renderer.ts +300 -89
  499. package/src/server/rsc-entry/helpers.ts +134 -5
  500. package/src/server/rsc-entry/index.ts +200 -112
  501. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  502. package/src/server/rsc-entry/rsc-stream.ts +65 -13
  503. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  504. package/src/server/rsc-entry/ssr-renderer.ts +168 -38
  505. package/src/server/safe-load.ts +60 -0
  506. package/src/server/sitemap-generator.ts +338 -0
  507. package/src/server/sitemap-handler.ts +126 -0
  508. package/src/server/slot-resolver.ts +244 -229
  509. package/src/server/ssr-entry.ts +211 -32
  510. package/src/server/ssr-render.ts +289 -67
  511. package/src/server/ssr-wrappers.tsx +139 -0
  512. package/src/server/status-code-resolver.ts +1 -1
  513. package/src/server/stream-utils.ts +213 -0
  514. package/src/server/tracing.ts +20 -9
  515. package/src/server/tree-builder.ts +92 -58
  516. package/src/server/types.ts +3 -6
  517. package/src/server/version-skew.ts +104 -0
  518. package/src/shared/merge-search-params.ts +55 -0
  519. package/src/shims/font-google.ts +1 -1
  520. package/src/shims/font-local.ts +34 -0
  521. package/src/shims/headers.ts +5 -1
  522. package/src/shims/navigation-client.ts +1 -1
  523. package/src/shims/navigation.ts +7 -2
  524. package/src/utils/directive-parser.ts +5 -2
  525. package/src/utils/state-machine.ts +111 -0
  526. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  527. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  528. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  529. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  530. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  531. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  532. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  533. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  534. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  535. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  536. package/dist/cache/register-cached-function.d.ts +0 -17
  537. package/dist/cache/register-cached-function.d.ts.map +0 -1
  538. package/dist/client/browser-entry.d.ts +0 -21
  539. package/dist/client/browser-entry.d.ts.map +0 -1
  540. package/dist/client/link-status-provider.d.ts +0 -11
  541. package/dist/client/link-status-provider.d.ts.map +0 -1
  542. package/dist/client/transition-root.d.ts.map +0 -1
  543. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  544. package/dist/cookies/index.js.map +0 -1
  545. package/dist/plugins/cache-transform.d.ts +0 -36
  546. package/dist/plugins/cache-transform.d.ts.map +0 -1
  547. package/dist/plugins/dynamic-transform.d.ts +0 -72
  548. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  549. package/dist/search-params/analyze.d.ts +0 -54
  550. package/dist/search-params/analyze.d.ts.map +0 -1
  551. package/dist/search-params/builtin-codecs.d.ts +0 -105
  552. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  553. package/dist/search-params/codecs.d.ts +0 -53
  554. package/dist/search-params/codecs.d.ts.map +0 -1
  555. package/dist/search-params/create.d.ts +0 -106
  556. package/dist/search-params/create.d.ts.map +0 -1
  557. package/dist/server/prerender.d.ts +0 -77
  558. package/dist/server/prerender.d.ts.map +0 -1
  559. package/dist/server/response-cache.d.ts +0 -54
  560. package/dist/server/response-cache.d.ts.map +0 -1
  561. package/src/cache/register-cached-function.ts +0 -103
  562. package/src/client/browser-entry.ts +0 -678
  563. package/src/client/link-status-provider.tsx +0 -30
  564. package/src/client/transition-root.tsx +0 -166
  565. package/src/plugins/cache-transform.ts +0 -199
  566. package/src/plugins/dynamic-transform.ts +0 -161
  567. package/src/search-params/analyze.ts +0 -192
  568. package/src/search-params/builtin-codecs.ts +0 -228
  569. package/src/search-params/create.ts +0 -321
  570. package/src/server/prerender.ts +0 -139
  571. package/src/server/response-cache.ts +0 -410
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-dev.js","names":[],"sources":["../../src/adapters/cloudflare-dev.ts"],"sourcesContent":["/**\n * Cloudflare dev-mode bindings via wrangler's getPlatformProxy().\n *\n * This Vite plugin starts a local workerd process (via Miniflare) that\n * emulates Cloudflare bindings (KV, D1, R2, Queues, Durable Objects, etc.)\n * during development. The proxy env is injected into the request ALS so\n * `getCloudflareBindings()` works identically in dev and production.\n *\n * Design doc: design/35-cloudflare-primitives.md §\"Dev Experience\"\n *\n * Usage:\n * ```ts\n * // vite.config.ts\n * import { timber } from '@timber-js/app'\n * import { cloudflare } from '@timber-js/app/adapters/cloudflare'\n * import { cloudflareDevBindings } from '@timber-js/app/adapters/cloudflare/dev'\n *\n * export default defineConfig({\n * plugins: [\n * timber({ adapter: cloudflare() }),\n * cloudflareDevBindings(),\n * ],\n * })\n * ```\n *\n * Requires `wrangler` as a dev dependency. Install it:\n * ```bash\n * pnpm add -D wrangler\n * ```\n */\n\nimport type { Plugin, ViteDevServer } from 'vite';\nimport { runWithBindings } from './cloudflare.js';\n\n/**\n * Dynamically import wrangler. Extracted as a named export so tests\n * can mock it without needing wrangler installed.\n * @internal\n */\nexport async function loadWrangler(): Promise<{ getPlatformProxy: (opts: any) => Promise<any> }> {\n try {\n return await import('wrangler');\n } catch {\n throw new Error(\n '[timber] Could not import wrangler. ' +\n 'cloudflareDevBindings() requires wrangler as a dev dependency.\\n' +\n 'Install it: pnpm add -D wrangler'\n );\n }\n}\n\n// ─── Contract ─────────────────────────────────────────────────────────────\n//\n// The dev request wrapper is stored on the ViteDevServer instance using a\n// well-known Symbol. This allows cross-plugin communication without import\n// dependencies — the dev-server plugin checks for this Symbol per-request\n// and wraps the handler call when present.\n//\n// The wrapper type is: <T>(fn: () => T) => T\n// It runs `fn` inside the Cloudflare bindings ALS so getCloudflareBindings()\n// works throughout the request lifecycle.\n\n/**\n * Symbol key used to store the dev request wrapper on ViteDevServer.\n *\n * @internal Exported for testing. The dev-server plugin uses\n * `Symbol.for('timber:dev-request-wrapper')` directly to avoid\n * importing from this module.\n */\nexport const DEV_REQUEST_WRAPPER_KEY = Symbol.for('timber:dev-request-wrapper');\n\n/** Options for the Cloudflare dev bindings plugin. */\nexport interface CloudflareDevBindingsOptions {\n /**\n * Path to the wrangler configuration file.\n * @default Auto-detected by wrangler (wrangler.jsonc, wrangler.json, wrangler.toml)\n */\n configPath?: string;\n\n /**\n * Whether to persist binding data (KV, D1, R2) between dev server restarts.\n *\n * - `true` — persist in wrangler's default location (`.wrangler/state/`)\n * - `{ path: string }` — persist in a custom directory\n * - `false` — start fresh on every restart\n *\n * @default true\n */\n persist?: boolean | { path: string };\n\n /**\n * Wrangler environment to use (for multi-environment configs).\n * Maps to `[env.<name>]` sections in wrangler.toml / wrangler.jsonc.\n */\n environment?: string;\n\n /**\n * @internal Override the wrangler loader for testing.\n * Not part of the public API — may change without notice.\n */\n _loadWrangler?: () => Promise<{ getPlatformProxy: (opts: any) => Promise<any> }>;\n}\n\n/**\n * Vite plugin that provides Cloudflare bindings in dev mode via\n * wrangler's `getPlatformProxy()`.\n *\n * Starts a local workerd process on dev server startup and injects\n * the proxy env into the per-request ALS. This makes\n * `getCloudflareBindings()` return real (emulated) bindings during\n * development — KV, D1, R2, Queues, Durable Objects, and all other\n * bindings declared in wrangler.jsonc.\n *\n * The proxy is automatically disposed when the dev server closes.\n *\n * **Requirements:**\n * - `wrangler` installed as a dev dependency\n * - A `wrangler.jsonc` (or `wrangler.toml`) with binding declarations\n *\n * @example\n * ```ts\n * import { cloudflareDevBindings } from '@timber-js/app/adapters/cloudflare/dev'\n *\n * export default defineConfig({\n * plugins: [\n * timber({ adapter: cloudflare() }),\n * cloudflareDevBindings(),\n * ],\n * })\n * ```\n */\nexport function cloudflareDevBindings(options: CloudflareDevBindingsOptions = {}): Plugin {\n return {\n name: 'timber-cloudflare-dev-bindings',\n\n // Dev mode only — never active during production builds.\n // See design/35-cloudflare-primitives.md §\"Security Considerations\":\n // \"Dev bindings are dev-only. apply: 'serve' ensures it never runs\n // in production builds.\"\n apply: 'serve',\n\n async configureServer(server: ViteDevServer) {\n // Dynamic import — wrangler is an optional peer dependency.\n // Users must install it themselves: `pnpm add -D wrangler`\n const { getPlatformProxy } = await (options._loadWrangler ?? loadWrangler)();\n\n // Build getPlatformProxy options from our public API.\n const proxyOptions: Record<string, unknown> = {\n persist: options.persist ?? true,\n };\n if (options.configPath) {\n proxyOptions.configPath = options.configPath;\n }\n if (options.environment) {\n proxyOptions.environment = options.environment;\n }\n\n const proxy = await getPlatformProxy(proxyOptions);\n\n // Store a request wrapper on the server instance. The dev-server\n // plugin checks for this Symbol per-request and wraps the RSC\n // handler call so getCloudflareBindings() works throughout the\n // request lifecycle (server components, middleware, server actions).\n (server as any)[DEV_REQUEST_WRAPPER_KEY] = <T>(fn: () => T): T => {\n return runWithBindings(proxy.env as Record<string, unknown>, fn);\n };\n\n // Dispose the proxy when the dev server closes. This shuts down\n // the local workerd process started by getPlatformProxy().\n server.httpServer?.on('close', () => {\n proxy.dispose().catch(() => {\n // Disposal errors are non-fatal — the process is shutting down.\n });\n });\n },\n };\n}\n"],"mappings":";;;;;;;AAuCA,eAAsB,eAA2E;AAC/F,KAAI;AACF,SAAO,MAAM,OAAO;SACd;AACN,QAAM,IAAI,MACR,uIAGD;;;;;;;;;;AAsBL,IAAa,0BAA0B,OAAO,IAAI,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8D/E,SAAgB,sBAAsB,UAAwC,EAAE,EAAU;AACxF,QAAO;EACL,MAAM;EAMN,OAAO;EAEP,MAAM,gBAAgB,QAAuB;GAG3C,MAAM,EAAE,qBAAqB,OAAO,QAAQ,iBAAiB,eAAe;GAG5E,MAAM,eAAwC,EAC5C,SAAS,QAAQ,WAAW,MAC7B;AACD,OAAI,QAAQ,WACV,cAAa,aAAa,QAAQ;AAEpC,OAAI,QAAQ,YACV,cAAa,cAAc,QAAQ;GAGrC,MAAM,QAAQ,MAAM,iBAAiB,aAAa;AAMjD,UAAe,4BAA+B,OAAmB;AAChE,WAAO,gBAAgB,MAAM,KAAgC,GAAG;;AAKlE,UAAO,YAAY,GAAG,eAAe;AACnC,UAAM,SAAS,CAAC,YAAY,GAE1B;KACF;;EAEL"}
@@ -0,0 +1,64 @@
1
+ import type { CacheHandler } from '../cache/index';
2
+ /**
3
+ * Cloudflare Workers KV interface — the subset of KVNamespace we depend on.
4
+ * Users don't need to import this; the handler resolves the binding internally
5
+ * via `getCloudflareBindings()`.
6
+ */
7
+ export interface CloudflareKVNamespace {
8
+ get(key: string, options: {
9
+ type: 'json';
10
+ }): Promise<unknown>;
11
+ get(key: string, options?: {
12
+ type?: string;
13
+ }): Promise<string | null>;
14
+ put(key: string, value: string, options?: {
15
+ expirationTtl?: number;
16
+ }): Promise<void>;
17
+ delete(key: string): Promise<void>;
18
+ }
19
+ /**
20
+ * Cloudflare Workers KV–backed CacheHandler.
21
+ *
22
+ * Uses tag index keys for tag-based invalidation (KV has no secondary indexes).
23
+ * Stores entries with 2× TTL so stale entries survive for `staleWhileRevalidate`
24
+ * reads. The logical staleness is determined by the `expiresAt` timestamp inside
25
+ * the entry payload.
26
+ *
27
+ * **Consistency:** KV is eventually consistent (~60s propagation). TTL is the
28
+ * primary expiry mechanism. Tag invalidation is best-effort — do not rely on it
29
+ * for security-critical cache purging (use short TTLs instead).
30
+ *
31
+ * ```ts
32
+ * // timber.config.ts
33
+ * import { CloudflareKVCacheHandler } from '@timber-js/app/adapters/cloudflare/cache';
34
+ *
35
+ * export default {
36
+ * cacheHandler: new CloudflareKVCacheHandler({ bindingName: 'TIMBER_CACHE' }),
37
+ * };
38
+ * ```
39
+ */
40
+ export declare class CloudflareKVCacheHandler implements CacheHandler {
41
+ private bindingName;
42
+ private prefix;
43
+ constructor(options: {
44
+ bindingName: string;
45
+ prefix?: string;
46
+ });
47
+ /** Resolve the KV binding from the current request's Cloudflare env. */
48
+ private getKV;
49
+ private dataKey;
50
+ private tagKey;
51
+ get(key: string): Promise<{
52
+ value: unknown;
53
+ stale: boolean;
54
+ } | null>;
55
+ set(key: string, value: unknown, opts: {
56
+ ttl: number;
57
+ tags: string[];
58
+ }): Promise<void>;
59
+ invalidate(opts: {
60
+ key?: string;
61
+ tag?: string;
62
+ }): Promise<void>;
63
+ }
64
+ //# sourceMappingURL=cloudflare-kv-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-kv-cache.d.ts","sourceRoot":"","sources":["../../src/adapters/cloudflare-kv-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAQD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAC3D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D,wEAAwE;IACxE,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAUpE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtF,UAAU,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAgCtE"}
@@ -0,0 +1,95 @@
1
+ import { getCloudflareBindings } from "./cloudflare.js";
2
+ //#region src/adapters/cloudflare-kv-cache.ts
3
+ /**
4
+ * Cloudflare Workers KV–backed CacheHandler.
5
+ *
6
+ * Uses tag index keys for tag-based invalidation (KV has no secondary indexes).
7
+ * Stores entries with 2× TTL so stale entries survive for `staleWhileRevalidate`
8
+ * reads. The logical staleness is determined by the `expiresAt` timestamp inside
9
+ * the entry payload.
10
+ *
11
+ * **Consistency:** KV is eventually consistent (~60s propagation). TTL is the
12
+ * primary expiry mechanism. Tag invalidation is best-effort — do not rely on it
13
+ * for security-critical cache purging (use short TTLs instead).
14
+ *
15
+ * ```ts
16
+ * // timber.config.ts
17
+ * import { CloudflareKVCacheHandler } from '@timber-js/app/adapters/cloudflare/cache';
18
+ *
19
+ * export default {
20
+ * cacheHandler: new CloudflareKVCacheHandler({ bindingName: 'TIMBER_CACHE' }),
21
+ * };
22
+ * ```
23
+ */
24
+ var CloudflareKVCacheHandler = class {
25
+ bindingName;
26
+ prefix;
27
+ constructor(options) {
28
+ this.bindingName = options.bindingName;
29
+ this.prefix = options.prefix ?? "tc:";
30
+ }
31
+ /** Resolve the KV binding from the current request's Cloudflare env. */
32
+ getKV() {
33
+ const kv = getCloudflareBindings()[this.bindingName];
34
+ if (!kv) throw new Error(`CloudflareKVCacheHandler: binding "${this.bindingName}" not found. Check your wrangler.jsonc kv_namespaces configuration.`);
35
+ return kv;
36
+ }
37
+ dataKey(key) {
38
+ return `${this.prefix}d:${key}`;
39
+ }
40
+ tagKey(tag) {
41
+ return `${this.prefix}t:${tag}`;
42
+ }
43
+ async get(key) {
44
+ const raw = await this.getKV().get(this.dataKey(key), { type: "json" });
45
+ if (!raw) return null;
46
+ const entry = raw;
47
+ const stale = Date.now() > entry.expiresAt;
48
+ return {
49
+ value: entry.value,
50
+ stale
51
+ };
52
+ }
53
+ async set(key, value, opts) {
54
+ const kv = this.getKV();
55
+ const entry = {
56
+ value,
57
+ tags: opts.tags,
58
+ expiresAt: Date.now() + opts.ttl * 1e3
59
+ };
60
+ const kvTtl = Math.max(opts.ttl * 2, 60);
61
+ await kv.put(this.dataKey(key), JSON.stringify(entry), { expirationTtl: kvTtl });
62
+ await Promise.all(opts.tags.map(async (tag) => {
63
+ const existing = await kv.get(this.tagKey(tag), { type: "json" });
64
+ const keys = Array.isArray(existing) ? existing : [];
65
+ if (!keys.includes(key)) {
66
+ keys.push(key);
67
+ await kv.put(this.tagKey(tag), JSON.stringify(keys));
68
+ }
69
+ }));
70
+ }
71
+ async invalidate(opts) {
72
+ const kv = this.getKV();
73
+ if (opts.key) {
74
+ const raw = await kv.get(this.dataKey(opts.key), { type: "json" });
75
+ if (raw) await Promise.all(raw.tags.map(async (tag) => {
76
+ const existing = await kv.get(this.tagKey(tag), { type: "json" });
77
+ if (Array.isArray(existing)) {
78
+ const filtered = existing.filter((k) => k !== opts.key);
79
+ if (filtered.length > 0) await kv.put(this.tagKey(tag), JSON.stringify(filtered));
80
+ else await kv.delete(this.tagKey(tag));
81
+ }
82
+ }));
83
+ await kv.delete(this.dataKey(opts.key));
84
+ }
85
+ if (opts.tag) {
86
+ const existing = await kv.get(this.tagKey(opts.tag), { type: "json" });
87
+ if (Array.isArray(existing)) await Promise.all(existing.map((key) => kv.delete(this.dataKey(key))));
88
+ await kv.delete(this.tagKey(opts.tag));
89
+ }
90
+ }
91
+ };
92
+ //#endregion
93
+ export { CloudflareKVCacheHandler };
94
+
95
+ //# sourceMappingURL=cloudflare-kv-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-kv-cache.js","names":[],"sources":["../../src/adapters/cloudflare-kv-cache.ts"],"sourcesContent":["import type { CacheHandler } from '../cache/index';\nimport { getCloudflareBindings } from './cloudflare';\n\n/**\n * Cloudflare Workers KV interface — the subset of KVNamespace we depend on.\n * Users don't need to import this; the handler resolves the binding internally\n * via `getCloudflareBindings()`.\n */\nexport interface CloudflareKVNamespace {\n get(key: string, options: { type: 'json' }): Promise<unknown>;\n get(key: string, options?: { type?: string }): Promise<string | null>;\n put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\ninterface KVCacheEntry {\n value: unknown;\n tags: string[];\n expiresAt: number;\n}\n\n/**\n * Cloudflare Workers KV–backed CacheHandler.\n *\n * Uses tag index keys for tag-based invalidation (KV has no secondary indexes).\n * Stores entries with 2× TTL so stale entries survive for `staleWhileRevalidate`\n * reads. The logical staleness is determined by the `expiresAt` timestamp inside\n * the entry payload.\n *\n * **Consistency:** KV is eventually consistent (~60s propagation). TTL is the\n * primary expiry mechanism. Tag invalidation is best-effort — do not rely on it\n * for security-critical cache purging (use short TTLs instead).\n *\n * ```ts\n * // timber.config.ts\n * import { CloudflareKVCacheHandler } from '@timber-js/app/adapters/cloudflare/cache';\n *\n * export default {\n * cacheHandler: new CloudflareKVCacheHandler({ bindingName: 'TIMBER_CACHE' }),\n * };\n * ```\n */\nexport class CloudflareKVCacheHandler implements CacheHandler {\n private bindingName: string;\n private prefix: string;\n\n constructor(options: { bindingName: string; prefix?: string }) {\n this.bindingName = options.bindingName;\n this.prefix = options.prefix ?? 'tc:';\n }\n\n /** Resolve the KV binding from the current request's Cloudflare env. */\n private getKV(): CloudflareKVNamespace {\n const env = getCloudflareBindings<Record<string, CloudflareKVNamespace>>();\n const kv = env[this.bindingName];\n if (!kv) {\n throw new Error(\n `CloudflareKVCacheHandler: binding \"${this.bindingName}\" not found. ` +\n 'Check your wrangler.jsonc kv_namespaces configuration.'\n );\n }\n return kv;\n }\n\n private dataKey(key: string): string {\n return `${this.prefix}d:${key}`;\n }\n\n private tagKey(tag: string): string {\n return `${this.prefix}t:${tag}`;\n }\n\n async get(key: string): Promise<{ value: unknown; stale: boolean } | null> {\n const kv = this.getKV();\n const raw = await kv.get(this.dataKey(key), { type: 'json' });\n if (!raw) return null;\n\n const entry = raw as KVCacheEntry;\n const stale = Date.now() > entry.expiresAt;\n return { value: entry.value, stale };\n }\n\n async set(key: string, value: unknown, opts: { ttl: number; tags: string[] }): Promise<void> {\n const kv = this.getKV();\n const entry: KVCacheEntry = {\n value,\n tags: opts.tags,\n expiresAt: Date.now() + opts.ttl * 1000,\n };\n\n // KV expirationTtl minimum is 60s. Use 2× TTL (min 60s) so stale entries\n // survive for staleWhileRevalidate background refetches.\n const kvTtl = Math.max(opts.ttl * 2, 60);\n await kv.put(this.dataKey(key), JSON.stringify(entry), { expirationTtl: kvTtl });\n\n // Update tag indexes (best-effort, eventually consistent).\n // Tag indexes have no TTL — cleaned up on invalidation.\n await Promise.all(\n opts.tags.map(async (tag) => {\n const existing = (await kv.get(this.tagKey(tag), { type: 'json' })) as string[] | null;\n const keys: string[] = Array.isArray(existing) ? existing : [];\n if (!keys.includes(key)) {\n keys.push(key);\n await kv.put(this.tagKey(tag), JSON.stringify(keys));\n }\n })\n );\n }\n\n async invalidate(opts: { key?: string; tag?: string }): Promise<void> {\n const kv = this.getKV();\n\n if (opts.key) {\n // Read entry to find its tags, then clean up tag indexes\n const raw = (await kv.get(this.dataKey(opts.key), { type: 'json' })) as KVCacheEntry | null;\n if (raw) {\n await Promise.all(\n raw.tags.map(async (tag) => {\n const existing = (await kv.get(this.tagKey(tag), { type: 'json' })) as string[] | null;\n if (Array.isArray(existing)) {\n const filtered = existing.filter((k: string) => k !== opts.key);\n if (filtered.length > 0) {\n await kv.put(this.tagKey(tag), JSON.stringify(filtered));\n } else {\n await kv.delete(this.tagKey(tag));\n }\n }\n })\n );\n }\n await kv.delete(this.dataKey(opts.key));\n }\n\n if (opts.tag) {\n const existing = (await kv.get(this.tagKey(opts.tag), { type: 'json' })) as string[] | null;\n if (Array.isArray(existing)) {\n await Promise.all(existing.map((key: string) => kv.delete(this.dataKey(key))));\n }\n await kv.delete(this.tagKey(opts.tag));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0CA,IAAa,2BAAb,MAA8D;CAC5D;CACA;CAEA,YAAY,SAAmD;AAC7D,OAAK,cAAc,QAAQ;AAC3B,OAAK,SAAS,QAAQ,UAAU;;;CAIlC,QAAuC;EAErC,MAAM,KADM,uBAA8D,CAC3D,KAAK;AACpB,MAAI,CAAC,GACH,OAAM,IAAI,MACR,sCAAsC,KAAK,YAAY,qEAExD;AAEH,SAAO;;CAGT,QAAgB,KAAqB;AACnC,SAAO,GAAG,KAAK,OAAO,IAAI;;CAG5B,OAAe,KAAqB;AAClC,SAAO,GAAG,KAAK,OAAO,IAAI;;CAG5B,MAAM,IAAI,KAAiE;EAEzE,MAAM,MAAM,MADD,KAAK,OAAO,CACF,IAAI,KAAK,QAAQ,IAAI,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,MAAI,CAAC,IAAK,QAAO;EAEjB,MAAM,QAAQ;EACd,MAAM,QAAQ,KAAK,KAAK,GAAG,MAAM;AACjC,SAAO;GAAE,OAAO,MAAM;GAAO;GAAO;;CAGtC,MAAM,IAAI,KAAa,OAAgB,MAAsD;EAC3F,MAAM,KAAK,KAAK,OAAO;EACvB,MAAM,QAAsB;GAC1B;GACA,MAAM,KAAK;GACX,WAAW,KAAK,KAAK,GAAG,KAAK,MAAM;GACpC;EAID,MAAM,QAAQ,KAAK,IAAI,KAAK,MAAM,GAAG,GAAG;AACxC,QAAM,GAAG,IAAI,KAAK,QAAQ,IAAI,EAAE,KAAK,UAAU,MAAM,EAAE,EAAE,eAAe,OAAO,CAAC;AAIhF,QAAM,QAAQ,IACZ,KAAK,KAAK,IAAI,OAAO,QAAQ;GAC3B,MAAM,WAAY,MAAM,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,EAAE,MAAM,QAAQ,CAAC;GAClE,MAAM,OAAiB,MAAM,QAAQ,SAAS,GAAG,WAAW,EAAE;AAC9D,OAAI,CAAC,KAAK,SAAS,IAAI,EAAE;AACvB,SAAK,KAAK,IAAI;AACd,UAAM,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,KAAK,UAAU,KAAK,CAAC;;IAEtD,CACH;;CAGH,MAAM,WAAW,MAAqD;EACpE,MAAM,KAAK,KAAK,OAAO;AAEvB,MAAI,KAAK,KAAK;GAEZ,MAAM,MAAO,MAAM,GAAG,IAAI,KAAK,QAAQ,KAAK,IAAI,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAI,IACF,OAAM,QAAQ,IACZ,IAAI,KAAK,IAAI,OAAO,QAAQ;IAC1B,MAAM,WAAY,MAAM,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClE,QAAI,MAAM,QAAQ,SAAS,EAAE;KAC3B,MAAM,WAAW,SAAS,QAAQ,MAAc,MAAM,KAAK,IAAI;AAC/D,SAAI,SAAS,SAAS,EACpB,OAAM,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,KAAK,UAAU,SAAS,CAAC;SAExD,OAAM,GAAG,OAAO,KAAK,OAAO,IAAI,CAAC;;KAGrC,CACH;AAEH,SAAM,GAAG,OAAO,KAAK,QAAQ,KAAK,IAAI,CAAC;;AAGzC,MAAI,KAAK,KAAK;GACZ,MAAM,WAAY,MAAM,GAAG,IAAI,KAAK,OAAO,KAAK,IAAI,EAAE,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAI,MAAM,QAAQ,SAAS,CACzB,OAAM,QAAQ,IAAI,SAAS,KAAK,QAAgB,GAAG,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC;AAEhF,SAAM,GAAG,OAAO,KAAK,OAAO,KAAK,IAAI,CAAC"}
@@ -20,12 +20,79 @@ import type { TimberPlatformAdapter, TimberConfig } from './types';
20
20
  * }
21
21
  * ```
22
22
  */
23
- export declare function getCloudflareBindings<T extends Record<string, unknown> = Record<string, unknown>>(): T;
23
+ export declare function getCloudflareBindings<T = Record<string, unknown>>(): T;
24
24
  /**
25
25
  * Run a function with Cloudflare bindings available via getCloudflareBindings().
26
26
  * @internal Used by wrapWithExecutionContext.
27
27
  */
28
28
  export declare function runWithBindings<T>(env: Record<string, unknown>, fn: () => T): T;
29
+ /** KV namespace binding. `id` defaults to `''` (filled in by wrangler or dashboard). */
30
+ export interface CloudflareKVBinding {
31
+ name: string;
32
+ id?: string;
33
+ }
34
+ /** D1 database binding. `database_id` is required (from Cloudflare dashboard). */
35
+ export interface CloudflareD1Binding {
36
+ name: string;
37
+ database_id: string;
38
+ }
39
+ /** R2 bucket binding. `bucket_name` must match the bucket created in Cloudflare. */
40
+ export interface CloudflareR2Binding {
41
+ name: string;
42
+ bucket_name: string;
43
+ }
44
+ /** Queue producer binding. `queue` is the queue name in Cloudflare. */
45
+ export interface CloudflareQueueProducer {
46
+ name: string;
47
+ queue: string;
48
+ }
49
+ /** Queue consumer declaration. Attached to the worker, not a binding name. */
50
+ export interface CloudflareQueueConsumer {
51
+ queue: string;
52
+ max_batch_size?: number;
53
+ max_retries?: number;
54
+ dead_letter_queue?: string;
55
+ }
56
+ /** Durable Object binding. `script_name` is for external DO references. */
57
+ export interface CloudflareDurableObjectBinding {
58
+ name: string;
59
+ class_name: string;
60
+ script_name?: string;
61
+ }
62
+ /**
63
+ * Declarative Cloudflare bindings configuration.
64
+ *
65
+ * These are converted to the appropriate wrangler.jsonc sections
66
+ * (`kv_namespaces`, `d1_databases`, `r2_buckets`, `queues`, `durable_objects`).
67
+ * The `wrangler` escape hatch overrides any generated binding sections
68
+ * if there's a conflict.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * cloudflare({
73
+ * bindings: {
74
+ * kv: [{ name: 'TIMBER_CACHE' }],
75
+ * d1: [{ name: 'MY_DB', database_id: 'xxxx' }],
76
+ * r2: [{ name: 'MY_BUCKET', bucket_name: 'my-bucket' }],
77
+ * queues: {
78
+ * producers: [{ name: 'EMAIL_QUEUE', queue: 'email-queue' }],
79
+ * consumers: [{ queue: 'email-queue', max_batch_size: 10 }],
80
+ * },
81
+ * durableObjects: [{ name: 'MY_DO', class_name: 'MyDurableObject' }],
82
+ * },
83
+ * })
84
+ * ```
85
+ */
86
+ export interface CloudflareBindings {
87
+ kv?: CloudflareKVBinding[];
88
+ d1?: CloudflareD1Binding[];
89
+ r2?: CloudflareR2Binding[];
90
+ queues?: {
91
+ producers?: CloudflareQueueProducer[];
92
+ consumers?: CloudflareQueueConsumer[];
93
+ };
94
+ durableObjects?: CloudflareDurableObjectBinding[];
95
+ }
29
96
  /** Options for the Cloudflare Workers adapter. */
30
97
  export interface CloudflareAdapterOptions {
31
98
  /**
@@ -38,11 +105,40 @@ export interface CloudflareAdapterOptions {
38
105
  * @default ['nodejs_compat']
39
106
  */
40
107
  compatibilityFlags?: string[];
108
+ /**
109
+ * Declarative Cloudflare bindings. Generates the appropriate
110
+ * `kv_namespaces`, `d1_databases`, `r2_buckets`, `queues`, and
111
+ * `durable_objects` sections in wrangler.jsonc.
112
+ *
113
+ * If both `bindings` and `wrangler` specify the same section,
114
+ * `wrangler` wins (it's the escape hatch).
115
+ */
116
+ bindings?: CloudflareBindings;
41
117
  /**
42
118
  * Custom wrangler.jsonc fields to merge.
43
- * Overrides generated values.
119
+ * Overrides generated values (including bindings-generated sections).
44
120
  */
45
121
  wrangler?: Record<string, unknown>;
122
+ /**
123
+ * Path to a module that exports additional Worker handlers (queue, scheduled, email, etc.).
124
+ * The module is imported in the generated `_worker.js` and its named exports are
125
+ * spread into the default export alongside `fetch`.
126
+ *
127
+ * The module receives `(batch/event, env, ctx)` — standard Cloudflare handler signatures.
128
+ * It does NOT have access to timber's request pipeline (no ALS, no getCloudflareBindings).
129
+ * Use `env` directly for bindings.
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * // timber.config.ts
134
+ * adapter: cloudflare({ workerHandlers: './src/worker-handlers.ts' })
135
+ *
136
+ * // src/worker-handlers.ts
137
+ * export async function queue(batch, env) { ... }
138
+ * export async function scheduled(controller, env, ctx) { ... }
139
+ * ```
140
+ */
141
+ workerHandlers?: string;
46
142
  }
47
143
  /**
48
144
  * Create a Cloudflare Workers adapter.
@@ -67,9 +163,49 @@ export declare function cloudflare(options?: CloudflareAdapterOptions): TimberPl
67
163
  * 1. Binds `adapter.waitUntil()` to `ctx.waitUntil()` per-request
68
164
  * 2. Makes `env` accessible via `getCloudflareBindings()` per-request via ALS
69
165
  */
70
- export declare function wrapWithExecutionContext(adapter: TimberPlatformAdapter, handler: (req: Request) => Promise<Response>): ExportedHandler<Record<string, unknown>>;
166
+ export declare function wrapWithExecutionContext(adapter: TimberPlatformAdapter, handler: (req: Request) => Promise<Response>): CfExportedHandler<Record<string, unknown>>;
71
167
  /** @internal Exported for testing. */
72
- export declare function generateWorkerEntry(buildDir: string, outDir: string, hasManifestInit?: boolean): string;
168
+ export declare function generateWorkerEntry(buildDir: string, outDir: string, hasManifestInit?: boolean, hasWorkerHandlers?: boolean): string;
169
+ /** Wrangler binding sections generated from `CloudflareBindings`. */
170
+ export interface WranglerBindingsConfig {
171
+ kv_namespaces?: Array<{
172
+ binding: string;
173
+ id: string;
174
+ }>;
175
+ d1_databases?: Array<{
176
+ binding: string;
177
+ database_id: string;
178
+ }>;
179
+ r2_buckets?: Array<{
180
+ binding: string;
181
+ bucket_name: string;
182
+ }>;
183
+ queues?: {
184
+ producers?: Array<{
185
+ binding: string;
186
+ queue: string;
187
+ }>;
188
+ consumers?: Array<Record<string, unknown>>;
189
+ };
190
+ durable_objects?: {
191
+ bindings: Array<Record<string, string>>;
192
+ };
193
+ }
194
+ /**
195
+ * Convert declarative `CloudflareBindings` into wrangler.jsonc binding sections.
196
+ *
197
+ * Maps:
198
+ * - `kv` → `kv_namespaces`
199
+ * - `d1` → `d1_databases`
200
+ * - `r2` → `r2_buckets`
201
+ * - `queues` → `queues` (producers + consumers)
202
+ * - `durableObjects` → `durable_objects`
203
+ *
204
+ * Empty arrays are omitted from the output.
205
+ *
206
+ * @internal Exported for testing.
207
+ */
208
+ export declare function generateBindingsConfig(bindings: CloudflareBindings | undefined): WranglerBindingsConfig;
73
209
  /** @internal Exported for testing. */
74
210
  export declare function generateWranglerConfig(config: TimberConfig, options: CloudflareAdapterOptions): Record<string, unknown>;
75
211
  /** Command descriptor for preview — testable without spawning a process. */
@@ -80,13 +216,13 @@ export interface PreviewCommand {
80
216
  }
81
217
  /** @internal Exported for testing. */
82
218
  export declare function generatePreviewCommand(buildDir: string): PreviewCommand;
83
- declare global {
84
- interface ExecutionContext {
85
- waitUntil(promise: Promise<unknown>): void;
86
- passThroughOnException(): void;
87
- }
88
- interface ExportedHandler<Env = Record<string, unknown>> {
89
- fetch?(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> | Response;
90
- }
219
+ /** @internal Minimal stub — use @cloudflare/workers-types for full types. */
220
+ export interface CfExecutionContext {
221
+ waitUntil(promise: Promise<unknown>): void;
222
+ passThroughOnException(): void;
223
+ }
224
+ /** @internal Minimal stub use @cloudflare/workers-types for full types. */
225
+ export interface CfExportedHandler<Env = Record<string, unknown>> {
226
+ fetch?(request: Request, env: Env, ctx: CfExecutionContext): Promise<Response> | Response;
91
227
  }
92
228
  //# sourceMappingURL=cloudflare.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/adapters/cloudflare.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA2BnE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACxD,CAAC,CAUL;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE/E;AAED,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,wBAA6B,GAAG,qBAAqB,CA2DxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GAC3C,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsB1C;AAID,sCAAsC;AACtC,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,eAAe,UAAQ,GACtB,MAAM,CA0BR;AAED,sCAAsC;AACtC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BzB;AAID,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,sCAAsC;AACtC,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAOvE;AAqBD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,gBAAgB;QACxB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QAC3C,sBAAsB,IAAI,IAAI,CAAC;KAChC;IAED,UAAU,eAAe,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QACrD,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;KACzF;CACF"}
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/adapters/cloudflare.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,15 @@ function generateHeadersFile() {
16
16
  Cache-Control: ${STATIC_CACHE}
17
17
  `;
18
18
  }
19
- var bindingsAls = new AsyncLocalStorage();
19
+ var BINDINGS_ALS_KEY = Symbol.for("timber:cf-bindings-als");
20
+ function getBindingsAls() {
21
+ let als = globalThis[BINDINGS_ALS_KEY];
22
+ if (!als) {
23
+ als = new AsyncLocalStorage();
24
+ globalThis[BINDINGS_ALS_KEY] = als;
25
+ }
26
+ return als;
27
+ }
20
28
  /**
21
29
  * Get Cloudflare Worker bindings for the current request.
22
30
  *
@@ -39,7 +47,7 @@ var bindingsAls = new AsyncLocalStorage();
39
47
  * ```
40
48
  */
41
49
  function getCloudflareBindings() {
42
- const env = bindingsAls.getStore();
50
+ const env = getBindingsAls().getStore();
43
51
  if (!env) throw new Error("getCloudflareBindings() called outside a Cloudflare Workers request context. It can only be called from server components, middleware, or server actions when running on the Cloudflare adapter.");
44
52
  return env;
45
53
  }
@@ -48,7 +56,7 @@ function getCloudflareBindings() {
48
56
  * @internal Used by wrapWithExecutionContext.
49
57
  */
50
58
  function runWithBindings(env, fn) {
51
- return bindingsAls.run(env, fn);
59
+ return getBindingsAls().run(env, fn);
52
60
  }
53
61
  /**
54
62
  * Create a Cloudflare Workers adapter.
@@ -82,7 +90,28 @@ function cloudflare(options = {}) {
82
90
  await cp(rscDir, join(outDir, "rsc"), { recursive: true });
83
91
  await cp(ssrDir, join(outDir, "ssr"), { recursive: true });
84
92
  if (config.manifestInit) await writeFile(join(outDir, "_timber-manifest-init.js"), config.manifestInit);
85
- const workerEntry = generateWorkerEntry(outDir, outDir, !!config.manifestInit);
93
+ let hasWorkerHandlers = false;
94
+ if (options.workerHandlers) {
95
+ const handlersEntry = join(process.cwd(), options.workerHandlers);
96
+ const { build: viteBuild } = await import("vite");
97
+ await viteBuild({
98
+ configFile: false,
99
+ logLevel: "info",
100
+ build: {
101
+ lib: {
102
+ entry: handlersEntry,
103
+ formats: ["es"],
104
+ fileName: () => "_worker-handlers.js"
105
+ },
106
+ outDir,
107
+ emptyOutDir: false,
108
+ minify: false,
109
+ rollupOptions: { external: [/^node:/] }
110
+ }
111
+ });
112
+ hasWorkerHandlers = true;
113
+ }
114
+ const workerEntry = generateWorkerEntry(outDir, outDir, !!config.manifestInit, hasWorkerHandlers);
86
115
  await writeFile(join(outDir, "_worker.js"), workerEntry);
87
116
  const wranglerConfig = generateWranglerConfig(config, options);
88
117
  await writeFile(join(outDir, "wrangler.jsonc"), JSON.stringify(wranglerConfig, null, 2));
@@ -117,22 +146,115 @@ function wrapWithExecutionContext(adapter, handler) {
117
146
  } };
118
147
  }
119
148
  /** @internal Exported for testing. */
120
- function generateWorkerEntry(buildDir, outDir, hasManifestInit = false) {
149
+ function generateWorkerEntry(buildDir, outDir, hasManifestInit = false, hasWorkerHandlers = false) {
121
150
  let rscEntryRelative = relative(outDir, join(buildDir, "rsc", "index.js"));
122
151
  if (!rscEntryRelative.startsWith(".")) rscEntryRelative = "./" + rscEntryRelative;
123
152
  return `// Generated by @timber-js/app/adapters/cloudflare
124
153
  // Do not edit — this file is regenerated on each build.
125
154
 
155
+ import { AsyncLocalStorage } from 'node:async_hooks'
126
156
  ${hasManifestInit ? "import './_timber-manifest-init.js'\n" : ""}import handler from '${rscEntryRelative}'
127
-
157
+ ${hasWorkerHandlers ? "import * as workerHandlers from './_worker-handlers.js'\n" : ""}
128
158
  // Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
129
159
  // See design/25-production-deployments.md §"TIMBER_RUNTIME".
130
160
  globalThis.process ??= { env: {} }
131
161
  process.env.TIMBER_RUNTIME = 'cloudflare'
132
162
 
133
- export default { fetch: handler }
163
+ // Bind Cloudflare env to ALS so getCloudflareBindings() works at runtime.
164
+ // Uses the same Symbol.for key as getCloudflareBindings() reads from.
165
+ const ALS_KEY = Symbol.for('timber:cf-bindings-als')
166
+ let bindingsAls = globalThis[ALS_KEY]
167
+ if (!bindingsAls) {
168
+ bindingsAls = new AsyncLocalStorage()
169
+ globalThis[ALS_KEY] = bindingsAls
170
+ }
171
+
172
+ export default {
173
+ ${hasWorkerHandlers ? " ...workerHandlers,\n" : ""} async fetch(request, env, ctx) {
174
+ return bindingsAls.run(env, () => handler(request))
175
+ }
176
+ }
134
177
  `;
135
178
  }
179
+ /**
180
+ * Convert declarative `CloudflareBindings` into wrangler.jsonc binding sections.
181
+ *
182
+ * Maps:
183
+ * - `kv` → `kv_namespaces`
184
+ * - `d1` → `d1_databases`
185
+ * - `r2` → `r2_buckets`
186
+ * - `queues` → `queues` (producers + consumers)
187
+ * - `durableObjects` → `durable_objects`
188
+ *
189
+ * Empty arrays are omitted from the output.
190
+ *
191
+ * @internal Exported for testing.
192
+ */
193
+ function generateBindingsConfig(bindings) {
194
+ if (!bindings) return {};
195
+ const result = {};
196
+ if (bindings.kv && bindings.kv.length > 0) result.kv_namespaces = bindings.kv.map((kv) => ({
197
+ binding: kv.name,
198
+ id: kv.id ?? ""
199
+ }));
200
+ if (bindings.d1 && bindings.d1.length > 0) result.d1_databases = bindings.d1.map((d1) => ({
201
+ binding: d1.name,
202
+ database_id: d1.database_id
203
+ }));
204
+ if (bindings.r2 && bindings.r2.length > 0) result.r2_buckets = bindings.r2.map((r2) => ({
205
+ binding: r2.name,
206
+ bucket_name: r2.bucket_name
207
+ }));
208
+ if (bindings.queues) {
209
+ const queues = {};
210
+ if (bindings.queues.producers && bindings.queues.producers.length > 0) queues.producers = bindings.queues.producers.map((p) => ({
211
+ binding: p.name,
212
+ queue: p.queue
213
+ }));
214
+ if (bindings.queues.consumers && bindings.queues.consumers.length > 0) queues.consumers = bindings.queues.consumers.map((c) => {
215
+ const consumer = { queue: c.queue };
216
+ if (c.max_batch_size !== void 0) consumer.max_batch_size = c.max_batch_size;
217
+ if (c.max_retries !== void 0) consumer.max_retries = c.max_retries;
218
+ if (c.dead_letter_queue !== void 0) consumer.dead_letter_queue = c.dead_letter_queue;
219
+ return consumer;
220
+ });
221
+ if (Object.keys(queues).length > 0) result.queues = queues;
222
+ }
223
+ if (bindings.durableObjects && bindings.durableObjects.length > 0) result.durable_objects = { bindings: bindings.durableObjects.map((dobj) => {
224
+ const entry = {
225
+ name: dobj.name,
226
+ class_name: dobj.class_name
227
+ };
228
+ if (dobj.script_name) entry.script_name = dobj.script_name;
229
+ return entry;
230
+ }) };
231
+ return result;
232
+ }
233
+ /**
234
+ * One-level deep merge: for each key in `override`, if both the base and
235
+ * override values are plain objects (not arrays, not null), merge their
236
+ * keys with override winning on conflicts. Everything else (primitives,
237
+ * arrays, null) is replaced outright — matching the intuitive behavior
238
+ * where `kv_namespaces: [...]` replaces fully but
239
+ * `durable_objects: { migrations }` merges with generated `bindings`.
240
+ */
241
+ function shallowDeepMerge(base, override) {
242
+ const result = { ...base };
243
+ for (const key of Object.keys(override)) {
244
+ const baseVal = result[key];
245
+ const overVal = override[key];
246
+ if (isPlainObject(baseVal) && isPlainObject(overVal)) result[key] = {
247
+ ...baseVal,
248
+ ...overVal
249
+ };
250
+ else result[key] = overVal;
251
+ }
252
+ return result;
253
+ }
254
+ /** True for `{}` literals — false for arrays, null, Date, etc. */
255
+ function isPlainObject(val) {
256
+ return val !== null && typeof val === "object" && !Array.isArray(val);
257
+ }
136
258
  /** @internal Exported for testing. */
137
259
  function generateWranglerConfig(config, options) {
138
260
  const base = {
@@ -148,11 +270,13 @@ function generateWranglerConfig(config, options) {
148
270
  }],
149
271
  assets: { directory: "./static" }
150
272
  };
151
- if (options.wrangler) return {
273
+ const bindingsConfig = generateBindingsConfig(options.bindings);
274
+ const merged = {
152
275
  ...base,
153
- ...options.wrangler
276
+ ...bindingsConfig
154
277
  };
155
- return base;
278
+ if (options.wrangler) return shallowDeepMerge(merged, options.wrangler);
279
+ return merged;
156
280
  }
157
281
  /** @internal Exported for testing. */
158
282
  function generatePreviewCommand(buildDir) {
@@ -183,6 +307,6 @@ function spawnPreviewProcess(command, args, cwd) {
183
307
  });
184
308
  }
185
309
  //#endregion
186
- export { cloudflare, generatePreviewCommand, generateWorkerEntry, generateWranglerConfig, getCloudflareBindings, runWithBindings, wrapWithExecutionContext };
310
+ export { cloudflare, generateBindingsConfig, generatePreviewCommand, generateWorkerEntry, generateWranglerConfig, getCloudflareBindings, runWithBindings, wrapWithExecutionContext };
187
311
 
188
312
  //# sourceMappingURL=cloudflare.js.map