@timber-js/app 0.2.0-alpha.9 → 0.2.0-alpha.90

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 (610) hide show
  1. package/dist/_chunks/actions-DLnUaR65.js +421 -0
  2. package/dist/_chunks/actions-DLnUaR65.js.map +1 -0
  3. package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
  4. package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
  5. package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
  6. package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
  7. package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
  8. package/dist/_chunks/define-C77ScO0m.js +106 -0
  9. package/dist/_chunks/define-C77ScO0m.js.map +1 -0
  10. package/dist/_chunks/define-Itxvcd7F.js +199 -0
  11. package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
  12. package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
  13. package/dist/_chunks/define-cookie-BowvzoP0.js.map +1 -0
  14. package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
  15. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
  16. package/dist/_chunks/format-CYBGxKtc.js +14 -0
  17. package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
  18. package/dist/_chunks/{interception-BOoWmLUA.js → interception-DRlhJWbu.js} +219 -97
  19. package/dist/_chunks/interception-DRlhJWbu.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
  21. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
  22. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
  23. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
  24. package/dist/_chunks/request-context-CK5tZqIP.js +478 -0
  25. package/dist/_chunks/request-context-CK5tZqIP.js.map +1 -0
  26. package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
  27. package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
  28. package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
  29. package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
  30. package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
  31. package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
  32. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
  33. package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
  34. package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
  35. package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
  36. package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
  37. package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
  38. package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
  39. package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
  40. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-BiV5GJgm.js} +7 -4
  41. package/dist/_chunks/use-query-states-BiV5GJgm.js.map +1 -0
  42. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  43. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  44. package/dist/adapters/cloudflare-dev.js +73 -0
  45. package/dist/adapters/cloudflare-dev.js.map +1 -0
  46. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  47. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  48. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  49. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  50. package/dist/adapters/cloudflare.d.ts +148 -12
  51. package/dist/adapters/cloudflare.d.ts.map +1 -1
  52. package/dist/adapters/cloudflare.js +135 -11
  53. package/dist/adapters/cloudflare.js.map +1 -1
  54. package/dist/adapters/compress-module.d.ts.map +1 -1
  55. package/dist/adapters/nitro.d.ts +17 -1
  56. package/dist/adapters/nitro.d.ts.map +1 -1
  57. package/dist/adapters/nitro.js +56 -13
  58. package/dist/adapters/nitro.js.map +1 -1
  59. package/dist/cache/cache-api.d.ts +24 -0
  60. package/dist/cache/cache-api.d.ts.map +1 -0
  61. package/dist/cache/handler-store.d.ts +31 -0
  62. package/dist/cache/handler-store.d.ts.map +1 -0
  63. package/dist/cache/index.d.ts +23 -7
  64. package/dist/cache/index.d.ts.map +1 -1
  65. package/dist/cache/index.js +142 -80
  66. package/dist/cache/index.js.map +1 -1
  67. package/dist/cache/singleflight.d.ts +18 -1
  68. package/dist/cache/singleflight.d.ts.map +1 -1
  69. package/dist/cache/sizeof.d.ts +22 -0
  70. package/dist/cache/sizeof.d.ts.map +1 -0
  71. package/dist/cache/timber-cache.d.ts +1 -1
  72. package/dist/cache/timber-cache.d.ts.map +1 -1
  73. package/dist/cli.d.ts +6 -1
  74. package/dist/cli.d.ts.map +1 -1
  75. package/dist/cli.js +8 -3
  76. package/dist/cli.js.map +1 -1
  77. package/dist/client/browser-dev.d.ts +27 -1
  78. package/dist/client/browser-dev.d.ts.map +1 -1
  79. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  80. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  81. package/dist/client/browser-entry/hmr.d.ts +21 -0
  82. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  83. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  84. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  85. package/dist/client/browser-entry/index.d.ts +30 -0
  86. package/dist/client/browser-entry/index.d.ts.map +1 -0
  87. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  88. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  89. package/dist/client/browser-entry/router-init.d.ts +23 -0
  90. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  91. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  92. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  93. package/dist/client/browser-entry/scroll.d.ts +19 -0
  94. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  95. package/dist/client/error-boundary.d.ts +12 -5
  96. package/dist/client/error-boundary.d.ts.map +1 -1
  97. package/dist/client/error-boundary.js +10 -4
  98. package/dist/client/error-boundary.js.map +1 -1
  99. package/dist/client/error-reconstituter.d.ts +54 -0
  100. package/dist/client/error-reconstituter.d.ts.map +1 -0
  101. package/dist/client/form.d.ts +6 -3
  102. package/dist/client/form.d.ts.map +1 -1
  103. package/dist/client/history.d.ts +19 -4
  104. package/dist/client/history.d.ts.map +1 -1
  105. package/dist/client/index.d.ts +9 -21
  106. package/dist/client/index.d.ts.map +1 -1
  107. package/dist/client/index.js +229 -1018
  108. package/dist/client/index.js.map +1 -1
  109. package/dist/client/internal.d.ts +18 -0
  110. package/dist/client/internal.d.ts.map +1 -0
  111. package/dist/client/internal.js +890 -0
  112. package/dist/client/internal.js.map +1 -0
  113. package/dist/client/link-pending-store.d.ts +63 -0
  114. package/dist/client/link-pending-store.d.ts.map +1 -0
  115. package/dist/client/link.d.ts +62 -55
  116. package/dist/client/link.d.ts.map +1 -1
  117. package/dist/client/nav-link-store.d.ts +36 -0
  118. package/dist/client/nav-link-store.d.ts.map +1 -0
  119. package/dist/client/navigation-api-types.d.ts +90 -0
  120. package/dist/client/navigation-api-types.d.ts.map +1 -0
  121. package/dist/client/navigation-api.d.ts +115 -0
  122. package/dist/client/navigation-api.d.ts.map +1 -0
  123. package/dist/client/navigation-context.d.ts +13 -2
  124. package/dist/client/navigation-context.d.ts.map +1 -1
  125. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  126. package/dist/client/navigation-root.d.ts.map +1 -0
  127. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  128. package/dist/client/router-ref.d.ts +1 -1
  129. package/dist/client/router.d.ts +70 -4
  130. package/dist/client/router.d.ts.map +1 -1
  131. package/dist/client/rsc-fetch.d.ts +38 -3
  132. package/dist/client/rsc-fetch.d.ts.map +1 -1
  133. package/dist/client/segment-cache.d.ts +1 -1
  134. package/dist/client/segment-cache.d.ts.map +1 -1
  135. package/dist/client/segment-outlet.d.ts +63 -0
  136. package/dist/client/segment-outlet.d.ts.map +1 -0
  137. package/dist/client/ssr-data.d.ts +13 -4
  138. package/dist/client/ssr-data.d.ts.map +1 -1
  139. package/dist/client/stale-reload.d.ts +15 -0
  140. package/dist/client/stale-reload.d.ts.map +1 -1
  141. package/dist/client/top-loader.d.ts +5 -5
  142. package/dist/client/top-loader.d.ts.map +1 -1
  143. package/dist/client/use-link-status.d.ts +5 -5
  144. package/dist/client/use-link-status.d.ts.map +1 -1
  145. package/dist/client/use-params.d.ts +6 -4
  146. package/dist/client/use-params.d.ts.map +1 -1
  147. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  148. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  149. package/dist/client/use-query-states.d.ts +1 -1
  150. package/dist/client/use-query-states.d.ts.map +1 -1
  151. package/dist/client/use-router.d.ts +1 -1
  152. package/dist/codec.d.ts +33 -0
  153. package/dist/codec.d.ts.map +1 -0
  154. package/dist/codec.js +2 -0
  155. package/dist/config-types.d.ts +266 -0
  156. package/dist/config-types.d.ts.map +1 -0
  157. package/dist/config-validation.d.ts +51 -0
  158. package/dist/config-validation.d.ts.map +1 -0
  159. package/dist/content/index.d.ts +1 -10
  160. package/dist/content/index.d.ts.map +1 -1
  161. package/dist/content/index.js +0 -2
  162. package/dist/cookies/define-cookie.d.ts +35 -14
  163. package/dist/cookies/define-cookie.d.ts.map +1 -1
  164. package/dist/cookies/index.js +1 -83
  165. package/dist/fonts/bundle.d.ts +48 -0
  166. package/dist/fonts/bundle.d.ts.map +1 -0
  167. package/dist/fonts/css.d.ts +1 -0
  168. package/dist/fonts/css.d.ts.map +1 -1
  169. package/dist/fonts/dev-middleware.d.ts +22 -0
  170. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  171. package/dist/fonts/pipeline.d.ts +138 -0
  172. package/dist/fonts/pipeline.d.ts.map +1 -0
  173. package/dist/fonts/transform.d.ts +72 -0
  174. package/dist/fonts/transform.d.ts.map +1 -0
  175. package/dist/fonts/types.d.ts +45 -1
  176. package/dist/fonts/types.d.ts.map +1 -1
  177. package/dist/fonts/virtual-modules.d.ts +59 -0
  178. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  179. package/dist/index.d.ts +45 -190
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +4294 -2453
  182. package/dist/index.js.map +1 -1
  183. package/dist/plugin-context.d.ts +107 -0
  184. package/dist/plugin-context.d.ts.map +1 -0
  185. package/dist/plugins/adapter-build.d.ts +1 -1
  186. package/dist/plugins/adapter-build.d.ts.map +1 -1
  187. package/dist/plugins/build-manifest.d.ts +2 -2
  188. package/dist/plugins/build-manifest.d.ts.map +1 -1
  189. package/dist/plugins/build-report.d.ts +3 -3
  190. package/dist/plugins/build-report.d.ts.map +1 -1
  191. package/dist/plugins/client-chunks.d.ts +32 -0
  192. package/dist/plugins/client-chunks.d.ts.map +1 -0
  193. package/dist/plugins/content.d.ts +1 -1
  194. package/dist/plugins/content.d.ts.map +1 -1
  195. package/dist/plugins/dev-404-page.d.ts +56 -0
  196. package/dist/plugins/dev-404-page.d.ts.map +1 -0
  197. package/dist/plugins/dev-browser-logs.d.ts +84 -0
  198. package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
  199. package/dist/plugins/dev-error-overlay.d.ts +49 -9
  200. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  201. package/dist/plugins/dev-error-page.d.ts +58 -0
  202. package/dist/plugins/dev-error-page.d.ts.map +1 -0
  203. package/dist/plugins/dev-logs.d.ts +1 -1
  204. package/dist/plugins/dev-logs.d.ts.map +1 -1
  205. package/dist/plugins/dev-server.d.ts +1 -1
  206. package/dist/plugins/dev-server.d.ts.map +1 -1
  207. package/dist/plugins/dev-terminal-error.d.ts +28 -0
  208. package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
  209. package/dist/plugins/entries.d.ts +1 -1
  210. package/dist/plugins/entries.d.ts.map +1 -1
  211. package/dist/plugins/fonts.d.ts +17 -73
  212. package/dist/plugins/fonts.d.ts.map +1 -1
  213. package/dist/plugins/mdx.d.ts +1 -1
  214. package/dist/plugins/mdx.d.ts.map +1 -1
  215. package/dist/plugins/routing.d.ts +1 -1
  216. package/dist/plugins/routing.d.ts.map +1 -1
  217. package/dist/plugins/server-bundle.d.ts.map +1 -1
  218. package/dist/plugins/shims.d.ts +6 -5
  219. package/dist/plugins/shims.d.ts.map +1 -1
  220. package/dist/plugins/static-build.d.ts +4 -4
  221. package/dist/plugins/static-build.d.ts.map +1 -1
  222. package/dist/routing/codegen.d.ts +2 -2
  223. package/dist/routing/codegen.d.ts.map +1 -1
  224. package/dist/routing/convention-lint.d.ts +41 -0
  225. package/dist/routing/convention-lint.d.ts.map +1 -0
  226. package/dist/routing/index.d.ts +2 -0
  227. package/dist/routing/index.d.ts.map +1 -1
  228. package/dist/routing/index.js +3 -2
  229. package/dist/routing/scanner.d.ts.map +1 -1
  230. package/dist/routing/segment-classify.d.ts +46 -0
  231. package/dist/routing/segment-classify.d.ts.map +1 -0
  232. package/dist/routing/status-file-lint.d.ts +2 -1
  233. package/dist/routing/status-file-lint.d.ts.map +1 -1
  234. package/dist/routing/types.d.ts +16 -4
  235. package/dist/routing/types.d.ts.map +1 -1
  236. package/dist/rsc-runtime/rsc.d.ts +1 -1
  237. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  238. package/dist/rsc-runtime/ssr.d.ts +12 -0
  239. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  240. package/dist/schema-bridge.d.ts +76 -0
  241. package/dist/schema-bridge.d.ts.map +1 -0
  242. package/dist/search-params/define.d.ts +139 -0
  243. package/dist/search-params/define.d.ts.map +1 -0
  244. package/dist/search-params/index.d.ts +4 -7
  245. package/dist/search-params/index.d.ts.map +1 -1
  246. package/dist/search-params/index.js +32 -441
  247. package/dist/search-params/index.js.map +1 -1
  248. package/dist/search-params/registry.d.ts +2 -2
  249. package/dist/search-params/registry.d.ts.map +1 -1
  250. package/dist/search-params/wrappers.d.ts +53 -0
  251. package/dist/search-params/wrappers.d.ts.map +1 -0
  252. package/dist/segment-params/define.d.ts +78 -0
  253. package/dist/segment-params/define.d.ts.map +1 -0
  254. package/dist/segment-params/index.d.ts +3 -0
  255. package/dist/segment-params/index.d.ts.map +1 -0
  256. package/dist/segment-params/index.js +2 -0
  257. package/dist/server/access-gate.d.ts +4 -0
  258. package/dist/server/access-gate.d.ts.map +1 -1
  259. package/dist/server/action-client.d.ts +41 -6
  260. package/dist/server/action-client.d.ts.map +1 -1
  261. package/dist/server/action-encryption.d.ts +76 -0
  262. package/dist/server/action-encryption.d.ts.map +1 -0
  263. package/dist/server/action-handler.d.ts +7 -0
  264. package/dist/server/action-handler.d.ts.map +1 -1
  265. package/dist/server/actions.d.ts +3 -6
  266. package/dist/server/actions.d.ts.map +1 -1
  267. package/dist/server/als-registry.d.ts +32 -4
  268. package/dist/server/als-registry.d.ts.map +1 -1
  269. package/dist/server/build-manifest.d.ts +2 -2
  270. package/dist/server/build-manifest.d.ts.map +1 -1
  271. package/dist/server/debug.d.ts +1 -1
  272. package/dist/server/default-logger.d.ts +22 -0
  273. package/dist/server/default-logger.d.ts.map +1 -0
  274. package/dist/server/deny-page-resolver.d.ts +52 -0
  275. package/dist/server/deny-page-resolver.d.ts.map +1 -0
  276. package/dist/server/deny-renderer.d.ts.map +1 -1
  277. package/dist/server/dev-holding-server.d.ts +52 -0
  278. package/dist/server/dev-holding-server.d.ts.map +1 -0
  279. package/dist/server/dev-source-map.d.ts +22 -0
  280. package/dist/server/dev-source-map.d.ts.map +1 -0
  281. package/dist/server/dev-warnings.d.ts +1 -21
  282. package/dist/server/dev-warnings.d.ts.map +1 -1
  283. package/dist/server/early-hints.d.ts +13 -5
  284. package/dist/server/early-hints.d.ts.map +1 -1
  285. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  286. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  287. package/dist/server/fallback-error.d.ts +12 -7
  288. package/dist/server/fallback-error.d.ts.map +1 -1
  289. package/dist/server/flight-injection-state.d.ts +66 -0
  290. package/dist/server/flight-injection-state.d.ts.map +1 -0
  291. package/dist/server/flight-scripts.d.ts +42 -0
  292. package/dist/server/flight-scripts.d.ts.map +1 -0
  293. package/dist/server/flush.d.ts.map +1 -1
  294. package/dist/server/form-data.d.ts +29 -0
  295. package/dist/server/form-data.d.ts.map +1 -1
  296. package/dist/server/html-injectors.d.ts +51 -11
  297. package/dist/server/html-injectors.d.ts.map +1 -1
  298. package/dist/server/index.d.ts +5 -43
  299. package/dist/server/index.d.ts.map +1 -1
  300. package/dist/server/index.js +195 -2800
  301. package/dist/server/index.js.map +1 -1
  302. package/dist/server/internal.d.ts +46 -0
  303. package/dist/server/internal.d.ts.map +1 -0
  304. package/dist/server/internal.js +2900 -0
  305. package/dist/server/internal.js.map +1 -0
  306. package/dist/server/logger.d.ts +25 -7
  307. package/dist/server/logger.d.ts.map +1 -1
  308. package/dist/server/middleware-runner.d.ts +19 -4
  309. package/dist/server/middleware-runner.d.ts.map +1 -1
  310. package/dist/server/node-stream-transforms.d.ts +113 -0
  311. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  312. package/dist/server/page-deny-boundary.d.ts +31 -0
  313. package/dist/server/page-deny-boundary.d.ts.map +1 -0
  314. package/dist/server/pipeline-interception.d.ts +1 -1
  315. package/dist/server/pipeline-interception.d.ts.map +1 -1
  316. package/dist/server/pipeline-metadata.d.ts +6 -0
  317. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  318. package/dist/server/pipeline.d.ts +52 -10
  319. package/dist/server/pipeline.d.ts.map +1 -1
  320. package/dist/server/primitives.d.ts +69 -18
  321. package/dist/server/primitives.d.ts.map +1 -1
  322. package/dist/server/render-timeout.d.ts +51 -0
  323. package/dist/server/render-timeout.d.ts.map +1 -0
  324. package/dist/server/request-context.d.ts +112 -43
  325. package/dist/server/request-context.d.ts.map +1 -1
  326. package/dist/server/route-element-builder.d.ts +27 -1
  327. package/dist/server/route-element-builder.d.ts.map +1 -1
  328. package/dist/server/route-handler.d.ts.map +1 -1
  329. package/dist/server/route-matcher.d.ts +16 -2
  330. package/dist/server/route-matcher.d.ts.map +1 -1
  331. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  332. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  333. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  334. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  335. package/dist/server/rsc-entry/helpers.d.ts +48 -5
  336. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  337. package/dist/server/rsc-entry/index.d.ts +20 -3
  338. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  339. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  340. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  341. package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
  342. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  343. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  344. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  345. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  346. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  347. package/dist/server/safe-load.d.ts +46 -0
  348. package/dist/server/safe-load.d.ts.map +1 -0
  349. package/dist/server/sensitive-fields.d.ts +74 -0
  350. package/dist/server/sensitive-fields.d.ts.map +1 -0
  351. package/dist/server/sitemap-generator.d.ts +129 -0
  352. package/dist/server/sitemap-generator.d.ts.map +1 -0
  353. package/dist/server/sitemap-handler.d.ts +22 -0
  354. package/dist/server/sitemap-handler.d.ts.map +1 -0
  355. package/dist/server/slot-resolver.d.ts +1 -1
  356. package/dist/server/slot-resolver.d.ts.map +1 -1
  357. package/dist/server/ssr-entry.d.ts +23 -0
  358. package/dist/server/ssr-entry.d.ts.map +1 -1
  359. package/dist/server/ssr-render.d.ts +39 -21
  360. package/dist/server/ssr-render.d.ts.map +1 -1
  361. package/dist/server/ssr-wrappers.d.ts +50 -0
  362. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  363. package/dist/server/status-code-resolver.d.ts +1 -1
  364. package/dist/server/status-code-resolver.d.ts.map +1 -1
  365. package/dist/server/stream-utils.d.ts +36 -0
  366. package/dist/server/stream-utils.d.ts.map +1 -0
  367. package/dist/server/tracing.d.ts +4 -4
  368. package/dist/server/tracing.d.ts.map +1 -1
  369. package/dist/server/tree-builder.d.ts +22 -19
  370. package/dist/server/tree-builder.d.ts.map +1 -1
  371. package/dist/server/types.d.ts +1 -4
  372. package/dist/server/types.d.ts.map +1 -1
  373. package/dist/server/version-skew.d.ts +61 -0
  374. package/dist/server/version-skew.d.ts.map +1 -0
  375. package/dist/shared/merge-search-params.d.ts +22 -0
  376. package/dist/shared/merge-search-params.d.ts.map +1 -0
  377. package/dist/shims/font-google.d.ts +1 -1
  378. package/dist/shims/font-google.d.ts.map +1 -1
  379. package/dist/shims/font-google.js +42 -0
  380. package/dist/shims/font-google.js.map +1 -0
  381. package/dist/shims/font-local.d.ts +26 -0
  382. package/dist/shims/font-local.d.ts.map +1 -0
  383. package/dist/shims/font-local.js +20 -0
  384. package/dist/shims/font-local.js.map +1 -0
  385. package/dist/shims/headers.d.ts +2 -1
  386. package/dist/shims/headers.d.ts.map +1 -1
  387. package/dist/shims/navigation-client.d.ts +1 -1
  388. package/dist/shims/navigation-client.d.ts.map +1 -1
  389. package/dist/shims/navigation.d.ts +3 -2
  390. package/dist/shims/navigation.d.ts.map +1 -1
  391. package/dist/utils/directive-parser.d.ts +5 -2
  392. package/dist/utils/directive-parser.d.ts.map +1 -1
  393. package/dist/utils/state-machine.d.ts +80 -0
  394. package/dist/utils/state-machine.d.ts.map +1 -0
  395. package/package.json +51 -16
  396. package/src/adapters/cloudflare-dev.ts +177 -0
  397. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  398. package/src/adapters/cloudflare.ts +342 -28
  399. package/src/adapters/compress-module.ts +24 -4
  400. package/src/adapters/nitro.ts +52 -8
  401. package/src/adapters/wrangler.d.ts +7 -0
  402. package/src/cache/cache-api.ts +38 -0
  403. package/src/cache/handler-store.ts +68 -0
  404. package/src/cache/index.ts +81 -18
  405. package/src/cache/singleflight.ts +62 -4
  406. package/src/cache/sizeof.ts +31 -0
  407. package/src/cache/timber-cache.ts +24 -20
  408. package/src/cli.ts +16 -6
  409. package/src/client/browser-dev.ts +128 -1
  410. package/src/client/browser-entry/action-dispatch.ts +116 -0
  411. package/src/client/browser-entry/hmr.ts +81 -0
  412. package/src/client/browser-entry/hydrate.ts +145 -0
  413. package/src/client/browser-entry/index.ts +143 -0
  414. package/src/client/browser-entry/post-hydration.ts +119 -0
  415. package/src/client/browser-entry/router-init.ts +193 -0
  416. package/src/client/browser-entry/rsc-stream.ts +157 -0
  417. package/src/client/browser-entry/scroll.ts +27 -0
  418. package/src/client/error-boundary.tsx +48 -16
  419. package/src/client/error-reconstituter.tsx +65 -0
  420. package/src/client/form.tsx +14 -7
  421. package/src/client/history.ts +26 -4
  422. package/src/client/index.ts +65 -38
  423. package/src/client/internal.ts +57 -0
  424. package/src/client/link-pending-store.ts +111 -0
  425. package/src/client/link.tsx +342 -113
  426. package/src/client/nav-link-store.ts +47 -0
  427. package/src/client/navigation-api-types.ts +112 -0
  428. package/src/client/navigation-api.ts +332 -0
  429. package/src/client/navigation-context.ts +31 -6
  430. package/src/client/navigation-root.tsx +342 -0
  431. package/src/client/nuqs-adapter.tsx +16 -3
  432. package/src/client/router-ref.ts +1 -1
  433. package/src/client/router.ts +299 -72
  434. package/src/client/rsc-fetch.ts +97 -8
  435. package/src/client/segment-cache.ts +1 -1
  436. package/src/client/segment-outlet.tsx +86 -0
  437. package/src/client/ssr-data.ts +13 -5
  438. package/src/client/stale-reload.ts +72 -3
  439. package/src/client/top-loader.tsx +18 -6
  440. package/src/client/use-link-status.ts +7 -7
  441. package/src/client/use-params.ts +7 -5
  442. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  443. package/src/client/use-query-states.ts +9 -3
  444. package/src/client/use-router.ts +1 -1
  445. package/src/codec.ts +49 -0
  446. package/src/config-types.ts +264 -0
  447. package/src/config-validation.ts +303 -0
  448. package/src/content/index.ts +5 -13
  449. package/src/cookies/define-cookie.ts +78 -25
  450. package/src/cookies/index.ts +8 -0
  451. package/src/fonts/bundle.ts +142 -0
  452. package/src/fonts/css.ts +2 -1
  453. package/src/fonts/dev-middleware.ts +74 -0
  454. package/src/fonts/pipeline.ts +275 -0
  455. package/src/fonts/transform.ts +353 -0
  456. package/src/fonts/types.ts +50 -1
  457. package/src/fonts/virtual-modules.ts +159 -0
  458. package/src/index.ts +314 -355
  459. package/src/plugin-context.ts +240 -0
  460. package/src/plugins/adapter-build.ts +9 -3
  461. package/src/plugins/build-manifest.ts +13 -2
  462. package/src/plugins/build-report.ts +3 -3
  463. package/src/plugins/client-chunks.ts +65 -0
  464. package/src/plugins/content.ts +1 -1
  465. package/src/plugins/dev-404-page.ts +418 -0
  466. package/src/plugins/dev-browser-logs.ts +288 -0
  467. package/src/plugins/dev-error-overlay.ts +286 -42
  468. package/src/plugins/dev-error-page.ts +536 -0
  469. package/src/plugins/dev-logs.ts +1 -1
  470. package/src/plugins/dev-server.ts +146 -19
  471. package/src/plugins/dev-terminal-error.ts +217 -0
  472. package/src/plugins/entries.ts +111 -10
  473. package/src/plugins/fonts.ts +133 -638
  474. package/src/plugins/mdx.ts +1 -1
  475. package/src/plugins/routing.ts +213 -31
  476. package/src/plugins/server-action-exports.ts +1 -1
  477. package/src/plugins/server-bundle.ts +32 -1
  478. package/src/plugins/shims.ts +136 -35
  479. package/src/plugins/static-build.ts +17 -11
  480. package/src/routing/codegen.ts +273 -105
  481. package/src/routing/convention-lint.ts +356 -0
  482. package/src/routing/index.ts +2 -0
  483. package/src/routing/scanner.ts +93 -23
  484. package/src/routing/segment-classify.ts +89 -0
  485. package/src/routing/status-file-lint.ts +3 -2
  486. package/src/routing/types.ts +17 -4
  487. package/src/rsc-runtime/rsc.ts +2 -0
  488. package/src/rsc-runtime/ssr.ts +50 -0
  489. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  490. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  491. package/src/search-params/define.ts +482 -0
  492. package/src/search-params/index.ts +14 -20
  493. package/src/search-params/registry.ts +2 -2
  494. package/src/search-params/wrappers.ts +85 -0
  495. package/src/segment-params/define.ts +279 -0
  496. package/src/segment-params/index.ts +9 -0
  497. package/src/server/access-gate.tsx +70 -29
  498. package/src/server/action-client.ts +88 -15
  499. package/src/server/action-encryption.ts +144 -0
  500. package/src/server/action-handler.ts +53 -6
  501. package/src/server/actions.ts +10 -9
  502. package/src/server/als-registry.ts +34 -6
  503. package/src/server/build-manifest.ts +10 -4
  504. package/src/server/compress.ts +25 -7
  505. package/src/server/debug.ts +1 -1
  506. package/src/server/default-logger.ts +99 -0
  507. package/src/server/deny-page-resolver.ts +154 -0
  508. package/src/server/deny-renderer.ts +24 -38
  509. package/src/server/dev-holding-server.ts +185 -0
  510. package/src/server/dev-source-map.ts +31 -0
  511. package/src/server/dev-warnings.ts +4 -49
  512. package/src/server/early-hints.ts +36 -15
  513. package/src/server/error-boundary-wrapper.ts +74 -22
  514. package/src/server/fallback-error.ts +74 -102
  515. package/src/server/flight-injection-state.ts +113 -0
  516. package/src/server/flight-scripts.ts +62 -0
  517. package/src/server/flush.ts +2 -1
  518. package/src/server/form-data.ts +76 -0
  519. package/src/server/html-injectors.ts +280 -120
  520. package/src/server/index.ts +25 -177
  521. package/src/server/internal.ts +169 -0
  522. package/src/server/logger.ts +44 -36
  523. package/src/server/middleware-runner.ts +31 -4
  524. package/src/server/node-stream-transforms.ts +509 -0
  525. package/src/server/page-deny-boundary.tsx +56 -0
  526. package/src/server/pipeline-interception.ts +17 -16
  527. package/src/server/pipeline-metadata.ts +13 -0
  528. package/src/server/pipeline.ts +261 -66
  529. package/src/server/primitives.ts +111 -28
  530. package/src/server/render-timeout.ts +108 -0
  531. package/src/server/request-context.ts +293 -132
  532. package/src/server/route-element-builder.ts +283 -191
  533. package/src/server/route-handler.ts +24 -4
  534. package/src/server/route-matcher.ts +31 -20
  535. package/src/server/rsc-entry/api-handler.ts +15 -16
  536. package/src/server/rsc-entry/error-renderer.ts +305 -89
  537. package/src/server/rsc-entry/helpers.ts +134 -5
  538. package/src/server/rsc-entry/index.ts +304 -111
  539. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  540. package/src/server/rsc-entry/rsc-stream.ts +81 -13
  541. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  542. package/src/server/rsc-entry/ssr-renderer.ts +171 -38
  543. package/src/server/safe-load.ts +60 -0
  544. package/src/server/sensitive-fields.ts +230 -0
  545. package/src/server/sitemap-generator.ts +338 -0
  546. package/src/server/sitemap-handler.ts +126 -0
  547. package/src/server/slot-resolver.ts +244 -229
  548. package/src/server/ssr-entry.ts +215 -32
  549. package/src/server/ssr-render.ts +289 -67
  550. package/src/server/ssr-wrappers.tsx +139 -0
  551. package/src/server/status-code-resolver.ts +1 -1
  552. package/src/server/stream-utils.ts +213 -0
  553. package/src/server/tracing.ts +20 -9
  554. package/src/server/tree-builder.ts +92 -58
  555. package/src/server/types.ts +3 -6
  556. package/src/server/version-skew.ts +104 -0
  557. package/src/shared/merge-search-params.ts +55 -0
  558. package/src/shims/font-google.ts +1 -1
  559. package/src/shims/font-local.ts +34 -0
  560. package/src/shims/headers.ts +5 -1
  561. package/src/shims/navigation-client.ts +1 -1
  562. package/src/shims/navigation.ts +7 -2
  563. package/src/utils/directive-parser.ts +5 -2
  564. package/src/utils/state-machine.ts +111 -0
  565. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  566. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  567. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  568. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  569. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  570. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  571. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  572. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  573. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  574. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  575. package/dist/cache/register-cached-function.d.ts +0 -17
  576. package/dist/cache/register-cached-function.d.ts.map +0 -1
  577. package/dist/client/browser-entry.d.ts +0 -21
  578. package/dist/client/browser-entry.d.ts.map +0 -1
  579. package/dist/client/link-status-provider.d.ts +0 -11
  580. package/dist/client/link-status-provider.d.ts.map +0 -1
  581. package/dist/client/transition-root.d.ts.map +0 -1
  582. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  583. package/dist/cookies/index.js.map +0 -1
  584. package/dist/plugins/cache-transform.d.ts +0 -36
  585. package/dist/plugins/cache-transform.d.ts.map +0 -1
  586. package/dist/plugins/dynamic-transform.d.ts +0 -72
  587. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  588. package/dist/search-params/analyze.d.ts +0 -54
  589. package/dist/search-params/analyze.d.ts.map +0 -1
  590. package/dist/search-params/builtin-codecs.d.ts +0 -105
  591. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  592. package/dist/search-params/codecs.d.ts +0 -53
  593. package/dist/search-params/codecs.d.ts.map +0 -1
  594. package/dist/search-params/create.d.ts +0 -106
  595. package/dist/search-params/create.d.ts.map +0 -1
  596. package/dist/server/prerender.d.ts +0 -77
  597. package/dist/server/prerender.d.ts.map +0 -1
  598. package/dist/server/response-cache.d.ts +0 -54
  599. package/dist/server/response-cache.d.ts.map +0 -1
  600. package/src/cache/register-cached-function.ts +0 -103
  601. package/src/client/browser-entry.ts +0 -678
  602. package/src/client/link-status-provider.tsx +0 -30
  603. package/src/client/transition-root.tsx +0 -166
  604. package/src/plugins/cache-transform.ts +0 -199
  605. package/src/plugins/dynamic-transform.ts +0 -161
  606. package/src/search-params/analyze.ts +0 -192
  607. package/src/search-params/builtin-codecs.ts +0 -228
  608. package/src/search-params/create.ts +0 -321
  609. package/src/server/prerender.ts +0 -139
  610. package/src/server/response-cache.ts +0 -410
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@timber-js/app",
3
- "version": "0.2.0-alpha.9",
4
- "description": "Vite-native React framework for Cloudflare Workers — correct HTTP semantics, real status codes, pages that work without JavaScript",
3
+ "version": "0.2.0-alpha.90",
4
+ "description": "Vite-native React framework built for Servers and Serverless Platforms — correct HTTP semantics, real status codes, pages that work without JavaScript",
5
5
  "keywords": [
6
6
  "cloudflare-workers",
7
7
  "framework",
@@ -31,7 +31,18 @@
31
31
  ],
