@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.181

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 (1026) hide show
  1. package/LICENSE +8 -0
  2. package/agent-skill.md +344 -0
  3. package/dist/_chunks/actions-O_LsyCE4.js +317 -0
  4. package/dist/_chunks/actions-O_LsyCE4.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-B-lhk9p4.js +1202 -0
  8. package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
  9. package/dist/_chunks/canonicalize-DQHyFClh.js +248 -0
  10. package/dist/_chunks/canonicalize-DQHyFClh.js.map +1 -0
  11. package/dist/_chunks/cli-schema-sync-D3naS3eH.js +688 -0
  12. package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +1 -0
  13. package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
  14. package/dist/_chunks/cloudflare-AHoWYTYr.js.map +1 -0
  15. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  16. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  17. package/dist/_chunks/define-COtkxMRT.js +191 -0
  18. package/dist/_chunks/define-COtkxMRT.js.map +1 -0
  19. package/dist/_chunks/define-c4au4I9R.js +82 -0
  20. package/dist/_chunks/define-c4au4I9R.js.map +1 -0
  21. package/dist/_chunks/dist-BA3u1z3W.js +423 -0
  22. package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
  23. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  24. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  25. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  26. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  27. package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
  28. package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
  29. package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
  30. package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
  31. package/dist/_chunks/logger-AWfuX-KJ.js +1468 -0
  32. package/dist/_chunks/logger-AWfuX-KJ.js.map +1 -0
  33. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  34. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  35. package/dist/_chunks/plugin-context---kTF5v8.js +315 -0
  36. package/dist/_chunks/plugin-context---kTF5v8.js.map +1 -0
  37. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  38. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  39. package/dist/_chunks/resolve-schema-Dz3fcFUo.js +50 -0
  40. package/dist/_chunks/resolve-schema-Dz3fcFUo.js.map +1 -0
  41. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  42. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  43. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +119 -0
  44. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
  45. package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
  46. package/dist/_chunks/segment-classify-Byy425ng.js.map +1 -0
  47. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  48. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  49. package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
  50. package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
  51. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  52. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  53. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
  54. package/dist/_chunks/use-query-states-DFvWd-EA.js.map +1 -0
  55. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  56. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  57. package/dist/_chunks/walkers-BtTlKviE.js +1002 -0
  58. package/dist/_chunks/walkers-BtTlKviE.js.map +1 -0
  59. package/dist/adapters/build-output-helper.d.ts +29 -0
  60. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  61. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  62. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  63. package/dist/adapters/cloudflare-dev.js +73 -0
  64. package/dist/adapters/cloudflare-dev.js.map +1 -0
  65. package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
  66. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  67. package/dist/adapters/cloudflare-kv-cache.js +124 -0
  68. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  69. package/dist/adapters/cloudflare.d.ts +189 -21
  70. package/dist/adapters/cloudflare.d.ts.map +1 -1
  71. package/dist/adapters/cloudflare.js +2 -188
  72. package/dist/adapters/compress-module.d.ts +5 -4
  73. package/dist/adapters/compress-module.d.ts.map +1 -1
  74. package/dist/adapters/nitro.d.ts +41 -3
  75. package/dist/adapters/nitro.d.ts.map +1 -1
  76. package/dist/adapters/nitro.js +224 -172
  77. package/dist/adapters/nitro.js.map +1 -1
  78. package/dist/adapters/shared.d.ts +6 -0
  79. package/dist/adapters/shared.d.ts.map +1 -0
  80. package/dist/adapters/types.d.ts +2 -6
  81. package/dist/adapters/types.d.ts.map +1 -1
  82. package/dist/cache/cache-api.d.ts +48 -0
  83. package/dist/cache/cache-api.d.ts.map +1 -0
  84. package/dist/cache/handler-store.d.ts +33 -0
  85. package/dist/cache/handler-store.d.ts.map +1 -0
  86. package/dist/cache/index.d.ts +31 -8
  87. package/dist/cache/index.d.ts.map +1 -1
  88. package/dist/cache/index.js +3 -326
  89. package/dist/cache/invalidation-epoch.d.ts +43 -0
  90. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  91. package/dist/cache/json-lossy-check.d.ts +11 -0
  92. package/dist/cache/json-lossy-check.d.ts.map +1 -0
  93. package/dist/cache/redis-handler.d.ts +140 -8
  94. package/dist/cache/redis-handler.d.ts.map +1 -1
  95. package/dist/cache/singleflight.d.ts +19 -2
  96. package/dist/cache/singleflight.d.ts.map +1 -1
  97. package/dist/cache/sizeof.d.ts +22 -0
  98. package/dist/cache/sizeof.d.ts.map +1 -0
  99. package/dist/cache/stable-stringify.d.ts +9 -0
  100. package/dist/cache/stable-stringify.d.ts.map +1 -1
  101. package/dist/cache/store.d.ts +53 -0
  102. package/dist/cache/store.d.ts.map +1 -0
  103. package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
  104. package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
  105. package/dist/cache/stores/cloudflare-kv.js +29 -0
  106. package/dist/cache/stores/cloudflare-kv.js.map +1 -0
  107. package/dist/cache/stores/memory.d.ts +42 -0
  108. package/dist/cache/stores/memory.d.ts.map +1 -0
  109. package/dist/cache/stores/memory.js +90 -0
  110. package/dist/cache/stores/memory.js.map +1 -0
  111. package/dist/cache/stores/redis.d.ts +69 -0
  112. package/dist/cache/stores/redis.d.ts.map +1 -0
  113. package/dist/cache/stores/redis.js +35 -0
  114. package/dist/cache/stores/redis.js.map +1 -0
  115. package/dist/cache/stores/vercel.d.ts +36 -0
  116. package/dist/cache/stores/vercel.d.ts.map +1 -0
  117. package/dist/cache/stores/vercel.js +33 -0
  118. package/dist/cache/stores/vercel.js.map +1 -0
  119. package/dist/cache/tag-aware-handler.d.ts +52 -0
  120. package/dist/cache/tag-aware-handler.d.ts.map +1 -0
  121. package/dist/cache/timber-cache.d.ts +20 -10
  122. package/dist/cache/timber-cache.d.ts.map +1 -1
  123. package/dist/cdn/cloudflare-purge.d.ts +23 -0
  124. package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
  125. package/dist/cdn/fastly-purge.d.ts +25 -0
  126. package/dist/cdn/fastly-purge.d.ts.map +1 -0
  127. package/dist/cdn/headers.d.ts +97 -0
  128. package/dist/cdn/headers.d.ts.map +1 -0
  129. package/dist/cdn/index.d.ts +5 -0
  130. package/dist/cdn/index.d.ts.map +1 -0
  131. package/dist/cdn/purge-store.d.ts +23 -0
  132. package/dist/cdn/purge-store.d.ts.map +1 -0
  133. package/dist/cdn/workers-cache-purge.d.ts +16 -0
  134. package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
  135. package/dist/cli-schema-sync.d.ts +59 -0
  136. package/dist/cli-schema-sync.d.ts.map +1 -0
  137. package/dist/cli.d.ts +35 -2
  138. package/dist/cli.d.ts.map +1 -1
  139. package/dist/cli.js +113 -34
  140. package/dist/cli.js.map +1 -1
  141. package/dist/client/browser-dev.d.ts +37 -1
  142. package/dist/client/browser-dev.d.ts.map +1 -1
  143. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  144. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  145. package/dist/client/browser-entry/hmr.d.ts +21 -0
  146. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  147. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  148. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  149. package/dist/client/browser-entry/index.d.ts +29 -0
  150. package/dist/client/browser-entry/index.d.ts.map +1 -0
  151. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  152. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  153. package/dist/client/browser-entry/router-init.d.ts +27 -0
  154. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  155. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  156. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  157. package/dist/client/browser-entry/scroll.d.ts +28 -0
  158. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  159. package/dist/client/error-boundary.d.ts +12 -5
  160. package/dist/client/error-boundary.d.ts.map +1 -1
  161. package/dist/client/error-boundary.js +47 -10
  162. package/dist/client/error-boundary.js.map +1 -1
  163. package/dist/client/error-reconstituter.d.ts +61 -0
  164. package/dist/client/error-reconstituter.d.ts.map +1 -0
  165. package/dist/client/form.d.ts +16 -27
  166. package/dist/client/form.d.ts.map +1 -1
  167. package/dist/client/history.d.ts +21 -6
  168. package/dist/client/history.d.ts.map +1 -1
  169. package/dist/client/index.d.ts +10 -24
  170. package/dist/client/index.d.ts.map +1 -1
  171. package/dist/client/index.js +185 -1134
  172. package/dist/client/index.js.map +1 -1
  173. package/dist/client/internal.d.ts +19 -0
  174. package/dist/client/internal.d.ts.map +1 -0
  175. package/dist/client/internal.js +938 -0
  176. package/dist/client/internal.js.map +1 -0
  177. package/dist/client/link.d.ts +69 -60
  178. package/dist/client/link.d.ts.map +1 -1
  179. package/dist/client/navigation-api.d.ts +121 -0
  180. package/dist/client/navigation-api.d.ts.map +1 -0
  181. package/dist/client/navigation-context.d.ts +3 -2
  182. package/dist/client/navigation-context.d.ts.map +1 -1
  183. package/dist/client/navigation-root.d.ts +119 -0
  184. package/dist/client/navigation-root.d.ts.map +1 -0
  185. package/dist/client/nuqs-adapter.d.ts +1 -1
  186. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  187. package/dist/client/router-ref.d.ts +1 -1
  188. package/dist/client/router.d.ts +99 -14
  189. package/dist/client/router.d.ts.map +1 -1
  190. package/dist/client/rsc-fetch.d.ts +62 -15
  191. package/dist/client/rsc-fetch.d.ts.map +1 -1
  192. package/dist/client/segment-cache.d.ts +30 -7
  193. package/dist/client/segment-cache.d.ts.map +1 -1
  194. package/dist/client/segment-outlet.d.ts +57 -0
  195. package/dist/client/segment-outlet.d.ts.map +1 -0
  196. package/dist/client/segment-update-context.d.ts +21 -0
  197. package/dist/client/segment-update-context.d.ts.map +1 -0
  198. package/dist/client/shallow-url.d.ts +10 -0
  199. package/dist/client/shallow-url.d.ts.map +1 -0
  200. package/dist/client/slot-context.d.ts +31 -0
  201. package/dist/client/slot-context.d.ts.map +1 -0
  202. package/dist/client/slot-outlet.d.ts +16 -0
  203. package/dist/client/slot-outlet.d.ts.map +1 -0
  204. package/dist/client/slot-provider.d.ts +25 -0
  205. package/dist/client/slot-provider.d.ts.map +1 -0
  206. package/dist/client/ssr-data.d.ts +13 -4
  207. package/dist/client/ssr-data.d.ts.map +1 -1
  208. package/dist/client/state.d.ts +1 -1
  209. package/dist/client/top-loader.d.ts +5 -5
  210. package/dist/client/top-loader.d.ts.map +1 -1
  211. package/dist/client/use-cookie.d.ts +12 -0
  212. package/dist/client/use-cookie.d.ts.map +1 -1
  213. package/dist/client/use-link-status.d.ts +5 -5
  214. package/dist/client/use-link-status.d.ts.map +1 -1
  215. package/dist/client/use-pathname.d.ts.map +1 -1
  216. package/dist/client/use-pending-navigation.d.ts +23 -0
  217. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  218. package/dist/client/use-query-states.d.ts +1 -1
  219. package/dist/client/use-query-states.d.ts.map +1 -1
  220. package/dist/client/use-router.d.ts +1 -1
  221. package/dist/client/use-router.d.ts.map +1 -1
  222. package/dist/client/use-search-params.d.ts +12 -5
  223. package/dist/client/use-search-params.d.ts.map +1 -1
  224. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  225. package/dist/client/use-segment-params.d.ts.map +1 -0
  226. package/dist/codec.d.ts +69 -0
  227. package/dist/codec.d.ts.map +1 -0
  228. package/dist/codec.js +76 -0
  229. package/dist/codec.js.map +1 -0
  230. package/dist/config-types.d.ts +284 -0
  231. package/dist/config-types.d.ts.map +1 -0
  232. package/dist/config-validation.d.ts +51 -0
  233. package/dist/config-validation.d.ts.map +1 -0
  234. package/dist/content/index.d.ts +1 -10
  235. package/dist/content/index.d.ts.map +1 -1
  236. package/dist/content/index.js +0 -2
  237. package/dist/cookies/define-cookie.d.ts +58 -25
  238. package/dist/cookies/define-cookie.d.ts.map +1 -1
  239. package/dist/cookies/index.d.ts +2 -1
  240. package/dist/cookies/index.d.ts.map +1 -1
  241. package/dist/cookies/index.js +257 -36
  242. package/dist/cookies/index.js.map +1 -1
  243. package/dist/cookies/json-cookie.d.ts +64 -0
  244. package/dist/cookies/json-cookie.d.ts.map +1 -0
  245. package/dist/cookies/validation.d.ts +34 -0
  246. package/dist/cookies/validation.d.ts.map +1 -0
  247. package/dist/dev-tools/404-page.d.ts +50 -0
  248. package/dist/dev-tools/404-page.d.ts.map +1 -0
  249. package/dist/dev-tools/browser-logs.d.ts +40 -0
  250. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  251. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  252. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  253. package/dist/dev-tools/error-page.d.ts +32 -0
  254. package/dist/dev-tools/error-page.d.ts.map +1 -0
  255. package/dist/dev-tools/holding-server.d.ts +54 -0
  256. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  257. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  258. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  259. package/dist/dev-tools/index.d.ts +31 -0
  260. package/dist/dev-tools/index.d.ts.map +1 -0
  261. package/dist/dev-tools/instrumentation.d.ts +59 -0
  262. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  263. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  264. package/dist/dev-tools/logger.d.ts.map +1 -0
  265. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
  266. package/dist/dev-tools/logs.d.ts.map +1 -0
  267. package/dist/dev-tools/overlay.d.ts +91 -0
  268. package/dist/dev-tools/overlay.d.ts.map +1 -0
  269. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  270. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  271. package/dist/dev-tools/terminal.d.ts +28 -0
  272. package/dist/dev-tools/terminal.d.ts.map +1 -0
  273. package/dist/fonts/ast-walk.d.ts +68 -0
  274. package/dist/fonts/ast-walk.d.ts.map +1 -0
  275. package/dist/fonts/ast.d.ts +110 -6
  276. package/dist/fonts/ast.d.ts.map +1 -1
  277. package/dist/fonts/bundle.d.ts +50 -0
  278. package/dist/fonts/bundle.d.ts.map +1 -0
  279. package/dist/fonts/dev-middleware.d.ts +22 -0
  280. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  281. package/dist/fonts/fallbacks.d.ts +0 -7
  282. package/dist/fonts/fallbacks.d.ts.map +1 -1
  283. package/dist/fonts/google.d.ts +4 -2
  284. package/dist/fonts/google.d.ts.map +1 -1
  285. package/dist/fonts/local.d.ts +4 -4
  286. package/dist/fonts/local.d.ts.map +1 -1
  287. package/dist/fonts/paths.d.ts +43 -0
  288. package/dist/fonts/paths.d.ts.map +1 -0
  289. package/dist/fonts/pipeline.d.ts +177 -0
  290. package/dist/fonts/pipeline.d.ts.map +1 -0
  291. package/dist/fonts/transform.d.ts +82 -0
  292. package/dist/fonts/transform.d.ts.map +1 -0
  293. package/dist/fonts/types.d.ts +47 -1
  294. package/dist/fonts/types.d.ts.map +1 -1
  295. package/dist/fonts/virtual-modules.d.ts +77 -0
  296. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  297. package/dist/index.d.ts +46 -180
  298. package/dist/index.d.ts.map +1 -1
  299. package/dist/index.js +9243 -14093
  300. package/dist/index.js.map +1 -1
  301. package/dist/params/codec-registry.d.ts +26 -0
  302. package/dist/params/codec-registry.d.ts.map +1 -0
  303. package/dist/params/define-schema.d.ts +81 -0
  304. package/dist/params/define-schema.d.ts.map +1 -0
  305. package/dist/params/index.d.ts +5 -0
  306. package/dist/params/index.d.ts.map +1 -0
  307. package/dist/params/index.js +34 -0
  308. package/dist/params/index.js.map +1 -0
  309. package/dist/params/resolve-schema.d.ts +34 -0
  310. package/dist/params/resolve-schema.d.ts.map +1 -0
  311. package/dist/plugin-context.d.ts +217 -0
  312. package/dist/plugin-context.d.ts.map +1 -0
  313. package/dist/plugins/adapter-build.d.ts +21 -1
  314. package/dist/plugins/adapter-build.d.ts.map +1 -1
  315. package/dist/plugins/build-manifest.d.ts +7 -3
  316. package/dist/plugins/build-manifest.d.ts.map +1 -1
  317. package/dist/plugins/build-report.d.ts +43 -7
  318. package/dist/plugins/build-report.d.ts.map +1 -1
  319. package/dist/plugins/cache.d.ts +64 -0
  320. package/dist/plugins/cache.d.ts.map +1 -0
  321. package/dist/plugins/callsite-ast.d.ts +117 -0
  322. package/dist/plugins/callsite-ast.d.ts.map +1 -0
  323. package/dist/plugins/callsite-jsx.d.ts +35 -0
  324. package/dist/plugins/callsite-jsx.d.ts.map +1 -0
  325. package/dist/plugins/chunks.d.ts +11 -4
  326. package/dist/plugins/chunks.d.ts.map +1 -1
  327. package/dist/plugins/client-chunks.d.ts +40 -0
  328. package/dist/plugins/client-chunks.d.ts.map +1 -0
  329. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  330. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  331. package/dist/plugins/content.d.ts +1 -1
  332. package/dist/plugins/content.d.ts.map +1 -1
  333. package/dist/plugins/dev-server.d.ts +17 -1
  334. package/dist/plugins/dev-server.d.ts.map +1 -1
  335. package/dist/plugins/entries.d.ts +28 -4
  336. package/dist/plugins/entries.d.ts.map +1 -1
  337. package/dist/plugins/fonts.d.ts +16 -73
  338. package/dist/plugins/fonts.d.ts.map +1 -1
  339. package/dist/plugins/mdx.d.ts +1 -1
  340. package/dist/plugins/mdx.d.ts.map +1 -1
  341. package/dist/plugins/prebuilt-capture.d.ts +60 -0
  342. package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
  343. package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
  344. package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
  345. package/dist/plugins/prebuilt.d.ts +82 -0
  346. package/dist/plugins/prebuilt.d.ts.map +1 -0
  347. package/dist/plugins/prerender-sugar.d.ts +42 -0
  348. package/dist/plugins/prerender-sugar.d.ts.map +1 -0
  349. package/dist/plugins/request-dep.d.ts +21 -0
  350. package/dist/plugins/request-dep.d.ts.map +1 -0
  351. package/dist/plugins/routing.d.ts +1 -1
  352. package/dist/plugins/routing.d.ts.map +1 -1
  353. package/dist/plugins/server-bundle.d.ts.map +1 -1
  354. package/dist/plugins/shims.d.ts +29 -5
  355. package/dist/plugins/shims.d.ts.map +1 -1
  356. package/dist/plugins/static-build.d.ts +5 -26
  357. package/dist/plugins/static-build.d.ts.map +1 -1
  358. package/dist/routing/codegen-shared.d.ts +67 -0
  359. package/dist/routing/codegen-shared.d.ts.map +1 -0
  360. package/dist/routing/codegen-types.d.ts +64 -0
  361. package/dist/routing/codegen-types.d.ts.map +1 -0
  362. package/dist/routing/codegen.d.ts +7 -2
  363. package/dist/routing/codegen.d.ts.map +1 -1
  364. package/dist/routing/convention-lint.d.ts +41 -0
  365. package/dist/routing/convention-lint.d.ts.map +1 -0
  366. package/dist/routing/export-detect.d.ts +56 -0
  367. package/dist/routing/export-detect.d.ts.map +1 -0
  368. package/dist/routing/file-cache.d.ts +8 -0
  369. package/dist/routing/file-cache.d.ts.map +1 -0
  370. package/dist/routing/index.d.ts +7 -1
  371. package/dist/routing/index.d.ts.map +1 -1
  372. package/dist/routing/index.js +4 -2
  373. package/dist/routing/interception.d.ts +0 -5
  374. package/dist/routing/interception.d.ts.map +1 -1
  375. package/dist/routing/link-codegen.d.ts +90 -0
  376. package/dist/routing/link-codegen.d.ts.map +1 -0
  377. package/dist/routing/manifest-codegen.d.ts +32 -0
  378. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  379. package/dist/routing/scanner.d.ts +1 -10
  380. package/dist/routing/scanner.d.ts.map +1 -1
  381. package/dist/routing/schema-validation.d.ts +35 -0
  382. package/dist/routing/schema-validation.d.ts.map +1 -0
  383. package/dist/routing/segment-classify.d.ts +81 -0
  384. package/dist/routing/segment-classify.d.ts.map +1 -0
  385. package/dist/routing/segment-codegen.d.ts +38 -0
  386. package/dist/routing/segment-codegen.d.ts.map +1 -0
  387. package/dist/routing/types.d.ts +81 -25
  388. package/dist/routing/types.d.ts.map +1 -1
  389. package/dist/routing/walkers.d.ts +51 -0
  390. package/dist/routing/walkers.d.ts.map +1 -0
  391. package/dist/rsc-runtime/rsc.d.ts +1 -1
  392. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  393. package/dist/rsc-runtime/ssr.d.ts +12 -0
  394. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  395. package/dist/schema-bridge.d.ts +91 -0
  396. package/dist/schema-bridge.d.ts.map +1 -0
  397. package/dist/search-params/define.d.ts +188 -0
  398. package/dist/search-params/define.d.ts.map +1 -0
  399. package/dist/search-params/index.d.ts +4 -7
  400. package/dist/search-params/index.d.ts.map +1 -1
  401. package/dist/search-params/index.js +34 -441
  402. package/dist/search-params/index.js.map +1 -1
  403. package/dist/search-params/registry.d.ts +2 -2
  404. package/dist/search-params/registry.d.ts.map +1 -1
  405. package/dist/search-params/wrappers.d.ts +53 -0
  406. package/dist/search-params/wrappers.d.ts.map +1 -0
  407. package/dist/segment-params/define.d.ts +89 -0
  408. package/dist/segment-params/define.d.ts.map +1 -0
  409. package/dist/segment-params/index.d.ts +3 -0
  410. package/dist/segment-params/index.d.ts.map +1 -0
  411. package/dist/segment-params/index.js +2 -0
  412. package/dist/server/access-gate.d.ts +8 -3
  413. package/dist/server/access-gate.d.ts.map +1 -1
  414. package/dist/server/action-client.d.ts +42 -7
  415. package/dist/server/action-client.d.ts.map +1 -1
  416. package/dist/server/action-encryption.d.ts +76 -0
  417. package/dist/server/action-encryption.d.ts.map +1 -0
  418. package/dist/server/action-handler.d.ts +35 -1
  419. package/dist/server/action-handler.d.ts.map +1 -1
  420. package/dist/server/actions.d.ts +6 -30
  421. package/dist/server/actions.d.ts.map +1 -1
  422. package/dist/server/als-registry.d.ts +93 -11
  423. package/dist/server/als-registry.d.ts.map +1 -1
  424. package/dist/server/asset-headers.d.ts +8 -18
  425. package/dist/server/asset-headers.d.ts.map +1 -1
  426. package/dist/server/body-limits.d.ts.map +1 -1
  427. package/dist/server/build-manifest.d.ts +12 -29
  428. package/dist/server/build-manifest.d.ts.map +1 -1
  429. package/dist/server/canonicalize.d.ts +10 -0
  430. package/dist/server/canonicalize.d.ts.map +1 -1
  431. package/dist/server/coalesce-tick.d.ts +40 -0
  432. package/dist/server/coalesce-tick.d.ts.map +1 -0
  433. package/dist/server/cookie-context.d.ts +170 -0
  434. package/dist/server/cookie-context.d.ts.map +1 -0
  435. package/dist/server/cookie-parsing.d.ts +65 -0
  436. package/dist/server/cookie-parsing.d.ts.map +1 -0
  437. package/dist/server/csrf.d.ts +3 -2
  438. package/dist/server/csrf.d.ts.map +1 -1
  439. package/dist/server/default-logger.d.ts +22 -0
  440. package/dist/server/default-logger.d.ts.map +1 -0
  441. package/dist/server/deny-boundary.d.ts +117 -0
  442. package/dist/server/deny-boundary.d.ts.map +1 -0
  443. package/dist/server/deny-renderer.d.ts +2 -2
  444. package/dist/server/deny-renderer.d.ts.map +1 -1
  445. package/dist/server/dev-source-map.d.ts +22 -0
  446. package/dist/server/dev-source-map.d.ts.map +1 -0
  447. package/dist/server/early-hints-sender.d.ts.map +1 -1
  448. package/dist/server/early-hints.d.ts +13 -11
  449. package/dist/server/early-hints.d.ts.map +1 -1
  450. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  451. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  452. package/dist/server/fallback-error.d.ts +12 -7
  453. package/dist/server/fallback-error.d.ts.map +1 -1
  454. package/dist/server/flight-injection-state.d.ts +66 -0
  455. package/dist/server/flight-injection-state.d.ts.map +1 -0
  456. package/dist/server/flight-scripts.d.ts +42 -0
  457. package/dist/server/flight-scripts.d.ts.map +1 -0
  458. package/dist/server/form-data.d.ts +41 -0
  459. package/dist/server/form-data.d.ts.map +1 -1
  460. package/dist/server/html-injector-core.d.ts +242 -0
  461. package/dist/server/html-injector-core.d.ts.map +1 -0
  462. package/dist/server/html-injectors.d.ts +82 -41
  463. package/dist/server/html-injectors.d.ts.map +1 -1
  464. package/dist/server/index.d.ts +11 -47
  465. package/dist/server/index.d.ts.map +1 -1
  466. package/dist/server/index.js +182 -2906
  467. package/dist/server/index.js.map +1 -1
  468. package/dist/server/internal.d.ts +49 -0
  469. package/dist/server/internal.d.ts.map +1 -0
  470. package/dist/server/internal.js +3892 -0
  471. package/dist/server/internal.js.map +1 -0
  472. package/dist/server/logger.d.ts +39 -7
  473. package/dist/server/logger.d.ts.map +1 -1
  474. package/dist/server/metadata-routes.d.ts +60 -11
  475. package/dist/server/metadata-routes.d.ts.map +1 -1
  476. package/dist/server/metadata.d.ts +8 -0
  477. package/dist/server/metadata.d.ts.map +1 -1
  478. package/dist/server/middleware-runner.d.ts +19 -4
  479. package/dist/server/middleware-runner.d.ts.map +1 -1
  480. package/dist/server/node-stream-transforms.d.ts +119 -0
  481. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  482. package/dist/server/param-coercion.d.ts +54 -0
  483. package/dist/server/param-coercion.d.ts.map +1 -0
  484. package/dist/server/pipeline-helpers.d.ts +95 -0
  485. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  486. package/dist/server/pipeline-interception.d.ts +1 -1
  487. package/dist/server/pipeline-interception.d.ts.map +1 -1
  488. package/dist/server/pipeline-metadata.d.ts +6 -0
  489. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  490. package/dist/server/pipeline-outcome.d.ts +49 -0
  491. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  492. package/dist/server/pipeline-phases.d.ts +59 -0
  493. package/dist/server/pipeline-phases.d.ts.map +1 -0
  494. package/dist/server/pipeline.d.ts +140 -19
  495. package/dist/server/pipeline.d.ts.map +1 -1
  496. package/dist/server/port-resolution.d.ts +117 -0
  497. package/dist/server/port-resolution.d.ts.map +1 -0
  498. package/dist/server/prebuilt/cache-key.d.ts +62 -0
  499. package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
  500. package/dist/server/prebuilt/capture-state.d.ts +57 -0
  501. package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
  502. package/dist/server/prebuilt/key-discipline.d.ts +23 -0
  503. package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
  504. package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
  505. package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
  506. package/dist/server/prebuilt/overlay.d.ts +100 -0
  507. package/dist/server/prebuilt/overlay.d.ts.map +1 -0
  508. package/dist/server/prebuilt/payload-source.d.ts +78 -0
  509. package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
  510. package/dist/server/prebuilt/slots.d.ts +99 -0
  511. package/dist/server/prebuilt/slots.d.ts.map +1 -0
  512. package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
  513. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
  514. package/dist/server/prebuilt-builder.d.ts +120 -0
  515. package/dist/server/prebuilt-builder.d.ts.map +1 -0
  516. package/dist/server/prebuilt-runtime.d.ts +111 -0
  517. package/dist/server/prebuilt-runtime.d.ts.map +1 -0
  518. package/dist/server/primitives.d.ts +88 -43
  519. package/dist/server/primitives.d.ts.map +1 -1
  520. package/dist/server/render-timeout.d.ts +51 -0
  521. package/dist/server/render-timeout.d.ts.map +1 -0
  522. package/dist/server/render-utils.d.ts +25 -0
  523. package/dist/server/render-utils.d.ts.map +1 -0
  524. package/dist/server/request-context.d.ts +62 -107
  525. package/dist/server/request-context.d.ts.map +1 -1
  526. package/dist/server/request-dep.d.ts +15 -0
  527. package/dist/server/request-dep.d.ts.map +1 -0
  528. package/dist/server/route-element-builder.d.ts +53 -25
  529. package/dist/server/route-element-builder.d.ts.map +1 -1
  530. package/dist/server/route-handler.d.ts.map +1 -1
  531. package/dist/server/route-matcher.d.ts +25 -36
  532. package/dist/server/route-matcher.d.ts.map +1 -1
  533. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  534. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  535. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  536. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  537. package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
  538. package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
  539. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  540. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  541. package/dist/server/rsc-entry/helpers.d.ts +69 -37
  542. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  543. package/dist/server/rsc-entry/index.d.ts +28 -6
  544. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  545. package/dist/server/rsc-entry/render-route.d.ts +51 -0
  546. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  547. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  548. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  549. package/dist/server/rsc-entry/rsc-payload.d.ts +6 -6
  550. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  551. package/dist/server/rsc-entry/rsc-stream.d.ts +25 -1
  552. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  553. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  554. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  555. package/dist/server/rsc-entry/ssr-renderer.d.ts +36 -4
  556. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  557. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
  558. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  559. package/dist/server/safe-load.d.ts +46 -0
  560. package/dist/server/safe-load.d.ts.map +1 -0
  561. package/dist/server/sensitive-fields.d.ts +74 -0
  562. package/dist/server/sensitive-fields.d.ts.map +1 -0
  563. package/dist/server/sitemap-generator.d.ts +129 -0
  564. package/dist/server/sitemap-generator.d.ts.map +1 -0
  565. package/dist/server/sitemap-handler.d.ts +22 -0
  566. package/dist/server/sitemap-handler.d.ts.map +1 -0
  567. package/dist/server/slot-resolver.d.ts +66 -5
  568. package/dist/server/slot-resolver.d.ts.map +1 -1
  569. package/dist/server/ssr-bridge-types.d.ts +121 -0
  570. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  571. package/dist/server/ssr-entry.d.ts +2 -43
  572. package/dist/server/ssr-entry.d.ts.map +1 -1
  573. package/dist/server/ssr-render.d.ts +64 -21
  574. package/dist/server/ssr-render.d.ts.map +1 -1
  575. package/dist/server/ssr-wrappers.d.ts +50 -0
  576. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  577. package/dist/server/state-tree-diff.d.ts +72 -9
  578. package/dist/server/state-tree-diff.d.ts.map +1 -1
  579. package/dist/server/status-code-resolver.d.ts +22 -11
  580. package/dist/server/status-code-resolver.d.ts.map +1 -1
  581. package/dist/server/stream-utils.d.ts +47 -0
  582. package/dist/server/stream-utils.d.ts.map +1 -0
  583. package/dist/server/tracing.d.ts +44 -9
  584. package/dist/server/tracing.d.ts.map +1 -1
  585. package/dist/server/tree-builder.d.ts +69 -30
  586. package/dist/server/tree-builder.d.ts.map +1 -1
  587. package/dist/server/tree-match.d.ts +49 -0
  588. package/dist/server/tree-match.d.ts.map +1 -0
  589. package/dist/server/types.d.ts +71 -6
  590. package/dist/server/types.d.ts.map +1 -1
  591. package/dist/server/utils/escape-html.d.ts +14 -0
  592. package/dist/server/utils/escape-html.d.ts.map +1 -0
  593. package/dist/server/utils/mdx-file.d.ts +15 -0
  594. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  595. package/dist/server/version-skew.d.ts +61 -0
  596. package/dist/server/version-skew.d.ts.map +1 -0
  597. package/dist/server/workers-cache-bridge.d.ts +26 -0
  598. package/dist/server/workers-cache-bridge.d.ts.map +1 -0
  599. package/dist/shared/href-validation.d.ts +49 -0
  600. package/dist/shared/href-validation.d.ts.map +1 -0
  601. package/dist/shared/merge-search-params.d.ts +22 -0
  602. package/dist/shared/merge-search-params.d.ts.map +1 -0
  603. package/dist/shared/redirect-type.d.ts +17 -0
  604. package/dist/shared/redirect-type.d.ts.map +1 -0
  605. package/dist/shims/font-google.d.ts +1 -1
  606. package/dist/shims/font-google.d.ts.map +1 -1
  607. package/dist/shims/font-google.js +42 -0
  608. package/dist/shims/font-google.js.map +1 -0
  609. package/dist/shims/font-local.d.ts +26 -0
  610. package/dist/shims/font-local.d.ts.map +1 -0
  611. package/dist/shims/font-local.js +20 -0
  612. package/dist/shims/font-local.js.map +1 -0
  613. package/dist/shims/headers.d.ts +53 -1
  614. package/dist/shims/headers.d.ts.map +1 -1
  615. package/dist/shims/image.d.ts +120 -120
  616. package/dist/shims/image.d.ts.map +1 -1
  617. package/dist/shims/navigation-client.d.ts +35 -11
  618. package/dist/shims/navigation-client.d.ts.map +1 -1
  619. package/dist/shims/navigation.d.ts +11 -5
  620. package/dist/shims/navigation.d.ts.map +1 -1
  621. package/dist/utils/state-machine.d.ts +80 -0
  622. package/dist/utils/state-machine.d.ts.map +1 -0
  623. package/docs/api/30-api-server.mdx +233 -0
  624. package/docs/api/31-api-client.mdx +161 -0
  625. package/docs/api/32-api-cache.mdx +311 -0
  626. package/docs/api/33-api-search-params.mdx +154 -0
  627. package/docs/api/34-api-config.mdx +325 -0
  628. package/docs/api/35-api-typescript.mdx +170 -0
  629. package/docs/api/36-cli.mdx +143 -0
  630. package/docs/learn/00-introduction.mdx +109 -0
  631. package/docs/learn/01-quick-start.mdx +94 -0
  632. package/docs/learn/02-pages-and-layouts.mdx +147 -0
  633. package/docs/learn/03-fetching-data.mdx +211 -0
  634. package/docs/learn/03b-access-control.mdx +130 -0
  635. package/docs/learn/04-loading-states.mdx +67 -0
  636. package/docs/learn/04b-the-flush-point.mdx +115 -0
  637. package/docs/learn/05-typed-params.mdx +275 -0
  638. package/docs/learn/06-forms-and-actions.mdx +146 -0
  639. package/docs/learn/07-typed-routes.mdx +127 -0
  640. package/docs/learn/08-streaming.mdx +146 -0
  641. package/docs/learn/09-caching.mdx +252 -0
  642. package/docs/learn/10-middleware.mdx +157 -0
  643. package/docs/learn/11-error-handling.mdx +156 -0
  644. package/docs/learn/12-client-navigation.mdx +176 -0
  645. package/docs/learn/13-configuration.mdx +162 -0
  646. package/docs/learn/14-deploying.mdx +264 -0
  647. package/docs/more/01-advanced-routing.mdx +173 -0
  648. package/docs/more/02-advanced-forms.mdx +137 -0
  649. package/docs/more/03-coming-from-nextjs.mdx +186 -0
  650. package/docs/more/04-metadata-and-fonts.mdx +193 -0
  651. package/docs/more/04b-mdx.mdx +209 -0
  652. package/docs/more/05-content-collections.mdx +90 -0
  653. package/docs/more/06-instrumentation.mdx +214 -0
  654. package/docs/more/07-security.mdx +129 -0
  655. package/docs/more/08-developer-experience.mdx +134 -0
  656. package/docs/more/40-why-timber.mdx +50 -0
  657. package/docs/more/41-timber-vs-nextjs.mdx +81 -0
  658. package/docs/more/42-timber-vs-others.mdx +68 -0
  659. package/docs/more/50-ai-agent-instructions.mdx +169 -0
  660. package/llms.txt +55 -0
  661. package/package.json +105 -26
  662. package/src/adapters/build-output-helper.ts +199 -0
  663. package/src/adapters/cloudflare-dev.ts +177 -0
  664. package/src/adapters/cloudflare-kv-cache.ts +204 -0
  665. package/src/adapters/cloudflare.ts +620 -129
  666. package/src/adapters/compress-module.ts +27 -92
  667. package/src/adapters/nitro.ts +266 -122
  668. package/src/adapters/raw-imports.d.ts +5 -0
  669. package/src/adapters/shared.ts +68 -0
  670. package/src/adapters/types.ts +2 -7
  671. package/src/adapters/wrangler.d.ts +7 -0
  672. package/src/cache/cache-api.ts +107 -0
  673. package/src/cache/handler-store.ts +76 -0
  674. package/src/cache/index.ts +114 -21
  675. package/src/cache/invalidation-epoch.ts +93 -0
  676. package/src/cache/json-lossy-check.ts +75 -0
  677. package/src/cache/redis-handler.ts +197 -19
  678. package/src/cache/singleflight.ts +64 -6
  679. package/src/cache/sizeof.ts +33 -0
  680. package/src/cache/stable-stringify.ts +65 -2
  681. package/src/cache/store.ts +71 -0
  682. package/src/cache/stores/cloudflare-kv.ts +52 -0
  683. package/src/cache/stores/memory.ts +125 -0
  684. package/src/cache/stores/redis.ts +97 -0
  685. package/src/cache/stores/vercel.ts +59 -0
  686. package/src/cache/tag-aware-handler.ts +237 -0
  687. package/src/cache/timber-cache.ts +161 -36
  688. package/src/cdn/cloudflare-purge.ts +50 -0
  689. package/src/cdn/fastly-purge.ts +63 -0
  690. package/src/cdn/headers.ts +153 -0
  691. package/src/cdn/index.ts +17 -0
  692. package/src/cdn/purge-store.ts +34 -0
  693. package/src/cdn/workers-cache-purge.ts +30 -0
  694. package/src/cli-schema-sync.ts +401 -0
  695. package/src/cli.ts +167 -34
  696. package/src/client/browser-dev.ts +156 -1
  697. package/src/client/browser-entry/action-dispatch.ts +124 -0
  698. package/src/client/browser-entry/hmr.ts +70 -0
  699. package/src/client/browser-entry/hydrate.ts +187 -0
  700. package/src/client/browser-entry/index.ts +113 -0
  701. package/src/client/browser-entry/post-hydration.ts +110 -0
  702. package/src/client/browser-entry/router-init.ts +286 -0
  703. package/src/client/browser-entry/rsc-stream.ts +157 -0
  704. package/src/client/browser-entry/scroll.ts +50 -0
  705. package/src/client/error-boundary.tsx +127 -22
  706. package/src/client/error-reconstituter.tsx +79 -0
  707. package/src/client/form.tsx +31 -32
  708. package/src/client/history.ts +21 -6
  709. package/src/client/index.ts +67 -45
  710. package/src/client/internal.ts +58 -0
  711. package/src/client/link.tsx +349 -150
  712. package/src/client/navigation-api.ts +345 -0
  713. package/src/client/navigation-context.ts +15 -7
  714. package/src/client/navigation-root.tsx +355 -0
  715. package/src/client/nuqs-adapter.tsx +16 -3
  716. package/src/client/router-ref.ts +1 -1
  717. package/src/client/router.ts +589 -215
  718. package/src/client/rsc-fetch.ts +251 -34
  719. package/src/client/segment-cache.ts +105 -17
  720. package/src/client/segment-outlet.tsx +141 -0
  721. package/src/client/segment-update-context.ts +42 -0
  722. package/src/client/shallow-url.ts +22 -0
  723. package/src/client/slot-context.ts +50 -0
  724. package/src/client/slot-outlet.tsx +22 -0
  725. package/src/client/slot-provider.tsx +32 -0
  726. package/src/client/ssr-data.ts +13 -5
  727. package/src/client/state.ts +2 -2
  728. package/src/client/top-loader.tsx +11 -9
  729. package/src/client/use-cookie.ts +60 -15
  730. package/src/client/use-link-status.ts +7 -7
  731. package/src/client/use-pathname.ts +1 -0
  732. package/src/client/use-pending-navigation.ts +40 -0
  733. package/src/client/use-query-states.ts +108 -10
  734. package/src/client/use-router.ts +4 -1
  735. package/src/client/use-search-params.ts +31 -44
  736. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  737. package/src/codec.ts +149 -0
  738. package/src/config-types.ts +282 -0
  739. package/src/config-validation.ts +330 -0
  740. package/src/content/index.ts +5 -13
  741. package/src/cookies/define-cookie.ts +217 -53
  742. package/src/cookies/index.ts +12 -1
  743. package/src/cookies/json-cookie.ts +105 -0
  744. package/src/cookies/validation.ts +192 -0
  745. package/src/dev-tools/404-page.ts +286 -0
  746. package/src/dev-tools/browser-logs.ts +55 -0
  747. package/src/dev-tools/dev-page-shell.ts +260 -0
  748. package/src/dev-tools/error-page.ts +331 -0
  749. package/src/dev-tools/holding-server.ts +187 -0
  750. package/src/dev-tools/hydration-overlay.ts +158 -0
  751. package/src/dev-tools/index.ts +83 -0
  752. package/src/dev-tools/instrumentation.ts +213 -0
  753. package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
  754. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
  755. package/src/dev-tools/overlay.ts +469 -0
  756. package/src/dev-tools/stack-classifier.ts +75 -0
  757. package/src/dev-tools/terminal.ts +182 -0
  758. package/src/fonts/ast-walk.ts +235 -0
  759. package/src/fonts/ast.ts +477 -126
  760. package/src/fonts/bundle.ts +138 -0
  761. package/src/fonts/dev-middleware.ts +85 -0
  762. package/src/fonts/fallbacks.ts +0 -23
  763. package/src/fonts/google.ts +100 -18
  764. package/src/fonts/local.ts +9 -8
  765. package/src/fonts/paths.ts +58 -0
  766. package/src/fonts/pipeline.ts +348 -0
  767. package/src/fonts/transform.ts +311 -0
  768. package/src/fonts/types.ts +52 -1
  769. package/src/fonts/virtual-modules.ts +179 -0
  770. package/src/index.ts +446 -352
  771. package/src/params/codec-registry.ts +34 -0
  772. package/src/params/define-schema.ts +115 -0
  773. package/src/params/index.ts +17 -0
  774. package/src/params/resolve-schema.ts +84 -0
  775. package/src/plugin-context.ts +432 -0
  776. package/src/plugins/adapter-build.ts +220 -7
  777. package/src/plugins/build-manifest.ts +177 -23
  778. package/src/plugins/build-report.ts +253 -35
  779. package/src/plugins/cache.ts +243 -0
  780. package/src/plugins/callsite-ast.ts +472 -0
  781. package/src/plugins/callsite-jsx.ts +243 -0
  782. package/src/plugins/chunks.ts +74 -5
  783. package/src/plugins/client-chunks.ts +185 -0
  784. package/src/plugins/cloudflare-wasm.ts +141 -0
  785. package/src/plugins/content.ts +1 -1
  786. package/src/plugins/dev-server.ts +284 -94
  787. package/src/plugins/entries.ts +134 -16
  788. package/src/plugins/fonts.ts +225 -660
  789. package/src/plugins/mdx.ts +47 -10
  790. package/src/plugins/prebuilt-capture.ts +217 -0
  791. package/src/plugins/prebuilt-options-analysis.ts +175 -0
  792. package/src/plugins/prebuilt.ts +655 -0
  793. package/src/plugins/prerender-sugar.ts +328 -0
  794. package/src/plugins/request-dep.ts +458 -0
  795. package/src/plugins/routing.ts +237 -241
  796. package/src/plugins/server-bundle.ts +89 -12
  797. package/src/plugins/shims.ts +241 -64
  798. package/src/plugins/static-build.ts +15 -90
  799. package/src/routing/codegen-shared.ts +115 -0
  800. package/src/routing/codegen-types.ts +65 -0
  801. package/src/routing/codegen.ts +372 -178
  802. package/src/routing/convention-lint.ts +394 -0
  803. package/src/routing/export-detect.ts +304 -0
  804. package/src/routing/file-cache.ts +23 -0
  805. package/src/routing/index.ts +10 -1
  806. package/src/routing/interception.ts +3 -22
  807. package/src/routing/link-codegen.ts +313 -0
  808. package/src/routing/manifest-codegen.ts +287 -0
  809. package/src/routing/scanner.ts +338 -189
  810. package/src/routing/schema-validation.ts +155 -0
  811. package/src/routing/segment-classify.ts +223 -0
  812. package/src/routing/segment-codegen.ts +98 -0
  813. package/src/routing/types.ts +82 -25
  814. package/src/routing/walkers.ts +90 -0
  815. package/src/rsc-runtime/rsc.ts +9 -0
  816. package/src/rsc-runtime/ssr.ts +50 -0
  817. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  818. package/src/schema-bridge.ts +253 -0
  819. package/src/search-params/define.ts +576 -0
  820. package/src/search-params/index.ts +14 -20
  821. package/src/search-params/registry.ts +2 -2
  822. package/src/search-params/wrappers.ts +101 -0
  823. package/src/segment-params/define.ts +249 -0
  824. package/src/segment-params/index.ts +9 -0
  825. package/src/server/access-gate.tsx +111 -34
  826. package/src/server/action-client.ts +120 -29
  827. package/src/server/action-encryption.ts +144 -0
  828. package/src/server/action-handler.ts +123 -33
  829. package/src/server/actions.ts +48 -54
  830. package/src/server/als-registry.ts +137 -20
  831. package/src/server/asset-headers.ts +15 -37
  832. package/src/server/body-limits.ts +10 -2
  833. package/src/server/build-manifest.ts +19 -56
  834. package/src/server/canonicalize.ts +6 -3
  835. package/src/server/coalesce-tick.ts +75 -0
  836. package/src/server/compress.ts +34 -7
  837. package/src/server/cookie-context.ts +484 -0
  838. package/src/server/cookie-parsing.ts +163 -0
  839. package/src/server/csrf.ts +39 -6
  840. package/src/server/default-logger.ts +99 -0
  841. package/src/server/deny-boundary.ts +314 -0
  842. package/src/server/deny-renderer.ts +85 -77
  843. package/src/server/dev-source-map.ts +31 -0
  844. package/src/server/early-hints-sender.ts +3 -2
  845. package/src/server/early-hints.ts +37 -27
  846. package/src/server/error-boundary-wrapper.ts +61 -22
  847. package/src/server/fallback-error.ts +79 -102
  848. package/src/server/flight-injection-state.ts +113 -0
  849. package/src/server/flight-scripts.ts +62 -0
  850. package/src/server/form-data.ts +124 -12
  851. package/src/server/html-injector-core.ts +495 -0
  852. package/src/server/html-injectors.ts +271 -254
  853. package/src/server/index.ts +31 -185
  854. package/src/server/internal.ts +181 -0
  855. package/src/server/logger.ts +72 -36
  856. package/src/server/metadata-routes.ts +205 -24
  857. package/src/server/metadata.ts +21 -0
  858. package/src/server/middleware-runner.ts +31 -4
  859. package/src/server/node-stream-transforms.ts +336 -0
  860. package/src/server/param-coercion.ts +207 -0
  861. package/src/server/pipeline-helpers.ts +204 -0
  862. package/src/server/pipeline-interception.ts +45 -18
  863. package/src/server/pipeline-metadata.ts +14 -0
  864. package/src/server/pipeline-outcome.ts +197 -0
  865. package/src/server/pipeline-phases.ts +545 -0
  866. package/src/server/pipeline.ts +274 -382
  867. package/src/server/port-resolution.ts +215 -0
  868. package/src/server/prebuilt/cache-key.ts +298 -0
  869. package/src/server/prebuilt/capture-state.ts +89 -0
  870. package/src/server/prebuilt/key-discipline.ts +53 -0
  871. package/src/server/prebuilt/manifest-tag-index.ts +46 -0
  872. package/src/server/prebuilt/overlay.ts +256 -0
  873. package/src/server/prebuilt/payload-source.ts +201 -0
  874. package/src/server/prebuilt/slots.ts +190 -0
  875. package/src/server/prebuilt/synthetic-store.ts +121 -0
  876. package/src/server/prebuilt-builder.ts +809 -0
  877. package/src/server/prebuilt-runtime.ts +815 -0
  878. package/src/server/primitives.ts +160 -83
  879. package/src/server/render-timeout.ts +108 -0
  880. package/src/server/render-utils.ts +31 -0
  881. package/src/server/request-context.ts +170 -337
  882. package/src/server/request-dep.ts +37 -0
  883. package/src/server/route-element-builder.ts +699 -295
  884. package/src/server/route-handler.ts +31 -4
  885. package/src/server/route-matcher.ts +158 -277
  886. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  887. package/src/server/rsc-entry/api-handler.ts +69 -32
  888. package/src/server/rsc-entry/deny-fallback.ts +92 -0
  889. package/src/server/rsc-entry/error-renderer.ts +306 -89
  890. package/src/server/rsc-entry/helpers.ts +210 -85
  891. package/src/server/rsc-entry/index.ts +332 -332
  892. package/src/server/rsc-entry/render-route.ts +300 -0
  893. package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
  894. package/src/server/rsc-entry/rsc-payload.ts +102 -42
  895. package/src/server/rsc-entry/rsc-stream.ts +93 -13
  896. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  897. package/src/server/rsc-entry/ssr-renderer.ts +275 -43
  898. package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
  899. package/src/server/safe-load.ts +60 -0
  900. package/src/server/sensitive-fields.ts +230 -0
  901. package/src/server/server-only-guard-noop.js +3 -0
  902. package/src/server/sitemap-generator.ts +345 -0
  903. package/src/server/sitemap-handler.ts +157 -0
  904. package/src/server/slot-resolver.ts +574 -250
  905. package/src/server/ssr-bridge-types.ts +124 -0
  906. package/src/server/ssr-entry.ts +206 -86
  907. package/src/server/ssr-render.ts +345 -86
  908. package/src/server/ssr-wrappers.tsx +141 -0
  909. package/src/server/state-tree-diff.ts +177 -30
  910. package/src/server/status-code-resolver.ts +115 -130
  911. package/src/server/stream-utils.ts +288 -0
  912. package/src/server/tracing.ts +126 -14
  913. package/src/server/tree-builder.ts +214 -90
  914. package/src/server/tree-match.ts +262 -0
  915. package/src/server/types.ts +78 -9
  916. package/src/server/utils/escape-html.ts +20 -0
  917. package/src/server/utils/mdx-file.ts +22 -0
  918. package/src/server/version-skew.ts +104 -0
  919. package/src/server/workers-cache-bridge.ts +33 -0
  920. package/src/shared/href-validation.ts +159 -0
  921. package/src/shared/merge-search-params.ts +55 -0
  922. package/src/shared/redirect-type.ts +17 -0
  923. package/src/shims/font-google.ts +1 -1
  924. package/src/shims/font-local.ts +34 -0
  925. package/src/shims/headers.ts +122 -1
  926. package/src/shims/navigation-client.ts +51 -29
  927. package/src/shims/navigation.ts +14 -7
  928. package/src/utils/state-machine.ts +111 -0
  929. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  930. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  931. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  932. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  933. package/dist/_chunks/format-RyoGQL74.js +0 -164
  934. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  935. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  936. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  937. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
  938. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  939. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  940. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  941. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  942. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  943. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  944. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  945. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  946. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  947. package/dist/adapters/cloudflare.js.map +0 -1
  948. package/dist/cache/index.js.map +0 -1
  949. package/dist/cache/register-cached-function.d.ts +0 -17
  950. package/dist/cache/register-cached-function.d.ts.map +0 -1
  951. package/dist/client/browser-entry.d.ts +0 -21
  952. package/dist/client/browser-entry.d.ts.map +0 -1
  953. package/dist/client/head.d.ts +0 -16
  954. package/dist/client/head.d.ts.map +0 -1
  955. package/dist/client/link-status-provider.d.ts +0 -11
  956. package/dist/client/link-status-provider.d.ts.map +0 -1
  957. package/dist/client/segment-merger.d.ts +0 -119
  958. package/dist/client/segment-merger.d.ts.map +0 -1
  959. package/dist/client/stale-reload.d.ts +0 -44
  960. package/dist/client/stale-reload.d.ts.map +0 -1
  961. package/dist/client/transition-root.d.ts +0 -74
  962. package/dist/client/transition-root.d.ts.map +0 -1
  963. package/dist/client/use-navigation-pending.d.ts +0 -26
  964. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  965. package/dist/client/use-params.d.ts.map +0 -1
  966. package/dist/plugins/cache-transform.d.ts +0 -36
  967. package/dist/plugins/cache-transform.d.ts.map +0 -1
  968. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  969. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  970. package/dist/plugins/dev-logs.d.ts.map +0 -1
  971. package/dist/plugins/dynamic-transform.d.ts +0 -72
  972. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  973. package/dist/plugins/server-action-exports.d.ts +0 -26
  974. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  975. package/dist/routing/status-file-lint.d.ts +0 -33
  976. package/dist/routing/status-file-lint.d.ts.map +0 -1
  977. package/dist/search-params/analyze.d.ts +0 -54
  978. package/dist/search-params/analyze.d.ts.map +0 -1
  979. package/dist/search-params/builtin-codecs.d.ts +0 -105
  980. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  981. package/dist/search-params/codecs.d.ts +0 -53
  982. package/dist/search-params/codecs.d.ts.map +0 -1
  983. package/dist/search-params/create.d.ts +0 -106
  984. package/dist/search-params/create.d.ts.map +0 -1
  985. package/dist/server/client-module-map.d.ts +0 -47
  986. package/dist/server/client-module-map.d.ts.map +0 -1
  987. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  988. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  989. package/dist/server/dev-logger.d.ts.map +0 -1
  990. package/dist/server/dev-span-processor.d.ts +0 -29
  991. package/dist/server/dev-span-processor.d.ts.map +0 -1
  992. package/dist/server/dev-warnings.d.ts +0 -129
  993. package/dist/server/dev-warnings.d.ts.map +0 -1
  994. package/dist/server/flush.d.ts +0 -74
  995. package/dist/server/flush.d.ts.map +0 -1
  996. package/dist/server/manifest-status-resolver.d.ts +0 -58
  997. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  998. package/dist/server/prerender.d.ts +0 -77
  999. package/dist/server/prerender.d.ts.map +0 -1
  1000. package/dist/utils/directive-parser.d.ts +0 -70
  1001. package/dist/utils/directive-parser.d.ts.map +0 -1
  1002. package/src/cache/register-cached-function.ts +0 -103
  1003. package/src/client/browser-entry.ts +0 -678
  1004. package/src/client/head.ts +0 -61
  1005. package/src/client/link-status-provider.tsx +0 -30
  1006. package/src/client/segment-merger.ts +0 -339
  1007. package/src/client/stale-reload.ts +0 -87
  1008. package/src/client/transition-root.tsx +0 -166
  1009. package/src/client/use-navigation-pending.ts +0 -38
  1010. package/src/plugins/cache-transform.ts +0 -199
  1011. package/src/plugins/dev-error-overlay.ts +0 -230
  1012. package/src/plugins/dynamic-transform.ts +0 -161
  1013. package/src/plugins/server-action-exports.ts +0 -220
  1014. package/src/routing/status-file-lint.ts +0 -112
  1015. package/src/search-params/analyze.ts +0 -192
  1016. package/src/search-params/builtin-codecs.ts +0 -228
  1017. package/src/search-params/codecs.ts +0 -153
  1018. package/src/search-params/create.ts +0 -321
  1019. package/src/server/client-module-map.ts +0 -58
  1020. package/src/server/dev-fetch-instrumentation.ts +0 -96
  1021. package/src/server/dev-span-processor.ts +0 -78
  1022. package/src/server/dev-warnings.ts +0 -283
  1023. package/src/server/flush.ts +0 -182
  1024. package/src/server/manifest-status-resolver.ts +0 -215
  1025. package/src/server/prerender.ts +0 -139
  1026. package/src/utils/directive-parser.ts +0 -529
