@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.141

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 (801) hide show
  1. package/dist/_chunks/actions-DzFMnUAR.js +1147 -0
  2. package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
  4. package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
  6. package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
  7. package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
  8. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  9. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  10. package/dist/_chunks/define-C3RvHQPK.js +195 -0
  11. package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
  12. package/dist/_chunks/define-DMVhsipD.js +112 -0
  13. package/dist/_chunks/define-DMVhsipD.js.map +1 -0
  14. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  15. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  16. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  17. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  18. package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
  19. package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
  20. package/dist/_chunks/href-validation-EZktELp8.js +124 -0
  21. package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
  22. package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
  23. package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
  24. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
  25. package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
  26. package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
  27. package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
  28. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  29. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  30. package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
  31. package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
  32. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  33. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  34. package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
  35. package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
  36. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  37. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  38. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  39. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  40. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  41. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  42. package/dist/_chunks/tracing-M_zKubhk.js +358 -0
  43. package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
  44. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  45. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  46. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  47. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  48. package/dist/_chunks/validation-taUkvA4Q.js +113 -0
  49. package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
  50. package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
  51. package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
  52. package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
  53. package/dist/_chunks/warnings-CNPXaypM.js.map +1 -0
  54. package/dist/adapters/build-output-helper.d.ts +28 -0
  55. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  57. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.js +73 -0
  59. package/dist/adapters/cloudflare-dev.js.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  61. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  63. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  64. package/dist/adapters/cloudflare.d.ts +148 -12
  65. package/dist/adapters/cloudflare.d.ts.map +1 -1
  66. package/dist/adapters/cloudflare.js +142 -38
  67. package/dist/adapters/cloudflare.js.map +1 -1
  68. package/dist/adapters/compress-module.d.ts.map +1 -1
  69. package/dist/adapters/nitro.d.ts +17 -1
  70. package/dist/adapters/nitro.d.ts.map +1 -1
  71. package/dist/adapters/nitro.js +154 -48
  72. package/dist/adapters/nitro.js.map +1 -1
  73. package/dist/adapters/shared.d.ts +16 -0
  74. package/dist/adapters/shared.d.ts.map +1 -0
  75. package/dist/cache/cache-api.d.ts +24 -0
  76. package/dist/cache/cache-api.d.ts.map +1 -0
  77. package/dist/cache/handler-store.d.ts +31 -0
  78. package/dist/cache/handler-store.d.ts.map +1 -0
  79. package/dist/cache/index.d.ts +23 -7
  80. package/dist/cache/index.d.ts.map +1 -1
  81. package/dist/cache/index.js +165 -117
  82. package/dist/cache/index.js.map +1 -1
  83. package/dist/cache/singleflight.d.ts +18 -1
  84. package/dist/cache/singleflight.d.ts.map +1 -1
  85. package/dist/cache/sizeof.d.ts +22 -0
  86. package/dist/cache/sizeof.d.ts.map +1 -0
  87. package/dist/cache/timber-cache.d.ts +1 -1
  88. package/dist/cache/timber-cache.d.ts.map +1 -1
  89. package/dist/cli-schema-sync.d.ts +39 -0
  90. package/dist/cli-schema-sync.d.ts.map +1 -0
  91. package/dist/cli.d.ts +14 -2
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +48 -6
  94. package/dist/cli.js.map +1 -1
  95. package/dist/client/browser-dev.d.ts +34 -1
  96. package/dist/client/browser-dev.d.ts.map +1 -1
  97. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  98. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hmr.d.ts +21 -0
  100. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  101. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  102. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  103. package/dist/client/browser-entry/index.d.ts +30 -0
  104. package/dist/client/browser-entry/index.d.ts.map +1 -0
  105. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  106. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  107. package/dist/client/browser-entry/router-init.d.ts +26 -0
  108. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  109. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  110. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  111. package/dist/client/browser-entry/scroll.d.ts +19 -0
  112. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  113. package/dist/client/error-boundary.d.ts +12 -5
  114. package/dist/client/error-boundary.d.ts.map +1 -1
  115. package/dist/client/error-boundary.js +29 -6
  116. package/dist/client/error-boundary.js.map +1 -1
  117. package/dist/client/error-reconstituter.d.ts +54 -0
  118. package/dist/client/error-reconstituter.d.ts.map +1 -0
  119. package/dist/client/form.d.ts +16 -27
  120. package/dist/client/form.d.ts.map +1 -1
  121. package/dist/client/history.d.ts +19 -4
  122. package/dist/client/history.d.ts.map +1 -1
  123. package/dist/client/index.d.ts +10 -24
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +183 -1134
  126. package/dist/client/index.js.map +1 -1
  127. package/dist/client/internal.d.ts +19 -0
  128. package/dist/client/internal.d.ts.map +1 -0
  129. package/dist/client/internal.js +925 -0
  130. package/dist/client/internal.js.map +1 -0
  131. package/dist/client/link-pending-store.d.ts +65 -0
  132. package/dist/client/link-pending-store.d.ts.map +1 -0
  133. package/dist/client/link.d.ts +69 -60
  134. package/dist/client/link.d.ts.map +1 -1
  135. package/dist/client/nav-link-store.d.ts +27 -0
  136. package/dist/client/nav-link-store.d.ts.map +1 -0
  137. package/dist/client/navigation-api-types.d.ts +90 -0
  138. package/dist/client/navigation-api-types.d.ts.map +1 -0
  139. package/dist/client/navigation-api.d.ts +115 -0
  140. package/dist/client/navigation-api.d.ts.map +1 -0
  141. package/dist/client/navigation-context.d.ts +14 -2
  142. package/dist/client/navigation-context.d.ts.map +1 -1
  143. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
  144. package/dist/client/navigation-root.d.ts.map +1 -0
  145. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router.d.ts +79 -10
  148. package/dist/client/router.d.ts.map +1 -1
  149. package/dist/client/rsc-fetch.d.ts +46 -3
  150. package/dist/client/rsc-fetch.d.ts.map +1 -1
  151. package/dist/client/segment-cache.d.ts +3 -1
  152. package/dist/client/segment-cache.d.ts.map +1 -1
  153. package/dist/client/segment-outlet.d.ts +49 -0
  154. package/dist/client/segment-outlet.d.ts.map +1 -0
  155. package/dist/client/segment-update-context.d.ts +21 -0
  156. package/dist/client/segment-update-context.d.ts.map +1 -0
  157. package/dist/client/shallow-url.d.ts +10 -0
  158. package/dist/client/shallow-url.d.ts.map +1 -0
  159. package/dist/client/ssr-data.d.ts +13 -4
  160. package/dist/client/ssr-data.d.ts.map +1 -1
  161. package/dist/client/stale-reload.d.ts +15 -0
  162. package/dist/client/stale-reload.d.ts.map +1 -1
  163. package/dist/client/state.d.ts +1 -1
  164. package/dist/client/top-loader.d.ts +5 -5
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/use-cookie.d.ts +12 -0
  167. package/dist/client/use-cookie.d.ts.map +1 -1
  168. package/dist/client/use-link-status.d.ts +5 -5
  169. package/dist/client/use-link-status.d.ts.map +1 -1
  170. package/dist/client/use-pathname.d.ts.map +1 -1
  171. package/dist/client/use-pending-navigation.d.ts +23 -0
  172. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  173. package/dist/client/use-query-states.d.ts +1 -1
  174. package/dist/client/use-query-states.d.ts.map +1 -1
  175. package/dist/client/use-router.d.ts +1 -1
  176. package/dist/client/use-router.d.ts.map +1 -1
  177. package/dist/client/use-search-params.d.ts +7 -5
  178. package/dist/client/use-search-params.d.ts.map +1 -1
  179. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  180. package/dist/client/use-segment-params.d.ts.map +1 -0
  181. package/dist/codec.d.ts +69 -0
  182. package/dist/codec.d.ts.map +1 -0
  183. package/dist/codec.js +75 -0
  184. package/dist/codec.js.map +1 -0
  185. package/dist/config-types.d.ts +294 -0
  186. package/dist/config-types.d.ts.map +1 -0
  187. package/dist/config-validation.d.ts +51 -0
  188. package/dist/config-validation.d.ts.map +1 -0
  189. package/dist/content/index.d.ts +1 -10
  190. package/dist/content/index.d.ts.map +1 -1
  191. package/dist/content/index.js +0 -2
  192. package/dist/cookies/define-cookie.d.ts +58 -25
  193. package/dist/cookies/define-cookie.d.ts.map +1 -1
  194. package/dist/cookies/index.d.ts +2 -1
  195. package/dist/cookies/index.d.ts.map +1 -1
  196. package/dist/cookies/index.js +251 -36
  197. package/dist/cookies/index.js.map +1 -1
  198. package/dist/cookies/json-cookie.d.ts +64 -0
  199. package/dist/cookies/json-cookie.d.ts.map +1 -0
  200. package/dist/cookies/validation.d.ts +34 -0
  201. package/dist/cookies/validation.d.ts.map +1 -0
  202. package/dist/dev-tools/404-page.d.ts +46 -0
  203. package/dist/dev-tools/404-page.d.ts.map +1 -0
  204. package/dist/dev-tools/browser-logs.d.ts +84 -0
  205. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  206. package/dist/dev-tools/error-page.d.ts +58 -0
  207. package/dist/dev-tools/error-page.d.ts.map +1 -0
  208. package/dist/dev-tools/holding-server.d.ts +54 -0
  209. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  210. package/dist/dev-tools/index.d.ts +31 -0
  211. package/dist/dev-tools/index.d.ts.map +1 -0
  212. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  213. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  214. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  215. package/dist/dev-tools/logger.d.ts.map +1 -0
  216. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  217. package/dist/dev-tools/logs.d.ts.map +1 -0
  218. package/dist/dev-tools/overlay.d.ts +91 -0
  219. package/dist/dev-tools/overlay.d.ts.map +1 -0
  220. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  221. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  222. package/dist/dev-tools/terminal.d.ts +28 -0
  223. package/dist/dev-tools/terminal.d.ts.map +1 -0
  224. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  225. package/dist/dev-tools/warnings.d.ts.map +1 -0
  226. package/dist/fonts/ast.d.ts +98 -6
  227. package/dist/fonts/ast.d.ts.map +1 -1
  228. package/dist/fonts/bundle.d.ts +48 -0
  229. package/dist/fonts/bundle.d.ts.map +1 -0
  230. package/dist/fonts/dev-middleware.d.ts +22 -0
  231. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  232. package/dist/fonts/local.d.ts +1 -1
  233. package/dist/fonts/pipeline.d.ts +172 -0
  234. package/dist/fonts/pipeline.d.ts.map +1 -0
  235. package/dist/fonts/transform.d.ts +78 -0
  236. package/dist/fonts/transform.d.ts.map +1 -0
  237. package/dist/fonts/types.d.ts +47 -1
  238. package/dist/fonts/types.d.ts.map +1 -1
  239. package/dist/fonts/virtual-modules.d.ts +94 -0
  240. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  241. package/dist/index.d.ts +46 -180
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +5315 -12687
  244. package/dist/index.js.map +1 -1
  245. package/dist/params/codec-registry.d.ts +26 -0
  246. package/dist/params/codec-registry.d.ts.map +1 -0
  247. package/dist/params/define-schema.d.ts +81 -0
  248. package/dist/params/define-schema.d.ts.map +1 -0
  249. package/dist/params/index.d.ts +5 -0
  250. package/dist/params/index.d.ts.map +1 -0
  251. package/dist/params/index.js +34 -0
  252. package/dist/params/index.js.map +1 -0
  253. package/dist/params/resolve-schema.d.ts +34 -0
  254. package/dist/params/resolve-schema.d.ts.map +1 -0
  255. package/dist/plugin-context.d.ts +114 -0
  256. package/dist/plugin-context.d.ts.map +1 -0
  257. package/dist/plugins/adapter-build.d.ts +20 -1
  258. package/dist/plugins/adapter-build.d.ts.map +1 -1
  259. package/dist/plugins/build-manifest.d.ts +7 -3
  260. package/dist/plugins/build-manifest.d.ts.map +1 -1
  261. package/dist/plugins/build-report.d.ts +9 -7
  262. package/dist/plugins/build-report.d.ts.map +1 -1
  263. package/dist/plugins/cache.d.ts +31 -0
  264. package/dist/plugins/cache.d.ts.map +1 -0
  265. package/dist/plugins/client-chunks.d.ts +39 -0
  266. package/dist/plugins/client-chunks.d.ts.map +1 -0
  267. package/dist/plugins/cloudflare-wasm.d.ts +18 -0
  268. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  269. package/dist/plugins/content.d.ts +1 -1
  270. package/dist/plugins/content.d.ts.map +1 -1
  271. package/dist/plugins/dev-server.d.ts +1 -1
  272. package/dist/plugins/dev-server.d.ts.map +1 -1
  273. package/dist/plugins/entries.d.ts +1 -1
  274. package/dist/plugins/entries.d.ts.map +1 -1
  275. package/dist/plugins/fonts.d.ts +17 -73
  276. package/dist/plugins/fonts.d.ts.map +1 -1
  277. package/dist/plugins/mdx.d.ts +1 -1
  278. package/dist/plugins/mdx.d.ts.map +1 -1
  279. package/dist/plugins/routing.d.ts +1 -1
  280. package/dist/plugins/routing.d.ts.map +1 -1
  281. package/dist/plugins/server-bundle.d.ts.map +1 -1
  282. package/dist/plugins/shims.d.ts +6 -5
  283. package/dist/plugins/shims.d.ts.map +1 -1
  284. package/dist/plugins/static-build.d.ts +5 -26
  285. package/dist/plugins/static-build.d.ts.map +1 -1
  286. package/dist/routing/codegen-shared.d.ts +67 -0
  287. package/dist/routing/codegen-shared.d.ts.map +1 -0
  288. package/dist/routing/codegen-types.d.ts +60 -0
  289. package/dist/routing/codegen-types.d.ts.map +1 -0
  290. package/dist/routing/codegen.d.ts +7 -2
  291. package/dist/routing/codegen.d.ts.map +1 -1
  292. package/dist/routing/convention-lint.d.ts +41 -0
  293. package/dist/routing/convention-lint.d.ts.map +1 -0
  294. package/dist/routing/index.d.ts +7 -1
  295. package/dist/routing/index.d.ts.map +1 -1
  296. package/dist/routing/index.js +4 -2
  297. package/dist/routing/link-codegen.d.ts +90 -0
  298. package/dist/routing/link-codegen.d.ts.map +1 -0
  299. package/dist/routing/scanner.d.ts +1 -10
  300. package/dist/routing/scanner.d.ts.map +1 -1
  301. package/dist/routing/schema-validation.d.ts +35 -0
  302. package/dist/routing/schema-validation.d.ts.map +1 -0
  303. package/dist/routing/segment-classify.d.ts +75 -0
  304. package/dist/routing/segment-classify.d.ts.map +1 -0
  305. package/dist/routing/segment-codegen.d.ts +38 -0
  306. package/dist/routing/segment-codegen.d.ts.map +1 -0
  307. package/dist/routing/types.d.ts +77 -25
  308. package/dist/routing/types.d.ts.map +1 -1
  309. package/dist/routing/walkers.d.ts +51 -0
  310. package/dist/routing/walkers.d.ts.map +1 -0
  311. package/dist/rsc-runtime/rsc.d.ts +1 -1
  312. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  313. package/dist/rsc-runtime/ssr.d.ts +12 -0
  314. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  315. package/dist/schema-bridge.d.ts +76 -0
  316. package/dist/schema-bridge.d.ts.map +1 -0
  317. package/dist/search-params/define.d.ts +157 -0
  318. package/dist/search-params/define.d.ts.map +1 -0
  319. package/dist/search-params/index.d.ts +4 -7
  320. package/dist/search-params/index.d.ts.map +1 -1
  321. package/dist/search-params/index.js +34 -441
  322. package/dist/search-params/index.js.map +1 -1
  323. package/dist/search-params/registry.d.ts +2 -2
  324. package/dist/search-params/registry.d.ts.map +1 -1
  325. package/dist/search-params/wrappers.d.ts +53 -0
  326. package/dist/search-params/wrappers.d.ts.map +1 -0
  327. package/dist/segment-params/define.d.ts +89 -0
  328. package/dist/segment-params/define.d.ts.map +1 -0
  329. package/dist/segment-params/index.d.ts +3 -0
  330. package/dist/segment-params/index.d.ts.map +1 -0
  331. package/dist/segment-params/index.js +2 -0
  332. package/dist/server/access-gate.d.ts +8 -3
  333. package/dist/server/access-gate.d.ts.map +1 -1
  334. package/dist/server/action-client.d.ts +41 -6
  335. package/dist/server/action-client.d.ts.map +1 -1
  336. package/dist/server/action-encryption.d.ts +76 -0
  337. package/dist/server/action-encryption.d.ts.map +1 -0
  338. package/dist/server/action-handler.d.ts +35 -1
  339. package/dist/server/action-handler.d.ts.map +1 -1
  340. package/dist/server/actions.d.ts +6 -14
  341. package/dist/server/actions.d.ts.map +1 -1
  342. package/dist/server/als-registry.d.ts +70 -11
  343. package/dist/server/als-registry.d.ts.map +1 -1
  344. package/dist/server/asset-headers.d.ts +1 -15
  345. package/dist/server/asset-headers.d.ts.map +1 -1
  346. package/dist/server/body-limits.d.ts.map +1 -1
  347. package/dist/server/build-manifest.d.ts +8 -2
  348. package/dist/server/build-manifest.d.ts.map +1 -1
  349. package/dist/server/coalesce-tick.d.ts +40 -0
  350. package/dist/server/coalesce-tick.d.ts.map +1 -0
  351. package/dist/server/cookie-context.d.ts +170 -0
  352. package/dist/server/cookie-context.d.ts.map +1 -0
  353. package/dist/server/cookie-parsing.d.ts +51 -0
  354. package/dist/server/cookie-parsing.d.ts.map +1 -0
  355. package/dist/server/csrf.d.ts +3 -2
  356. package/dist/server/csrf.d.ts.map +1 -1
  357. package/dist/server/default-logger.d.ts +22 -0
  358. package/dist/server/default-logger.d.ts.map +1 -0
  359. package/dist/server/deny-boundary.d.ts +90 -0
  360. package/dist/server/deny-boundary.d.ts.map +1 -0
  361. package/dist/server/deny-renderer.d.ts +1 -1
  362. package/dist/server/deny-renderer.d.ts.map +1 -1
  363. package/dist/server/dev-source-map.d.ts +22 -0
  364. package/dist/server/dev-source-map.d.ts.map +1 -0
  365. package/dist/server/early-hints-sender.d.ts.map +1 -1
  366. package/dist/server/early-hints.d.ts +13 -11
  367. package/dist/server/early-hints.d.ts.map +1 -1
  368. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  369. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  370. package/dist/server/fallback-error.d.ts +12 -7
  371. package/dist/server/fallback-error.d.ts.map +1 -1
  372. package/dist/server/flight-injection-state.d.ts +66 -0
  373. package/dist/server/flight-injection-state.d.ts.map +1 -0
  374. package/dist/server/flight-scripts.d.ts +42 -0
  375. package/dist/server/flight-scripts.d.ts.map +1 -0
  376. package/dist/server/flush.d.ts.map +1 -1
  377. package/dist/server/form-data.d.ts +29 -0
  378. package/dist/server/form-data.d.ts.map +1 -1
  379. package/dist/server/html-injector-core.d.ts +213 -0
  380. package/dist/server/html-injector-core.d.ts.map +1 -0
  381. package/dist/server/html-injectors.d.ts +81 -41
  382. package/dist/server/html-injectors.d.ts.map +1 -1
  383. package/dist/server/index.d.ts +10 -46
  384. package/dist/server/index.d.ts.map +1 -1
  385. package/dist/server/index.js +170 -2911
  386. package/dist/server/index.js.map +1 -1
  387. package/dist/server/internal.d.ts +48 -0
  388. package/dist/server/internal.d.ts.map +1 -0
  389. package/dist/server/internal.js +3126 -0
  390. package/dist/server/internal.js.map +1 -0
  391. package/dist/server/logger.d.ts +39 -7
  392. package/dist/server/logger.d.ts.map +1 -1
  393. package/dist/server/metadata-routes.d.ts +23 -7
  394. package/dist/server/metadata-routes.d.ts.map +1 -1
  395. package/dist/server/middleware-runner.d.ts +36 -4
  396. package/dist/server/middleware-runner.d.ts.map +1 -1
  397. package/dist/server/node-stream-transforms.d.ts +112 -0
  398. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  399. package/dist/server/param-coercion.d.ts +54 -0
  400. package/dist/server/param-coercion.d.ts.map +1 -0
  401. package/dist/server/pipeline-helpers.d.ts +95 -0
  402. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  403. package/dist/server/pipeline-interception.d.ts +1 -1
  404. package/dist/server/pipeline-interception.d.ts.map +1 -1
  405. package/dist/server/pipeline-metadata.d.ts +6 -0
  406. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  407. package/dist/server/pipeline-outcome.d.ts +49 -0
  408. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  409. package/dist/server/pipeline-phases.d.ts +56 -0
  410. package/dist/server/pipeline-phases.d.ts.map +1 -0
  411. package/dist/server/pipeline.d.ts +111 -19
  412. package/dist/server/pipeline.d.ts.map +1 -1
  413. package/dist/server/port-resolution.d.ts +117 -0
  414. package/dist/server/port-resolution.d.ts.map +1 -0
  415. package/dist/server/primitives.d.ts +74 -20
  416. package/dist/server/primitives.d.ts.map +1 -1
  417. package/dist/server/render-timeout.d.ts +51 -0
  418. package/dist/server/render-timeout.d.ts.map +1 -0
  419. package/dist/server/request-context.d.ts +62 -107
  420. package/dist/server/request-context.d.ts.map +1 -1
  421. package/dist/server/route-element-builder.d.ts +28 -2
  422. package/dist/server/route-element-builder.d.ts.map +1 -1
  423. package/dist/server/route-handler.d.ts.map +1 -1
  424. package/dist/server/route-matcher.d.ts +25 -36
  425. package/dist/server/route-matcher.d.ts.map +1 -1
  426. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  427. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  428. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  429. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  430. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  431. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  432. package/dist/server/rsc-entry/helpers.d.ts +50 -6
  433. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  434. package/dist/server/rsc-entry/index.d.ts +19 -8
  435. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  436. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  437. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  438. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  439. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  440. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  441. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  442. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  443. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  444. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  445. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  446. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  447. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  448. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  449. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  450. package/dist/server/safe-load.d.ts +46 -0
  451. package/dist/server/safe-load.d.ts.map +1 -0
  452. package/dist/server/sensitive-fields.d.ts +74 -0
  453. package/dist/server/sensitive-fields.d.ts.map +1 -0
  454. package/dist/server/sitemap-generator.d.ts +129 -0
  455. package/dist/server/sitemap-generator.d.ts.map +1 -0
  456. package/dist/server/sitemap-handler.d.ts +22 -0
  457. package/dist/server/sitemap-handler.d.ts.map +1 -0
  458. package/dist/server/slot-resolver.d.ts +1 -1
  459. package/dist/server/slot-resolver.d.ts.map +1 -1
  460. package/dist/server/ssr-bridge-types.d.ts +121 -0
  461. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  462. package/dist/server/ssr-entry.d.ts +2 -43
  463. package/dist/server/ssr-entry.d.ts.map +1 -1
  464. package/dist/server/ssr-render.d.ts +64 -21
  465. package/dist/server/ssr-render.d.ts.map +1 -1
  466. package/dist/server/ssr-wrappers.d.ts +50 -0
  467. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  468. package/dist/server/state-tree-diff.d.ts +12 -5
  469. package/dist/server/state-tree-diff.d.ts.map +1 -1
  470. package/dist/server/status-code-resolver.d.ts +16 -11
  471. package/dist/server/status-code-resolver.d.ts.map +1 -1
  472. package/dist/server/stream-utils.d.ts +36 -0
  473. package/dist/server/stream-utils.d.ts.map +1 -0
  474. package/dist/server/tracing.d.ts +5 -5
  475. package/dist/server/tracing.d.ts.map +1 -1
  476. package/dist/server/tree-builder.d.ts +62 -30
  477. package/dist/server/tree-builder.d.ts.map +1 -1
  478. package/dist/server/tree-match.d.ts +49 -0
  479. package/dist/server/tree-match.d.ts.map +1 -0
  480. package/dist/server/types.d.ts +71 -6
  481. package/dist/server/types.d.ts.map +1 -1
  482. package/dist/server/utils/escape-html.d.ts +14 -0
  483. package/dist/server/utils/escape-html.d.ts.map +1 -0
  484. package/dist/server/version-skew.d.ts +61 -0
  485. package/dist/server/version-skew.d.ts.map +1 -0
  486. package/dist/shared/href-validation.d.ts +38 -0
  487. package/dist/shared/href-validation.d.ts.map +1 -0
  488. package/dist/shared/merge-search-params.d.ts +22 -0
  489. package/dist/shared/merge-search-params.d.ts.map +1 -0
  490. package/dist/shims/font-google.d.ts +1 -1
  491. package/dist/shims/font-google.d.ts.map +1 -1
  492. package/dist/shims/font-google.js +42 -0
  493. package/dist/shims/font-google.js.map +1 -0
  494. package/dist/shims/font-local.d.ts +26 -0
  495. package/dist/shims/font-local.d.ts.map +1 -0
  496. package/dist/shims/font-local.js +20 -0
  497. package/dist/shims/font-local.js.map +1 -0
  498. package/dist/shims/headers.d.ts +2 -1
  499. package/dist/shims/headers.d.ts.map +1 -1
  500. package/dist/shims/image.d.ts +1 -1
  501. package/dist/shims/navigation-client.d.ts +3 -1
  502. package/dist/shims/navigation-client.d.ts.map +1 -1
  503. package/dist/shims/navigation.d.ts +11 -5
  504. package/dist/shims/navigation.d.ts.map +1 -1
  505. package/dist/utils/state-machine.d.ts +80 -0
  506. package/dist/utils/state-machine.d.ts.map +1 -0
  507. package/package.json +63 -22
  508. package/src/adapters/build-output-helper.ts +139 -0
  509. package/src/adapters/cloudflare-dev.ts +177 -0
  510. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  511. package/src/adapters/cloudflare.ts +350 -76
  512. package/src/adapters/compress-module.ts +24 -4
  513. package/src/adapters/nitro.ts +147 -60
  514. package/src/adapters/shared.ts +40 -0
  515. package/src/adapters/wrangler.d.ts +7 -0
  516. package/src/cache/cache-api.ts +39 -0
  517. package/src/cache/handler-store.ts +68 -0
  518. package/src/cache/index.ts +81 -18
  519. package/src/cache/singleflight.ts +62 -4
  520. package/src/cache/sizeof.ts +33 -0
  521. package/src/cache/timber-cache.ts +52 -24
  522. package/src/cli-schema-sync.ts +295 -0
  523. package/src/cli.ts +76 -8
  524. package/src/client/browser-dev.ts +153 -1
  525. package/src/client/browser-entry/action-dispatch.ts +125 -0
  526. package/src/client/browser-entry/hmr.ts +81 -0
  527. package/src/client/browser-entry/hydrate.ts +153 -0
  528. package/src/client/browser-entry/index.ts +151 -0
  529. package/src/client/browser-entry/post-hydration.ts +113 -0
  530. package/src/client/browser-entry/router-init.ts +219 -0
  531. package/src/client/browser-entry/rsc-stream.ts +157 -0
  532. package/src/client/browser-entry/scroll.ts +27 -0
  533. package/src/client/error-boundary.tsx +99 -22
  534. package/src/client/error-reconstituter.tsx +65 -0
  535. package/src/client/form.tsx +31 -32
  536. package/src/client/history.ts +26 -4
  537. package/src/client/index.ts +67 -45
  538. package/src/client/internal.ts +58 -0
  539. package/src/client/link-pending-store.ts +116 -0
  540. package/src/client/link.tsx +343 -150
  541. package/src/client/nav-link-store.ts +37 -0
  542. package/src/client/navigation-api-types.ts +112 -0
  543. package/src/client/navigation-api.ts +338 -0
  544. package/src/client/navigation-context.ts +35 -7
  545. package/src/client/navigation-root.tsx +347 -0
  546. package/src/client/nuqs-adapter.tsx +16 -3
  547. package/src/client/router-ref.ts +1 -1
  548. package/src/client/router.ts +418 -128
  549. package/src/client/rsc-fetch.ts +208 -10
  550. package/src/client/segment-cache.ts +6 -3
  551. package/src/client/segment-outlet.tsx +77 -0
  552. package/src/client/segment-update-context.ts +42 -0
  553. package/src/client/shallow-url.ts +22 -0
  554. package/src/client/ssr-data.ts +13 -5
  555. package/src/client/stale-reload.ts +72 -3
  556. package/src/client/state.ts +2 -2
  557. package/src/client/top-loader.tsx +11 -9
  558. package/src/client/use-cookie.ts +31 -2
  559. package/src/client/use-link-status.ts +7 -7
  560. package/src/client/use-pathname.ts +1 -0
  561. package/src/client/use-pending-navigation.ts +40 -0
  562. package/src/client/use-query-states.ts +9 -3
  563. package/src/client/use-router.ts +4 -1
  564. package/src/client/use-search-params.ts +26 -44
  565. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  566. package/src/codec.ts +147 -0
  567. package/src/config-types.ts +292 -0
  568. package/src/config-validation.ts +303 -0
  569. package/src/content/index.ts +5 -13
  570. package/src/cookies/define-cookie.ts +233 -53
  571. package/src/cookies/index.ts +12 -1
  572. package/src/cookies/json-cookie.ts +105 -0
  573. package/src/cookies/validation.ts +192 -0
  574. package/src/dev-tools/404-page.ts +387 -0
  575. package/src/dev-tools/browser-logs.ts +291 -0
  576. package/src/dev-tools/error-page.ts +507 -0
  577. package/src/dev-tools/holding-server.ts +187 -0
  578. package/src/dev-tools/index.ts +90 -0
  579. package/src/dev-tools/instrumentation.ts +176 -0
  580. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  581. package/src/dev-tools/overlay.ts +469 -0
  582. package/src/dev-tools/stack-classifier.ts +75 -0
  583. package/src/dev-tools/terminal.ts +183 -0
  584. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  585. package/src/fonts/ast.ts +525 -16
  586. package/src/fonts/bundle.ts +131 -0
  587. package/src/fonts/dev-middleware.ts +74 -0
  588. package/src/fonts/local.ts +3 -3
  589. package/src/fonts/pipeline.ts +337 -0
  590. package/src/fonts/transform.ts +317 -0
  591. package/src/fonts/types.ts +52 -1
  592. package/src/fonts/virtual-modules.ts +235 -0
  593. package/src/index.ts +415 -345
  594. package/src/params/codec-registry.ts +34 -0
  595. package/src/params/define-schema.ts +115 -0
  596. package/src/params/index.ts +17 -0
  597. package/src/params/resolve-schema.ts +116 -0
  598. package/src/plugin-context.ts +247 -0
  599. package/src/plugins/adapter-build.ts +98 -4
  600. package/src/plugins/build-manifest.ts +168 -23
  601. package/src/plugins/build-report.ts +16 -25
  602. package/src/plugins/cache.ts +180 -0
  603. package/src/plugins/client-chunks.ts +113 -0
  604. package/src/plugins/cloudflare-wasm.ts +103 -0
  605. package/src/plugins/content.ts +1 -1
  606. package/src/plugins/dev-server.ts +179 -37
  607. package/src/plugins/entries.ts +110 -8
  608. package/src/plugins/fonts.ts +167 -655
  609. package/src/plugins/mdx.ts +47 -10
  610. package/src/plugins/routing.ts +386 -47
  611. package/src/plugins/server-bundle.ts +59 -3
  612. package/src/plugins/shims.ts +136 -35
  613. package/src/plugins/static-build.ts +15 -89
  614. package/src/routing/codegen-shared.ts +115 -0
  615. package/src/routing/codegen-types.ts +61 -0
  616. package/src/routing/codegen.ts +321 -177
  617. package/src/routing/convention-lint.ts +357 -0
  618. package/src/routing/index.ts +10 -1
  619. package/src/routing/interception.ts +1 -1
  620. package/src/routing/link-codegen.ts +310 -0
  621. package/src/routing/scanner.ts +165 -110
  622. package/src/routing/schema-validation.ts +149 -0
  623. package/src/routing/segment-classify.ts +188 -0
  624. package/src/routing/segment-codegen.ts +98 -0
  625. package/src/routing/types.ts +78 -25
  626. package/src/routing/walkers.ts +90 -0
  627. package/src/rsc-runtime/rsc.ts +2 -0
  628. package/src/rsc-runtime/ssr.ts +50 -0
  629. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  630. package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
  631. package/src/search-params/define.ts +538 -0
  632. package/src/search-params/index.ts +14 -20
  633. package/src/search-params/registry.ts +2 -2
  634. package/src/search-params/wrappers.ts +92 -0
  635. package/src/segment-params/define.ts +309 -0
  636. package/src/segment-params/index.ts +9 -0
  637. package/src/server/access-gate.tsx +76 -34
  638. package/src/server/action-client.ts +119 -28
  639. package/src/server/action-encryption.ts +144 -0
  640. package/src/server/action-handler.ts +112 -14
  641. package/src/server/actions.ts +34 -26
  642. package/src/server/als-registry.ts +108 -20
  643. package/src/server/asset-headers.ts +8 -34
  644. package/src/server/body-limits.ts +10 -2
  645. package/src/server/build-manifest.ts +17 -4
  646. package/src/server/coalesce-tick.ts +75 -0
  647. package/src/server/compress.ts +25 -7
  648. package/src/server/cookie-context.ts +473 -0
  649. package/src/server/cookie-parsing.ts +135 -0
  650. package/src/server/csrf.ts +39 -6
  651. package/src/server/default-logger.ts +99 -0
  652. package/src/server/deny-boundary.ts +218 -0
  653. package/src/server/deny-renderer.ts +32 -52
  654. package/src/server/dev-source-map.ts +31 -0
  655. package/src/server/early-hints-sender.ts +3 -2
  656. package/src/server/early-hints.ts +35 -27
  657. package/src/server/error-boundary-wrapper.ts +74 -22
  658. package/src/server/fallback-error.ts +74 -102
  659. package/src/server/flight-injection-state.ts +113 -0
  660. package/src/server/flight-scripts.ts +62 -0
  661. package/src/server/flush.ts +2 -1
  662. package/src/server/form-data.ts +101 -5
  663. package/src/server/html-injector-core.ts +418 -0
  664. package/src/server/html-injectors.ts +238 -223
  665. package/src/server/index.ts +29 -183
  666. package/src/server/internal.ts +182 -0
  667. package/src/server/logger.ts +67 -36
  668. package/src/server/metadata-routes.ts +44 -19
  669. package/src/server/middleware-runner.ts +75 -4
  670. package/src/server/node-stream-transforms.ts +361 -0
  671. package/src/server/param-coercion.ts +206 -0
  672. package/src/server/pipeline-helpers.ts +204 -0
  673. package/src/server/pipeline-interception.ts +32 -18
  674. package/src/server/pipeline-metadata.ts +13 -0
  675. package/src/server/pipeline-outcome.ts +197 -0
  676. package/src/server/pipeline-phases.ts +527 -0
  677. package/src/server/pipeline.ts +201 -382
  678. package/src/server/port-resolution.ts +215 -0
  679. package/src/server/primitives.ts +130 -46
  680. package/src/server/render-timeout.ts +108 -0
  681. package/src/server/request-context.ts +168 -337
  682. package/src/server/route-element-builder.ts +437 -208
  683. package/src/server/route-handler.ts +31 -4
  684. package/src/server/route-matcher.ts +128 -277
  685. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  686. package/src/server/rsc-entry/api-handler.ts +69 -32
  687. package/src/server/rsc-entry/error-renderer.ts +316 -89
  688. package/src/server/rsc-entry/helpers.ts +155 -26
  689. package/src/server/rsc-entry/index.ts +283 -329
  690. package/src/server/rsc-entry/render-route.ts +313 -0
  691. package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
  692. package/src/server/rsc-entry/rsc-payload.ts +65 -22
  693. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  694. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  695. package/src/server/rsc-entry/ssr-renderer.ts +271 -41
  696. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  697. package/src/server/safe-load.ts +60 -0
  698. package/src/server/sensitive-fields.ts +230 -0
  699. package/src/server/sitemap-generator.ts +338 -0
  700. package/src/server/sitemap-handler.ts +148 -0
  701. package/src/server/slot-resolver.ts +234 -246
  702. package/src/server/ssr-bridge-types.ts +124 -0
  703. package/src/server/ssr-entry.ts +217 -78
  704. package/src/server/ssr-render.ts +344 -71
  705. package/src/server/ssr-wrappers.tsx +141 -0
  706. package/src/server/state-tree-diff.ts +30 -23
  707. package/src/server/status-code-resolver.ts +112 -128
  708. package/src/server/stream-utils.ts +213 -0
  709. package/src/server/tracing.ts +21 -10
  710. package/src/server/tree-builder.ts +204 -90
  711. package/src/server/tree-match.ts +210 -0
  712. package/src/server/types.ts +78 -9
  713. package/src/server/utils/escape-html.ts +20 -0
  714. package/src/server/version-skew.ts +104 -0
  715. package/src/shared/href-validation.ts +127 -0
  716. package/src/shared/merge-search-params.ts +55 -0
  717. package/src/shims/font-google.ts +1 -1
  718. package/src/shims/font-local.ts +34 -0
  719. package/src/shims/headers.ts +5 -1
  720. package/src/shims/navigation-client.ts +4 -3
  721. package/src/shims/navigation.ts +14 -7
  722. package/src/utils/state-machine.ts +111 -0
  723. package/LICENSE +0 -8
  724. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  725. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  726. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  727. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  728. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  729. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  730. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  731. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  732. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  733. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  734. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  735. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  736. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  737. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  738. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  739. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  740. package/dist/cache/register-cached-function.d.ts +0 -17
  741. package/dist/cache/register-cached-function.d.ts.map +0 -1
  742. package/dist/client/browser-entry.d.ts +0 -21
  743. package/dist/client/browser-entry.d.ts.map +0 -1
  744. package/dist/client/link-status-provider.d.ts +0 -11
  745. package/dist/client/link-status-provider.d.ts.map +0 -1
  746. package/dist/client/segment-merger.d.ts +0 -119
  747. package/dist/client/segment-merger.d.ts.map +0 -1
  748. package/dist/client/transition-root.d.ts.map +0 -1
  749. package/dist/client/use-navigation-pending.d.ts +0 -26
  750. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  751. package/dist/client/use-params.d.ts.map +0 -1
  752. package/dist/plugins/cache-transform.d.ts +0 -36
  753. package/dist/plugins/cache-transform.d.ts.map +0 -1
  754. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  755. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  756. package/dist/plugins/dev-logs.d.ts.map +0 -1
  757. package/dist/plugins/dynamic-transform.d.ts +0 -72
  758. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  759. package/dist/plugins/server-action-exports.d.ts +0 -26
  760. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  761. package/dist/routing/status-file-lint.d.ts +0 -33
  762. package/dist/routing/status-file-lint.d.ts.map +0 -1
  763. package/dist/search-params/analyze.d.ts +0 -54
  764. package/dist/search-params/analyze.d.ts.map +0 -1
  765. package/dist/search-params/builtin-codecs.d.ts +0 -105
  766. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  767. package/dist/search-params/codecs.d.ts +0 -53
  768. package/dist/search-params/codecs.d.ts.map +0 -1
  769. package/dist/search-params/create.d.ts +0 -106
  770. package/dist/search-params/create.d.ts.map +0 -1
  771. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  772. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  773. package/dist/server/dev-logger.d.ts.map +0 -1
  774. package/dist/server/dev-span-processor.d.ts.map +0 -1
  775. package/dist/server/dev-warnings.d.ts.map +0 -1
  776. package/dist/server/manifest-status-resolver.d.ts +0 -58
  777. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  778. package/dist/server/prerender.d.ts +0 -77
  779. package/dist/server/prerender.d.ts.map +0 -1
  780. package/dist/utils/directive-parser.d.ts +0 -70
  781. package/dist/utils/directive-parser.d.ts.map +0 -1
  782. package/src/cache/register-cached-function.ts +0 -103
  783. package/src/client/browser-entry.ts +0 -678
  784. package/src/client/link-status-provider.tsx +0 -30
  785. package/src/client/segment-merger.ts +0 -339
  786. package/src/client/transition-root.tsx +0 -166
  787. package/src/client/use-navigation-pending.ts +0 -38
  788. package/src/plugins/cache-transform.ts +0 -199
  789. package/src/plugins/dev-error-overlay.ts +0 -230
  790. package/src/plugins/dynamic-transform.ts +0 -161
  791. package/src/plugins/server-action-exports.ts +0 -220
  792. package/src/routing/status-file-lint.ts +0 -112
  793. package/src/search-params/analyze.ts +0 -192
  794. package/src/search-params/builtin-codecs.ts +0 -228
  795. package/src/search-params/create.ts +0 -321
  796. package/src/server/dev-fetch-instrumentation.ts +0 -96
  797. package/src/server/dev-span-processor.ts +0 -78
  798. package/src/server/manifest-status-resolver.ts +0 -215
  799. package/src/server/prerender.ts +0 -139
  800. package/src/utils/directive-parser.ts +0 -529
  801. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -5,10 +5,21 @@ import { SegmentCache, PrefetchCache, buildSegmentTree } from './segment-cache';
