@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.161

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 (998) hide show
  1. package/LICENSE +8 -0
  2. package/agent-skill.md +344 -0
  3. package/dist/_chunks/actions-cjklt63G.js +317 -0
  4. package/dist/_chunks/actions-cjklt63G.js.map +1 -0
  5. package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
  6. package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
  7. package/dist/_chunks/cache-api-CzYUlgXA.js +1125 -0
  8. package/dist/_chunks/cache-api-CzYUlgXA.js.map +1 -0
  9. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
  10. package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
  11. package/dist/_chunks/cli-schema-sync-NfLbLnDw.js +638 -0
  12. package/dist/_chunks/cli-schema-sync-NfLbLnDw.js.map +1 -0
  13. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  14. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  15. package/dist/_chunks/define-Bssfp6ot.js +82 -0
  16. package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
  17. package/dist/_chunks/define-CFmvb4Bt.js +203 -0
  18. package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
  19. package/dist/_chunks/dist-BA3u1z3W.js +423 -0
  20. package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
  21. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  22. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  23. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  24. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  25. package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
  26. package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
  27. package/dist/_chunks/logger-B_O6-mdJ.js +1485 -0
  28. package/dist/_chunks/logger-B_O6-mdJ.js.map +1 -0
  29. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  30. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  31. package/dist/_chunks/plugin-context-DeAxFRMq.js +280 -0
  32. package/dist/_chunks/plugin-context-DeAxFRMq.js.map +1 -0
  33. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  34. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  35. package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
  36. package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
  37. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  38. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  39. package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
  40. package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
  41. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  42. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  43. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  44. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  45. package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
  46. package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
  47. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  48. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  49. package/dist/_chunks/tree-match-D2l830j2.js +102 -0
  50. package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
  51. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  52. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  53. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  54. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  55. package/dist/_chunks/walkers-9mz9T7mb.js +988 -0
  56. package/dist/_chunks/walkers-9mz9T7mb.js.map +1 -0
  57. package/dist/adapters/build-output-helper.d.ts +29 -0
  58. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  59. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  60. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  61. package/dist/adapters/cloudflare-dev.js +73 -0
  62. package/dist/adapters/cloudflare-dev.js.map +1 -0
  63. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  64. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  65. package/dist/adapters/cloudflare-kv-cache.js +117 -0
  66. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  67. package/dist/adapters/cloudflare.d.ts +177 -20
  68. package/dist/adapters/cloudflare.d.ts.map +1 -1
  69. package/dist/adapters/cloudflare.js +337 -64
  70. package/dist/adapters/cloudflare.js.map +1 -1
  71. package/dist/adapters/compress-module.d.ts +5 -4
  72. package/dist/adapters/compress-module.d.ts.map +1 -1
  73. package/dist/adapters/nitro.d.ts +1 -3
  74. package/dist/adapters/nitro.d.ts.map +1 -1
  75. package/dist/adapters/nitro.js +144 -152
  76. package/dist/adapters/nitro.js.map +1 -1
  77. package/dist/adapters/shared.d.ts +6 -0
  78. package/dist/adapters/shared.d.ts.map +1 -0
  79. package/dist/adapters/types.d.ts +0 -6
  80. package/dist/adapters/types.d.ts.map +1 -1
  81. package/dist/cache/cache-api.d.ts +26 -0
  82. package/dist/cache/cache-api.d.ts.map +1 -0
  83. package/dist/cache/handler-store.d.ts +33 -0
  84. package/dist/cache/handler-store.d.ts.map +1 -0
  85. package/dist/cache/index.d.ts +27 -7
  86. package/dist/cache/index.d.ts.map +1 -1
  87. package/dist/cache/index.js +3 -326
  88. package/dist/cache/invalidation-epoch.d.ts +43 -0
  89. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  90. package/dist/cache/redis-handler.d.ts +97 -8
  91. package/dist/cache/redis-handler.d.ts.map +1 -1
  92. package/dist/cache/singleflight.d.ts +19 -2
  93. package/dist/cache/singleflight.d.ts.map +1 -1
  94. package/dist/cache/sizeof.d.ts +22 -0
  95. package/dist/cache/sizeof.d.ts.map +1 -0
  96. package/dist/cache/stable-stringify.d.ts +9 -0
  97. package/dist/cache/stable-stringify.d.ts.map +1 -1
  98. package/dist/cache/store.d.ts +53 -0
  99. package/dist/cache/store.d.ts.map +1 -0
  100. package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
  101. package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
  102. package/dist/cache/stores/cloudflare-kv.js +29 -0
  103. package/dist/cache/stores/cloudflare-kv.js.map +1 -0
  104. package/dist/cache/stores/memory.d.ts +42 -0
  105. package/dist/cache/stores/memory.d.ts.map +1 -0
  106. package/dist/cache/stores/memory.js +90 -0
  107. package/dist/cache/stores/memory.js.map +1 -0
  108. package/dist/cache/stores/redis.d.ts +69 -0
  109. package/dist/cache/stores/redis.d.ts.map +1 -0
  110. package/dist/cache/stores/redis.js +35 -0
  111. package/dist/cache/stores/redis.js.map +1 -0
  112. package/dist/cache/stores/vercel.d.ts +36 -0
  113. package/dist/cache/stores/vercel.d.ts.map +1 -0
  114. package/dist/cache/stores/vercel.js +33 -0
  115. package/dist/cache/stores/vercel.js.map +1 -0
  116. package/dist/cache/tag-aware-handler.d.ts +51 -0
  117. package/dist/cache/tag-aware-handler.d.ts.map +1 -0
  118. package/dist/cache/timber-cache.d.ts +20 -10
  119. package/dist/cache/timber-cache.d.ts.map +1 -1
  120. package/dist/cdn/cloudflare-purge.d.ts +23 -0
  121. package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
  122. package/dist/cdn/fastly-purge.d.ts +25 -0
  123. package/dist/cdn/fastly-purge.d.ts.map +1 -0
  124. package/dist/cdn/headers.d.ts +97 -0
  125. package/dist/cdn/headers.d.ts.map +1 -0
  126. package/dist/cdn/index.d.ts +5 -0
  127. package/dist/cdn/index.d.ts.map +1 -0
  128. package/dist/cdn/purge-store.d.ts +23 -0
  129. package/dist/cdn/purge-store.d.ts.map +1 -0
  130. package/dist/cdn/workers-cache-purge.d.ts +16 -0
  131. package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
  132. package/dist/cli-schema-sync.d.ts +59 -0
  133. package/dist/cli-schema-sync.d.ts.map +1 -0
  134. package/dist/cli.d.ts +34 -2
  135. package/dist/cli.d.ts.map +1 -1
  136. package/dist/cli.js +107 -33
  137. package/dist/cli.js.map +1 -1
  138. package/dist/client/browser-dev.d.ts +37 -1
  139. package/dist/client/browser-dev.d.ts.map +1 -1
  140. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  141. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  142. package/dist/client/browser-entry/hmr.d.ts +21 -0
  143. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  144. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  145. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  146. package/dist/client/browser-entry/index.d.ts +29 -0
  147. package/dist/client/browser-entry/index.d.ts.map +1 -0
  148. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  149. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  150. package/dist/client/browser-entry/router-init.d.ts +26 -0
  151. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  152. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  153. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  154. package/dist/client/browser-entry/scroll.d.ts +28 -0
  155. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  156. package/dist/client/child-segment-context.d.ts +22 -0
  157. package/dist/client/child-segment-context.d.ts.map +1 -0
  158. package/dist/client/child-segment-outlet.d.ts +18 -0
  159. package/dist/client/child-segment-outlet.d.ts.map +1 -0
  160. package/dist/client/child-segment-provider.d.ts +21 -0
  161. package/dist/client/child-segment-provider.d.ts.map +1 -0
  162. package/dist/client/error-boundary.d.ts +12 -5
  163. package/dist/client/error-boundary.d.ts.map +1 -1
  164. package/dist/client/error-boundary.js +47 -10
  165. package/dist/client/error-boundary.js.map +1 -1
  166. package/dist/client/error-reconstituter.d.ts +61 -0
  167. package/dist/client/error-reconstituter.d.ts.map +1 -0
  168. package/dist/client/form.d.ts +16 -27
  169. package/dist/client/form.d.ts.map +1 -1
  170. package/dist/client/history.d.ts +11 -6
  171. package/dist/client/history.d.ts.map +1 -1
  172. package/dist/client/index.d.ts +10 -24
  173. package/dist/client/index.d.ts.map +1 -1
  174. package/dist/client/index.js +182 -1134
  175. package/dist/client/index.js.map +1 -1
  176. package/dist/client/internal.d.ts +19 -0
  177. package/dist/client/internal.d.ts.map +1 -0
  178. package/dist/client/internal.js +825 -0
  179. package/dist/client/internal.js.map +1 -0
  180. package/dist/client/link.d.ts +69 -60
  181. package/dist/client/link.d.ts.map +1 -1
  182. package/dist/client/navigation-api.d.ts +120 -0
  183. package/dist/client/navigation-api.d.ts.map +1 -0
  184. package/dist/client/navigation-context.d.ts +3 -2
  185. package/dist/client/navigation-context.d.ts.map +1 -1
  186. package/dist/client/navigation-root.d.ts +119 -0
  187. package/dist/client/navigation-root.d.ts.map +1 -0
  188. package/dist/client/nuqs-adapter.d.ts +1 -1
  189. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  190. package/dist/client/router-ref.d.ts +1 -1
  191. package/dist/client/router.d.ts +87 -14
  192. package/dist/client/router.d.ts.map +1 -1
  193. package/dist/client/rsc-fetch.d.ts +47 -14
  194. package/dist/client/rsc-fetch.d.ts.map +1 -1
  195. package/dist/client/segment-cache.d.ts +4 -4
  196. package/dist/client/segment-cache.d.ts.map +1 -1
  197. package/dist/client/segment-outlet.d.ts +49 -0
  198. package/dist/client/segment-outlet.d.ts.map +1 -0
  199. package/dist/client/segment-update-context.d.ts +21 -0
  200. package/dist/client/segment-update-context.d.ts.map +1 -0
  201. package/dist/client/shallow-url.d.ts +10 -0
  202. package/dist/client/shallow-url.d.ts.map +1 -0
  203. package/dist/client/ssr-data.d.ts +13 -4
  204. package/dist/client/ssr-data.d.ts.map +1 -1
  205. package/dist/client/state.d.ts +1 -1
  206. package/dist/client/top-loader.d.ts +5 -5
  207. package/dist/client/top-loader.d.ts.map +1 -1
  208. package/dist/client/use-cookie.d.ts +12 -0
  209. package/dist/client/use-cookie.d.ts.map +1 -1
  210. package/dist/client/use-link-status.d.ts +5 -5
  211. package/dist/client/use-link-status.d.ts.map +1 -1
  212. package/dist/client/use-pathname.d.ts.map +1 -1
  213. package/dist/client/use-pending-navigation.d.ts +23 -0
  214. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  215. package/dist/client/use-query-states.d.ts +1 -1
  216. package/dist/client/use-query-states.d.ts.map +1 -1
  217. package/dist/client/use-router.d.ts +1 -1
  218. package/dist/client/use-router.d.ts.map +1 -1
  219. package/dist/client/use-search-params.d.ts +12 -5
  220. package/dist/client/use-search-params.d.ts.map +1 -1
  221. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  222. package/dist/client/use-segment-params.d.ts.map +1 -0
  223. package/dist/codec.d.ts +69 -0
  224. package/dist/codec.d.ts.map +1 -0
  225. package/dist/codec.js +75 -0
  226. package/dist/codec.js.map +1 -0
  227. package/dist/config-types.d.ts +304 -0
  228. package/dist/config-types.d.ts.map +1 -0
  229. package/dist/config-validation.d.ts +51 -0
  230. package/dist/config-validation.d.ts.map +1 -0
  231. package/dist/content/index.d.ts +1 -10
  232. package/dist/content/index.d.ts.map +1 -1
  233. package/dist/content/index.js +0 -2
  234. package/dist/cookies/define-cookie.d.ts +58 -25
  235. package/dist/cookies/define-cookie.d.ts.map +1 -1
  236. package/dist/cookies/index.d.ts +2 -1
  237. package/dist/cookies/index.d.ts.map +1 -1
  238. package/dist/cookies/index.js +257 -36
  239. package/dist/cookies/index.js.map +1 -1
  240. package/dist/cookies/json-cookie.d.ts +64 -0
  241. package/dist/cookies/json-cookie.d.ts.map +1 -0
  242. package/dist/cookies/validation.d.ts +34 -0
  243. package/dist/cookies/validation.d.ts.map +1 -0
  244. package/dist/dev-tools/404-page.d.ts +50 -0
  245. package/dist/dev-tools/404-page.d.ts.map +1 -0
  246. package/dist/dev-tools/browser-logs.d.ts +40 -0
  247. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  248. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  249. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  250. package/dist/dev-tools/error-page.d.ts +32 -0
  251. package/dist/dev-tools/error-page.d.ts.map +1 -0
  252. package/dist/dev-tools/holding-server.d.ts +54 -0
  253. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  254. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  255. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  256. package/dist/dev-tools/index.d.ts +31 -0
  257. package/dist/dev-tools/index.d.ts.map +1 -0
  258. package/dist/dev-tools/instrumentation.d.ts +59 -0
  259. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  260. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  261. package/dist/dev-tools/logger.d.ts.map +1 -0
  262. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  263. package/dist/dev-tools/logs.d.ts.map +1 -0
  264. package/dist/dev-tools/overlay.d.ts +91 -0
  265. package/dist/dev-tools/overlay.d.ts.map +1 -0
  266. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  267. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  268. package/dist/dev-tools/terminal.d.ts +28 -0
  269. package/dist/dev-tools/terminal.d.ts.map +1 -0
  270. package/dist/fonts/ast-walk.d.ts +68 -0
  271. package/dist/fonts/ast-walk.d.ts.map +1 -0
  272. package/dist/fonts/ast.d.ts +110 -6
  273. package/dist/fonts/ast.d.ts.map +1 -1
  274. package/dist/fonts/bundle.d.ts +50 -0
  275. package/dist/fonts/bundle.d.ts.map +1 -0
  276. package/dist/fonts/dev-middleware.d.ts +22 -0
  277. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  278. package/dist/fonts/fallbacks.d.ts +0 -7
  279. package/dist/fonts/fallbacks.d.ts.map +1 -1
  280. package/dist/fonts/google.d.ts +4 -2
  281. package/dist/fonts/google.d.ts.map +1 -1
  282. package/dist/fonts/local.d.ts +4 -4
  283. package/dist/fonts/local.d.ts.map +1 -1
  284. package/dist/fonts/paths.d.ts +43 -0
  285. package/dist/fonts/paths.d.ts.map +1 -0
  286. package/dist/fonts/pipeline.d.ts +158 -0
  287. package/dist/fonts/pipeline.d.ts.map +1 -0
  288. package/dist/fonts/transform.d.ts +82 -0
  289. package/dist/fonts/transform.d.ts.map +1 -0
  290. package/dist/fonts/types.d.ts +47 -1
  291. package/dist/fonts/types.d.ts.map +1 -1
  292. package/dist/fonts/virtual-modules.d.ts +77 -0
  293. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  294. package/dist/index.d.ts +46 -180
  295. package/dist/index.d.ts.map +1 -1
  296. package/dist/index.js +8471 -14108
  297. package/dist/index.js.map +1 -1
  298. package/dist/params/codec-registry.d.ts +26 -0
  299. package/dist/params/codec-registry.d.ts.map +1 -0
  300. package/dist/params/define-schema.d.ts +81 -0
  301. package/dist/params/define-schema.d.ts.map +1 -0
  302. package/dist/params/index.d.ts +5 -0
  303. package/dist/params/index.d.ts.map +1 -0
  304. package/dist/params/index.js +34 -0
  305. package/dist/params/index.js.map +1 -0
  306. package/dist/params/resolve-schema.d.ts +34 -0
  307. package/dist/params/resolve-schema.d.ts.map +1 -0
  308. package/dist/plugin-context.d.ts +190 -0
  309. package/dist/plugin-context.d.ts.map +1 -0
  310. package/dist/plugins/adapter-build.d.ts +20 -1
  311. package/dist/plugins/adapter-build.d.ts.map +1 -1
  312. package/dist/plugins/build-manifest.d.ts +7 -3
  313. package/dist/plugins/build-manifest.d.ts.map +1 -1
  314. package/dist/plugins/build-report.d.ts +43 -7
  315. package/dist/plugins/build-report.d.ts.map +1 -1
  316. package/dist/plugins/cache.d.ts +64 -0
  317. package/dist/plugins/cache.d.ts.map +1 -0
  318. package/dist/plugins/callsite-ast.d.ts +117 -0
  319. package/dist/plugins/callsite-ast.d.ts.map +1 -0
  320. package/dist/plugins/callsite-jsx.d.ts +35 -0
  321. package/dist/plugins/callsite-jsx.d.ts.map +1 -0
  322. package/dist/plugins/chunks.d.ts +11 -4
  323. package/dist/plugins/chunks.d.ts.map +1 -1
  324. package/dist/plugins/client-chunks.d.ts +40 -0
  325. package/dist/plugins/client-chunks.d.ts.map +1 -0
  326. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  327. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  328. package/dist/plugins/content.d.ts +1 -1
  329. package/dist/plugins/content.d.ts.map +1 -1
  330. package/dist/plugins/dev-server.d.ts +17 -1
  331. package/dist/plugins/dev-server.d.ts.map +1 -1
  332. package/dist/plugins/entries.d.ts +1 -1
  333. package/dist/plugins/entries.d.ts.map +1 -1
  334. package/dist/plugins/fonts.d.ts +16 -73
  335. package/dist/plugins/fonts.d.ts.map +1 -1
  336. package/dist/plugins/mdx.d.ts +1 -1
  337. package/dist/plugins/mdx.d.ts.map +1 -1
  338. package/dist/plugins/prebuilt-capture.d.ts +60 -0
  339. package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
  340. package/dist/plugins/prebuilt.d.ts +82 -0
  341. package/dist/plugins/prebuilt.d.ts.map +1 -0
  342. package/dist/plugins/prerender-sugar.d.ts +42 -0
  343. package/dist/plugins/prerender-sugar.d.ts.map +1 -0
  344. package/dist/plugins/routing.d.ts +1 -1
  345. package/dist/plugins/routing.d.ts.map +1 -1
  346. package/dist/plugins/server-bundle.d.ts.map +1 -1
  347. package/dist/plugins/shims.d.ts +29 -5
  348. package/dist/plugins/shims.d.ts.map +1 -1
  349. package/dist/plugins/static-build.d.ts +5 -26
  350. package/dist/plugins/static-build.d.ts.map +1 -1
  351. package/dist/routing/codegen-shared.d.ts +67 -0
  352. package/dist/routing/codegen-shared.d.ts.map +1 -0
  353. package/dist/routing/codegen-types.d.ts +64 -0
  354. package/dist/routing/codegen-types.d.ts.map +1 -0
  355. package/dist/routing/codegen.d.ts +7 -2
  356. package/dist/routing/codegen.d.ts.map +1 -1
  357. package/dist/routing/convention-lint.d.ts +41 -0
  358. package/dist/routing/convention-lint.d.ts.map +1 -0
  359. package/dist/routing/export-detect.d.ts +56 -0
  360. package/dist/routing/export-detect.d.ts.map +1 -0
  361. package/dist/routing/file-cache.d.ts +8 -0
  362. package/dist/routing/file-cache.d.ts.map +1 -0
  363. package/dist/routing/index.d.ts +7 -1
  364. package/dist/routing/index.d.ts.map +1 -1
  365. package/dist/routing/index.js +4 -2
  366. package/dist/routing/interception.d.ts +0 -5
  367. package/dist/routing/interception.d.ts.map +1 -1
  368. package/dist/routing/link-codegen.d.ts +90 -0
  369. package/dist/routing/link-codegen.d.ts.map +1 -0
  370. package/dist/routing/manifest-codegen.d.ts +32 -0
  371. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  372. package/dist/routing/scanner.d.ts +1 -10
  373. package/dist/routing/scanner.d.ts.map +1 -1
  374. package/dist/routing/schema-validation.d.ts +35 -0
  375. package/dist/routing/schema-validation.d.ts.map +1 -0
  376. package/dist/routing/segment-classify.d.ts +75 -0
  377. package/dist/routing/segment-classify.d.ts.map +1 -0
  378. package/dist/routing/segment-codegen.d.ts +38 -0
  379. package/dist/routing/segment-codegen.d.ts.map +1 -0
  380. package/dist/routing/types.d.ts +77 -25
  381. package/dist/routing/types.d.ts.map +1 -1
  382. package/dist/routing/walkers.d.ts +51 -0
  383. package/dist/routing/walkers.d.ts.map +1 -0
  384. package/dist/rsc-runtime/rsc.d.ts +1 -1
  385. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  386. package/dist/rsc-runtime/ssr.d.ts +12 -0
  387. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  388. package/dist/schema-bridge.d.ts +91 -0
  389. package/dist/schema-bridge.d.ts.map +1 -0
  390. package/dist/search-params/define.d.ts +157 -0
  391. package/dist/search-params/define.d.ts.map +1 -0
  392. package/dist/search-params/index.d.ts +4 -7
  393. package/dist/search-params/index.d.ts.map +1 -1
  394. package/dist/search-params/index.js +37 -440
  395. package/dist/search-params/index.js.map +1 -1
  396. package/dist/search-params/registry.d.ts +2 -2
  397. package/dist/search-params/registry.d.ts.map +1 -1
  398. package/dist/search-params/wrappers.d.ts +53 -0
  399. package/dist/search-params/wrappers.d.ts.map +1 -0
  400. package/dist/segment-params/define.d.ts +89 -0
  401. package/dist/segment-params/define.d.ts.map +1 -0
  402. package/dist/segment-params/index.d.ts +3 -0
  403. package/dist/segment-params/index.d.ts.map +1 -0
  404. package/dist/segment-params/index.js +2 -0
  405. package/dist/server/access-gate.d.ts +8 -3
  406. package/dist/server/access-gate.d.ts.map +1 -1
  407. package/dist/server/action-client.d.ts +41 -6
  408. package/dist/server/action-client.d.ts.map +1 -1
  409. package/dist/server/action-encryption.d.ts +76 -0
  410. package/dist/server/action-encryption.d.ts.map +1 -0
  411. package/dist/server/action-handler.d.ts +35 -1
  412. package/dist/server/action-handler.d.ts.map +1 -1
  413. package/dist/server/actions.d.ts +6 -30
  414. package/dist/server/actions.d.ts.map +1 -1
  415. package/dist/server/als-registry.d.ts +86 -11
  416. package/dist/server/als-registry.d.ts.map +1 -1
  417. package/dist/server/asset-headers.d.ts +8 -18
  418. package/dist/server/asset-headers.d.ts.map +1 -1
  419. package/dist/server/body-limits.d.ts.map +1 -1
  420. package/dist/server/build-manifest.d.ts +6 -29
  421. package/dist/server/build-manifest.d.ts.map +1 -1
  422. package/dist/server/canonicalize.d.ts +10 -0
  423. package/dist/server/canonicalize.d.ts.map +1 -1
  424. package/dist/server/coalesce-tick.d.ts +40 -0
  425. package/dist/server/coalesce-tick.d.ts.map +1 -0
  426. package/dist/server/cookie-context.d.ts +170 -0
  427. package/dist/server/cookie-context.d.ts.map +1 -0
  428. package/dist/server/cookie-parsing.d.ts +65 -0
  429. package/dist/server/cookie-parsing.d.ts.map +1 -0
  430. package/dist/server/csrf.d.ts +3 -2
  431. package/dist/server/csrf.d.ts.map +1 -1
  432. package/dist/server/default-logger.d.ts +22 -0
  433. package/dist/server/default-logger.d.ts.map +1 -0
  434. package/dist/server/deny-boundary.d.ts +115 -0
  435. package/dist/server/deny-boundary.d.ts.map +1 -0
  436. package/dist/server/deny-renderer.d.ts +2 -2
  437. package/dist/server/deny-renderer.d.ts.map +1 -1
  438. package/dist/server/dev-source-map.d.ts +22 -0
  439. package/dist/server/dev-source-map.d.ts.map +1 -0
  440. package/dist/server/early-hints-sender.d.ts.map +1 -1
  441. package/dist/server/early-hints.d.ts +13 -11
  442. package/dist/server/early-hints.d.ts.map +1 -1
  443. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  444. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  445. package/dist/server/fallback-error.d.ts +12 -7
  446. package/dist/server/fallback-error.d.ts.map +1 -1
  447. package/dist/server/flight-injection-state.d.ts +66 -0
  448. package/dist/server/flight-injection-state.d.ts.map +1 -0
  449. package/dist/server/flight-scripts.d.ts +42 -0
  450. package/dist/server/flight-scripts.d.ts.map +1 -0
  451. package/dist/server/form-data.d.ts +41 -0
  452. package/dist/server/form-data.d.ts.map +1 -1
  453. package/dist/server/html-injector-core.d.ts +221 -0
  454. package/dist/server/html-injector-core.d.ts.map +1 -0
  455. package/dist/server/html-injectors.d.ts +82 -41
  456. package/dist/server/html-injectors.d.ts.map +1 -1
  457. package/dist/server/index.d.ts +11 -47
  458. package/dist/server/index.d.ts.map +1 -1
  459. package/dist/server/index.js +170 -2911
  460. package/dist/server/index.js.map +1 -1
  461. package/dist/server/internal.d.ts +49 -0
  462. package/dist/server/internal.d.ts.map +1 -0
  463. package/dist/server/internal.js +3652 -0
  464. package/dist/server/internal.js.map +1 -0
  465. package/dist/server/logger.d.ts +39 -7
  466. package/dist/server/logger.d.ts.map +1 -1
  467. package/dist/server/metadata-routes.d.ts +23 -7
  468. package/dist/server/metadata-routes.d.ts.map +1 -1
  469. package/dist/server/middleware-runner.d.ts +36 -4
  470. package/dist/server/middleware-runner.d.ts.map +1 -1
  471. package/dist/server/node-stream-transforms.d.ts +119 -0
  472. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  473. package/dist/server/param-coercion.d.ts +54 -0
  474. package/dist/server/param-coercion.d.ts.map +1 -0
  475. package/dist/server/pipeline-helpers.d.ts +95 -0
  476. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  477. package/dist/server/pipeline-interception.d.ts +1 -1
  478. package/dist/server/pipeline-interception.d.ts.map +1 -1
  479. package/dist/server/pipeline-metadata.d.ts +6 -0
  480. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  481. package/dist/server/pipeline-outcome.d.ts +49 -0
  482. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  483. package/dist/server/pipeline-phases.d.ts +56 -0
  484. package/dist/server/pipeline-phases.d.ts.map +1 -0
  485. package/dist/server/pipeline.d.ts +122 -19
  486. package/dist/server/pipeline.d.ts.map +1 -1
  487. package/dist/server/port-resolution.d.ts +117 -0
  488. package/dist/server/port-resolution.d.ts.map +1 -0
  489. package/dist/server/prebuilt/cache-key.d.ts +58 -0
  490. package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
  491. package/dist/server/prebuilt/capture-state.d.ts +57 -0
  492. package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
  493. package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
  494. package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
  495. package/dist/server/prebuilt/overlay.d.ts +100 -0
  496. package/dist/server/prebuilt/overlay.d.ts.map +1 -0
  497. package/dist/server/prebuilt/payload-source.d.ts +78 -0
  498. package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
  499. package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
  500. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
  501. package/dist/server/prebuilt-builder.d.ts +120 -0
  502. package/dist/server/prebuilt-builder.d.ts.map +1 -0
  503. package/dist/server/prebuilt-runtime.d.ts +101 -0
  504. package/dist/server/prebuilt-runtime.d.ts.map +1 -0
  505. package/dist/server/primitives.d.ts +88 -43
  506. package/dist/server/primitives.d.ts.map +1 -1
  507. package/dist/server/render-timeout.d.ts +51 -0
  508. package/dist/server/render-timeout.d.ts.map +1 -0
  509. package/dist/server/render-utils.d.ts +25 -0
  510. package/dist/server/render-utils.d.ts.map +1 -0
  511. package/dist/server/request-context.d.ts +62 -107
  512. package/dist/server/request-context.d.ts.map +1 -1
  513. package/dist/server/route-element-builder.d.ts +46 -25
  514. package/dist/server/route-element-builder.d.ts.map +1 -1
  515. package/dist/server/route-handler.d.ts.map +1 -1
  516. package/dist/server/route-matcher.d.ts +25 -36
  517. package/dist/server/route-matcher.d.ts.map +1 -1
  518. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  519. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  520. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  521. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  522. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  523. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  524. package/dist/server/rsc-entry/helpers.d.ts +51 -28
  525. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  526. package/dist/server/rsc-entry/index.d.ts +28 -6
  527. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  528. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  529. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  530. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  531. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  532. package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
  533. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  534. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  535. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  536. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  537. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  538. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  539. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  540. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  541. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  542. package/dist/server/safe-load.d.ts +46 -0
  543. package/dist/server/safe-load.d.ts.map +1 -0
  544. package/dist/server/sensitive-fields.d.ts +74 -0
  545. package/dist/server/sensitive-fields.d.ts.map +1 -0
  546. package/dist/server/sitemap-generator.d.ts +129 -0
  547. package/dist/server/sitemap-generator.d.ts.map +1 -0
  548. package/dist/server/sitemap-handler.d.ts +22 -0
  549. package/dist/server/sitemap-handler.d.ts.map +1 -0
  550. package/dist/server/slot-resolver.d.ts +7 -5
  551. package/dist/server/slot-resolver.d.ts.map +1 -1
  552. package/dist/server/ssr-bridge-types.d.ts +121 -0
  553. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  554. package/dist/server/ssr-entry.d.ts +2 -43
  555. package/dist/server/ssr-entry.d.ts.map +1 -1
  556. package/dist/server/ssr-render.d.ts +64 -21
  557. package/dist/server/ssr-render.d.ts.map +1 -1
  558. package/dist/server/ssr-wrappers.d.ts +50 -0
  559. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  560. package/dist/server/state-tree-diff.d.ts +12 -5
  561. package/dist/server/state-tree-diff.d.ts.map +1 -1
  562. package/dist/server/status-code-resolver.d.ts +22 -11
  563. package/dist/server/status-code-resolver.d.ts.map +1 -1
  564. package/dist/server/stream-utils.d.ts +47 -0
  565. package/dist/server/stream-utils.d.ts.map +1 -0
  566. package/dist/server/tracing.d.ts +44 -9
  567. package/dist/server/tracing.d.ts.map +1 -1
  568. package/dist/server/tree-builder.d.ts +62 -30
  569. package/dist/server/tree-builder.d.ts.map +1 -1
  570. package/dist/server/tree-match.d.ts +49 -0
  571. package/dist/server/tree-match.d.ts.map +1 -0
  572. package/dist/server/types.d.ts +71 -6
  573. package/dist/server/types.d.ts.map +1 -1
  574. package/dist/server/utils/escape-html.d.ts +14 -0
  575. package/dist/server/utils/escape-html.d.ts.map +1 -0
  576. package/dist/server/utils/mdx-file.d.ts +15 -0
  577. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  578. package/dist/server/version-skew.d.ts +61 -0
  579. package/dist/server/version-skew.d.ts.map +1 -0
  580. package/dist/server/workers-cache-bridge.d.ts +26 -0
  581. package/dist/server/workers-cache-bridge.d.ts.map +1 -0
  582. package/dist/shared/href-validation.d.ts +49 -0
  583. package/dist/shared/href-validation.d.ts.map +1 -0
  584. package/dist/shared/merge-search-params.d.ts +22 -0
  585. package/dist/shared/merge-search-params.d.ts.map +1 -0
  586. package/dist/shared/redirect-type.d.ts +17 -0
  587. package/dist/shared/redirect-type.d.ts.map +1 -0
  588. package/dist/shims/font-google.d.ts +1 -1
  589. package/dist/shims/font-google.d.ts.map +1 -1
  590. package/dist/shims/font-google.js +42 -0
  591. package/dist/shims/font-google.js.map +1 -0
  592. package/dist/shims/font-local.d.ts +26 -0
  593. package/dist/shims/font-local.d.ts.map +1 -0
  594. package/dist/shims/font-local.js +20 -0
  595. package/dist/shims/font-local.js.map +1 -0
  596. package/dist/shims/headers.d.ts +53 -1
  597. package/dist/shims/headers.d.ts.map +1 -1
  598. package/dist/shims/image.d.ts +16 -16
  599. package/dist/shims/navigation-client.d.ts +35 -11
  600. package/dist/shims/navigation-client.d.ts.map +1 -1
  601. package/dist/shims/navigation.d.ts +11 -5
  602. package/dist/shims/navigation.d.ts.map +1 -1
  603. package/dist/utils/state-machine.d.ts +80 -0
  604. package/dist/utils/state-machine.d.ts.map +1 -0
  605. package/docs/api/30-api-server.mdx +233 -0
  606. package/docs/api/31-api-client.mdx +161 -0
  607. package/docs/api/32-api-cache.mdx +199 -0
  608. package/docs/api/33-api-search-params.mdx +141 -0
  609. package/docs/api/34-api-config.mdx +189 -0
  610. package/docs/api/35-api-typescript.mdx +170 -0
  611. package/docs/api/36-cli.mdx +143 -0
  612. package/docs/learn/00-introduction.mdx +76 -0
  613. package/docs/learn/01-quick-start.mdx +94 -0
  614. package/docs/learn/02-pages-and-layouts.mdx +147 -0
  615. package/docs/learn/03-fetching-data.mdx +211 -0
  616. package/docs/learn/03b-access-control.mdx +130 -0
  617. package/docs/learn/04-loading-states.mdx +67 -0
  618. package/docs/learn/04b-the-flush-point.mdx +115 -0
  619. package/docs/learn/05-typed-params.mdx +275 -0
  620. package/docs/learn/06-forms-and-actions.mdx +146 -0
  621. package/docs/learn/07-typed-routes.mdx +127 -0
  622. package/docs/learn/08-streaming.mdx +146 -0
  623. package/docs/learn/09-caching.mdx +136 -0
  624. package/docs/learn/10-middleware.mdx +157 -0
  625. package/docs/learn/11-error-handling.mdx +156 -0
  626. package/docs/learn/12-client-navigation.mdx +168 -0
  627. package/docs/learn/13-configuration.mdx +145 -0
  628. package/docs/learn/14-deploying.mdx +264 -0
  629. package/docs/more/01-advanced-routing.mdx +139 -0
  630. package/docs/more/02-advanced-forms.mdx +137 -0
  631. package/docs/more/03-coming-from-nextjs.mdx +186 -0
  632. package/docs/more/04-metadata-and-fonts.mdx +193 -0
  633. package/docs/more/04b-mdx.mdx +209 -0
  634. package/docs/more/05-content-collections.mdx +90 -0
  635. package/docs/more/06-instrumentation.mdx +214 -0
  636. package/docs/more/07-security.mdx +129 -0
  637. package/docs/more/08-developer-experience.mdx +134 -0
  638. package/docs/more/40-why-timber.mdx +50 -0
  639. package/docs/more/41-timber-vs-nextjs.mdx +81 -0
  640. package/docs/more/42-timber-vs-others.mdx +68 -0
  641. package/docs/more/50-ai-agent-instructions.mdx +169 -0
  642. package/llms.txt +55 -0
  643. package/package.json +103 -26
  644. package/src/adapters/build-output-helper.ts +199 -0
  645. package/src/adapters/cloudflare-dev.ts +177 -0
  646. package/src/adapters/cloudflare-kv-cache.ts +179 -0
  647. package/src/adapters/cloudflare.ts +571 -118
  648. package/src/adapters/compress-module.ts +27 -92
  649. package/src/adapters/nitro.ts +131 -107
  650. package/src/adapters/raw-imports.d.ts +5 -0
  651. package/src/adapters/shared.ts +68 -0
  652. package/src/adapters/types.ts +0 -7
  653. package/src/adapters/wrangler.d.ts +7 -0
  654. package/src/cache/cache-api.ts +107 -0
  655. package/src/cache/handler-store.ts +76 -0
  656. package/src/cache/index.ts +88 -18
  657. package/src/cache/invalidation-epoch.ts +93 -0
  658. package/src/cache/redis-handler.ts +122 -15
  659. package/src/cache/singleflight.ts +64 -6
  660. package/src/cache/sizeof.ts +33 -0
  661. package/src/cache/stable-stringify.ts +65 -2
  662. package/src/cache/store.ts +71 -0
  663. package/src/cache/stores/cloudflare-kv.ts +52 -0
  664. package/src/cache/stores/memory.ts +125 -0
  665. package/src/cache/stores/redis.ts +97 -0
  666. package/src/cache/stores/vercel.ts +59 -0
  667. package/src/cache/tag-aware-handler.ts +233 -0
  668. package/src/cache/timber-cache.ts +142 -36
  669. package/src/cdn/cloudflare-purge.ts +50 -0
  670. package/src/cdn/fastly-purge.ts +63 -0
  671. package/src/cdn/headers.ts +153 -0
  672. package/src/cdn/index.ts +17 -0
  673. package/src/cdn/purge-store.ts +34 -0
  674. package/src/cdn/workers-cache-purge.ts +30 -0
  675. package/src/cli-schema-sync.ts +388 -0
  676. package/src/cli.ts +157 -34
  677. package/src/client/browser-dev.ts +156 -1
  678. package/src/client/browser-entry/action-dispatch.ts +124 -0
  679. package/src/client/browser-entry/hmr.ts +70 -0
  680. package/src/client/browser-entry/hydrate.ts +187 -0
  681. package/src/client/browser-entry/index.ts +111 -0
  682. package/src/client/browser-entry/post-hydration.ts +103 -0
  683. package/src/client/browser-entry/router-init.ts +287 -0
  684. package/src/client/browser-entry/rsc-stream.ts +157 -0
  685. package/src/client/browser-entry/scroll.ts +50 -0
  686. package/src/client/child-segment-context.ts +40 -0
  687. package/src/client/child-segment-outlet.tsx +25 -0
  688. package/src/client/child-segment-provider.tsx +27 -0
  689. package/src/client/error-boundary.tsx +127 -22
  690. package/src/client/error-reconstituter.tsx +79 -0
  691. package/src/client/form.tsx +31 -32
  692. package/src/client/history.ts +11 -7
  693. package/src/client/index.ts +67 -45
  694. package/src/client/internal.ts +58 -0
  695. package/src/client/link.tsx +346 -150
  696. package/src/client/navigation-api.ts +341 -0
  697. package/src/client/navigation-context.ts +15 -7
  698. package/src/client/navigation-root.tsx +355 -0
  699. package/src/client/nuqs-adapter.tsx +16 -3
  700. package/src/client/router-ref.ts +1 -1
  701. package/src/client/router.ts +482 -166
  702. package/src/client/rsc-fetch.ts +214 -33
  703. package/src/client/segment-cache.ts +7 -7
  704. package/src/client/segment-outlet.tsx +77 -0
  705. package/src/client/segment-update-context.ts +42 -0
  706. package/src/client/shallow-url.ts +22 -0
  707. package/src/client/ssr-data.ts +13 -5
  708. package/src/client/state.ts +2 -2
  709. package/src/client/top-loader.tsx +11 -9
  710. package/src/client/use-cookie.ts +60 -15
  711. package/src/client/use-link-status.ts +7 -7
  712. package/src/client/use-pathname.ts +1 -0
  713. package/src/client/use-pending-navigation.ts +40 -0
  714. package/src/client/use-query-states.ts +9 -3
  715. package/src/client/use-router.ts +4 -1
  716. package/src/client/use-search-params.ts +31 -44
  717. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  718. package/src/codec.ts +147 -0
  719. package/src/config-types.ts +302 -0
  720. package/src/config-validation.ts +328 -0
  721. package/src/content/index.ts +5 -13
  722. package/src/cookies/define-cookie.ts +217 -53
  723. package/src/cookies/index.ts +12 -1
  724. package/src/cookies/json-cookie.ts +105 -0
  725. package/src/cookies/validation.ts +192 -0
  726. package/src/dev-tools/404-page.ts +286 -0
  727. package/src/dev-tools/browser-logs.ts +55 -0
  728. package/src/dev-tools/dev-page-shell.ts +260 -0
  729. package/src/dev-tools/error-page.ts +331 -0
  730. package/src/dev-tools/holding-server.ts +187 -0
  731. package/src/dev-tools/hydration-overlay.ts +158 -0
  732. package/src/dev-tools/index.ts +83 -0
  733. package/src/dev-tools/instrumentation.ts +213 -0
  734. package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
  735. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  736. package/src/dev-tools/overlay.ts +469 -0
  737. package/src/dev-tools/stack-classifier.ts +75 -0
  738. package/src/dev-tools/terminal.ts +182 -0
  739. package/src/fonts/ast-walk.ts +235 -0
  740. package/src/fonts/ast.ts +477 -126
  741. package/src/fonts/bundle.ts +138 -0
  742. package/src/fonts/dev-middleware.ts +85 -0
  743. package/src/fonts/fallbacks.ts +0 -23
  744. package/src/fonts/google.ts +63 -8
  745. package/src/fonts/local.ts +9 -8
  746. package/src/fonts/paths.ts +58 -0
  747. package/src/fonts/pipeline.ts +316 -0
  748. package/src/fonts/transform.ts +305 -0
  749. package/src/fonts/types.ts +52 -1
  750. package/src/fonts/virtual-modules.ts +179 -0
  751. package/src/index.ts +431 -352
  752. package/src/params/codec-registry.ts +34 -0
  753. package/src/params/define-schema.ts +115 -0
  754. package/src/params/index.ts +17 -0
  755. package/src/params/resolve-schema.ts +84 -0
  756. package/src/plugin-context.ts +378 -0
  757. package/src/plugins/adapter-build.ts +98 -4
  758. package/src/plugins/build-manifest.ts +168 -23
  759. package/src/plugins/build-report.ts +253 -35
  760. package/src/plugins/cache.ts +229 -0
  761. package/src/plugins/callsite-ast.ts +472 -0
  762. package/src/plugins/callsite-jsx.ts +243 -0
  763. package/src/plugins/chunks.ts +74 -5
  764. package/src/plugins/client-chunks.ts +144 -0
  765. package/src/plugins/cloudflare-wasm.ts +141 -0
  766. package/src/plugins/content.ts +1 -1
  767. package/src/plugins/dev-server.ts +293 -46
  768. package/src/plugins/entries.ts +129 -8
  769. package/src/plugins/fonts.ts +199 -664
  770. package/src/plugins/mdx.ts +47 -10
  771. package/src/plugins/prebuilt-capture.ts +217 -0
  772. package/src/plugins/prebuilt.ts +700 -0
  773. package/src/plugins/prerender-sugar.ts +329 -0
  774. package/src/plugins/routing.ts +237 -241
  775. package/src/plugins/server-bundle.ts +97 -12
  776. package/src/plugins/shims.ts +241 -64
  777. package/src/plugins/static-build.ts +15 -90
  778. package/src/routing/codegen-shared.ts +115 -0
  779. package/src/routing/codegen-types.ts +65 -0
  780. package/src/routing/codegen.ts +360 -178
  781. package/src/routing/convention-lint.ts +394 -0
  782. package/src/routing/export-detect.ts +304 -0
  783. package/src/routing/file-cache.ts +23 -0
  784. package/src/routing/index.ts +10 -1
  785. package/src/routing/interception.ts +3 -22
  786. package/src/routing/link-codegen.ts +310 -0
  787. package/src/routing/manifest-codegen.ts +281 -0
  788. package/src/routing/scanner.ts +248 -188
  789. package/src/routing/schema-validation.ts +149 -0
  790. package/src/routing/segment-classify.ts +188 -0
  791. package/src/routing/segment-codegen.ts +98 -0
  792. package/src/routing/types.ts +78 -25
  793. package/src/routing/walkers.ts +90 -0
  794. package/src/rsc-runtime/rsc.ts +9 -0
  795. package/src/rsc-runtime/ssr.ts +50 -0
  796. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  797. package/src/schema-bridge.ts +252 -0
  798. package/src/search-params/define.ts +570 -0
  799. package/src/search-params/index.ts +14 -20
  800. package/src/search-params/registry.ts +2 -2
  801. package/src/search-params/wrappers.ts +110 -0
  802. package/src/segment-params/define.ts +249 -0
  803. package/src/segment-params/index.ts +9 -0
  804. package/src/server/access-gate.tsx +84 -34
  805. package/src/server/action-client.ts +119 -28
  806. package/src/server/action-encryption.ts +144 -0
  807. package/src/server/action-handler.ts +123 -33
  808. package/src/server/actions.ts +48 -54
  809. package/src/server/als-registry.ts +130 -20
  810. package/src/server/asset-headers.ts +15 -37
  811. package/src/server/body-limits.ts +10 -2
  812. package/src/server/build-manifest.ts +13 -56
  813. package/src/server/canonicalize.ts +6 -3
  814. package/src/server/coalesce-tick.ts +75 -0
  815. package/src/server/compress.ts +34 -7
  816. package/src/server/cookie-context.ts +484 -0
  817. package/src/server/cookie-parsing.ts +163 -0
  818. package/src/server/csrf.ts +39 -6
  819. package/src/server/default-logger.ts +99 -0
  820. package/src/server/deny-boundary.ts +311 -0
  821. package/src/server/deny-renderer.ts +85 -77
  822. package/src/server/dev-source-map.ts +31 -0
  823. package/src/server/early-hints-sender.ts +3 -2
  824. package/src/server/early-hints.ts +37 -27
  825. package/src/server/error-boundary-wrapper.ts +61 -22
  826. package/src/server/fallback-error.ts +79 -102
  827. package/src/server/flight-injection-state.ts +113 -0
  828. package/src/server/flight-scripts.ts +62 -0
  829. package/src/server/form-data.ts +124 -12
  830. package/src/server/html-injector-core.ts +437 -0
  831. package/src/server/html-injectors.ts +267 -254
  832. package/src/server/index.ts +31 -185
  833. package/src/server/internal.ts +181 -0
  834. package/src/server/logger.ts +72 -36
  835. package/src/server/metadata-routes.ts +44 -19
  836. package/src/server/middleware-runner.ts +75 -4
  837. package/src/server/node-stream-transforms.ts +331 -0
  838. package/src/server/param-coercion.ts +206 -0
  839. package/src/server/pipeline-helpers.ts +204 -0
  840. package/src/server/pipeline-interception.ts +32 -18
  841. package/src/server/pipeline-metadata.ts +14 -0
  842. package/src/server/pipeline-outcome.ts +197 -0
  843. package/src/server/pipeline-phases.ts +538 -0
  844. package/src/server/pipeline.ts +226 -382
  845. package/src/server/port-resolution.ts +215 -0
  846. package/src/server/prebuilt/cache-key.ts +224 -0
  847. package/src/server/prebuilt/capture-state.ts +89 -0
  848. package/src/server/prebuilt/manifest-tag-index.ts +46 -0
  849. package/src/server/prebuilt/overlay.ts +256 -0
  850. package/src/server/prebuilt/payload-source.ts +201 -0
  851. package/src/server/prebuilt/synthetic-store.ts +121 -0
  852. package/src/server/prebuilt-builder.ts +774 -0
  853. package/src/server/prebuilt-runtime.ts +731 -0
  854. package/src/server/primitives.ts +160 -83
  855. package/src/server/render-timeout.ts +108 -0
  856. package/src/server/render-utils.ts +31 -0
  857. package/src/server/request-context.ts +168 -337
  858. package/src/server/route-element-builder.ts +548 -233
  859. package/src/server/route-handler.ts +31 -4
  860. package/src/server/route-matcher.ts +144 -277
  861. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  862. package/src/server/rsc-entry/api-handler.ts +69 -32
  863. package/src/server/rsc-entry/error-renderer.ts +306 -89
  864. package/src/server/rsc-entry/helpers.ts +160 -76
  865. package/src/server/rsc-entry/index.ts +394 -330
  866. package/src/server/rsc-entry/render-route.ts +288 -0
  867. package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
  868. package/src/server/rsc-entry/rsc-payload.ts +74 -35
  869. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  870. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  871. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  872. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  873. package/src/server/safe-load.ts +60 -0
  874. package/src/server/sensitive-fields.ts +230 -0
  875. package/src/server/server-only-guard-noop.js +3 -0
  876. package/src/server/sitemap-generator.ts +344 -0
  877. package/src/server/sitemap-handler.ts +157 -0
  878. package/src/server/slot-resolver.ts +258 -257
  879. package/src/server/ssr-bridge-types.ts +124 -0
  880. package/src/server/ssr-entry.ts +206 -78
  881. package/src/server/ssr-render.ts +345 -82
  882. package/src/server/ssr-wrappers.tsx +141 -0
  883. package/src/server/state-tree-diff.ts +30 -23
  884. package/src/server/status-code-resolver.ts +115 -130
  885. package/src/server/stream-utils.ts +286 -0
  886. package/src/server/tracing.ts +126 -14
  887. package/src/server/tree-builder.ts +204 -90
  888. package/src/server/tree-match.ts +220 -0
  889. package/src/server/types.ts +78 -9
  890. package/src/server/utils/escape-html.ts +20 -0
  891. package/src/server/utils/mdx-file.ts +22 -0
  892. package/src/server/version-skew.ts +104 -0
  893. package/src/server/workers-cache-bridge.ts +33 -0
  894. package/src/shared/href-validation.ts +159 -0
  895. package/src/shared/merge-search-params.ts +55 -0
  896. package/src/shared/redirect-type.ts +17 -0
  897. package/src/shims/font-google.ts +1 -1
  898. package/src/shims/font-local.ts +34 -0
  899. package/src/shims/headers.ts +122 -1
  900. package/src/shims/navigation-client.ts +51 -29
  901. package/src/shims/navigation.ts +14 -7
  902. package/src/utils/state-machine.ts +111 -0
  903. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  904. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  905. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  906. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  907. package/dist/_chunks/format-RyoGQL74.js +0 -164
  908. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  909. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  910. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  911. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  912. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  913. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  914. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  915. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  916. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  917. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  918. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  919. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  920. package/dist/cache/index.js.map +0 -1
  921. package/dist/cache/register-cached-function.d.ts +0 -17
  922. package/dist/cache/register-cached-function.d.ts.map +0 -1
  923. package/dist/client/browser-entry.d.ts +0 -21
  924. package/dist/client/browser-entry.d.ts.map +0 -1
  925. package/dist/client/head.d.ts +0 -16
  926. package/dist/client/head.d.ts.map +0 -1
  927. package/dist/client/link-status-provider.d.ts +0 -11
  928. package/dist/client/link-status-provider.d.ts.map +0 -1
  929. package/dist/client/segment-merger.d.ts +0 -119
  930. package/dist/client/segment-merger.d.ts.map +0 -1
  931. package/dist/client/stale-reload.d.ts +0 -44
  932. package/dist/client/stale-reload.d.ts.map +0 -1
  933. package/dist/client/transition-root.d.ts +0 -74
  934. package/dist/client/transition-root.d.ts.map +0 -1
  935. package/dist/client/use-navigation-pending.d.ts +0 -26
  936. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  937. package/dist/client/use-params.d.ts.map +0 -1
  938. package/dist/plugins/cache-transform.d.ts +0 -36
  939. package/dist/plugins/cache-transform.d.ts.map +0 -1
  940. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  941. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  942. package/dist/plugins/dev-logs.d.ts.map +0 -1
  943. package/dist/plugins/dynamic-transform.d.ts +0 -72
  944. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  945. package/dist/plugins/server-action-exports.d.ts +0 -26
  946. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  947. package/dist/routing/status-file-lint.d.ts +0 -33
  948. package/dist/routing/status-file-lint.d.ts.map +0 -1
  949. package/dist/search-params/analyze.d.ts +0 -54
  950. package/dist/search-params/analyze.d.ts.map +0 -1
  951. package/dist/search-params/builtin-codecs.d.ts +0 -105
  952. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  953. package/dist/search-params/codecs.d.ts +0 -53
  954. package/dist/search-params/codecs.d.ts.map +0 -1
  955. package/dist/search-params/create.d.ts +0 -106
  956. package/dist/search-params/create.d.ts.map +0 -1
  957. package/dist/server/client-module-map.d.ts +0 -47
  958. package/dist/server/client-module-map.d.ts.map +0 -1
  959. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  960. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  961. package/dist/server/dev-logger.d.ts.map +0 -1
  962. package/dist/server/dev-span-processor.d.ts +0 -29
  963. package/dist/server/dev-span-processor.d.ts.map +0 -1
  964. package/dist/server/dev-warnings.d.ts +0 -129
  965. package/dist/server/dev-warnings.d.ts.map +0 -1
  966. package/dist/server/flush.d.ts +0 -74
  967. package/dist/server/flush.d.ts.map +0 -1
  968. package/dist/server/manifest-status-resolver.d.ts +0 -58
  969. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  970. package/dist/server/prerender.d.ts +0 -77
  971. package/dist/server/prerender.d.ts.map +0 -1
  972. package/dist/utils/directive-parser.d.ts +0 -70
  973. package/dist/utils/directive-parser.d.ts.map +0 -1
  974. package/src/cache/register-cached-function.ts +0 -103
  975. package/src/client/browser-entry.ts +0 -678
  976. package/src/client/head.ts +0 -61
  977. package/src/client/link-status-provider.tsx +0 -30
  978. package/src/client/segment-merger.ts +0 -339
  979. package/src/client/stale-reload.ts +0 -87
  980. package/src/client/transition-root.tsx +0 -166
  981. package/src/client/use-navigation-pending.ts +0 -38
  982. package/src/plugins/cache-transform.ts +0 -199
  983. package/src/plugins/dev-error-overlay.ts +0 -230
  984. package/src/plugins/dynamic-transform.ts +0 -161
  985. package/src/plugins/server-action-exports.ts +0 -220
  986. package/src/routing/status-file-lint.ts +0 -112
  987. package/src/search-params/analyze.ts +0 -192
  988. package/src/search-params/builtin-codecs.ts +0 -228
  989. package/src/search-params/codecs.ts +0 -153
  990. package/src/search-params/create.ts +0 -321
  991. package/src/server/client-module-map.ts +0 -58
  992. package/src/server/dev-fetch-instrumentation.ts +0 -96
  993. package/src/server/dev-span-processor.ts +0 -78
  994. package/src/server/dev-warnings.ts +0 -283
  995. package/src/server/flush.ts +0 -182
  996. package/src/server/manifest-status-resolver.ts +0 -215
  997. package/src/server/prerender.ts +0 -139
  998. package/src/utils/directive-parser.ts +0 -529