@@ -0,0 +1,938 @@
1
+ import { t as bindUseQueryStates } from "../_chunks/use-query-states-DFvWd-EA.js";
2
+ import { c as cachedSearchParams, i as _setCachedSearch, n as getSsrData, r as setSsrData, s as cachedSearch, t as clearSsrData } from "../_chunks/ssr-data-BOWsq18U.js";
3
+ import { a as setNavigationState, i as getNavigationState, o as useNavigationContext, r as NavigationProvider, t as setCurrentParams } from "../_chunks/use-segment-params-D1CzlgBo.js";
4
+ import { n as getRouterOrNull, r as setGlobalRouter, t as getRouter } from "../_chunks/router-ref-CtmF-aPv.js";
5
+ import { TimberErrorBoundary } from "./error-boundary.js";
6
+ import { n as useSegmentContext, t as SegmentProvider } from "../_chunks/segment-context-ZDnXDkbz.js";
7
+ import { n as supersedeNavigationTransitions, t as setHardNavigating } from "../_chunks/navigation-root-bUDZLw74.js";
8
+ //#region src/client/segment-cache.ts
9
+ /**
10
+ * Maintains the client-side segment tree representing currently mounted
11
+ * layouts and pages. Used for navigation reconciliation — the router diffs
12
+ * new routes against this tree to determine which segments to re-fetch.
13
+ */
14
+ var SegmentCache = class {
15
+ root;
16
+ get(segment) {
17
+ if (segment === "/" || segment === this.root?.segment) return this.root;
18
+ }
19
+ set(segment, node) {
20
+ if (segment === "/" || !this.root) this.root = node;
21
+ }
22
+ clear() {
23
+ this.root = void 0;
24
+ }
25
+ /**
26
+ * Serialize the mounted segment tree for the X-Timber-State-Tree header.
27
+ * Only includes sync segments — async segments are excluded because the
28
+ * server must always re-render them (they may depend on request context).
29
+ *
30
+ * When mergeableFilter is provided, only segments whose paths are in the
31
+ * set are included. This ensures the server only skips segments that the
32
+ * client can actually merge (i.e., segments whose cached element tree
33
+ * contains an inner SegmentProvider the merger can splice into).
34
+ *
35
+ * This is a performance optimization only, NOT a security boundary.
36
+ * The server always runs all access.ts files regardless of the state tree.
37
+ */
38
+ serializeStateTree(mergeableFilter) {
39
+ const segments = [];
40
+ const slots = [];
41
+ if (this.root) {
42
+ collectSyncSegments(this.root, segments, mergeableFilter);
43
+ collectSyncSlots(this.root, slots);
44
+ }
45
+ const tree = { segments };
46
+ if (slots.length > 0) tree.slots = slots;
47
+ return tree;
48
+ }
49
+ };
50
+ /** Recursively collect sync segment paths from the tree */
51
+ function collectSyncSegments(node, out, mergeableFilter) {
52
+ if (!node.isRequestDependent && (!mergeableFilter || mergeableFilter.has(node.segment))) out.push(node.segment);
53
+ for (const child of node.children.values()) collectSyncSegments(child, out, mergeableFilter);
54
+ }
55
+ /** Recursively collect cacheable slot paths from the tree */
56
+ function collectSyncSlots(node, out) {
57
+ if (node.slots) {
58
+ for (const slot of node.slots.values()) if (!slot.isRequestDependent && !slot.denied) out.push(slot.segment);
59
+ }
60
+ for (const child of node.children.values()) collectSyncSlots(child, out);
61
+ }
62
+ /**
63
+ * Build a SegmentNode tree from flat segment metadata.
64
+ *
65
+ * Takes an ordered list of segment descriptors (root → leaf) from the
66
+ * server's X-Timber-Segments header and constructs the hierarchical
67
+ * tree structure that SegmentCache expects.
68
+ *
69
+ * Each segment is nested as a child of the previous one, forming a
70
+ * linear chain from root to leaf. The leaf segment (page) is excluded
71
+ * from the tree — pages are never cached across navigations.
72
+ */
73
+ function buildSegmentTree(segments) {
74
+ if (segments.length === 0) return void 0;
75
+ const segmentEntries = [];
76
+ const slotEntries = [];
77
+ for (const info of segments) if (info.slot) slotEntries.push(info);
78
+ else segmentEntries.push(info);
79
+ let root;
80
+ let parent;
81
+ const nodeById = /* @__PURE__ */ new Map();
82
+ for (const info of segmentEntries) {
83
+ const id = info.segmentId ?? info.path;
84
+ const node = {
85
+ segment: id,
86
+ payload: null,
87
+ isRequestDependent: info.isRequestDependent,
88
+ children: /* @__PURE__ */ new Map()
89
+ };
90
+ nodeById.set(id, node);
91
+ if (!root) root = node;
92
+ if (parent) parent.children.set(id, node);
93
+ parent = node;
94
+ }
95
+ for (const slotInfo of slotEntries) {
96
+ const parentId = slotInfo.parentSegment;
97
+ const parentNode = parentId ? nodeById.get(parentId) : root;
98
+ if (!parentNode) continue;
99
+ const slotId = slotInfo.segmentId ?? slotInfo.path;
100
+ const slotNode = {
101
+ segment: slotId,
102
+ payload: null,
103
+ isRequestDependent: slotInfo.isRequestDependent,
104
+ children: /* @__PURE__ */ new Map(),
105
+ denied: slotInfo.denied
106
+ };
107
+ if (!parentNode.slots) parentNode.slots = /* @__PURE__ */ new Map();
108
+ parentNode.slots.set(slotId, slotNode);
109
+ }
110
+ return root;
111
+ }
112
+ /** Sentinel value for negative cache entries (URL is not a route). */
113
+ var NEGATIVE_ENTRY = Object.freeze({ payload: null });
114
+ /**
115
+ * Short-lived cache for hover-triggered prefetches. Entries expire after
116
+ * 30 seconds. When a link is clicked, the prefetched payload is consumed
117
+ * (moved to the history stack) and removed from this cache.
118
+ *
119
+ * timber.js does NOT prefetch on viewport intersection — only explicit
120
+ * hover on <Link prefetch> triggers a prefetch.
121
+ */
122
+ var PrefetchCache = class PrefetchCache {
123
+ static TTL_MS = 3e4;
124
+ entries = /* @__PURE__ */ new Map();
125
+ set(url, result) {
126
+ this.entries.set(url, {
127
+ result,
128
+ expiresAt: Date.now() + PrefetchCache.TTL_MS
129
+ });
130
+ }
131
+ get(url) {
132
+ const entry = this.entries.get(url);
133
+ if (!entry) return void 0;
134
+ if (Date.now() >= entry.expiresAt) {
135
+ this.entries.delete(url);
136
+ return;
137
+ }
138
+ return entry.result;
139
+ }
140
+ /** Get and remove the entry (used when navigation consumes a prefetch) */
141
+ consume(url) {
142
+ const result = this.get(url);
143
+ if (result !== void 0) this.entries.delete(url);
144
+ return result;
145
+ }
146
+ /** Store a negative entry — the URL is not a route (non-RSC Content-Type). */
147
+ setNegative(url) {
148
+ this.set(url, NEGATIVE_ENTRY);
149
+ }
150
+ /** Check if the entry is a negative cache entry (URL is not a route). */
151
+ isNegative(url) {
152
+ return this.get(url) === NEGATIVE_ENTRY;
153
+ }
154
+ };
155
+ //#endregion
156
+ //#region src/client/history.ts
157
+ /**
158
+ * Session-lived history stack keyed by URL. Enables instant back/forward
159
+ * navigation without a server roundtrip.
160
+ *
161
+ * On forward navigation, the new page's payload is pushed onto the stack.
162
+ * On popstate, the cached payload is replayed instantly.
163
+ *
164
+ * Entries are keyed by pathname + search. Used with the History API
165
+ * fallback and the Navigation API.
166
+ *
167
+ * Scroll positions are stored in history.state or Navigation API entry
168
+ * state, not in this stack — see design/19-client-navigation.md §Scroll Restoration.
169
+ *
170
+ * Entries persist for the session duration (no expiry) and are cleared
171
+ * when the tab is closed — matching browser back-button behavior.
172
+ */
173
+ var HistoryStack = class {
174
+ entries = /* @__PURE__ */ new Map();
175
+ push(url, entry) {
176
+ this.entries.set(url, entry);
177
+ }
178
+ get(url) {
179
+ return this.entries.get(url);
180
+ }
181
+ has(url) {
182
+ return this.entries.has(url);
183
+ }
184
+ };
185
+ //#endregion
186
+ //#region src/client/rsc-fetch.ts
187
+ var RSC_CONTENT_TYPE = "text/x-component";
188
+ /**
189
+ * Generate a short random cache-busting ID (5 chars, a-z0-9).
190
+ * Matches the format Next.js uses for _rsc params.
191
+ */
192
+ function generateCacheBustId() {
193
+ const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
194
+ let id = "";
195
+ for (let i = 0; i < 5; i++) id += chars[Math.random() * 36 | 0];
196
+ return id;
197
+ }
198
+ /**
199
+ * Append a `_rsc=<id>` query parameter to the URL.
200
+ * Follows Next.js's pattern — prevents CDN/browser from serving cached HTML
201
+ * for RSC navigation requests and signals that this is an RSC fetch.
202
+ *
203
+ * Strips any #fragment before appending — fragments are client-only and
204
+ * fetch() discards them, so _rsc would land inside the hash and be lost.
205
+ */
206
+ function appendRscParam(url) {
207
+ const hashIndex = url.indexOf("#");
208
+ const urlWithoutHash = hashIndex === -1 ? url : url.slice(0, hashIndex);
209
+ return `${urlWithoutHash}${urlWithoutHash.includes("?") ? "&" : "?"}_rsc=${generateCacheBustId()}`;
210
+ }
211
+ /**
212
+ * The client's deployment ID, set at bootstrap from the runtime config.
213
+ * Sent with every RSC/action request for version skew detection.
214
+ * Null in dev mode. See TIM-446.
215
+ */
216
+ var clientDeploymentId = null;
217
+ /** Header name used by the server to signal a version skew reload. */
218
+ var RELOAD_HEADER = "X-Timber-Reload";
219
+ /** Header name for the client's deployment ID. */
220
+ var DEPLOYMENT_ID_HEADER = "X-Timber-Deployment-Id";
221
+ /**
222
+ * Check if a response signals a version skew reload.
223
+ * Triggers a full page reload if the server indicates the client is stale.
224
+ */
225
+ function checkReloadSignal(response) {
226
+ return response.headers.get(RELOAD_HEADER) === "1";
227
+ }
228
+ function buildRscHeaders(stateTree, currentUrl) {
229
+ const headers = { Accept: RSC_CONTENT_TYPE };
230
+ if (stateTree) headers["X-Timber-State-Tree"] = JSON.stringify(stateTree);
231
+ if (currentUrl) headers["X-Timber-URL"] = currentUrl;
232
+ if (clientDeploymentId) headers[DEPLOYMENT_ID_HEADER] = clientDeploymentId;
233
+ return headers;
234
+ }
235
+ /** Dev-only warning for malformed framework headers. Tree-shaken in production. */
236
+ function warnMalformedHeader(headerName, raw) {
237
+ if (process.env.NODE_ENV !== "production") {
238
+ const preview = raw.length > 200 ? raw.slice(0, 200) + "…" : raw;
239
+ console.warn(`[timber] Malformed ${headerName} header \u2014 JSON.parse failed. This indicates a framework bug or header corruption. Raw (first 200 chars): ${preview}`);
240
+ }
241
+ }
242
+ /**
243
+ * Extract segment metadata from the X-Timber-Segments response header.
244
+ * Returns null if the header is missing or malformed.
245
+ *
246
+ * Format: JSON array of {path, isRequestDependent} objects describing the rendered
247
+ * segment chain from root to leaf. Used to populate the client-side
248
+ * segment cache for state tree diffing on subsequent navigations.
249
+ */
250
+ function extractSegmentInfo(response) {
251
+ const header = response.headers.get("X-Timber-Segments");
252
+ if (!header) return null;
253
+ try {
254
+ return JSON.parse(header);
255
+ } catch {
256
+ warnMalformedHeader("X-Timber-Segments", header);
257
+ return null;
258
+ }
259
+ }
260
+ /**
261
+ * Extract skipped segment paths from the X-Timber-Skipped-Segments header.
262
+ * Returns null if the header is missing or malformed.
263
+ *
264
+ * When the server skips sync layouts the client already has cached,
265
+ * it sends this header listing the skipped segment paths (outermost first).
266
+ * The client uses this to merge the partial payload with cached segments.
267
+ */
268
+ function extractSkippedSegments(response) {
269
+ const header = response.headers.get("X-Timber-Skipped-Segments");
270
+ if (!header) return null;
271
+ try {
272
+ const parsed = JSON.parse(header);
273
+ return Array.isArray(parsed) ? parsed : null;
274
+ } catch {
275
+ warnMalformedHeader("X-Timber-Skipped-Segments", header);
276
+ return null;
277
+ }
278
+ }
279
+ /**
280
+ * Extract route params from the X-Timber-Params response header.
281
+ * Returns null if the header is missing or malformed.
282
+ *
283
+ * Used to populate useSegmentParams() after client-side navigation.
284
+ */
285
+ function extractParams(response) {
286
+ const header = response.headers.get("X-Timber-Params");
287
+ if (!header) return null;
288
+ try {
289
+ return JSON.parse(header);
290
+ } catch {
291
+ warnMalformedHeader("X-Timber-Params", header);
292
+ return null;
293
+ }
294
+ }
295
+ /**
296
+ * Thrown when an RSC payload response contains X-Timber-Redirect header.
297
+ * Caught in navigate() to trigger a soft router navigation to the redirect target.
298
+ */
299
+ var RedirectError = class extends Error {
300
+ redirectUrl;
301
+ constructor(url) {
302
+ super(`Server redirect to ${url}`);
303
+ this.redirectUrl = url;
304
+ }
305
+ };
306
+ /**
307
+ * Thrown when the server signals a version skew (X-Timber-Reload header).
308
+ * Caught in navigate() to trigger a full page reload.
309
+ * See TIM-446.
310
+ */
311
+ var VersionSkewError = class extends Error {
312
+ constructor() {
313
+ super("Version skew detected — server has been redeployed");
314
+ }
315
+ };
316
+ /**
317
+ * Thrown when the server returns an error for an RSC payload request.
318
+ * The server sends X-Timber-Error header and a JSON body instead of a
319
+ * broken RSC stream for any RenderError (4xx or 5xx). Caught in
320
+ * navigate() to trigger a hard navigation so the server can render
321
+ * the error page as HTML.
322
+ *
323
+ * See design/10-error-handling.md §"Error Page Rendering for Client Navigation"
324
+ */
325
+ var ServerErrorResponse = class extends Error {
326
+ status;
327
+ url;
328
+ constructor(status, url) {
329
+ super(`Server error ${status} during navigation to ${url}`);
330
+ this.status = status;
331
+ this.url = url;
332
+ }
333
+ };
334
+ /**
335
+ * Thrown when the RSC fetch response has a Content-Type that is not
336
+ * text/x-component — e.g., a static asset (image, CSS, JS) served
337
+ * for a same-origin URL that isn't a route. The response body is
338
+ * cancelled immediately (headers-only cost). Caught in navigate()
339
+ * to trigger a hard navigation; caught in prefetch() to store a
340
+ * negative cache entry so click hard-navigates without a second fetch.
341
+ *
342
+ * See TIM-1231.
343
+ */
344
+ var NonRscResponse = class extends Error {
345
+ url;
346
+ constructor(url) {
347
+ super(`Non-RSC response for ${url}`);
348
+ this.url = url;
349
+ }
350
+ };
351
+ /**
352
+ * Wrap a response body stream to track when it's fully consumed.
353
+ * Returns a new body that passes all chunks through unchanged, plus
354
+ * a `done` promise that resolves when the last chunk is read (or
355
+ * rejects if the stream errors).
356
+ *
357
+ * Used to keep React transitions open for the full RSC stream
358
+ * duration — createFromFetch's thenable resolves on shell arrival,
359
+ * but we need stream completion for useOptimistic pending state.
360
+ */
361
+ function trackStreamCompletion(body) {
362
+ let resolveDone;
363
+ let rejectDone;
364
+ const done = new Promise((res, rej) => {
365
+ resolveDone = res;
366
+ rejectDone = rej;
367
+ });
368
+ const reader = body.getReader();
369
+ return {
370
+ body: new ReadableStream({
371
+ async pull(controller) {
372
+ try {
373
+ const result = await reader.read();
374
+ if (result.done) {
375
+ controller.close();
376
+ resolveDone();
377
+ } else controller.enqueue(result.value);
378
+ } catch (error) {
379
+ controller.error(error);
380
+ rejectDone(error);
381
+ }
382
+ },
383
+ cancel(reason) {
384
+ reader.cancel(reason);
385
+ resolveDone();
386
+ }
387
+ }),
388
+ done
389
+ };
390
+ }
391
+ /**
392
+ * Fetch an RSC payload from the server. If a decodeRsc function is provided,
393
+ * the response is decoded into a React element tree via createFromFetch.
394
+ * Otherwise, the raw response text is returned (test mode).
395
+ */
396
+ async function fetchRscPayload(url, deps, stateTree, currentUrl, signal) {
397
+ const rscUrl = appendRscParam(url);
398
+ const headers = buildRscHeaders(stateTree, currentUrl);
399
+ if (deps.decodeRsc) {
400
+ const fetchPromise = deps.fetch(rscUrl, {
401
+ headers,
402
+ redirect: "manual",
403
+ signal
404
+ });
405
+ let segmentInfo = null;
406
+ let params = null;
407
+ let skippedSegments = null;
408
+ let streamDone = Promise.resolve();
409
+ const wrappedPromise = fetchPromise.then((response) => {
410
+ if (checkReloadSignal(response)) throw new VersionSkewError();
411
+ const redirectLocation = response.headers.get("X-Timber-Redirect") || (response.status >= 300 && response.status < 400 ? response.headers.get("Location") : null);
412
+ if (redirectLocation) throw new RedirectError(redirectLocation);
413
+ if (response.headers.get("X-Timber-Error") === "1") throw new ServerErrorResponse(response.status, url);
414
+ const contentType = response.headers.get("content-type");
415
+ if (!contentType || !contentType.split(";")[0].trim().includes("text/x-component")) {
416
+ response.body?.cancel();
417
+ throw new NonRscResponse(url);
418
+ }
419
+ segmentInfo = extractSegmentInfo(response);
420
+ params = extractParams(response);
421
+ skippedSegments = extractSkippedSegments(response);
422
+ if (response.body) {
423
+ const tracked = trackStreamCompletion(response.body);
424
+ streamDone = tracked.done;
425
+ streamDone.catch(() => {});
426
+ return new Response(tracked.body, {
427
+ headers: response.headers,
428
+ status: response.status
429
+ });
430
+ }
431
+ return response;
432
+ });
433
+ await wrappedPromise;
434
+ const payload = deps.decodeRsc(wrappedPromise);
435
+ const payloadError = new Promise((_, reject) => {
436
+ Promise.resolve(payload).then(() => {}, reject);
437
+ });
438
+ payloadError.catch(() => {});
439
+ return {
440
+ payload,
441
+ decodePromise: Promise.race([streamDone, payloadError]),
442
+ segmentInfo,
443
+ params,
444
+ skippedSegments
445
+ };
446
+ }
447
+ const response = await deps.fetch(rscUrl, {
448
+ headers,
449
+ redirect: "manual",
450
+ signal
451
+ });
452
+ if (response.status >= 300 && response.status < 400) {
453
+ const location = response.headers.get("Location");
454
+ if (location) throw new RedirectError(location);
455
+ }
456
+ const fallbackContentType = response.headers.get("content-type");
457
+ if (!fallbackContentType || !fallbackContentType.split(";")[0].trim().includes("text/x-component")) {
458
+ response.body?.cancel();
459
+ throw new NonRscResponse(url);
460
+ }
461
+ return {
462
+ payload: await response.text(),
463
+ decodePromise: null,
464
+ segmentInfo: extractSegmentInfo(response),
465
+ params: extractParams(response),
466
+ skippedSegments: extractSkippedSegments(response)
467
+ };
468
+ }
469
+ //#endregion
470
+ //#region src/client/router.ts
471
+ /**
472
+ * Check if an error is an abort error (connection closed / fetch aborted).
473
+ * Browsers throw DOMException with name 'AbortError' when a fetch is aborted.
474
+ */
475
+ function isAbortError(error) {
476
+ if (error instanceof DOMException && error.name === "AbortError") return true;
477
+ if (error instanceof Error && error.name === "AbortError") return true;
478
+ return false;
479
+ }
480
+ function createRouter(deps) {
481
+ const segmentCache = new SegmentCache();
482
+ const prefetchCache = new PrefetchCache();
483
+ const historyStack = new HistoryStack();
484
+ let routerPhase = { phase: "idle" };
485
+ const pendingListeners = /* @__PURE__ */ new Set();
486
+ let currentNavAbort = null;
487
+ /**
488
+ * Create a new AbortController for a navigation, superseding any
489
+ * previous in-flight navigation. Optionally links to an external
490
+ * signal (e.g., from the Navigation API's NavigateEvent.signal).
491
+ *
492
+ * Superseding is one operation with three parts:
493
+ * 1. Abort the previous navigation's fetch.
494
+ * 2. Invalidate its render transition so a response that already
495
+ * arrived can't commit a stale tree (NavigationRoot's transId guard).
496
+ * 3. Resolve its Navigation API deferred — the superseded navigation's
497
+ * finally block is staleness-guarded (see TIM-1034) and no longer
498
+ * cleans up after itself, so the browser's native loading state for
499
+ * the dead navigation is cleared here.
500
+ */
501
+ function createNavAbort(externalSignal) {
502
+ if (currentNavAbort) {
503
+ currentNavAbort.abort();
504
+ supersedeNavigationTransitions();
505
+ deps.completeRouterNavigation?.();
506
+ }
507
+ const controller = new AbortController();
508
+ currentNavAbort = controller;
509
+ if (externalSignal) if (externalSignal.aborted) controller.abort();
510
+ else externalSignal.addEventListener("abort", () => controller.abort(), { once: true });
511
+ return controller;
512
+ }
513
+ function setPending(value, url) {
514
+ const next = value && url ? {
515
+ phase: "navigating",
516
+ targetUrl: url
517
+ } : { phase: "idle" };
518
+ if (routerPhase.phase === next.phase && (routerPhase.phase === "idle" || routerPhase.phase === "navigating" && next.phase === "navigating" && routerPhase.targetUrl === next.targetUrl)) return;
519
+ routerPhase = next;
520
+ for (const listener of pendingListeners) listener(value);
521
+ }
522
+ /** Update the segment cache from server-provided segment metadata. */
523
+ function updateSegmentCache(segmentInfo) {
524
+ if (!deps.clientSegmentCache) return;
525
+ if (!segmentInfo || segmentInfo.length === 0) return;
526
+ const tree = buildSegmentTree(segmentInfo);
527
+ if (tree) segmentCache.set("/", tree);
528
+ }
529
+ /** Render a decoded RSC payload into the DOM if a renderer is available. */
530
+ function renderPayload(payload, navState) {
531
+ if (deps.renderRoot) deps.renderRoot(payload, navState);
532
+ }
533
+ /**
534
+ * Atomically update all navigation-owned state for a new page. Every
535
+ * code path that changes the "current page" must go through this
536
+ * function — making "forgot a field" impossible by construction.
537
+ *
538
+ * The three operations:
539
+ * 1. Segment cache — update from server-provided segment metadata
540
+ * 2. Navigation state — params + pathname for useSegmentParams/usePathname
541
+ * 3. History stack — store the payload for instant back/forward replay
542
+ */
543
+ function commitNavigation(url, opts) {
544
+ if (opts.segmentInfo && opts.segmentInfo.length > 0) updateSegmentCache(opts.segmentInfo);
545
+ else if (opts.clearSegmentCacheOnEmpty) segmentCache.clear();
546
+ const navState = updateNavigationState(opts.params, url);
547
+ historyStack.push(url, {
548
+ payload: opts.payload,
549
+ params: navState.params,
550
+ segmentInfo: opts.segmentInfo
551
+ });
552
+ return navState;
553
+ }
554
+ /**
555
+ * Wrap a navigation in the standard abort/pending/cleanup lifecycle.
556
+ * Consolidates the createNavAbort + setPending + staleness-guarded
557
+ * finally that was duplicated across navigate, refresh, and both
558
+ * handlePopState paths. AbortErrors are swallowed (not application
559
+ * errors); all other errors propagate to the caller.
560
+ */
561
+ async function runNavigation(url, fn, externalSignal) {
562
+ const navAbort = createNavAbort(externalSignal);
563
+ setPending(true, url);
564
+ try {
565
+ await fn(navAbort);
566
+ } catch (error) {
567
+ if (isAbortError(error)) return;
568
+ throw error;
569
+ } finally {
570
+ if (currentNavAbort === navAbort) {
571
+ currentNavAbort = null;
572
+ setPending(false);
573
+ deps.completeRouterNavigation?.();
574
+ }
575
+ }
576
+ }
577
+ /**
578
+ * Resolve thenable payloads in the test/fallback path (no navigateTransition).
579
+ * In production, React handles thenables from createFromFetch directly via
580
+ * Suspense. In tests, renderRoot is a plain mock that expects resolved values.
581
+ */
582
+ async function resolveForFallback(payload) {
583
+ if (!deps.navigateTransition && payload != null && typeof payload === "object" && "then" in payload) return await payload;
584
+ return payload;
585
+ }
586
+ function isPartialNavigation(skippedSegments) {
587
+ return skippedSegments != null && skippedSegments.length > 0;
588
+ }
589
+ /**
590
+ * Build a segment updates map for partial navigation. Identifies the
591
+ * first non-skipped segment and maps it to the payload content.
592
+ */
593
+ function buildSegmentUpdates(result) {
594
+ const skipped = new Set(result.skippedSegments);
595
+ const segmentInfo = result.segmentInfo;
596
+ const updates = /* @__PURE__ */ new Map();
597
+ if (segmentInfo) {
598
+ for (const info of segmentInfo) if (!skipped.has(info.segmentId ?? info.path)) {
599
+ updates.set(info.segmentId ?? info.path, result.payload);
600
+ break;
601
+ }
602
+ }
603
+ return updates;
604
+ }
605
+ /**
606
+ * Update navigation state (params + pathname) for the next render.
607
+ *
608
+ * Sets the module-level fallback (for tests and SSR) and the
609
+ * globalThis bridge, then returns the NavigationState so callers
610
+ * can pass it explicitly to renderRoot/wrapPayload — eliminating
611
+ * temporal coupling with getNavigationState().
612
+ */
613
+ function updateNavigationState(params, url) {
614
+ const resolvedParams = params ?? {};
615
+ setCurrentParams(resolvedParams);
616
+ const parsed = new URL(url, "http://localhost");
617
+ const navState = {
618
+ params: resolvedParams,
619
+ pathname: parsed.pathname || "/",
620
+ search: parsed.search
621
+ };
622
+ setNavigationState(navState);
623
+ return navState;
624
+ }
625
+ /**
626
+ * Render a payload via navigateTransition (production) or renderRoot (tests).
627
+ * The perform callback should fetch data, call commitNavigation, and return
628
+ * the FetchResult plus the NavigationState.
629
+ *
630
+ * State management (segmentCache, navState, historyStack) is handled by
631
+ * commitNavigation inside perform — this function only handles rendering.
632
+ */
633
+ async function renderViaTransition(url, perform) {
634
+ if (deps.navigateTransition) {
635
+ await deps.navigateTransition(url, async (wrapPayload) => {
636
+ const result = await perform();
637
+ if (isPartialNavigation(result.skippedSegments)) {
638
+ const segmentUpdates = buildSegmentUpdates(result);
639
+ return {
640
+ element: wrapPayload(deps._getCurrentPayload?.() ?? result.payload, result.navState, segmentUpdates),
641
+ decodePromise: result.decodePromise
642
+ };
643
+ }
644
+ return {
645
+ element: wrapPayload(result.payload, result.navState),
646
+ decodePromise: result.decodePromise
647
+ };
648
+ });
649
+ return;
650
+ }
651
+ const result = await perform();
652
+ if (!isPartialNavigation(result.skippedSegments)) renderPayload(result.payload, result.navState);
653
+ }
654
+ /** Run a callback after the next paint (after React commit). */
655
+ function afterPaint(callback) {
656
+ if (deps.afterPaint) deps.afterPaint(callback);
657
+ else callback();
658
+ }
659
+ /**
660
+ * Schedule scroll restoration after the next paint and fire the
661
+ * scroll-restored event. Used by navigate, popstate, and refresh.
662
+ */
663
+ function restoreScrollAfterPaint(scrollY) {
664
+ afterPaint(() => {
665
+ deps.scrollTo(0, scrollY);
666
+ window.dispatchEvent(new Event("timber:scroll-restored"));
667
+ });
668
+ }
669
+ /**
670
+ * Scroll to the element matching the URL #fragment after paint, falling
671
+ * back to scroll-to-top when no element matches (matching full-page-load
672
+ * behavior for an unknown fragment). Used by forward navigation to a
673
+ * hash-bearing URL (TIM-1035).
674
+ */
675
+ function scrollToHashAfterPaint(hash) {
676
+ afterPaint(() => {
677
+ if (deps.scrollToHash?.(hash) !== true) deps.scrollTo(0, 0);
678
+ window.dispatchEvent(new Event("timber:scroll-restored"));
679
+ });
680
+ }
681
+ /**
682
+ * Core navigation logic shared between the transition and fallback paths.
683
+ * Fetches the RSC payload, updates all state, and returns the result.
684
+ */
685
+ async function performNavigationFetch(url, options) {
686
+ if (prefetchCache.isNegative(url)) {
687
+ prefetchCache.consume(url);
688
+ throw new NonRscResponse(url);
689
+ }
690
+ const prefetched = prefetchCache.consume(url);
691
+ let result = prefetched ? {
692
+ payload: prefetched.payload,
693
+ decodePromise: null,
694
+ segmentInfo: prefetched.segmentInfo ?? null,
695
+ params: prefetched.params ?? null,
696
+ skippedSegments: prefetched.skippedSegments ?? null
697
+ } : void 0;
698
+ if (result === void 0) {
699
+ const stateTree = deps.clientSegmentCache ? segmentCache.serializeStateTree() : void 0;
700
+ const rawDepartingUrl = options.departingUrl ?? deps.getCurrentUrl();
701
+ result = await fetchRscPayload(url, deps, stateTree, rawDepartingUrl.startsWith("http") ? new URL(rawDepartingUrl).pathname : new URL(rawDepartingUrl, "http://localhost").pathname, options.signal);
702
+ }
703
+ if (!options.skipHistory) {
704
+ const commitUrl = options.commitUrl ?? url;
705
+ deps.setRouterNavigating?.(true);
706
+ if (options.replace) deps.replaceState({
707
+ timber: true,
708
+ scrollY: 0
709
+ }, "", commitUrl);
710
+ else deps.pushState({
711
+ timber: true,
712
+ scrollY: 0
713
+ }, "", commitUrl);
714
+ deps.setRouterNavigating?.(false);
715
+ }
716
+ const payload = await resolveForFallback(result.payload);
717
+ const isPartial = isPartialNavigation(result.skippedSegments);
718
+ const hasSkippedSlots = result.segmentInfo?.some((s) => s.slot && s.skipped) ?? false;
719
+ const navState = commitNavigation(url, {
720
+ payload: isPartial || hasSkippedSlots ? null : payload,
721
+ params: result.params,
722
+ segmentInfo: result.segmentInfo
723
+ });
724
+ return {
725
+ ...result,
726
+ payload,
727
+ navState
728
+ };
729
+ }
730
+ async function navigate(url, options = {}) {
731
+ const scroll = options.scroll !== false;
732
+ const replace = options.replace === true;
733
+ const externalSignal = options._signal;
734
+ const skipHistory = options._skipHistory === true;
735
+ const hashIndex = url.indexOf("#");
736
+ const hash = hashIndex === -1 ? "" : url.slice(hashIndex);
737
+ const fetchUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);
738
+ const departingUrl = options._departingUrl ?? deps.getCurrentUrl();
739
+ const currentScrollY = deps.getScrollY();
740
+ if (deps.saveNavigationEntryScroll) deps.saveNavigationEntryScroll(currentScrollY);
741
+ else deps.replaceState({
742
+ timber: true,
743
+ scrollY: currentScrollY
744
+ }, "", deps.getCurrentUrl());
745
+ let effectiveSkipHistory = skipHistory;
746
+ await runNavigation(url, async (navAbort) => {
747
+ if (!effectiveSkipHistory && deps.navigationNavigate) {
748
+ deps.setRouterNavigating?.(true);
749
+ deps.navigationNavigate(url, replace);
750
+ deps.setRouterNavigating?.(false);
751
+ effectiveSkipHistory = true;
752
+ }
753
+ try {
754
+ await renderViaTransition(fetchUrl, () => performNavigationFetch(fetchUrl, {
755
+ replace,
756
+ commitUrl: url,
757
+ signal: navAbort.signal,
758
+ skipHistory: effectiveSkipHistory,
759
+ departingUrl
760
+ }));
761
+ window.dispatchEvent(new Event("timber:navigation-end"));
762
+ if (scroll && hash) scrollToHashAfterPaint(hash);
763
+ else restoreScrollAfterPaint(scroll ? 0 : currentScrollY);
764
+ } catch (error) {
765
+ if (error instanceof VersionSkewError) {
766
+ setHardNavigating(true);
767
+ window.location.reload();
768
+ await new Promise(() => {});
769
+ }
770
+ if (error instanceof RedirectError) {
771
+ if (currentNavAbort !== navAbort) return;
772
+ await navigate(error.redirectUrl, { replace: true });
773
+ return;
774
+ }
775
+ if (error instanceof ServerErrorResponse) {
776
+ setHardNavigating(true);
777
+ window.location.href = error.url;
778
+ await new Promise(() => {});
779
+ }
780
+ if (error instanceof NonRscResponse) {
781
+ setHardNavigating(true);
782
+ window.location.href = url;
783
+ await new Promise(() => {});
784
+ }
785
+ throw error;
786
+ }
787
+ }, externalSignal);
788
+ }
789
+ async function refresh() {
790
+ const currentUrl = deps.getCurrentUrl();
791
+ await runNavigation(currentUrl, async (navAbort) => {
792
+ await renderViaTransition(currentUrl, async () => {
793
+ const result = await fetchRscPayload(currentUrl, deps, void 0, void 0, navAbort.signal);
794
+ const payload = await resolveForFallback(result.payload);
795
+ const navState = commitNavigation(currentUrl, {
796
+ payload,
797
+ params: result.params,
798
+ segmentInfo: result.segmentInfo
799
+ });
800
+ return {
801
+ ...result,
802
+ payload,
803
+ navState
804
+ };
805
+ });
806
+ });
807
+ }
808
+ async function handlePopState(url, scrollY = 0, externalSignal) {
809
+ const entry = historyStack.get(url);
810
+ if (entry && entry.payload !== null) await runNavigation(url, async () => {
811
+ const navState = commitNavigation(url, {
812
+ payload: entry.payload,
813
+ params: entry.params,
814
+ segmentInfo: entry.segmentInfo,
815
+ clearSegmentCacheOnEmpty: true
816
+ });
817
+ renderPayload(entry.payload, navState);
818
+ restoreScrollAfterPaint(scrollY);
819
+ }, externalSignal);
820
+ else await runNavigation(url, async (navAbort) => {
821
+ await renderViaTransition(url, async () => {
822
+ const result = await fetchRscPayload(url, deps, deps.clientSegmentCache ? segmentCache.serializeStateTree() : void 0, void 0, navAbort.signal);
823
+ const payload = await resolveForFallback(result.payload);
824
+ const navState = commitNavigation(url, {
825
+ payload,
826
+ params: result.params,
827
+ segmentInfo: result.segmentInfo
828
+ });
829
+ return {
830
+ ...result,
831
+ payload,
832
+ navState
833
+ };
834
+ });
835
+ restoreScrollAfterPaint(scrollY);
836
+ }, externalSignal);
837
+ }
838
+ /**
839
+ * Prefetch an RSC payload for a URL and store it in the prefetch cache.
840
+ * Called on hover of <Link prefetch> elements.
841
+ */
842
+ function prefetch(url) {
843
+ const hashIndex = url.indexOf("#");
844
+ const fetchUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);
845
+ if (prefetchCache.get(fetchUrl) !== void 0) return;
846
+ if (historyStack.has(fetchUrl)) return;
847
+ fetchRscPayload(fetchUrl, deps, deps.clientSegmentCache ? segmentCache.serializeStateTree() : void 0).then((result) => {
848
+ result.decodePromise?.catch(() => {});
849
+ prefetchCache.set(fetchUrl, result);
850
+ }, (error) => {
851
+ if (error instanceof NonRscResponse) {
852
+ prefetchCache.setNegative(fetchUrl);
853
+ return;
854
+ }
855
+ });
856
+ }
857
+ return {
858
+ navigate,
859
+ refresh,
860
+ handlePopState,
861
+ isPending: () => routerPhase.phase === "navigating",
862
+ getPendingUrl: () => routerPhase.phase === "navigating" ? routerPhase.targetUrl : null,
863
+ onPendingChange(listener) {
864
+ pendingListeners.add(listener);
865
+ return () => pendingListeners.delete(listener);
866
+ },
867
+ prefetch,
868
+ applyRevalidation(element) {
869
+ const currentUrl = deps.getCurrentUrl();
870
+ const existingEntry = historyStack.get(currentUrl);
871
+ renderPayload(element, commitNavigation(currentUrl, {
872
+ payload: element,
873
+ params: getNavigationState().params,
874
+ segmentInfo: existingEntry?.segmentInfo
875
+ }));
876
+ },
877
+ initSegmentCache: (segments) => updateSegmentCache(segments),
878
+ segmentCache,
879
+ prefetchCache,
880
+ historyStack
881
+ };
882
+ }
883
+ //#endregion
884
+ //#region src/client/use-search-params.ts
885
+ /**
886
+ * useSearchParams() — client-side hook for reading URL search params.
887
+ *
888
+ * Returns a read-only URLSearchParams instance reflecting the current
889
+ * URL's query string. Updates when client-side navigation changes the URL.
890
+ *
891
+ * On the client, reads from NavigationContext which is updated atomically
892
+ * with the RSC tree render during full navigations, AND by
893
+ * syncShallowSearch() for shallow URL updates (nuqs shallow: true,
894
+ * replaceUrl, or any external pushState/replaceState that changes the
895
+ * query string). See router-init.ts.
896
+ *
897
+ * This replaces the previous useSyncExternalStore approach which read
898
+ * window.location.search directly — causing React to detect external
899
+ * store tearing during transitions and fall back to synchronous rendering
900
+ * (renderRootSync instead of renderRootConcurrent), blocking the main
901
+ * thread and freezing animations.
902
+ *
903
+ * Unlike Next.js's ReadonlyURLSearchParams, this returns a standard
904
+ * URLSearchParams. Mutation methods (set, delete, append) work on the
905
+ * local copy but do NOT affect the URL — use the router or nuqs for that.
906
+ *
907
+ * During SSR, reads the request search params from the SSR ALS context
908
+ * (populated by ssr-entry.ts) instead of window.location.
909
+ *
910
+ * Compatible with Next.js's `useSearchParams()` from `next/navigation`.
911
+ */
912
+ function getSearchParams(search) {
913
+ if (search !== cachedSearch) {
914
+ const params = new URLSearchParams(search);
915
+ _setCachedSearch(search, params);
916
+ return params;
917
+ }
918
+ return cachedSearchParams;
919
+ }
920
+ /**
921
+ * Read the current URL search params.
922
+ *
923
+ * Compatible with Next.js's `useSearchParams()` from `next/navigation`.
924
+ */
925
+ function useSearchParams() {
926
+ try {
927
+ const navContext = useNavigationContext();
928
+ if (navContext !== null) return getSearchParams(navContext.search);
929
+ } catch {}
930
+ const ssrData = getSsrData();
931
+ if (ssrData) return new URLSearchParams(ssrData.searchParams);
932
+ if (typeof window !== "undefined") return getSearchParams(window.location.search);
933
+ return new URLSearchParams();
934
+ }
935
+ //#endregion
936
+ export { HistoryStack, NavigationProvider, PrefetchCache, SegmentCache, SegmentProvider, TimberErrorBoundary, bindUseQueryStates, clearSsrData, createRouter, getNavigationState, getRouter, getRouterOrNull, getSsrData, setCurrentParams, setGlobalRouter, setNavigationState, setSsrData, useSearchParams, useSegmentContext };
937
+
938
+ //# sourceMappingURL=internal.js.map