5
5
  import type { SegmentInfo } from './segment-cache';
6
6
  import { HistoryStack } from './history';
7
7
  import type { HeadElement } from './head';
8
- import { setCurrentParams } from './use-params.js';
9
- import { setNavigationState } from './navigation-context.js';
10
- import { SegmentElementCache, cacheSegmentElements, mergeSegmentTree } from './segment-merger.js';
11
- import { fetchRscPayload, RedirectError } from './rsc-fetch.js';
8
+ import { setCurrentParams } from './use-segment-params.js';
9
+ import {
10
+ setNavigationState,
11
+ getNavigationState,
12
+ type NavigationState,
13
+ } from './navigation-context.js';
14
+
15
+ import {
16
+ fetchRscPayload,
17
+ RedirectError,
18
+ ServerErrorResponse,
19
+ VersionSkewError,
20
+ } from './rsc-fetch.js';
21
+ import { setHardNavigating } from './navigation-root.js';
22
+ import { isStaleClientReference, triggerStaleReload } from './stale-reload.js';
12
23
  import type { FetchResult } from './rsc-fetch.js';
13
24
 
14
25
  // ─── Types ───────────────────────────────────────────────────────
@@ -18,6 +29,19 @@ export interface NavigationOptions {
18
29
  scroll?: boolean;
19
30
  /** Use replaceState instead of pushState (replaces current history entry) */
20
31
  replace?: boolean;
32
+ /**
33
+ * @internal AbortSignal from the Navigation API's NavigateEvent.
34
+ * When provided, the signal is linked to the router's per-navigation
35
+ * AbortController so in-flight RSC fetches are cancelled when a new
36
+ * navigation starts.
37
+ */
38
+ _signal?: AbortSignal;
39
+ /**
40
+ * @internal Skip pushState/replaceState — the Navigation API has already
41
+ * updated the URL via event.intercept(). Used for external navigations
42
+ * intercepted by the navigate event handler.
43
+ */
44
+ _skipHistory?: boolean;
21
45
  }