@@ -0,0 +1,1125 @@
1
+ import { L as getWaitUntil, V as addSpanEventSync, d as logSwrRefetchFailed } from "./logger-B_O6-mdJ.js";
2
+ import { t as fnv1aHash } from "./fast-hash-D6hIVt1Y.js";
3
+ import { t as estimateByteSize } from "./sizeof-lXffQ1Vr.js";
4
+ //#region src/cache/stable-stringify.ts
5
+ /**
6
+ * Deterministic JSON serialization with sorted object keys.
7
+ * Used for cache key generation — ensures { a: 1, b: 2 } and { b: 2, a: 1 }
8
+ * produce the same string.
9
+ *
10
+ * Matches JSON.stringify semantics for toJSON: Date serializes to its ISO
11
+ * string, URL to its href, and class instances with a custom toJSON use it.
12
+ * Map and Set serialize their entries explicitly (insertion-order
13
+ * independent). Values that would serialize lossily — functions, symbols,
14
+ * and non-plain objects with no enumerable own state (RegExp, class
15
+ * instances holding data behind getters or internal slots) — throw instead:
16
+ * every such value would collapse to the same cache key, silently returning
17
+ * one argument's cached data for another (TIM-1020).
18
+ */
19
+ function stableStringify(value) {
20
+ if (value === null || value === void 0) return String(value);
21
+ const type = typeof value;
22
+ if (type === "function" || type === "symbol") throw new TypeError(`stableStringify: cannot serialize a ${type} into a stable cache key — all such values would collide. Provide an explicit \`key\` option to cache().`);
23
+ if (type !== "object") return JSON.stringify(value);
24
+ if (Array.isArray(value)) return "[" + value.map((item) => stableStringify(item)).join(",") + "]";
25
+ const withToJSON = value;
26
+ if (typeof withToJSON.toJSON === "function") {
27
+ const json = withToJSON.toJSON();
28
+ if (json !== value) return stableStringify(json);
29
+ }
30
+ if (value instanceof Map) return "Map(" + [...value.entries()].map(([k, v]) => stableStringify(k) + "=>" + stableStringify(v)).sort().join(",") + ")";
31
+ if (value instanceof Set) return "Set(" + [...value].map((member) => stableStringify(member)).sort().join(",") + ")";
32
+ const obj = value;
33
+ const keys = Object.keys(obj).sort();
34
+ const pairs = [];
35
+ for (const key of keys) {
36
+ if (obj[key] === void 0) continue;
37
+ if (key === "toJSON" && typeof obj[key] === "function") continue;
38
+ pairs.push(JSON.stringify(key) + ":" + stableStringify(obj[key]));
39
+ }
40
+ if (pairs.length === 0) {
41
+ const proto = Object.getPrototypeOf(value);
42
+ if (proto !== Object.prototype && proto !== null) {
43
+ const name = value.constructor?.name || "Object";
44
+ throw new TypeError(`stableStringify: ${name} instance has no serializable own state — all instances would share one cache key. Provide an explicit \`key\` option to cache(), or add a toJSON() method.`);
45
+ }
46
+ }
47
+ return "{" + pairs.join(",") + "}";
48
+ }
49
+ //#endregion
50
+ //#region src/cache/singleflight.ts
51
+ /**
52
+ * Error thrown when a singleflight call exceeds `timeoutMs`.
53
+ * Exported so callers can distinguish timeout from other errors.
54
+ */
55
+ var SingleflightTimeoutError = class extends Error {
56
+ constructor(key, timeoutMs) {
57
+ super(`Singleflight timeout: key "${key}" exceeded ${timeoutMs}ms`);
58
+ this.name = "SingleflightTimeoutError";
59
+ }
60
+ };
61
+ function createSingleflight(opts) {
62
+ const inflight = /* @__PURE__ */ new Map();
63
+ const timeoutMs = opts?.timeoutMs;
64
+ return { do(key, fn) {
65
+ const existing = inflight.get(key);
66
+ if (existing) return existing;
67
+ const ac = new AbortController();
68
+ let promise;
69
+ if (timeoutMs != null && timeoutMs > 0) promise = new Promise((resolve, reject) => {
70
+ const timer = setTimeout(() => {
71
+ ac.abort();
72
+ reject(new SingleflightTimeoutError(key, timeoutMs));
73
+ }, timeoutMs);
74
+ try {
75
+ fn(ac.signal).then((value) => {
76
+ clearTimeout(timer);
77
+ resolve(value);
78
+ }, (err) => {
79
+ clearTimeout(timer);
80
+ reject(err);
81
+ });
82
+ } catch (err) {
83
+ clearTimeout(timer);
84
+ reject(err);
85
+ }
86
+ });
87
+ else promise = fn(ac.signal);
88
+ const tracked = promise.finally(() => {
89
+ inflight.delete(key);
90
+ });
91
+ inflight.set(key, tracked);
92
+ return tracked;
93
+ } };
94
+ }
95
+ //#endregion
96
+ //#region src/cache/invalidation-epoch.ts
97
+ /**
98
+ * Per-process invalidation epoch tracking for timber.cache (TIM-1028).
99
+ *
100
+ * handler.set for a cache miss runs after `fn()` resolves. An explicit
101
+ * `cache.invalidate({ tag })` / `revalidateTag` that lands while fn is in
102
+ * flight would otherwise be silently undone — the just-invalidated value
103
+ * re-stored as fresh for the full TTL, resurrecting pre-mutation data.
104
+ *
105
+ * Every invalidation bumps a monotonic epoch and records it against the
106
+ * invalidated key/tag. Before storing a result, the cache wrapper checks
107
+ * whether its key or any of its tags were invalidated after fn started and
108
+ * skips the write if so. Skipping is always safe: the only cost is one
109
+ * extra cache miss on the next call.
110
+ *
111
+ * Scope: per-process, like the singleflight map. An invalidation issued by
112
+ * another instance against a shared handler (Redis/KV) during fn flight is
113
+ * not observable here — closing that window fully would require store-level
114
+ * versioning, which no CacheHandler backend offers.
115
+ */
116
+ var epoch = 0;
117
+ /**
118
+ * Last-invalidated epoch per `key:<k>` / `tag:<t>` entry. Insertion order is
119
+ * epoch order (entries are re-inserted on update), so the oldest entry is
120
+ * always first — pruning evicts lowest epochs.
121
+ */
122
+ var lastInvalidated = /* @__PURE__ */ new Map();
123
+ /**
124
+ * Bound on tracked entries so high-cardinality tag invalidation (e.g.
125
+ * per-user tags) cannot grow this map without limit.
126
+ */
127
+ var MAX_TRACKED_ENTRIES = 1e4;
128
+ /**
129
+ * Highest epoch evicted from the map. Any execution that started at or
130
+ * before this epoch conservatively counts as invalidated — history was
131
+ * truncated, so we can no longer prove it wasn't.
132
+ */
133
+ var evictedEpochFloor = 0;
134
+ /** The current epoch. Capture before running fn(), pass to wasInvalidatedSince. */
135
+ function currentInvalidationEpoch() {
136
+ return epoch;
137
+ }
138
+ /**
139
+ * Record an invalidation. Call BEFORE handler.invalidate() so an execution
140
+ * whose set-check races the invalidation errs toward skipping the write.
141
+ */
142
+ function recordInvalidation(opts) {
143
+ epoch++;
144
+ if (opts.key) track(`key:${opts.key}`);
145
+ if (opts.tag) track(`tag:${opts.tag}`);
146
+ }
147
+ function track(entry) {
148
+ lastInvalidated.delete(entry);
149
+ lastInvalidated.set(entry, epoch);
150
+ while (lastInvalidated.size > MAX_TRACKED_ENTRIES) {
151
+ const oldest = lastInvalidated.entries().next().value;
152
+ if (oldest === void 0) break;
153
+ evictedEpochFloor = Math.max(evictedEpochFloor, oldest[1]);
154
+ lastInvalidated.delete(oldest[0]);
155
+ }
156
+ }
157
+ /**
158
+ * Whether the key or any tag was invalidated after `startEpoch` (the epoch
159
+ * captured when fn started executing).
160
+ */
161
+ function wasInvalidatedSince(startEpoch, key, tags) {
162
+ return lastInvalidationEpochFor(key, tags) > startEpoch;
163
+ }
164
+ /**
165
+ * The highest epoch at which the key or any of the tags was invalidated
166
+ * (0 if never). Used to scope the singleflight key: callers arriving after
167
+ * an invalidation must not coalesce onto a flight that started before it —
168
+ * they would receive the pre-invalidation result the invalidation was
169
+ * issued to discard.
170
+ */
171
+ function lastInvalidationEpochFor(key, tags) {
172
+ let last = evictedEpochFloor;
173
+ const keyEpoch = lastInvalidated.get(`key:${key}`);
174
+ if (keyEpoch !== void 0 && keyEpoch > last) last = keyEpoch;
175
+ for (const tag of tags) {
176
+ const tagEpoch = lastInvalidated.get(`tag:${tag}`);
177
+ if (tagEpoch !== void 0 && tagEpoch > last) last = tagEpoch;
178
+ }
179
+ return last;
180
+ }
181
+ //#endregion
182
+ //#region src/cache/timber-cache.ts
183
+ var defaultSingleflight = createSingleflight();
184
+ /**
185
+ * Set the timeout for the module-level default singleflight.
186
+ * Called at framework boot with renderTimeoutMs from timber.config.ts so that
187
+ * cache calls without a per-call timeoutMs still get deadlock protection.
188
+ * See design/06-caching.md §"Singleflight Timeout — Deadlock Risk".
189
+ */
190
+ function setDefaultSingleflightTimeout(timeoutMs) {
191
+ defaultSingleflight = createSingleflight({ timeoutMs });
192
+ }
193
+ /**
194
+ * Generate a cache key from function identity and serialized args.
195
+ *
196
+ * Uses FNV-1a (fast non-crypto hash) instead of SHA-256. Cache keys don't
197
+ * need collision resistance — they need speed. The fnId prefix provides
198
+ * namespace isolation; the hash covers the args.
199
+ *
200
+ * See TIM-370 for perf motivation.
201
+ */
202
+ function defaultKeyGenerator(fnId, args) {
203
+ const raw = fnId + ":" + stableStringify(args);
204
+ return fnId + ":" + fnv1aHash(raw);
205
+ }
206
+ /**
207
+ * Resolve tags from the options — supports static array or function form.
208
+ */
209
+ function resolveTags(opts, args) {
210
+ if (!opts.tags) return [];
211
+ if (Array.isArray(opts.tags)) return opts.tags;
212
+ return opts.tags(...args);
213
+ }
214
+ /** Per-process count of byte-identical fn sources seen by deriveFallbackFnId. */
215
+ var fallbackIdOccurrences = /* @__PURE__ */ new Map();
216
+ var hasWarnedFallbackId = false;
217
+ /**
218
+ * Derive a fallback fnId for callsites the timber-cache-transform Vite plugin
219
+ * could not statically detect (aliased bindings, user re-export wrappers).
220
+ *
221
+ * The base is fnv1a(fn.toString()) — deterministic across instances and cold
222
+ * starts of the same build, so two *different* functions can never swap fnIds
223
+ * by module-evaluation order (the TIM-997 poisoning scenario that the old
224
+ * process-local counter allowed; see TIM-1054). A per-process occurrence
225
+ * suffix disambiguates byte-identical duplicate sources. That residue is the
226
+ * one remaining hazard: closures produced by the same factory share source
227
+ * text but capture different values, and their occurrence order may differ
228
+ * across instances — such callsites need an explicit `key` option.
229
+ */
230
+ function deriveFallbackFnId(fn) {
231
+ const sourceHash = fnv1aHash(fn.toString());
232
+ const occurrence = fallbackIdOccurrences.get(sourceHash) ?? 0;
233
+ fallbackIdOccurrences.set(sourceHash, occurrence + 1);
234
+ if (!hasWarnedFallbackId && typeof process !== "undefined" && process.env.NODE_ENV !== "test") {
235
+ hasWarnedFallbackId = true;
236
+ console.warn("[timber] cache() callsite has no build-time stable ID and no explicit `key` option — the call is not statically visible to the timber Vite plugin (e.g. an aliased binding like `const c = cache` or a re-export wrapper module). Falling back to a function-source hash for the cache key. With a shared CacheHandler (Redis/KV) this is safe for distinct functions, but byte-identical closures from a factory can swap cache entries across instances. Provide an explicit `key` option to make the cache key contract stable and auditable.");
237
+ }
238
+ return `timber-cache:fn:${sourceHash}:${occurrence}`;
239
+ }
240
+ /**
241
+ * Creates a cached wrapper around an async function.
242
+ *
243
+ * - FNV-1a default keys with normalized JSON args
244
+ * - Singleflight: concurrent misses → single execution AND single
245
+ * handler.set — the write happens inside the coalesced callback (TIM-1028)
246
+ * - Writes are skipped when the key/tags were invalidated while fn was in
247
+ * flight, so explicit invalidation is never silently undone (TIM-1028)
248
+ * - SWR: serve stale immediately, background refetch
249
+ * - Tags as string[] or function of args
250
+ * - The handler is resolved per invocation via `getHandler`, never captured
251
+ * at wrapper-creation time — module-scope cache() wrappers created before
252
+ * the framework's boot wiring calls setCacheHandler() still use the
253
+ * configured handler once it arrives (TIM-1029)
254
+ * - No ALS dependency for correctness — cache() works outside a request
255
+ * context. The waitUntil ALS bridge is read optionally so the SWR
256
+ * background refetch survives handler return on Workers/Lambda.
257
+ *
258
+ * Cache hits/misses are recorded as OTEL span events on the enclosing
259
+ * span (not child spans). The DevSpanProcessor reads these for dev log output.
260
+ */
261
+ function createCache(fn, opts, getHandler, stableId) {
262
+ const fnId = stableId ?? (opts.key ? void 0 : deriveFallbackFnId(fn));
263
+ const perCallSf = opts.timeoutMs !== void 0 ? createSingleflight({ timeoutMs: opts.timeoutMs }) : void 0;
264
+ return (async (...args) => {
265
+ const sf = perCallSf ?? defaultSingleflight;
266
+ const key = opts.key ? opts.key(...args) : defaultKeyGenerator(fnId, args);
267
+ const cacheStart = performance.now();
268
+ const cached = await getHandler().get(key);
269
+ if (cached && !cached.stale) {
270
+ addSpanEventSync("timber.cache.hit", {
271
+ key,
272
+ duration_ms: Math.round(performance.now() - cacheStart)
273
+ });
274
+ return cached.value;
275
+ }
276
+ const tags = resolveTags(opts, args);
277
+ const flightKey = `${key}\u0000${lastInvalidationEpochFor(key, tags)}`;
278
+ /**
279
+ * Run fn and store the result — exactly once per coalesced execution,
280
+ * inside the singleflight callback. The write is skipped when:
281
+ * - the key/tags were invalidated after fn started (TIM-1028), or
282
+ * - the singleflight timed out (signal aborted) — the timed-out
283
+ * flight's write could overwrite a newer value from a subsequent
284
+ * flight (TIM-1092).
285
+ *
286
+ * Residual race: if fn() completes within the timeout but
287
+ * handler.set() is slow enough that the timeout fires during the
288
+ * set, the write lands with stale data. This window is narrow
289
+ * (requires set latency to straddle the timeout boundary) and
290
+ * self-healing (next cache miss triggers a fresh write). Fully
291
+ * closing it requires CAS/versioned writes on CacheHandler —
292
+ * tracked in TIM-1158.
293
+ */
294
+ const executeAndStore = async (signal) => {
295
+ const startEpoch = currentInvalidationEpoch();
296
+ const result = await fn(...args);
297
+ if (!signal.aborted && !wasInvalidatedSince(startEpoch, key, tags)) await getHandler().set(key, result, {
298
+ ttl: opts.ttl,
299
+ tags
300
+ });
301
+ return result;
302
+ };
303
+ if (cached && cached.stale && opts.staleWhileRevalidate) {
304
+ addSpanEventSync("timber.cache.hit", {
305
+ key,
306
+ duration_ms: Math.round(performance.now() - cacheStart),
307
+ stale: true
308
+ });
309
+ const refetch = sf.do(`swr:${flightKey}`, async (signal) => {
310
+ try {
311
+ await executeAndStore(signal);
312
+ } catch (err) {
313
+ logSwrRefetchFailed({
314
+ cacheKey: key,
315
+ error: err
316
+ });
317
+ }
318
+ }).catch(() => {});
319
+ getWaitUntil()?.(refetch);
320
+ return cached.value;
321
+ }
322
+ const result = await sf.do(flightKey, executeAndStore);
323
+ addSpanEventSync("timber.cache.miss", {
324
+ key,
325
+ duration_ms: Math.round(performance.now() - cacheStart)
326
+ });
327
+ return result;
328
+ });
329
+ }
330
+ //#endregion
331
+ //#region src/cache/handler-store.ts
332
+ var handler$1 = null;
333
+ var explicitlyConfigured = false;
334
+ /** Replace the active cache handler. Called by the framework at boot. */
335
+ function setCacheHandler(h) {
336
+ handler$1 = h;
337
+ explicitlyConfigured = true;
338
+ }
339
+ /** Whether the handler was explicitly configured (vs the default in-memory fallback). */
340
+ function isCacheHandlerConfigured() {
341
+ return explicitlyConfigured;
342
+ }
343
+ /**
344
+ * Get the active cache handler. Creates a default MemoryCacheHandler on
345
+ * first access if none has been set via setCacheHandler().
346
+ */
347
+ function getCacheHandler() {
348
+ if (!handler$1) handler$1 = createDefaultHandler();
349
+ return handler$1;
350
+ }
351
+ function createDefaultHandler() {
352
+ const store = /* @__PURE__ */ new Map();
353
+ const maxEntries = 1e3;
354
+ return {
355
+ async get(key) {
356
+ const entry = store.get(key);
357
+ if (!entry) return null;
358
+ store.delete(key);
359
+ store.set(key, entry);
360
+ const stale = Date.now() > entry.expiresAt;
361
+ return {
362
+ value: entry.value,
363
+ stale
364
+ };
365
+ },
366
+ async set(key, value, opts) {
367
+ if (store.has(key)) store.delete(key);
368
+ while (store.size >= maxEntries) {
369
+ const oldest = store.keys().next().value;
370
+ if (oldest !== void 0) store.delete(oldest);
371
+ else break;
372
+ }
373
+ store.set(key, {
374
+ value,
375
+ expiresAt: Date.now() + opts.ttl * 1e3,
376
+ tags: opts.tags
377
+ });
378
+ },
379
+ async invalidate(opts) {
380
+ if (opts.key) store.delete(opts.key);
381
+ if (opts.tag) {
382
+ for (const [key, entry] of store) if (entry.tags.includes(opts.tag)) store.delete(key);
383
+ }
384
+ }
385
+ };
386
+ }
387
+ //#endregion
388
+ //#region src/cache/redis-handler.ts
389
+ var KEY_PREFIX = "timber:cache:";
390
+ var TAG_PREFIX = "timber:tag:";
391
+ /**
392
+ * Redis-backed CacheHandler for distributed caching.
393
+ *
394
+ * All instances sharing the same Redis see each other's cache entries and
395
+ * invalidations. Tag-based invalidation uses Redis Sets to track which keys
396
+ * belong to which tags.
397
+ *
398
+ * Bring your own Redis client wrapped to the {@link RedisClient} contract —
399
+ * see the adapter examples on the interface for ioredis, node-redis v4, and
400
+ * @upstash/redis.
401
+ */
402
+ var RedisCacheHandler = class {
403
+ client;
404
+ prefix;
405
+ constructor(client, opts) {
406
+ this.client = client;
407
+ this.prefix = opts?.prefix ?? "";
408
+ }
409
+ cacheKey(key) {
410
+ return `${this.prefix}${KEY_PREFIX}${key}`;
411
+ }
412
+ tagKey(tag) {
413
+ return `${this.prefix}${TAG_PREFIX}${tag}`;
414
+ }
415
+ async get(key) {
416
+ const raw = await this.client.get(this.cacheKey(key));
417
+ if (raw === null) return null;
418
+ const entry = JSON.parse(raw);
419
+ const stale = Date.now() > entry.expiresAt;
420
+ return {
421
+ value: entry.value,
422
+ stale
423
+ };
424
+ }
425
+ async set(key, value, opts) {
426
+ const ck = this.cacheKey(key);
427
+ const expiresAt = Date.now() + opts.ttl * 1e3;
428
+ const payload = JSON.stringify({
429
+ value,
430
+ expiresAt,
431
+ tags: opts.tags
432
+ });
433
+ const redisTtlSeconds = Math.max(opts.ttl * 2 + 60, 120);
434
+ await this.client.set(ck, payload, redisTtlSeconds);
435
+ for (const tag of opts.tags) {
436
+ await this.client.sadd(this.tagKey(tag), key);
437
+ await this.client.expireNX(this.tagKey(tag), redisTtlSeconds);
438
+ await this.client.expireGT(this.tagKey(tag), redisTtlSeconds);
439
+ }
440
+ }
441
+ async invalidate(opts) {
442
+ if (opts.key) {
443
+ const raw = await this.client.get(this.cacheKey(opts.key));
444
+ if (raw !== null) {
445
+ const entry = JSON.parse(raw);
446
+ if (entry.tags) await Promise.all(entry.tags.map((tag) => this.client.srem(this.tagKey(tag), opts.key)));
447
+ }
448
+ await this.client.del(this.cacheKey(opts.key));
449
+ }
450
+ if (opts.tag) {
451
+ const tk = this.tagKey(opts.tag);
452
+ const keys = await this.client.smembers(tk);
453
+ await Promise.all(keys.map((k) => this.client.del(this.cacheKey(k))));
454
+ await this.client.del(tk);
455
+ }
456
+ }
457
+ };
458
+ //#endregion
459
+ //#region src/cache/tag-aware-handler.ts
460
+ var DATA_PREFIX = "d:";
461
+ var TAG_SET_PREFIX = "ts:";
462
+ var TAG_VERSION_PREFIX = "tv:";
463
+ function detectStrategy(store) {
464
+ if (store.setWithTags && store.invalidateTag) return "native";
465
+ if (store.sadd && store.smembers && store.srem && store.sdel) return "eager";
466
+ return "lazy";
467
+ }
468
+ var TagAwareCacheHandler = class {
469
+ store;
470
+ prefix;
471
+ strategy;
472
+ constructor(store, opts) {
473
+ this.store = store;
474
+ this.prefix = opts?.prefix ?? "timber:";
475
+ this.strategy = detectStrategy(store);
476
+ }
477
+ get consistency() {
478
+ return this.store.consistency;
479
+ }
480
+ dataKey(key) {
481
+ return `${this.prefix}${DATA_PREFIX}${key}`;
482
+ }
483
+ /** Namespace tags for native stores so prefix isolates shared stores. */
484
+ prefixTags(tags) {
485
+ return tags.map((t) => `${this.prefix}${t}`);
486
+ }
487
+ tagSetKey(tag) {
488
+ return `${this.prefix}${TAG_SET_PREFIX}${tag}`;
489
+ }
490
+ tagVersionKey(tag) {
491
+ return `${this.prefix}${TAG_VERSION_PREFIX}${tag}`;
492
+ }
493
+ async get(key) {
494
+ const raw = await this.store.get(this.dataKey(key));
495
+ if (raw === null) return null;
496
+ if (this.strategy === "native" || this.strategy === "eager") {
497
+ const entry = JSON.parse(raw);
498
+ const stale = Date.now() > entry.expiresAt;
499
+ return {
500
+ value: entry.value,
501
+ stale
502
+ };
503
+ }
504
+ const entry = JSON.parse(raw);
505
+ if (entry.tags.length > 0) {
506
+ const currentVersions = await this.getTagVersions(entry.tags);
507
+ for (const tag of entry.tags) {
508
+ const stored = entry.tagVersions[tag] ?? 0;
509
+ if ((currentVersions[tag] ?? 0) > stored) return null;
510
+ }
511
+ }
512
+ const stale = Date.now() > entry.expiresAt;
513
+ return {
514
+ value: entry.value,
515
+ stale
516
+ };
517
+ }
518
+ async set(key, value, opts) {
519
+ const physicalTtl = Math.max(opts.ttl * 2 + 60, 120);
520
+ if (this.strategy === "native") {
521
+ const entry = {
522
+ value,
523
+ expiresAt: Date.now() + opts.ttl * 1e3,
524
+ tags: opts.tags
525
+ };
526
+ const payload = JSON.stringify(entry);
527
+ if (opts.tags.length > 0) await this.store.setWithTags(this.dataKey(key), payload, physicalTtl, this.prefixTags(opts.tags));
528
+ else await this.store.set(this.dataKey(key), payload, physicalTtl);
529
+ return;
530
+ }
531
+ if (this.strategy === "eager") {
532
+ const entry = {
533
+ value,
534
+ expiresAt: Date.now() + opts.ttl * 1e3,
535
+ tags: opts.tags
536
+ };
537
+ await this.store.set(this.dataKey(key), JSON.stringify(entry), physicalTtl);
538
+ if (opts.tags.length > 0) await Promise.all(opts.tags.map((tag) => this.store.sadd(this.tagSetKey(tag), [key], physicalTtl)));
539
+ return;
540
+ }
541
+ const tagVersions = opts.tags.length > 0 ? await this.getTagVersions(opts.tags) : {};
542
+ const entry = {
543
+ value,
544
+ expiresAt: Date.now() + opts.ttl * 1e3,
545
+ tags: opts.tags,
546
+ tagVersions
547
+ };
548
+ await this.store.set(this.dataKey(key), JSON.stringify(entry), physicalTtl);
549
+ }
550
+ async invalidate(opts) {
551
+ if (opts.key) {
552
+ if (this.strategy === "eager") {
553
+ const raw = await this.store.get(this.dataKey(opts.key));
554
+ if (raw !== null) {
555
+ const entry = JSON.parse(raw);
556
+ if (entry.tags.length > 0) await Promise.all(entry.tags.map((tag) => this.store.srem(this.tagSetKey(tag), [opts.key])));
557
+ }
558
+ }
559
+ await this.store.del(this.dataKey(opts.key));
560
+ }
561
+ if (opts.tag) {
562
+ const tag = opts.tag;
563
+ if (this.strategy === "native") await this.store.invalidateTag(`${this.prefix}${tag}`);
564
+ else if (this.strategy === "eager") {
565
+ const members = await this.store.smembers(this.tagSetKey(tag));
566
+ await Promise.all(members.map(async (k) => {
567
+ const raw = await this.store.get(this.dataKey(k));
568
+ if (raw === null) {
569
+ await this.store.srem(this.tagSetKey(tag), [k]);
570
+ return;
571
+ }
572
+ if (JSON.parse(raw).tags.includes(tag)) {
573
+ await this.store.del(this.dataKey(k));
574
+ await this.store.srem(this.tagSetKey(tag), [k]);
575
+ } else await this.store.srem(this.tagSetKey(tag), [k]);
576
+ }));
577
+ } else await this.bumpTagVersion(opts.tag);
578
+ }
579
+ }
580
+ async getTagVersions(tags) {
581
+ const versions = {};
582
+ await Promise.all(tags.map(async (tag) => {
583
+ const raw = await this.store.get(this.tagVersionKey(tag));
584
+ versions[tag] = raw !== null ? parseInt(raw, 10) : 0;
585
+ }));
586
+ return versions;
587
+ }
588
+ async bumpTagVersion(tag) {
589
+ const key = this.tagVersionKey(tag);
590
+ const raw = await this.store.get(key);
591
+ const version = Math.max(raw !== null ? parseInt(raw, 10) : 0, Date.now()) + 1;
592
+ await this.store.set(key, String(version), 365 * 86400);
593
+ }
594
+ };
595
+ //#endregion
596
+ //#region src/cache/index.ts
597
+ var MemoryCacheHandler = class {
598
+ store = /* @__PURE__ */ new Map();
599
+ maxEntries;
600
+ maxBytes;
601
+ maxEntryBytes;
602
+ currentBytes = 0;
603
+ _trackBytes;
604
+ constructor(opts) {
605
+ this.maxEntries = opts?.maxEntries ?? opts?.maxSize ?? 1e3;
606
+ this.maxBytes = opts?.maxBytes;
607
+ this.maxEntryBytes = opts?.maxEntryBytes;
608
+ this._trackBytes = this.maxBytes !== void 0 || this.maxEntryBytes !== void 0;
609
+ }
610
+ async get(key) {
611
+ const entry = this.store.get(key);
612
+ if (!entry) return null;
613
+ this.store.delete(key);
614
+ this.store.set(key, entry);
615
+ const stale = Date.now() > entry.expiresAt;
616
+ return {
617
+ value: entry.value,
618
+ stale
619
+ };
620
+ }
621
+ async set(key, value, opts) {
622
+ const byteSize = this._trackBytes ? estimateByteSize(value) : 0;
623
+ if (this.maxEntryBytes !== void 0 && byteSize > this.maxEntryBytes) return;
624
+ if (this.store.has(key)) {
625
+ const existing = this.store.get(key);
626
+ this.currentBytes -= existing.byteSize;
627
+ this.store.delete(key);
628
+ }
629
+ while (this.store.size >= this.maxEntries) this.evictOldest();
630
+ if (this.maxBytes !== void 0) {
631
+ while (this.currentBytes + byteSize > this.maxBytes && this.store.size > 0) this.evictOldest();
632
+ if (this.currentBytes + byteSize > this.maxBytes) return;
633
+ }
634
+ this.store.set(key, {
635
+ value,
636
+ expiresAt: Date.now() + opts.ttl * 1e3,
637
+ tags: opts.tags,
638
+ byteSize
639
+ });
640
+ this.currentBytes += byteSize;
641
+ }
642
+ async invalidate(opts) {
643
+ if (opts.key) {
644
+ const entry = this.store.get(opts.key);
645
+ if (entry) {
646
+ this.currentBytes -= entry.byteSize;
647
+ this.store.delete(opts.key);
648
+ }
649
+ }
650
+ if (opts.tag) {
651
+ for (const [key, entry] of this.store) if (entry.tags.includes(opts.tag)) {
652
+ this.currentBytes -= entry.byteSize;
653
+ this.store.delete(key);
654
+ }
655
+ }
656
+ }
657
+ /** Number of entries currently in the cache. */
658
+ get size() {
659
+ return this.store.size;
660
+ }
661
+ /** Estimated total byte size of all cached values. Only tracked when maxBytes or maxEntryBytes is configured; returns 0 otherwise. */
662
+ get bytes() {
663
+ return this.currentBytes;
664
+ }
665
+ /** Evict the oldest entry (front of Map). */
666
+ evictOldest() {
667
+ const oldest = this.store.keys().next().value;
668
+ if (oldest !== void 0) {
669
+ const entry = this.store.get(oldest);
670
+ this.currentBytes -= entry.byteSize;
671
+ this.store.delete(oldest);
672
+ }
673
+ }
674
+ };
675
+ //#endregion
676
+ //#region src/server/version-skew.ts
677
+ /**
678
+ * Version Skew Detection — graceful recovery when stale clients hit new deployments.
679
+ *
680
+ * When a new version of the app is deployed, clients with open tabs still have
681
+ * the old JavaScript bundle. Without version skew handling, these stale clients
682
+ * will experience:
683
+ *
684
+ * 1. Server action calls that crash (action IDs are content-hashed)
685
+ * 2. Chunk load failures (old filenames gone from CDN)
686
+ * 3. RSC payload mismatches (component references differ between builds)
687
+ *
688
+ * This module implements deployment ID comparison:
689
+ * - A per-build deployment ID is generated at build time (see build-manifest.ts)
690
+ * - The client sends it via `X-Timber-Deployment-Id` header on every RSC/action request
691
+ * - The server compares it against the current build's ID
692
+ * - On mismatch: signal the client to reload (not crash)
693
+ *
694
+ * The deployment ID is always-on in production. Dev mode skips the check
695
+ * (HMR handles code updates without full reloads).
696
+ *
697
+ * See design/25-production-deployments.md, TIM-446
698
+ */
699
+ /** Header sent by the client with every RSC/action request. */
700
+ var DEPLOYMENT_ID_HEADER = "X-Timber-Deployment-Id";
701
+ /** Response header that signals the client to do a full page reload. */
702
+ var RELOAD_HEADER = "X-Timber-Reload";
703
+ /**
704
+ * The current build's deployment ID. Set at startup from the manifest init
705
+ * module (globalThis.__TIMBER_DEPLOYMENT_ID__). Null in dev mode.
706
+ */
707
+ var currentDeploymentId = null;
708
+ /**
709
+ * Get the current deployment ID. Returns null in dev mode.
710
+ */
711
+ function getDeploymentId() {
712
+ return currentDeploymentId;
713
+ }
714
+ /**
715
+ * Check if a request's deployment ID matches the current build.
716
+ *
717
+ * Returns `{ ok: true }` when:
718
+ * - Dev mode (no deployment ID set — HMR handles updates)
719
+ * - No deployment ID header (initial page load, non-RSC request)
720
+ * - Deployment IDs match
721
+ *
722
+ * Returns `{ ok: false }` when:
723
+ * - Client sends a deployment ID that differs from the current build
724
+ */
725
+ function checkVersionSkew(req) {
726
+ if (!currentDeploymentId) return {
727
+ ok: true,
728
+ clientId: null
729
+ };
730
+ const clientId = req.headers.get(DEPLOYMENT_ID_HEADER);
731
+ if (!clientId) return {
732
+ ok: true,
733
+ clientId: null
734
+ };
735
+ if (clientId === currentDeploymentId) return {
736
+ ok: true,
737
+ clientId
738
+ };
739
+ return {
740
+ ok: false,
741
+ clientId
742
+ };
743
+ }
744
+ /**
745
+ * Apply version skew reload headers to a response.
746
+ * Sets X-Timber-Reload: 1 to signal the client to do a full page reload.
747
+ */
748
+ function applyReloadHeaders(headers) {
749
+ headers.set(RELOAD_HEADER, "1");
750
+ }
751
+ //#endregion
752
+ //#region src/server/prebuilt/manifest-tag-index.ts
753
+ /**
754
+ * Build the inverted tag → seed key index from the manifest.
755
+ *
756
+ * Returns a Map where each tag maps to the set of (componentId, cacheKey)
757
+ * pairs whose manifest entries carry that tag. Only entries with non-empty
758
+ * `tags` arrays participate.
759
+ */
760
+ function buildTagIndex(manifest) {
761
+ const index = /* @__PURE__ */ new Map();
762
+ for (const [componentId, component] of Object.entries(manifest)) {
763
+ if (!component || typeof component !== "object" || !("entries" in component)) continue;
764
+ for (const [cacheKey, entry] of Object.entries(component.entries)) {
765
+ if (!entry.tags || entry.tags.length === 0) continue;
766
+ for (const tag of entry.tags) {
767
+ let list = index.get(tag);
768
+ if (!list) {
769
+ list = [];
770
+ index.set(tag, list);
771
+ }
772
+ list.push({
773
+ componentId,
774
+ cacheKey
775
+ });
776
+ }
777
+ }
778
+ }
779
+ return index;
780
+ }
781
+ //#endregion
782
+ //#region src/server/prebuilt/payload-source.ts
783
+ /**
784
+ * Prebuilt payload source — the adapter seam through which the runtime
785
+ * reads build-time flight artifacts (`.timber/dist/prebuilt/`).
786
+ *
787
+ * The runtime never touches the filesystem directly: adapters register a
788
+ * source at startup (Node: fs reads; Cloudflare: the assets binding —
789
+ * design/44-render-at-build-time.md §Adapter Integration). Artifacts are
790
+ * produced by the post-build capture pass (TIM-1119, prebuilt-builder.ts);
791
+ * adapter registration of the source is TIM-1122. Until a source is
792
+ * registered (adapter not wired yet, dev mode, no artifacts built), every
793
+ * lookup misses and cache.component wrappers render live — the designed
794
+ * dynamic-fallback behavior.
795
+ *
796
+ * Phase 3 (design/45 runtime tier) inserts the CacheHandler overlay lookup
797
+ * in front of `lookupPrebuiltPayload` — overlay first, then artifact. The
798
+ * single-lookup-function shape here is that seam.
799
+ */
800
+ var source = null;
801
+ var manifestPromise = null;
802
+ /**
803
+ * Ceiling on the memoized manifest load. Without it, a stalled
804
+ * `loadManifest()` would leave `manifestPromise` pending forever and every
805
+ * subsequent cache.component render would await the same hung promise —
806
+ * the coalesced-promise deadlock class from design/13-security.md (A5).
807
+ * On expiry the load memoizes as null (permanent dynamic fallback, same
808
+ * policy as a failed load) and callers proceed immediately.
809
+ */
810
+ var MANIFEST_LOAD_TIMEOUT_MS = 5e3;
811
+ /**
812
+ * Per-read ceiling on payload reads. The read is awaited inside a server
813
+ * component render — a stalled adapter promise would otherwise hang the
814
+ * RSC stream until the render timeout kills the whole page, when the
815
+ * correct degradation is a miss → live render (codex review round 4 on
816
+ * PR #835).
817
+ */
818
+ var PAYLOAD_READ_TIMEOUT_MS = 5e3;
819
+ /** Race a source promise against a timeout that resolves to `fallback`. */
820
+ async function withTimeout(work, timeoutMs, fallback, onTimeout) {
821
+ let timer;
822
+ try {
823
+ return await Promise.race([work, new Promise((resolve) => {
824
+ timer = setTimeout(() => {
825
+ onTimeout();
826
+ resolve(fallback);
827
+ }, timeoutMs);
828
+ })]);
829
+ } finally {
830
+ clearTimeout(timer);
831
+ }
832
+ }
833
+ async function loadManifestWithTimeout(src) {
834
+ let manifest;
835
+ try {
836
+ manifest = await withTimeout(src.loadManifest(), MANIFEST_LOAD_TIMEOUT_MS, null, () => {
837
+ console.error(`[timber] prebuilt manifest load exceeded ${MANIFEST_LOAD_TIMEOUT_MS}ms — all cache.component lookups will render dynamically`);
838
+ });
839
+ } catch (error) {
840
+ console.error("[timber] failed to load prebuilt manifest — all cache.component lookups will miss:", error);
841
+ return null;
842
+ }
843
+ if (manifest) initTagIndex(manifest);
844
+ return manifest;
845
+ }
846
+ /**
847
+ * Register the payload source. Called once at server startup by the
848
+ * adapter/entry wiring (TIM-1122); tests inject fakes. Passing null
849
+ * unregisters (and drops the memoized manifest).
850
+ */
851
+ function setPrebuiltPayloadSource(next) {
852
+ source = next;
853
+ manifestPromise = null;
854
+ if (!next) resetTagIndex();
855
+ }
856
+ /**
857
+ * Whether a source is registered — the gate for both marker emission and
858
+ * splice-transform installation. False means zero prebuilt overhead.
859
+ */
860
+ function hasPrebuiltPayloadSource() {
861
+ return source !== null;
862
+ }
863
+ /**
864
+ * Ensure the manifest is loaded (and the tag index initialized). No-op
865
+ * when no source is registered. Used by the tombstone path to avoid
866
+ * skipping tombstones on cold processes where the first request is an
867
+ * action rather than a page render.
868
+ */
869
+ async function ensureManifestLoaded() {
870
+ if (source === null) return;
871
+ manifestPromise ??= loadManifestWithTimeout(source);
872
+ await manifestPromise;
873
+ }
874
+ /**
875
+ * Look up a manifest entry (metadata only, no payload read).
876
+ * Used by the overlay to check seed existence and freshness.
877
+ */
878
+ async function isParamIndependent(componentId) {
879
+ if (source === null) return false;
880
+ manifestPromise ??= loadManifestWithTimeout(source);
881
+ return (await manifestPromise)?.[componentId]?.paramIndependent === true;
882
+ }
883
+ async function getManifestEntry(componentId, cacheKey) {
884
+ if (source === null) return null;
885
+ manifestPromise ??= loadManifestWithTimeout(source);
886
+ return (await manifestPromise)?.[componentId]?.entries?.[cacheKey] ?? null;
887
+ }
888
+ /**
889
+ * Look up a cached payload: manifest entry → payload bytes.
890
+ * Null on any miss or read failure — callers fall back to live render.
891
+ *
892
+ * The manifest is loaded once and memoized (design/44 §manifest.json:
893
+ * loaded at startup, held in memory; payloads read on demand). A failed
894
+ * manifest load is memoized as null rather than retried per-request — a
895
+ * broken artifact should degrade to dynamic rendering, not add a failing
896
+ * read to every request.
897
+ */
898
+ async function lookupPrebuiltPayload(componentId, cacheKey) {
899
+ if (source === null) return null;
900
+ manifestPromise ??= loadManifestWithTimeout(source);
901
+ const entry = (await manifestPromise)?.[componentId]?.entries?.[cacheKey];
902
+ if (!entry) return null;
903
+ try {
904
+ return await withTimeout(source.readPayload(entry.file), PAYLOAD_READ_TIMEOUT_MS, null, () => {
905
+ console.error(`[timber] prebuilt payload read for "${entry.file}" exceeded ${PAYLOAD_READ_TIMEOUT_MS}ms — rendering dynamically`);
906
+ });
907
+ } catch (error) {
908
+ console.error(`[timber] failed to read prebuilt payload "${entry.file}" for ${componentId} — rendering dynamically:`, error);
909
+ return null;
910
+ }
911
+ }
912
+ //#endregion
913
+ //#region src/server/prebuilt/overlay.ts
914
+ /**
915
+ * Component cache overlay — runtime CacheHandler layer for ISR.
916
+ *
917
+ * Sits in front of the immutable build artifact (`.flight` files) and
918
+ * stores replacement payloads and tombstones via the configured
919
+ * CacheHandler. Overlay entries are per-deploy namespaced:
920
+ * `timber:c:{deploymentId}:{componentId}:{hash}`
921
+ *
922
+ * The CacheHandler contract is untouched — tombstones and the tag index
923
+ * live above the interface as value conventions. Redis, KV, and custom
924
+ * handlers work unmodified.
925
+ *
926
+ * See design/45-cache-lifetimes.md §ISR mechanics.
927
+ */
928
+ /** Default ceiling TTL for tag-only entries (24 hours), in seconds. */
929
+ var CEILING_TTL_SECONDS = 1440 * 60;
930
+ /** Deploy-long physical TTL for seed-backed overlay records (90 days). */
931
+ var DEPLOY_LONG_TTL_SECONDS = 2160 * 60 * 60;
932
+ function isOverlayRecord(v) {
933
+ return v !== null && typeof v === "object" && v._t === "co";
934
+ }
935
+ function isTombstone(v) {
936
+ return v !== null && typeof v === "object" && v._t === "ct";
937
+ }
938
+ function overlayKey(componentId, cacheKey) {
939
+ return `timber:c:${getDeploymentId() ?? "dev"}:${componentId}:${cacheKey}`;
940
+ }
941
+ /**
942
+ * Look up an overlay entry in the cache handler.
943
+ * Returns null on a clean miss (no overlay entry at all).
944
+ */
945
+ async function lookupOverlay(componentId, cacheKey) {
946
+ const handler = getCacheHandler();
947
+ const key = overlayKey(componentId, cacheKey);
948
+ const result = await handler.get(key);
949
+ if (!result) return null;
950
+ const value = result.value;
951
+ if (isTombstone(value)) return {
952
+ kind: "tombstone",
953
+ record: null,
954
+ payload: null
955
+ };
956
+ if (isOverlayRecord(value)) return {
957
+ kind: Date.now() > value.fu ? "stale" : "fresh",
958
+ record: value,
959
+ payload: base64ToBytes(value.p)
960
+ };
961
+ return null;
962
+ }
963
+ /**
964
+ * Resolve the effective TTL for a component's runtime lifetime.
965
+ * Tag-only entries (no explicit ttl) get the ceiling TTL (design/45
966
+ * §Tag-only entries carry a ceiling TTL).
967
+ */
968
+ function effectiveTtl(ttl) {
969
+ return ttl ?? CEILING_TTL_SECONDS;
970
+ }
971
+ /**
972
+ * Store a component flight payload in the overlay.
973
+ */
974
+ async function storeOverlayEntry(componentId, cacheKey, payloadBytes, opts) {
975
+ const handler = getCacheHandler();
976
+ const key = overlayKey(componentId, cacheKey);
977
+ const logicalTtl = effectiveTtl(opts.ttl);
978
+ const physicalTtl = opts.hasSeed ? DEPLOY_LONG_TTL_SECONDS : logicalTtl;
979
+ const record = {
980
+ _t: "co",
981
+ p: bytesToBase64(payloadBytes),
982
+ fu: Date.now() + logicalTtl * 1e3,
983
+ s: opts.hasSeed
984
+ };
985
+ await handler.set(key, record, {
986
+ ttl: physicalTtl,
987
+ tags: opts.tags
988
+ });
989
+ }
990
+ var tagIndex = null;
991
+ /**
992
+ * Initialize the tag index from the prebuilt manifest. Called once when the
993
+ * manifest is loaded. Without a manifest (no prebuilt components), this is
994
+ * never called and revalidateTag skips the tombstone path entirely.
995
+ */
996
+ function initTagIndex(manifest) {
997
+ tagIndex = buildTagIndex(manifest);
998
+ emitIsrDiagnosticIfNeeded(manifest);
999
+ }
1000
+ /**
1001
+ * Reset the tag index (for tests).
1002
+ * @internal
1003
+ */
1004
+ function resetTagIndex() {
1005
+ tagIndex = null;
1006
+ }
1007
+ /**
1008
+ * Write tombstones for all seed entries carrying the given tag.
1009
+ * Called from cache.invalidate (cache-api.ts) AFTER the handler's own
1010
+ * invalidation clears overlay entries.
1011
+ *
1012
+ * The tombstone prevents the immutable seed from being served after
1013
+ * invalidation — without it, a handler.invalidate that clears the overlay
1014
+ * would expose the (now-stale) build artifact on the next request.
1015
+ *
1016
+ * Ensures the manifest is loaded first so cold-process actions that
1017
+ * invalidate before any page render still write tombstones.
1018
+ */
1019
+ async function writeTombstonesForTag(tag) {
1020
+ if (!tagIndex) await ensureManifestLoaded();
1021
+ if (!tagIndex) return;
1022
+ const seeds = tagIndex.get(tag);
1023
+ if (!seeds || seeds.length === 0) return;
1024
+ const handler = getCacheHandler();
1025
+ const tombstone = { _t: "ct" };
1026
+ await Promise.all(seeds.map((seed) => {
1027
+ const key = overlayKey(seed.componentId, seed.cacheKey);
1028
+ return handler.set(key, tombstone, {
1029
+ ttl: DEPLOY_LONG_TTL_SECONDS,
1030
+ tags: [tag]
1031
+ });
1032
+ }));
1033
+ }
1034
+ var isrDiagnosticEmitted = false;
1035
+ function emitIsrDiagnosticIfNeeded(manifest) {
1036
+ if (isrDiagnosticEmitted) return;
1037
+ if (!(getCacheHandler() instanceof MemoryCacheHandler || !isCacheHandlerConfigured())) return;
1038
+ for (const [, component] of Object.entries(manifest)) {
1039
+ if (!component || typeof component !== "object" || !("entries" in component)) continue;
1040
+ for (const [, entry] of Object.entries(component.entries)) if (entry.tags && entry.tags.length > 0) {
1041
+ isrDiagnosticEmitted = true;
1042
+ console.warn("[timber] tag revalidation of prerendered components requires a shared cache handler in multi-instance deployments. The current MemoryCacheHandler is per-process — revalidateTag on one instance will not purge the build seed on others. Configure a shared handler (Redis, KV) for production ISR.");
1043
+ return;
1044
+ }
1045
+ }
1046
+ }
1047
+ function bytesToBase64(bytes) {
1048
+ return Buffer.from(bytes).toString("base64");
1049
+ }
1050
+ function base64ToBytes(b64) {
1051
+ return new Uint8Array(Buffer.from(b64, "base64"));
1052
+ }
1053
+ //#endregion
1054
+ //#region src/cdn/purge-store.ts
1055
+ var handler;
1056
+ /** Get the current CDN purge handler, if configured. */
1057
+ function getCdnPurgeHandler() {
1058
+ return handler;
1059
+ }
1060
+ //#endregion
1061
+ //#region src/cache/cache-api.ts
1062
+ /**
1063
+ * Public caching API: `cache(fn, opts)`.
1064
+ *
1065
+ * Wraps an async function with cross-request caching. Uses the configured
1066
+ * cache handler (defaults to MemoryCacheHandler, overridable via timber.config.ts).
1067
+ *
1068
+ * ```ts
1069
+ * import { cache } from '@timber-js/app/cache';
1070
+ *
1071
+ * const getUser = cache(
1072
+ * async (id: string) => db.users.findUnique({ where: { id } }),
1073
+ * { ttl: 60, tags: (id) => [`user:${id}`] }
1074
+ * );
1075
+ * ```
1076
+ */
1077
+ function cache(fn, opts, stableId) {
1078
+ return createCache(fn, opts, getCacheHandler, stableId);
1079
+ }
1080
+ /**
1081
+ * Invalidate cache entries by tag or key.
1082
+ *
1083
+ * ```ts
1084
+ * cache.invalidate({ tag: 'products' });
1085
+ * cache.invalidate({ key: 'user:abc' });
1086
+ * ```
1087
+ */
1088
+ cache.invalidate = async function invalidate(opts) {
1089
+ recordInvalidation(opts);
1090
+ await getCacheHandler().invalidate(opts);
1091
+ if (opts.tag) await writeTombstonesForTag(opts.tag);
1092
+ if (opts.tag) {
1093
+ const purgeHandler = getCdnPurgeHandler();
1094
+ if (purgeHandler) try {
1095
+ await Promise.race([purgeHandler.purgeTags([opts.tag]), new Promise((_, reject) => setTimeout(() => reject(/* @__PURE__ */ new Error("CDN purge timed out (10s)")), 1e4))]);
1096
+ } catch (err) {
1097
+ console.error("[timber] CDN purge failed for tag:", err);
1098
+ }
1099
+ }
1100
+ };
1101
+ var componentFallbackWarned = /* @__PURE__ */ new WeakSet();
1102
+ /**
1103
+ * Runtime fallback for `cache.component(...)` callsites the timber-prebuilt
1104
+ * transform does not rewrite — nested/computed/argument-position forms (see
1105
+ * plugins/prebuilt.ts). Only module-scope `const X = cache.component(...)`
1106
+ * declarations are transformed and eligible for prebuilding; everything else
1107
+ * lands here, warns once per component, and renders dynamically. Same
1108
+ * safety-net pattern as the data cache's runtime fnId fallback (TIM-1054):
1109
+ * an untraceable callsite degrades in performance, never in correctness.
1110
+ *
1111
+ * The full public surface (types, docs, `timber` namespace) is TIM-1121;
1112
+ * design/45-cache-lifetimes.md specifies the options.
1113
+ */
1114
+ cache.component = function component(componentFn, _options) {
1115
+ if (!componentFallbackWarned.has(componentFn)) {
1116
+ componentFallbackWarned.add(componentFn);
1117
+ const name = componentFn.name || "anonymous component";
1118
+ console.warn(`[timber] cache.component: "${name}" was not transformed at build time — rendering dynamically. Only module-scope declarations (const X = cache.component(...)) are prebuilt.`);
1119
+ }
1120
+ return componentFn;
1121
+ };
1122
+ //#endregion
1123
+ export { setDefaultSingleflightTimeout as _, getManifestEntry as a, wasInvalidatedSince as b, lookupPrebuiltPayload as c, checkVersionSkew as d, MemoryCacheHandler as f, setCacheHandler as g, getCacheHandler as h, storeOverlayEntry as i, setPrebuiltPayloadSource as l, RedisCacheHandler as m, lookupOverlay as n, hasPrebuiltPayloadSource as o, TagAwareCacheHandler as p, overlayKey as r, isParamIndependent as s, cache as t, applyReloadHeaders as u, currentInvalidationEpoch as v, createSingleflight as x, lastInvalidationEpochFor as y };
1124
+
1125
+ //# sourceMappingURL=cache-api-CzYUlgXA.js.map