32
32
  "type": "module",
33
33
  "imports": {
34
- "#/*": "./src/*"
34
+ "#server-internal": {
35
+ "types": "./dist/server/internal.d.ts",
36
+ "default": "./dist/server/internal.js"
37
+ },
38
+ "#client-internal": {
39
+ "types": "./dist/client/internal.d.ts",
40
+ "default": "./dist/client/internal.js"
41
+ },
42
+ "#routing": {
43
+ "types": "./dist/routing/index.d.ts",
44
+ "default": "./dist/routing/index.js"
45
+ }
35
46
  },
36
47
  "exports": {
37
48
  ".": {
@@ -46,13 +57,17 @@
46
57
  "types": "./dist/client/index.d.ts",
47
58
  "import": "./dist/client/index.js"
48
59
  },
60
+ "./client/internal": {
61
+ "types": "./dist/client/internal.d.ts",
62
+ "import": "./dist/client/internal.js"
63
+ },
49
64
  "./cache": {
50
65
  "types": "./dist/cache/index.d.ts",
51
66
  "import": "./dist/cache/index.js"
52
67
  },
53
- "./content": {
54
- "types": "./dist/content/index.d.ts",
55
- "import": "./dist/content/index.js"
68
+ "./codec": {
69
+ "types": "./dist/codec.d.ts",
70
+ "import": "./dist/codec.js"
56
71
  },
57
72
  "./cookies": {
58
73
  "types": "./dist/cookies/index.d.ts",
@@ -62,18 +77,34 @@
62
77
  "types": "./dist/search-params/index.d.ts",
63
78
  "import": "./dist/search-params/index.js"
64
79
  },
65
- "./routing": {
66
- "types": "./dist/routing/index.d.ts",
67
- "import": "./dist/routing/index.js"
80
+ "./segment-params": {
81
+ "types": "./dist/segment-params/index.d.ts",
82
+ "import": "./dist/segment-params/index.js"
68
83
  },
69
84
  "./adapters/cloudflare": {
70
85
  "types": "./dist/adapters/cloudflare.d.ts",
71
86
  "import": "./dist/adapters/cloudflare.js"
72
87
  },
88
+ "./adapters/cloudflare/cache": {
89
+ "types": "./dist/adapters/cloudflare-kv-cache.d.ts",
90
+ "import": "./dist/adapters/cloudflare-kv-cache.js"
91
+ },
92
+ "./adapters/cloudflare/dev": {
93
+ "types": "./dist/adapters/cloudflare-dev.d.ts",
94
+ "import": "./dist/adapters/cloudflare-dev.js"
95
+ },
73
96
  "./adapters/nitro": {
74
97
  "types": "./dist/adapters/nitro.d.ts",
75
98
  "import": "./dist/adapters/nitro.js"
76
99
  },
100
+ "./fonts/google": {
101
+ "types": "./dist/shims/font-google.d.ts",
102
+ "import": "./dist/shims/font-google.js"
103
+ },
104
+ "./fonts/local": {
105
+ "types": "./dist/shims/font-local.d.ts",
106
+ "import": "./dist/shims/font-local.js"
107
+ },
77
108
  "./package.json": "./package.json"
78
109
  },
79
110
  "publishConfig": {
@@ -85,9 +116,9 @@
85
116
  "prepublishOnly": "pnpm run build"
86
117
  },
87
118
  "dependencies": {
88
- "@opentelemetry/api": "^1.9.0",
89
- "@opentelemetry/context-async-hooks": "^2.6.0",
90
- "@opentelemetry/sdk-trace-base": "^2.6.0",
119
+ "@opentelemetry/api": "^1.9.1",
120
+ "@opentelemetry/context-async-hooks": "^2.6.1",
121
+ "@opentelemetry/sdk-trace-base": "^2.6.1",
91
122
  "nitro": "3.0.260311-beta"
92
123
  },
93
124
  "peerDependencies": {
@@ -98,9 +129,10 @@
98
129
  "@vitejs/plugin-react": "^6.0.0",
99
130
  "@vitejs/plugin-rsc": ">=0.5.21",
100
131
  "nuqs": "^2.0.0",
101
- "react": "^19.2.4",
102
- "react-dom": "^19.2.4",
103
- "vite": "^8.0.1",
132
+ "react": "19.3.0-canary-ed69815c-20260323",
133
+ "react-dom": "19.3.0-canary-ed69815c-20260323",
134
+ "vite": "^8.0.3",
135
+ "wrangler": "^4.0.0",
104
136
  "zod": "^3.22.0 || ^4.0.0"
105
137
  },
106
138
  "peerDependenciesMeta": {
@@ -116,11 +148,14 @@
116
148
  "@mdx-js/rollup": {
117
149
  "optional": true
118
150
  },
151
+ "wrangler": {
152
+ "optional": true
153
+ },
119
154
  "zod": {
120
155
  "optional": true
121
156
  }
122
157
  },
123
158
  "engines": {
124
- "node": ">=20.0.0"
159
+ "node": ">=22.12.0"
125
160
  }
126
161
  }
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Cloudflare dev-mode bindings via wrangler's getPlatformProxy().
3
+ *
4
+ * This Vite plugin starts a local workerd process (via Miniflare) that
5
+ * emulates Cloudflare bindings (KV, D1, R2, Queues, Durable Objects, etc.)
6
+ * during development. The proxy env is injected into the request ALS so
7
+ * `getCloudflareBindings()` works identically in dev and production.
8
+ *
9
+ * Design doc: design/35-cloudflare-primitives.md §"Dev Experience"
10
+ *
11
+ * Usage:
12
+ * ```ts
13
+ * // vite.config.ts
14
+ * import { timber } from '@timber-js/app'
15
+ * import { cloudflare } from '@timber-js/app/adapters/cloudflare'
16
+ * import { cloudflareDevBindings } from '@timber-js/app/adapters/cloudflare/dev'
17
+ *
18
+ * export default defineConfig({
19
+ * plugins: [
20
+ * timber({ adapter: cloudflare() }),
21
+ * cloudflareDevBindings(),
22
+ * ],
23
+ * })
24
+ * ```
25
+ *
26
+ * Requires `wrangler` as a dev dependency. Install it:
27
+ * ```bash
28
+ * pnpm add -D wrangler
29
+ * ```
30
+ */
31
+
32
+ import type { Plugin, ViteDevServer } from 'vite';
33
+ import { runWithBindings } from './cloudflare.js';
34
+
35
+ /**
36
+ * Dynamically import wrangler. Extracted as a named export so tests
37
+ * can mock it without needing wrangler installed.
38
+ * @internal
39
+ */
40
+ export async function loadWrangler(): Promise<{ getPlatformProxy: (opts: any) => Promise<any> }> {
41
+ try {
42
+ return await import('wrangler');
43
+ } catch {
44
+ throw new Error(
45
+ '[timber] Could not import wrangler. ' +
46
+ 'cloudflareDevBindings() requires wrangler as a dev dependency.\n' +
47
+ 'Install it: pnpm add -D wrangler'
48
+ );
49
+ }
50
+ }
51
+
52
+ // ─── Contract ─────────────────────────────────────────────────────────────
53
+ //
54
+ // The dev request wrapper is stored on the ViteDevServer instance using a
55
+ // well-known Symbol. This allows cross-plugin communication without import
56
+ // dependencies — the dev-server plugin checks for this Symbol per-request
57
+ // and wraps the handler call when present.
58
+ //
59
+ // The wrapper type is: <T>(fn: () => T) => T
60
+ // It runs `fn` inside the Cloudflare bindings ALS so getCloudflareBindings()
61
+ // works throughout the request lifecycle.
62
+
63
+ /**
64
+ * Symbol key used to store the dev request wrapper on ViteDevServer.
65
+ *
66
+ * @internal Exported for testing. The dev-server plugin uses
67
+ * `Symbol.for('timber:dev-request-wrapper')` directly to avoid
68
+ * importing from this module.
69
+ */
70
+ export const DEV_REQUEST_WRAPPER_KEY = Symbol.for('timber:dev-request-wrapper');
71
+
72
+ /** Options for the Cloudflare dev bindings plugin. */
73
+ export interface CloudflareDevBindingsOptions {
74
+ /**
75
+ * Path to the wrangler configuration file.
76
+ * @default Auto-detected by wrangler (wrangler.jsonc, wrangler.json, wrangler.toml)
77
+ */
78
+ configPath?: string;
79
+
80
+ /**
81
+ * Whether to persist binding data (KV, D1, R2) between dev server restarts.
82
+ *
83
+ * - `true` — persist in wrangler's default location (`.wrangler/state/`)
84
+ * - `{ path: string }` — persist in a custom directory
85
+ * - `false` — start fresh on every restart
86
+ *
87
+ * @default true
88
+ */
89
+ persist?: boolean | { path: string };
90
+
91
+ /**
92
+ * Wrangler environment to use (for multi-environment configs).
93
+ * Maps to `[env.<name>]` sections in wrangler.toml / wrangler.jsonc.
94
+ */
95
+ environment?: string;
96
+
97
+ /**
98
+ * @internal Override the wrangler loader for testing.
99
+ * Not part of the public API — may change without notice.
100
+ */
101
+ _loadWrangler?: () => Promise<{ getPlatformProxy: (opts: any) => Promise<any> }>;
102
+ }
103
+
104
+ /**
105
+ * Vite plugin that provides Cloudflare bindings in dev mode via
106
+ * wrangler's `getPlatformProxy()`.
107
+ *
108
+ * Starts a local workerd process on dev server startup and injects
109
+ * the proxy env into the per-request ALS. This makes
110
+ * `getCloudflareBindings()` return real (emulated) bindings during
111
+ * development — KV, D1, R2, Queues, Durable Objects, and all other
112
+ * bindings declared in wrangler.jsonc.
113
+ *
114
+ * The proxy is automatically disposed when the dev server closes.
115
+ *
116
+ * **Requirements:**
117
+ * - `wrangler` installed as a dev dependency
118
+ * - A `wrangler.jsonc` (or `wrangler.toml`) with binding declarations
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * import { cloudflareDevBindings } from '@timber-js/app/adapters/cloudflare/dev'
123
+ *
124
+ * export default defineConfig({
125
+ * plugins: [
126
+ * timber({ adapter: cloudflare() }),
127
+ * cloudflareDevBindings(),
128
+ * ],
129
+ * })
130
+ * ```
131
+ */
132
+ export function cloudflareDevBindings(options: CloudflareDevBindingsOptions = {}): Plugin {
133
+ return {
134
+ name: 'timber-cloudflare-dev-bindings',
135
+
136
+ // Dev mode only — never active during production builds.
137
+ // See design/35-cloudflare-primitives.md §"Security Considerations":
138
+ // "Dev bindings are dev-only. apply: 'serve' ensures it never runs
139
+ // in production builds."
140
+ apply: 'serve',
141
+
142
+ async configureServer(server: ViteDevServer) {
143
+ // Dynamic import — wrangler is an optional peer dependency.
144
+ // Users must install it themselves: `pnpm add -D wrangler`
145
+ const { getPlatformProxy } = await (options._loadWrangler ?? loadWrangler)();
146
+
147
+ // Build getPlatformProxy options from our public API.
148
+ const proxyOptions: Record<string, unknown> = {
149
+ persist: options.persist ?? true,
150
+ };
151
+ if (options.configPath) {
152
+ proxyOptions.configPath = options.configPath;
153
+ }
154
+ if (options.environment) {
155
+ proxyOptions.environment = options.environment;
156
+ }
157
+
158
+ const proxy = await getPlatformProxy(proxyOptions);
159
+
160
+ // Store a request wrapper on the server instance. The dev-server
161
+ // plugin checks for this Symbol per-request and wraps the RSC
162
+ // handler call so getCloudflareBindings() works throughout the
163
+ // request lifecycle (server components, middleware, server actions).
164
+ (server as any)[DEV_REQUEST_WRAPPER_KEY] = <T>(fn: () => T): T => {
165
+ return runWithBindings(proxy.env as Record<string, unknown>, fn);
166
+ };
167
+
168
+ // Dispose the proxy when the dev server closes. This shuts down
169
+ // the local workerd process started by getPlatformProxy().
170
+ server.httpServer?.on('close', () => {
171
+ proxy.dispose().catch(() => {
172
+ // Disposal errors are non-fatal — the process is shutting down.
173
+ });
174
+ });
175
+ },
176
+ };
177
+ }
@@ -0,0 +1,142 @@
1
+ import type { CacheHandler } from '../cache/index';
2
+ import { getCloudflareBindings } from './cloudflare';
3
+
4
+ /**
5
+ * Cloudflare Workers KV interface — the subset of KVNamespace we depend on.
6
+ * Users don't need to import this; the handler resolves the binding internally
7
+ * via `getCloudflareBindings()`.
8
+ */
9
+ export interface CloudflareKVNamespace {
10
+ get(key: string, options: { type: 'json' }): Promise<unknown>;
11
+ get(key: string, options?: { type?: string }): Promise<string | null>;
12
+ put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void>;
13
+ delete(key: string): Promise<void>;
14
+ }
15
+
16
+ interface KVCacheEntry {
17
+ value: unknown;
18
+ tags: string[];
19
+ expiresAt: number;
20
+ }
21
+
22
+ /**
23
+ * Cloudflare Workers KV–backed CacheHandler.
24
+ *
25
+ * Uses tag index keys for tag-based invalidation (KV has no secondary indexes).
26
+ * Stores entries with 2× TTL so stale entries survive for `staleWhileRevalidate`
27
+ * reads. The logical staleness is determined by the `expiresAt` timestamp inside
28
+ * the entry payload.
29
+ *
30
+ * **Consistency:** KV is eventually consistent (~60s propagation). TTL is the
31
+ * primary expiry mechanism. Tag invalidation is best-effort — do not rely on it
32
+ * for security-critical cache purging (use short TTLs instead).
33
+ *
34
+ * ```ts
35
+ * // timber.config.ts
36
+ * import { CloudflareKVCacheHandler } from '@timber-js/app/adapters/cloudflare/cache';
37
+ *
38
+ * export default {
39
+ * cacheHandler: new CloudflareKVCacheHandler({ bindingName: 'TIMBER_CACHE' }),
40
+ * };
41
+ * ```
42
+ */
43
+ export class CloudflareKVCacheHandler implements CacheHandler {
44
+ private bindingName: string;
45
+ private prefix: string;
46
+
47
+ constructor(options: { bindingName: string; prefix?: string }) {
48
+ this.bindingName = options.bindingName;
49
+ this.prefix = options.prefix ?? 'tc:';
50
+ }
51
+
52
+ /** Resolve the KV binding from the current request's Cloudflare env. */
53
+ private getKV(): CloudflareKVNamespace {
54
+ const env = getCloudflareBindings<Record<string, CloudflareKVNamespace>>();
55
+ const kv = env[this.bindingName];
56
+ if (!kv) {
57
+ throw new Error(
58
+ `CloudflareKVCacheHandler: binding "${this.bindingName}" not found. ` +
59
+ 'Check your wrangler.jsonc kv_namespaces configuration.'
60
+ );
61
+ }
62
+ return kv;
63
+ }
64
+
65
+ private dataKey(key: string): string {
66
+ return `${this.prefix}d:${key}`;
67
+ }
68
+
69
+ private tagKey(tag: string): string {
70
+ return `${this.prefix}t:${tag}`;
71
+ }
72
+
73
+ async get(key: string): Promise<{ value: unknown; stale: boolean } | null> {
74
+ const kv = this.getKV();
75
+ const raw = await kv.get(this.dataKey(key), { type: 'json' });
76
+ if (!raw) return null;
77
+
78
+ const entry = raw as KVCacheEntry;
79
+ const stale = Date.now() > entry.expiresAt;
80
+ return { value: entry.value, stale };
81
+ }
82
+
83
+ async set(key: string, value: unknown, opts: { ttl: number; tags: string[] }): Promise<void> {
84
+ const kv = this.getKV();
85
+ const entry: KVCacheEntry = {
86
+ value,
87
+ tags: opts.tags,
88
+ expiresAt: Date.now() + opts.ttl * 1000,
89
+ };
90
+
91
+ // KV expirationTtl minimum is 60s. Use 2× TTL (min 60s) so stale entries
92
+ // survive for staleWhileRevalidate background refetches.
93
+ const kvTtl = Math.max(opts.ttl * 2, 60);
94
+ await kv.put(this.dataKey(key), JSON.stringify(entry), { expirationTtl: kvTtl });
95
+
96
+ // Update tag indexes (best-effort, eventually consistent).
97
+ // Tag indexes have no TTL — cleaned up on invalidation.
98
+ await Promise.all(
99
+ opts.tags.map(async (tag) => {
100
+ const existing = (await kv.get(this.tagKey(tag), { type: 'json' })) as string[] | null;
101
+ const keys: string[] = Array.isArray(existing) ? existing : [];
102
+ if (!keys.includes(key)) {
103
+ keys.push(key);
104
+ await kv.put(this.tagKey(tag), JSON.stringify(keys));
105
+ }
106
+ })
107
+ );
108
+ }
109
+
110
+ async invalidate(opts: { key?: string; tag?: string }): Promise<void> {
111
+ const kv = this.getKV();
112
+
113
+ if (opts.key) {
114
+ // Read entry to find its tags, then clean up tag indexes
115
+ const raw = (await kv.get(this.dataKey(opts.key), { type: 'json' })) as KVCacheEntry | null;
116
+ if (raw) {
117
+ await Promise.all(
118
+ raw.tags.map(async (tag) => {
119
+ const existing = (await kv.get(this.tagKey(tag), { type: 'json' })) as string[] | null;
120
+ if (Array.isArray(existing)) {
121
+ const filtered = existing.filter((k: string) => k !== opts.key);
122
+ if (filtered.length > 0) {
123
+ await kv.put(this.tagKey(tag), JSON.stringify(filtered));
124
+ } else {
125
+ await kv.delete(this.tagKey(tag));
126
+ }
127
+ }
128
+ })
129
+ );
130
+ }
131
+ await kv.delete(this.dataKey(opts.key));
132
+ }
133
+
134
+ if (opts.tag) {
135
+ const existing = (await kv.get(this.tagKey(opts.tag), { type: 'json' })) as string[] | null;
136
+ if (Array.isArray(existing)) {
137
+ await Promise.all(existing.map((key: string) => kv.delete(this.dataKey(key))));
138
+ }
139
+ await kv.delete(this.tagKey(opts.tag));
140
+ }
141
+ }
142
+ }