22
46
 
23
47
  /**
@@ -31,8 +55,12 @@ export type RscDecoder = (fetchPromise: Promise<Response>) => unknown;
31
55
  * Function that renders a decoded RSC element tree into the DOM.
32
56
  * In production: reactRoot.render(element).
33
57
  * In tests: a no-op or mock.
58
+ *
59
+ * Receives the current NavigationState explicitly — no temporal
60
+ * coupling with setNavigationState/getNavigationState. The renderer
61
+ * wraps the element in NavigationProvider with this state.
34
62
  */
35
- export type RootRenderer = (element: unknown) => void;
63
+ export type RootRenderer = (element: unknown, navState: NavigationState) => void;
36
64
 
37
65
  /**
38
66
  * Platform dependencies injected for testability. In production these
@@ -64,14 +92,65 @@ export interface RouterDeps {
64
92
  *
65
93
  * The `perform` callback receives a `wrapPayload` function to wrap the
66
94
  * decoded RSC payload with NavigationProvider + NuqsAdapter before
67
- * TransitionRoot sets it as the new element.
95
+ * NavigationRoot sets it as the new element. The `wrapPayload` function
96
+ * receives the NavigationState explicitly — no temporal coupling with
97
+ * getNavigationState().
68
98
  *
69
99
  * If not provided (tests), the router falls back to renderRoot.
70
100
  */
71
101
  navigateTransition?: (
72
102
  pendingUrl: string,
73
- perform: (wrapPayload: (payload: unknown) => unknown) => Promise<unknown>
103
+ perform: (
104
+ wrapPayload: (
105
+ payload: unknown,
106
+ navState: NavigationState,
107
+ segmentUpdates?: Map<string, unknown>
108
+ ) => unknown
109
+ ) => Promise<{ element: unknown; decodePromise: Promise<void> | null }>
74
110
  ) => Promise<void>;
111
+
112
+ /**
113
+ * Whether the Navigation API is active and handling traversals.
114
+ * When true, the popstate handler is a no-op — the Navigation API's
115
+ * navigate event covers back/forward button presses.
116
+ */
117
+ navigationApiActive?: boolean;
118
+
119
+ /**
120
+ * Called around pushState/replaceState to set a flag that prevents
121
+ * the Navigation API's navigate listener from double-handling
122
+ * router-initiated navigations.
123
+ */
124
+ setRouterNavigating?: (value: boolean) => void;
125
+
126
+ /**
127
+ * Save scroll position via the Navigation API's per-entry state.
128
+ * When provided, used instead of history.replaceState for scroll storage.
129
+ */
130
+ saveNavigationEntryScroll?: (scrollY: number) => void;
131
+
132
+ /**
133
+ * Signal that a router-initiated navigation has completed. Resolves the
134
+ * deferred promise that ties the browser's native loading state to the
135
+ * navigation lifecycle. Called in the finally block of navigate/refresh,
136
+ * aligned with when the TopLoader's pendingUrl clears.
137
+ */
138
+ completeRouterNavigation?: () => void;
139
+
140
+ /**
141
+ * Get the current unwrapped RSC payload element. Used for partial
142
+ * navigation: the router re-wraps the same element with new
143
+ * NavigationProvider context so mounted SegmentOutlets are preserved.
144
+ */
145
+ _getCurrentPayload?: () => unknown;
146
+
147
+ /**
148
+ * Initiate a navigation via the Navigation API (`navigation.navigate()`).
149
+ * Fires the navigate event BEFORE committing the URL, allowing Chrome
150
+ * to show its native loading indicator. Falls back to pushState when
151
+ * unavailable.
152
+ */
153
+ navigationNavigate?: (url: string, replace: boolean) => void;
75
154
  }
76
155
 
77
156
  export interface RouterInstance {
@@ -80,7 +159,7 @@ export interface RouterInstance {
80
159
  /** Full re-render of the current URL — no state tree sent */
81
160
  refresh(): Promise<void>;
82
161
  /** Handle a popstate event (back/forward button). scrollY is read from history.state. */
83
- handlePopState(url: string, scrollY?: number): Promise<void>;
162
+ handlePopState(url: string, scrollY?: number, externalSignal?: AbortSignal): Promise<void>;
84
163
  /** Whether a navigation is currently in flight */
85
164
  isPending(): boolean;
86
165
  /** The URL currently being navigated to, or null if idle */
@@ -100,12 +179,7 @@ export interface RouterInstance {
100
179
  * Called on initial hydration with segment info embedded in the HTML.
101
180
  */
102
181
  initSegmentCache(segments: SegmentInfo[]): void;
103
- /**
104
- * Cache segment elements from a decoded RSC element tree.
105
- * Called on initial hydration to populate the element cache so the
106
- * first client navigation can use partial payloads.
107
- */
108
- cacheElementTree(element: unknown): void;
182
+
109
183
  /** The segment cache (exposed for tests and <Link> prefetch) */
110
184
  segmentCache: SegmentCache;
111
185
  /** The prefetch cache (exposed for tests and <Link> prefetch) */
@@ -130,24 +204,71 @@ function isAbortError(error: unknown): boolean {
130
204
  * Create a router instance. In production, called once at app hydration
131
205
  * with real browser APIs. In tests, called with mock dependencies.
132
206
  */
207
+ /**
208
+ * Router navigation phase — discriminated union replacing scattered
209
+ * `pending` + `pendingUrl` boolean flags.
210
+ *
211
+ * - `idle`: No navigation in flight. The committed params/pathname
212
+ * are current.
213
+ * - `navigating`: A fetch or render is in progress. `targetUrl` is
214
+ * the destination being navigated to.
215
+ */
216
+ export type RouterPhase = { phase: 'idle' } | { phase: 'navigating'; targetUrl: string };
217
+
133
218
  export function createRouter(deps: RouterDeps): RouterInstance {
134
219
  const segmentCache = new SegmentCache();
135
220
  const prefetchCache = new PrefetchCache();
136
221
  const historyStack = new HistoryStack();
137
- const segmentElementCache = new SegmentElementCache();
138
-
139
- let pending = false;
140
- let pendingUrl: string | null = null;
222
+ let routerPhase: RouterPhase = { phase: 'idle' };
141
223
  const pendingListeners = new Set<(pending: boolean) => void>();
142
224
 
225
+ // AbortController for the current in-flight navigation.
226
+ // When a new navigation starts, the previous controller is aborted,
227
+ // cancelling any in-progress RSC fetch. This provides automatic
228
+ // cancellation of stale fetches regardless of Navigation API support.
229
+ let currentNavAbort: AbortController | null = null;
230
+
231
+ /**
232
+ * Create a new AbortController for a navigation, aborting any
233
+ * previous in-flight navigation. Optionally links to an external
234
+ * signal (e.g., from the Navigation API's NavigateEvent.signal).
235
+ */
236
+ function createNavAbort(externalSignal?: AbortSignal): AbortController {
237
+ // Abort previous navigation's fetch
238
+ currentNavAbort?.abort();
239
+ const controller = new AbortController();
240
+ currentNavAbort = controller;
241
+
242
+ // If an external signal is provided (e.g., Navigation API),
243
+ // forward its abort to our controller.
244
+ if (externalSignal) {
245
+ if (externalSignal.aborted) {
246
+ controller.abort();
247
+ } else {
248
+ externalSignal.addEventListener('abort', () => controller.abort(), { once: true });
249
+ }
250
+ }
251
+
252
+ return controller;
253
+ }
254
+
143
255
  function setPending(value: boolean, url?: string): void {
144
- const newPendingUrl = value && url ? url : null;
145
- if (pending === value && pendingUrl === newPendingUrl) return;
146
- pending = value;
147
- pendingUrl = newPendingUrl;
256
+ const next: RouterPhase =
257
+ value && url ? { phase: 'navigating', targetUrl: url } : { phase: 'idle' };
258
+ // Skip no-op updates
259
+ if (
260
+ routerPhase.phase === next.phase &&
261
+ (routerPhase.phase === 'idle' ||
262
+ (routerPhase.phase === 'navigating' &&
263
+ next.phase === 'navigating' &&
264
+ routerPhase.targetUrl === next.targetUrl))
265
+ ) {
266
+ return;
267
+ }
268
+ routerPhase = next;
148
269
  // Notify external store listeners (non-React consumers).
149
270
  // React-facing pending state is handled by useOptimistic in
150
- // TransitionRoot via navigateTransition — not this function.
271
+ // NavigationRoot via navigateTransition — not this function.
151
272
  for (const listener of pendingListeners) {
152
273
  listener(value);
153
274
  }
@@ -163,94 +284,139 @@ export function createRouter(deps: RouterDeps): RouterInstance {
163
284
  }
164
285
 
165
286
  /** Render a decoded RSC payload into the DOM if a renderer is available. */
166
- function renderPayload(payload: unknown): void {
287
+ function renderPayload(payload: unknown, navState: NavigationState): void {
167
288
  if (deps.renderRoot) {
168
- deps.renderRoot(payload);
289
+ deps.renderRoot(payload, navState);
169
290
  }
170
291
  }
171
292
 
293
+ function isPartialNavigation(skippedSegments: string[] | null | undefined): boolean {
294
+ return skippedSegments != null && skippedSegments.length > 0;
295
+ }
296
+
172
297
  /**
173
- * Merge a partial RSC payload with cached segment elements if segments
174
- * were skipped, then cache segments from the (merged) payload.
175
- * Returns the merged payload ready for rendering.
298
+ * Build a segment updates map for partial navigation. Identifies the
299
+ * first non-skipped segment and maps it to the payload content.
176
300
  */
177
- function mergeAndCachePayload(
178
- payload: unknown,
179
- skippedSegments: string[] | null | undefined
180
- ): unknown {
181
- let merged = payload;
182
-
183
- // If segments were skipped, merge the partial payload with cached segments
184
- if (skippedSegments && skippedSegments.length > 0) {
185
- merged = mergeSegmentTree(payload, skippedSegments, segmentElementCache);
301
+ function buildSegmentUpdates(result: FetchResult): Map<string, unknown> {
302
+ const skipped = new Set(result.skippedSegments!);
303
+ const segmentInfo = result.segmentInfo;
304
+ const updates = new Map<string, unknown>();
305
+ if (segmentInfo) {
306
+ for (const info of segmentInfo) {
307
+ if (!skipped.has(info.segmentId ?? info.path)) {
308
+ // Use segmentId (outlet key) when available — route groups
309
+ // use a disambiguated key like "/(marketing)" instead of "/".
310
+ updates.set(info.segmentId ?? info.path, result.payload);
311
+ break;
312
+ }
313
+ }
186
314
  }
187
-
188
- // Cache segment elements from the (merged) payload for future merges
189
- cacheSegmentElements(merged, segmentElementCache);
190
-
191
- return merged;
315
+ return updates;
192
316
  }
193
317
 
194
318
  /**
195
319
  * Update navigation state (params + pathname) for the next render.
196
320
  *
197
- * Sets both the module-level fallback (for tests and SSR) and the
198
- * navigation context state (read by renderRoot to wrap the element
199
- * in NavigationProvider). The context update is atomic with the tree
200
- * render — both are passed to reactRoot.render() in the same call.
321
+ * Sets the module-level fallback (for tests and SSR) and the
322
+ * globalThis bridge, then returns the NavigationState so callers
323
+ * can pass it explicitly to renderRoot/wrapPayload — eliminating
324
+ * temporal coupling with getNavigationState().
201
325
  */
202
326
  function updateNavigationState(
203
327
  params: Record<string, string | string[]> | null | undefined,
204
328
  url: string
205
- ): void {
329
+ ): NavigationState {
206
330
  const resolvedParams = params ?? {};
207
331
  // Module-level fallback for tests (no NavigationProvider) and SSR
208
332
  setCurrentParams(resolvedParams);
209
- // Navigation context — read by renderRoot to wrap the RSC element
210
- const pathname = url.startsWith('http') ? new URL(url).pathname : url.split('?')[0] || '/';
211
- setNavigationState({ params: resolvedParams, pathname });
333
+ // globalThis bridge — kept for backward compat
334
+ const parsed = new URL(url, 'http://localhost');
335
+ const pathname = parsed.pathname || '/';
336
+ const search = parsed.search;
337
+ const navState: NavigationState = { params: resolvedParams, pathname, search };
338
+ setNavigationState(navState);
339
+ return navState;
212
340
  }
213
341
 
214
342
  /**
215
343
  * Render a payload via navigateTransition (production) or renderRoot (tests).
216
- * The perform callback should fetch data, update state, and return the payload.
217
- * In production, the entire callback runs inside a React transition with
218
- * useOptimistic for the pending URL. In tests, the payload is rendered directly.
344
+ * The perform callback should fetch data, update state, and return the
345
+ * FetchResult plus the NavigationState (so it can be passed explicitly
346
+ * to wrapPayload/renderRoot without temporal coupling).
219
347
  */
348
+ interface TransitionResult {
349
+ headElements: HeadElement[] | null;
350
+ decodePromise: Promise<void> | null;
351
+ }
352
+
220
353
  async function renderViaTransition(
221
354
  url: string,
222
- perform: () => Promise<FetchResult>
223
- ): Promise<HeadElement[] | null> {
355
+ perform: () => Promise<FetchResult & { navState: NavigationState }>
356
+ ): Promise<TransitionResult> {
224
357
  if (deps.navigateTransition) {
225
358
  let headElements: HeadElement[] | null = null;
226
359
  await deps.navigateTransition(url, async (wrapPayload) => {
227
360
  const result = await perform();
228
361
  headElements = result.headElements;
229
- // Merge partial payload with cached segments before wrapping
230
- const merged = mergeAndCachePayload(result.payload, result.skippedSegments);
231
- // Store the MERGED payload in history — not the partial pre-merge tree.
232
- // This ensures handlePopState replays the complete tree on back/forward.
362
+
363
+ if (isPartialNavigation(result.skippedSegments)) {
364
+ const segmentUpdates = buildSegmentUpdates(result);
365
+
366
+ historyStack.push(url, {
367
+ payload: null,
368
+ headElements: result.headElements,
369
+ params: result.params,
370
+ });
371
+
372
+ // Re-wrap the CURRENT element with new context values.
373
+ // SegmentOutlets read updates from SegmentUpdateContext;
374
+ // NavigationProvider gets new params/pathname.
375
+ const element = wrapPayload(
376
+ deps._getCurrentPayload?.() ?? result.payload,
377
+ result.navState,
378
+ segmentUpdates
379
+ );
380
+ return { element, decodePromise: result.decodePromise };
381
+ }
382
+
383
+ // Full navigation — empty updates, render the new tree.
233
384
  historyStack.push(url, {
234
- payload: merged,
385
+ payload: result.payload,
235
386
  headElements: result.headElements,
236
387
  params: result.params,
237
388
  });
238
- return wrapPayload(merged);
389
+ const element = wrapPayload(result.payload, result.navState);
390
+ return { element, decodePromise: result.decodePromise };
239
391
  });
240
- return headElements;
392
+ // decodePromise is awaited inside the transition's startTransition
393
+ // callback (NavigationRoot), so we don't need it here.
394
+ return { headElements, decodePromise: null };
241
395
  }
242
396
  // Fallback: no transition (tests, no React tree)
243
397
  const result = await perform();
244
- // Merge partial payload with cached segments before rendering
245
- const merged = mergeAndCachePayload(result.payload, result.skippedSegments);
246
- // Store merged payload in history
247
- historyStack.push(url, {
248
- payload: merged,
249
- headElements: result.headElements,
250
- params: result.params,
251
- });
252
- renderPayload(merged);
253
- return result.headElements;
398
+ if (isPartialNavigation(result.skippedSegments)) {
399
+ historyStack.push(url, {
400
+ payload: null,
401
+ headElements: result.headElements,
402
+ params: result.params,
403
+ });
404
+ } else {
405
+ // Resolve thenables before storing/rendering in the fallback path
406
+ // (tests without navigateTransition). In production, React handles
407
+ // thenables via Suspense; in tests, renderRoot expects resolved values.
408
+ const payload =
409
+ result.payload != null && typeof result.payload === 'object' && 'then' in result.payload
410
+ ? await (result.payload as PromiseLike<unknown>)
411
+ : result.payload;
412
+ historyStack.push(url, {
413
+ payload,
414
+ headElements: result.headElements,
415
+ params: result.params,
416
+ });
417
+ renderPayload(payload, result.navState);
418
+ }
419
+ return { headElements: result.headElements, decodePromise: result.decodePromise };
254
420
  }
255
421
 
256
422
  /** Apply head elements (title, meta tags) to the DOM if available. */
@@ -269,20 +435,32 @@ export function createRouter(deps: RouterDeps): RouterInstance {
269
435
  }
270
436
  }
271
437
 
438
+ /**
439
+ * Schedule scroll restoration after the next paint and fire the
440
+ * scroll-restored event. Used by navigate, popstate, and refresh.
441
+ */
442
+ function restoreScrollAfterPaint(scrollY: number): void {
443
+ afterPaint(() => {
444
+ deps.scrollTo(0, scrollY);
445
+ window.dispatchEvent(new Event('timber:scroll-restored'));
446
+ });
447
+ }
448
+
272
449
  /**
273
450
  * Core navigation logic shared between the transition and fallback paths.
274
451
  * Fetches the RSC payload, updates all state, and returns the result.
275
452
  */
276
453
  async function performNavigationFetch(
277
454
  url: string,
278
- options: { replace: boolean }
279
- ): Promise<FetchResult> {
455
+ options: { replace: boolean; signal?: AbortSignal; skipHistory?: boolean }
456
+ ): Promise<FetchResult & { navState: NavigationState }> {
280
457
  // Check prefetch cache first. PrefetchResult has optional segmentInfo/params
281
458
  // fields — normalize to null for FetchResult compatibility.
282
459
  const prefetched = prefetchCache.consume(url);
283
460
  let result: FetchResult | undefined = prefetched
284
461
  ? {
285
462
  payload: prefetched.payload,
463
+ decodePromise: null,
286
464
  headElements: prefetched.headElements,
287
465
  segmentInfo: prefetched.segmentInfo ?? null,
288
466
  params: prefetched.params ?? null,
@@ -293,19 +471,26 @@ export function createRouter(deps: RouterDeps): RouterInstance {
293
471
  if (result === undefined) {
294
472
  // Fetch RSC payload with state tree for partial rendering.
295
473
  // Send current URL for intercepting route resolution (modal pattern).
296
- const stateTree = segmentCache.serializeStateTree(segmentElementCache.getMergeablePaths());
474
+ const stateTree = segmentCache.serializeStateTree();
297
475
  const rawCurrentUrl = deps.getCurrentUrl();
298
476
  const currentUrl = rawCurrentUrl.startsWith('http')
299
477
  ? new URL(rawCurrentUrl).pathname
300
478
  : new URL(rawCurrentUrl, 'http://localhost').pathname;
301
- result = await fetchRscPayload(url, deps, stateTree, currentUrl);
479
+ result = await fetchRscPayload(url, deps, stateTree, currentUrl, options.signal);
302
480
  }
303
481
 
304
- // Update the browser history — replace mode overwrites the current entry
305
- if (options.replace) {
306
- deps.replaceState({ timber: true, scrollY: 0 }, '', url);
307
- } else {
308
- deps.pushState({ timber: true, scrollY: 0 }, '', url);
482
+ // Update the browser history — skip when the Navigation API has already
483
+ // updated the URL via event.intercept() (external navigations).
484
+ if (!options.skipHistory) {
485
+ // Set the router-navigating flag so the Navigation API's navigate
486
+ // listener doesn't double-intercept this pushState/replaceState.
487
+ deps.setRouterNavigating?.(true);
488
+ if (options.replace) {
489
+ deps.replaceState({ timber: true, scrollY: 0 }, '', url);
490
+ } else {
491
+ deps.pushState({ timber: true, scrollY: 0 }, '', url);
492
+ }
493
+ deps.setRouterNavigating?.(false);
309
494
  }
310
495
 
311
496
  // NOTE: History push is deferred — the merged payload (after segment
@@ -316,29 +501,57 @@ export function createRouter(deps: RouterDeps): RouterInstance {
316
501
  // Update the segment cache with the new route's segment tree.
317
502
  updateSegmentCache(result.segmentInfo);
318
503
 
319
- // Update navigation state (params + pathname) before rendering.
320
- updateNavigationState(result.params, url);
504
+ // Update navigation state and capture it for explicit passing.
505
+ const navState = updateNavigationState(result.params, url);
321
506
 
322
- return result;
507
+ return { ...result, navState };
323
508
  }
324
509
 
325
510
  async function navigate(url: string, options: NavigationOptions = {}): Promise<void> {
326
511
  const scroll = options.scroll !== false;
327
512
  const replace = options.replace === true;
513
+ const externalSignal = options._signal as AbortSignal | undefined;
514
+ const skipHistory = options._skipHistory === true;
515
+
516
+ // Create an abort controller for this navigation. Links to the external
517
+ // signal (Navigation API's event.signal) when provided.
518
+ const navAbort = createNavAbort(externalSignal);
328
519
 
329
520
  // Capture the departing page's scroll position for scroll={false} preservation.
330
521
  const currentScrollY = deps.getScrollY();
331
522
 
332
- // Save the departing page's scroll position in history.state before
333
- // pushing a new entry. This ensures back/forward navigation can restore
334
- // the correct scroll position from the browser's per-entry state.
335
- deps.replaceState({ timber: true, scrollY: currentScrollY }, '', deps.getCurrentUrl());
523
+ // Save the departing page's scroll position — use Navigation API entry
524
+ // state when available, otherwise fall back to history.state.
525
+ if (deps.saveNavigationEntryScroll) {
526
+ deps.saveNavigationEntryScroll(currentScrollY);
527
+ } else {
528
+ deps.replaceState({ timber: true, scrollY: currentScrollY }, '', deps.getCurrentUrl());
529
+ }
530
+
531
+ // When Navigation API is active, initiate the navigation via
532
+ // navigation.navigate() BEFORE the fetch. Unlike history.pushState()
533
+ // which commits the URL synchronously (so Chrome sees it as "done"),
534
+ // navigation.navigate() fires the navigate event before committing.
535
+ // Our handler intercepts with a deferred promise, and Chrome shows
536
+ // its native loading indicator until completeRouterNavigation()
537
+ // resolves it in the finally block (same time as TopLoader clears).
538
+ let effectiveSkipHistory = skipHistory;
539
+ if (!skipHistory && deps.navigationNavigate) {
540
+ deps.setRouterNavigating?.(true);
541
+ deps.navigationNavigate(url, replace);
542
+ deps.setRouterNavigating?.(false);
543
+ effectiveSkipHistory = true;
544
+ }
336
545
 
337
546
  setPending(true, url);
338
547
 
339
548
  try {
340
- const headElements = await renderViaTransition(url, () =>
341
- performNavigationFetch(url, { replace })
549
+ const { headElements } = await renderViaTransition(url, () =>
550
+ performNavigationFetch(url, {
551
+ replace,
552
+ signal: navAbort.signal,
553
+ skipHistory: effectiveSkipHistory,
554
+ })
342
555
  );
343
556
 
344
557
  // Update document.title and <meta> tags with the new page's metadata
@@ -350,51 +563,117 @@ export function createRouter(deps: RouterDeps): RouterInstance {
350
563
  // Scroll-to-top on forward navigation, or restore captured position
351
564
  // for scroll={false}. React's render() on the document root can reset
352
565
  // scroll during DOM reconciliation, so all scroll must be actively managed.
353
- afterPaint(() => {
354
- if (scroll) {
355
- deps.scrollTo(0, 0);
356
- } else {
357
- deps.scrollTo(0, currentScrollY);
358
- }
359
- window.dispatchEvent(new Event('timber:scroll-restored'));
360
- });
566
+ restoreScrollAfterPaint(scroll ? 0 : currentScrollY);
361
567
  } catch (error) {
568
+ // Version skew — server has been redeployed. Trigger full page reload
569
+ // so the browser fetches the new bundle. See TIM-446.
570
+ // Set hard-navigating flag to prevent Navigation API interception
571
+ // and React from rendering during page teardown. See TIM-626.
572
+ if (error instanceof VersionSkewError) {
573
+ setHardNavigating(true);
574
+ // Import triggerStaleReload dynamically to avoid circular deps
575
+ // and keep the reload logic centralized with its loop guard.
576
+ const { triggerStaleReload } = await import('./stale-reload.js');
577
+ triggerStaleReload();
578
+ // Return a never-resolving promise — page is reloading.
579
+ return new Promise(() => {}) as never;
580
+ }
362
581
  // Server-side redirect during RSC fetch → soft router navigation.
582
+ // The redirect navigate will push/replace its own URL.
363
583
  if (error instanceof RedirectError) {
364
584
  setPending(false);
585
+ deps.completeRouterNavigation?.();
365
586
  await navigate(error.redirectUrl, { replace: true });
366
587
  return;
367
588
  }
589
+ // Server 5xx error — hard-navigate so the server renders the
590
+ // error page as HTML. See design/10-error-handling.md
591
+ // §"Error Page Rendering for Client Navigation".
592
+ //
593
+ // Set hard-navigating flag BEFORE setting window.location.href:
594
+ // 1. Prevents Navigation API from intercepting → infinite loop
595
+ // 2. Causes NavigationRoot to throw unresolvedThenable → prevents
596
+ // React from rendering children during page teardown (avoids
597
+ // "Rendered more hooks" crashes). See TIM-626.
598
+ if (error instanceof ServerErrorResponse) {
599
+ setHardNavigating(true);
600
+ window.location.href = error.url;
601
+ return new Promise(() => {}) as never;
602
+ }
603
+ // Stale client reference from streaming RSC decode — the server
604
+ // was redeployed with new bundles. Same recovery as VersionSkewError.
605
+ if (isStaleClientReference(error)) {
606
+ setHardNavigating(true);
607
+ triggerStaleReload();
608
+ return new Promise(() => {}) as never;
609
+ }
368
610
  // Abort errors are not application errors — swallow silently.
369
611
  if (isAbortError(error)) return;
370
612
  throw error;
371
613
  } finally {
614
+ // Clear the abort controller so we don't abort a completed navigation
615
+ // when the next one starts. In dev mode, the RSC body stream stays
616
+ // open after data arrives (React's Flight client waits for debug rows).
617
+ // Aborting a "completed" navigation kills the open stream reader →
618
+ // "BodyStreamBuffer was aborted". By clearing the controller here,
619
+ // createNavAbort() becomes a no-op for completed navigations.
620
+ if (currentNavAbort === navAbort) {
621
+ currentNavAbort = null;
622
+ }
372
623
  setPending(false);
624
+ // Resolve the Navigation API deferred — clears the browser's native
625
+ // loading state (tab spinner) at the same time as the TopLoader.
626
+ deps.completeRouterNavigation?.();
373
627
  }
374
628
  }
375
629
 
376
630
  async function refresh(): Promise<void> {
377
631
  const currentUrl = deps.getCurrentUrl();
632
+ const navAbort = createNavAbort();
378
633
 
379
634
  setPending(true, currentUrl);
380
635
 
381
636
  try {
382
- const headElements = await renderViaTransition(currentUrl, async () => {
637
+ const { headElements } = await renderViaTransition(currentUrl, async () => {
383
638
  // No state tree sent — server renders the complete RSC payload
384
- const result = await fetchRscPayload(currentUrl, deps);
639
+ const result = await fetchRscPayload(
640
+ currentUrl,
641
+ deps,
642
+ undefined,
643
+ undefined,
644
+ navAbort.signal
645
+ );
385
646
  // History push handled by renderViaTransition (stores merged payload)
386
647
  updateSegmentCache(result.segmentInfo);
387
- updateNavigationState(result.params, currentUrl);
388
- return result;
648
+ const navState = updateNavigationState(result.params, currentUrl);
649
+ return { ...result, navState };
389
650
  });
390
651
 
391
652
  applyHead(headElements);
653
+ } catch (error) {
654
+ if (isStaleClientReference(error)) {
655
+ setHardNavigating(true);
656
+ triggerStaleReload();
657
+ return new Promise(() => {}) as never;
658
+ }
659
+ // Stale transition (superseded by a newer navigation) or aborted
660
+ // fetch — silently ignore. See TIM-629.
661
+ if (isAbortError(error)) return;
662
+ throw error;
392
663
  } finally {
664
+ if (currentNavAbort === navAbort) {
665
+ currentNavAbort = null;
666
+ }
393
667
  setPending(false);
668
+ deps.completeRouterNavigation?.();
394
669
  }
395
670
  }
396
671
 
397
- async function handlePopState(url: string, scrollY: number = 0): Promise<void> {
672
+ async function handlePopState(
673
+ url: string,
674
+ scrollY: number = 0,
675
+ externalSignal?: AbortSignal
676
+ ): Promise<void> {
398
677
  // Scroll position is read from history.state by the caller (browser-entry.ts)
399
678
  // and passed in. This is more reliable than tracking scroll per-URL in memory
400
679
  // because the browser maintains per-entry state even with duplicate URLs.
@@ -402,37 +681,43 @@ export function createRouter(deps: RouterDeps): RouterInstance {
402
681
 
403
682
  if (entry && entry.payload !== null) {
404
683
  // Replay cached payload — no server roundtrip
405
- updateNavigationState(entry.params, url);
406
- renderPayload(entry.payload);
684
+ const navState = updateNavigationState(entry.params, url);
685
+ renderPayload(entry.payload, navState);
407
686
  applyHead(entry.headElements);
408
- afterPaint(() => {
409
- deps.scrollTo(0, scrollY);
410
- window.dispatchEvent(new Event('timber:scroll-restored'));
411
- });
687
+ restoreScrollAfterPaint(scrollY);
412
688
  } else {
413
689
  // No cached payload — fetch from server.
414
690
  // This happens when navigating back to the initial SSR'd page
415
691
  // (its payload is null since it was rendered via SSR, not RSC fetch)
416
692
  // or when the entry doesn't exist at all.
693
+ const navAbort = createNavAbort(externalSignal);
417
694
  setPending(true, url);
418
695
  try {
419
- const headElements = await renderViaTransition(url, async () => {
420
- const stateTree = segmentCache.serializeStateTree(
421
- segmentElementCache.getMergeablePaths()
422
- );
423
- const result = await fetchRscPayload(url, deps, stateTree);
696
+ const { headElements } = await renderViaTransition(url, async () => {
697
+ const stateTree = segmentCache.serializeStateTree();
698
+ const result = await fetchRscPayload(url, deps, stateTree, undefined, navAbort.signal);
424
699
  updateSegmentCache(result.segmentInfo);
425
- updateNavigationState(result.params, url);
700
+ const navState = updateNavigationState(result.params, url);
426
701
  // History push handled by renderViaTransition (stores merged payload)
427
- return result;
702
+ return { ...result, navState };
428
703
  });
429
704
 
430
705
  applyHead(headElements);
431
- afterPaint(() => {
432
- deps.scrollTo(0, scrollY);
433
- window.dispatchEvent(new Event('timber:scroll-restored'));
434
- });
706
+ restoreScrollAfterPaint(scrollY);
707
+ } catch (error) {
708
+ if (isStaleClientReference(error)) {
709
+ setHardNavigating(true);
710
+ triggerStaleReload();
711
+ return new Promise(() => {}) as never;
712
+ }
713
+ // Stale transition (superseded by a newer navigation) or aborted
714
+ // fetch — silently ignore. See TIM-629.
715
+ if (isAbortError(error)) return;
716
+ throw error;
435
717
  } finally {
718
+ if (currentNavAbort === navAbort) {
719
+ currentNavAbort = null;
720
+ }
436
721
  setPending(false);
437
722
  }
438
723
  }
@@ -448,9 +733,10 @@ export function createRouter(deps: RouterDeps): RouterInstance {
448
733
  if (historyStack.has(url)) return;
449
734
 
450
735
  // Fire-and-forget fetch
451
- const stateTree = segmentCache.serializeStateTree(segmentElementCache.getMergeablePaths());
736
+ const stateTree = segmentCache.serializeStateTree();
452
737
  void fetchRscPayload(url, deps, stateTree).then(
453
738
  (result) => {
739
+ result.decodePromise?.catch(() => {});
454
740
  prefetchCache.set(url, result);
455
741
  },
456
742
  () => {
@@ -463,8 +749,8 @@ export function createRouter(deps: RouterDeps): RouterInstance {
463
749
  navigate,
464
750
  refresh,
465
751
  handlePopState,
466
- isPending: () => pending,
467
- getPendingUrl: () => pendingUrl,
752
+ isPending: () => routerPhase.phase === 'navigating',
753
+ getPendingUrl: () => (routerPhase.phase === 'navigating' ? routerPhase.targetUrl : null),
468
754
  onPendingChange(listener) {
469
755
  pendingListeners.add(listener);
470
756
  return () => pendingListeners.delete(listener);
@@ -474,18 +760,22 @@ export function createRouter(deps: RouterDeps): RouterInstance {
474
760
  // Render the piggybacked element tree from a server action response.
475
761
  // Updates the current history entry with the fresh payload and applies
476
762
  // head elements — same as refresh() but without a server fetch.
477
- // Cache segment elements for future partial merges.
763
+ // Revalidation payloads are already resolved (no Flight thenable),
764
+ // so no segment merging is needed — just cache and render.
478
765
  const currentUrl = deps.getCurrentUrl();
479
- const merged = mergeAndCachePayload(element, null);
480
766
  historyStack.push(currentUrl, {
481
- payload: merged,
767
+ payload: element,
482
768
  headElements,
483
769
  });
484
- renderPayload(merged);
770
+
771
+ // Revalidation doesn't change params/pathname — preserve current state.
772
+ // DO NOT call updateNavigationState(null, ...) here: that normalizes
773
+ // params to {}, clearing dynamic route params on every action response.
774
+ const navState = getNavigationState();
775
+ renderPayload(element, navState);
485
776
  applyHead(headElements);
486
777
  },
487
778
  initSegmentCache: (segments: SegmentInfo[]) => updateSegmentCache(segments),
488
- cacheElementTree: (element: unknown) => cacheSegmentElements(element, segmentElementCache),
489
779
  segmentCache,
490
780
  prefetchCache,
491
781
  historyStack,