@timber-js/app 0.2.0-alpha.185 → 0.2.0-alpha.186

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 (418) hide show
  1. package/dist/_chunks/{actions-O_LsyCE4.js → actions-C-Rw9vPc.js} +3 -3
  2. package/dist/_chunks/{actions-O_LsyCE4.js.map → actions-C-Rw9vPc.js.map} +1 -1
  3. package/dist/_chunks/als-slots-mFweg276.js +27 -0
  4. package/dist/_chunks/als-slots-mFweg276.js.map +1 -0
  5. package/dist/_chunks/base-path-DaQrzbez.js +80 -0
  6. package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
  7. package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
  8. package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
  9. package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
  10. package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
  11. package/dist/_chunks/{cache-api-B-lhk9p4.js → cache-api-Cd0VZ_Pd.js} +3 -3
  12. package/dist/_chunks/{cache-api-B-lhk9p4.js.map → cache-api-Cd0VZ_Pd.js.map} +1 -1
  13. package/dist/_chunks/cli-schema-sync-CKgHC2MB.js +1857 -0
  14. package/dist/_chunks/cli-schema-sync-CKgHC2MB.js.map +1 -0
  15. package/dist/_chunks/{cloudflare-CnT5Lr7U.js → cloudflare-Cs0uZXea.js} +89 -12
  16. package/dist/_chunks/{cloudflare-CnT5Lr7U.js.map → cloudflare-Cs0uZXea.js.map} +1 -1
  17. package/dist/_chunks/error-boundary-DpYRI_I1.js +330 -0
  18. package/dist/_chunks/error-boundary-DpYRI_I1.js.map +1 -0
  19. package/dist/_chunks/{fast-hash-D6hIVt1Y.js → fast-hash-C-tVYrLb.js} +6 -1
  20. package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
  21. package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
  22. package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
  23. package/dist/_chunks/{logger-AWfuX-KJ.js → logger-N7e5auP0.js} +9 -13
  24. package/dist/_chunks/logger-N7e5auP0.js.map +1 -0
  25. package/dist/_chunks/navigation-root-B29qg0_T.js +274 -0
  26. package/dist/_chunks/navigation-root-B29qg0_T.js.map +1 -0
  27. package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
  28. package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
  29. package/dist/_chunks/{plugin-context---kTF5v8.js → plugin-context-DEGLSJs3.js} +2 -1
  30. package/dist/_chunks/plugin-context-DEGLSJs3.js.map +1 -0
  31. package/dist/_chunks/{router-ref-CtmF-aPv.js → router-ref-DuYuV_0Q.js} +2 -2
  32. package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
  33. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
  34. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
  35. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
  36. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
  37. package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
  38. package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
  39. package/dist/_chunks/{segment-classify-Byy425ng.js → segment-classify-C539Pa2O.js} +23 -2
  40. package/dist/_chunks/{segment-classify-Byy425ng.js.map → segment-classify-C539Pa2O.js.map} +1 -1
  41. package/dist/_chunks/{canonicalize-DQHyFClh.js → segment-keys-BawYuNFO.js} +61 -2
  42. package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
  43. package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
  44. package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
  45. package/dist/_chunks/{ssr-data-BOWsq18U.js → ssr-data-14MXm7Pj.js} +17 -2
  46. package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
  47. package/dist/_chunks/use-segment-params-ClyUNq4d.js +128 -0
  48. package/dist/_chunks/use-segment-params-ClyUNq4d.js.map +1 -0
  49. package/dist/_chunks/{walkers-_6zKFlch.js → walkers-BhhwI9TD.js} +21 -87
  50. package/dist/_chunks/walkers-BhhwI9TD.js.map +1 -0
  51. package/dist/adapters/build-output-helper.d.ts +37 -0
  52. package/dist/adapters/build-output-helper.d.ts.map +1 -1
  53. package/dist/adapters/cloudflare-dev.js +1 -1
  54. package/dist/adapters/cloudflare-kv-cache.js +1 -1
  55. package/dist/adapters/cloudflare.d.ts.map +1 -1
  56. package/dist/adapters/cloudflare.js +1 -1
  57. package/dist/adapters/fs-identity.d.ts +64 -0
  58. package/dist/adapters/fs-identity.d.ts.map +1 -0
  59. package/dist/adapters/nitro.d.ts.map +1 -1
  60. package/dist/adapters/nitro.js +2 -3
  61. package/dist/adapters/nitro.js.map +1 -1
  62. package/dist/adapters/shared.d.ts +57 -1
  63. package/dist/adapters/shared.d.ts.map +1 -1
  64. package/dist/adapters/types.d.ts +13 -1
  65. package/dist/adapters/types.d.ts.map +1 -1
  66. package/dist/cache/fast-hash.d.ts +5 -0
  67. package/dist/cache/fast-hash.d.ts.map +1 -1
  68. package/dist/cache/index.js +1 -1
  69. package/dist/cli.js +2 -2
  70. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  71. package/dist/client/browser-entry/hydrate.d.ts +20 -9
  72. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  73. package/dist/client/browser-entry/post-hydration.d.ts +4 -1
  74. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
  75. package/dist/client/browser-entry/router-init.d.ts +3 -0
  76. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  77. package/dist/client/browser-entry/rsc-stream.d.ts +8 -0
  78. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -1
  79. package/dist/client/error-boundary.d.ts +1 -0
  80. package/dist/client/error-boundary.d.ts.map +1 -1
  81. package/dist/client/error-boundary.js +1 -162
  82. package/dist/client/history.d.ts +13 -6
  83. package/dist/client/history.d.ts.map +1 -1
  84. package/dist/client/index.js +18 -11
  85. package/dist/client/index.js.map +1 -1
  86. package/dist/client/internal.d.ts +4 -3
  87. package/dist/client/internal.d.ts.map +1 -1
  88. package/dist/client/internal.js +865 -306
  89. package/dist/client/internal.js.map +1 -1
  90. package/dist/client/link.d.ts.map +1 -1
  91. package/dist/client/navigation-api.d.ts +2 -2
  92. package/dist/client/navigation-commit.d.ts +71 -0
  93. package/dist/client/navigation-commit.d.ts.map +1 -0
  94. package/dist/client/navigation-context.d.ts +37 -20
  95. package/dist/client/navigation-context.d.ts.map +1 -1
  96. package/dist/client/navigation-root.d.ts +63 -23
  97. package/dist/client/navigation-root.d.ts.map +1 -1
  98. package/dist/client/params-context.d.ts +81 -0
  99. package/dist/client/params-context.d.ts.map +1 -0
  100. package/dist/client/router-effects.d.ts +129 -0
  101. package/dist/client/router-effects.d.ts.map +1 -0
  102. package/dist/client/router-lifecycle.d.ts +55 -0
  103. package/dist/client/router-lifecycle.d.ts.map +1 -0
  104. package/dist/client/router-pipeline.d.ts +84 -0
  105. package/dist/client/router-pipeline.d.ts.map +1 -0
  106. package/dist/client/router-ref.d.ts +1 -1
  107. package/dist/client/router-ref.d.ts.map +1 -1
  108. package/dist/client/router-skew.d.ts +21 -0
  109. package/dist/client/router-skew.d.ts.map +1 -0
  110. package/dist/client/router-types.d.ts +207 -0
  111. package/dist/client/router-types.d.ts.map +1 -0
  112. package/dist/client/router.d.ts +1 -182
  113. package/dist/client/router.d.ts.map +1 -1
  114. package/dist/client/rsc-fetch.d.ts +38 -25
  115. package/dist/client/rsc-fetch.d.ts.map +1 -1
  116. package/dist/client/segment-cache.d.ts +79 -34
  117. package/dist/client/segment-cache.d.ts.map +1 -1
  118. package/dist/client/ssr-data.d.ts +6 -0
  119. package/dist/client/ssr-data.d.ts.map +1 -1
  120. package/dist/client/stale-client.d.ts +69 -0
  121. package/dist/client/stale-client.d.ts.map +1 -0
  122. package/dist/client/state.d.ts +10 -1
  123. package/dist/client/state.d.ts.map +1 -1
  124. package/dist/client/top-loader.d.ts +2 -1
  125. package/dist/client/top-loader.d.ts.map +1 -1
  126. package/dist/client/unload-guard.d.ts +5 -0
  127. package/dist/client/unload-guard.d.ts.map +1 -1
  128. package/dist/client/use-cookie.d.ts.map +1 -1
  129. package/dist/client/use-router.d.ts +1 -1
  130. package/dist/client/use-segment-params.d.ts +18 -8
  131. package/dist/client/use-segment-params.d.ts.map +1 -1
  132. package/dist/cookies/index.js +3 -3
  133. package/dist/cookies/index.js.map +1 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +906 -321
  136. package/dist/index.js.map +1 -1
  137. package/dist/plugin-context.d.ts +31 -0
  138. package/dist/plugin-context.d.ts.map +1 -1
  139. package/dist/plugins/adapter-build.d.ts.map +1 -1
  140. package/dist/plugins/build-manifest.d.ts +1 -1
  141. package/dist/plugins/build-manifest.d.ts.map +1 -1
  142. package/dist/plugins/entries.d.ts.map +1 -1
  143. package/dist/plugins/fonts.d.ts.map +1 -1
  144. package/dist/plugins/request-dep/analysis.d.ts +106 -0
  145. package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
  146. package/dist/plugins/request-dep/index.d.ts +75 -0
  147. package/dist/plugins/request-dep/index.d.ts.map +1 -0
  148. package/dist/plugins/request-dep/origin.d.ts +61 -0
  149. package/dist/plugins/request-dep/origin.d.ts.map +1 -0
  150. package/dist/plugins/routing.d.ts +9 -0
  151. package/dist/plugins/routing.d.ts.map +1 -1
  152. package/dist/plugins/static-build.d.ts +136 -8
  153. package/dist/plugins/static-build.d.ts.map +1 -1
  154. package/dist/routing/codegen-types.d.ts +18 -0
  155. package/dist/routing/codegen-types.d.ts.map +1 -1
  156. package/dist/routing/codegen.d.ts.map +1 -1
  157. package/dist/routing/collision-probe.d.ts +104 -0
  158. package/dist/routing/collision-probe.d.ts.map +1 -0
  159. package/dist/routing/collision-spaces.d.ts +26 -0
  160. package/dist/routing/collision-spaces.d.ts.map +1 -0
  161. package/dist/routing/index.js +3 -3
  162. package/dist/routing/interception.d.ts +235 -6
  163. package/dist/routing/interception.d.ts.map +1 -1
  164. package/dist/routing/manifest-codegen.d.ts.map +1 -1
  165. package/dist/routing/scanner.d.ts.map +1 -1
  166. package/dist/routing/segment-classify.d.ts +33 -0
  167. package/dist/routing/segment-classify.d.ts.map +1 -1
  168. package/dist/routing/segment-keys.d.ts +95 -0
  169. package/dist/routing/segment-keys.d.ts.map +1 -0
  170. package/dist/routing/slot-placement.d.ts +48 -0
  171. package/dist/routing/slot-placement.d.ts.map +1 -0
  172. package/dist/routing/walkers.d.ts +6 -0
  173. package/dist/routing/walkers.d.ts.map +1 -1
  174. package/dist/search-params/define.d.ts +0 -6
  175. package/dist/search-params/define.d.ts.map +1 -1
  176. package/dist/search-params/index.js +176 -2
  177. package/dist/search-params/index.js.map +1 -1
  178. package/dist/segment-params/define.d.ts +0 -6
  179. package/dist/segment-params/define.d.ts.map +1 -1
  180. package/dist/segment-params/index.js +69 -1
  181. package/dist/segment-params/index.js.map +1 -0
  182. package/dist/server/actions.d.ts +6 -3
  183. package/dist/server/actions.d.ts.map +1 -1
  184. package/dist/server/als-registry.d.ts +2 -1
  185. package/dist/server/als-registry.d.ts.map +1 -1
  186. package/dist/server/build-manifest.d.ts +13 -1
  187. package/dist/server/build-manifest.d.ts.map +1 -1
  188. package/dist/server/chain-url-parts.d.ts +82 -0
  189. package/dist/server/chain-url-parts.d.ts.map +1 -0
  190. package/dist/server/children-interception.d.ts +49 -0
  191. package/dist/server/children-interception.d.ts.map +1 -0
  192. package/dist/server/default-status-page.d.ts +45 -0
  193. package/dist/server/default-status-page.d.ts.map +1 -0
  194. package/dist/server/deny-renderer.d.ts +14 -3
  195. package/dist/server/deny-renderer.d.ts.map +1 -1
  196. package/dist/server/head-response.d.ts +35 -0
  197. package/dist/server/head-response.d.ts.map +1 -0
  198. package/dist/server/index.js +2 -2
  199. package/dist/server/internal.js +393 -212
  200. package/dist/server/internal.js.map +1 -1
  201. package/dist/server/param-coercion.d.ts +10 -1
  202. package/dist/server/param-coercion.d.ts.map +1 -1
  203. package/dist/server/pipeline-helpers.d.ts +0 -18
  204. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  205. package/dist/server/pipeline-interception.d.ts +59 -9
  206. package/dist/server/pipeline-interception.d.ts.map +1 -1
  207. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  208. package/dist/server/pipeline-phases.d.ts.map +1 -1
  209. package/dist/server/pipeline.d.ts +11 -0
  210. package/dist/server/pipeline.d.ts.map +1 -1
  211. package/dist/server/publish-params.d.ts +33 -0
  212. package/dist/server/publish-params.d.ts.map +1 -0
  213. package/dist/server/request-context.d.ts +48 -0
  214. package/dist/server/request-context.d.ts.map +1 -1
  215. package/dist/server/route-element-builder.d.ts +32 -2
  216. package/dist/server/route-element-builder.d.ts.map +1 -1
  217. package/dist/server/route-handler.d.ts.map +1 -1
  218. package/dist/server/route-matcher.d.ts +13 -0
  219. package/dist/server/route-matcher.d.ts.map +1 -1
  220. package/dist/server/rsc-cache-key-guard.d.ts +78 -0
  221. package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
  222. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  223. package/dist/server/rsc-entry/error-renderer.d.ts +14 -2
  224. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  225. package/dist/server/rsc-entry/helpers.d.ts +2 -10
  226. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  227. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  228. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  229. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -2
  230. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  231. package/dist/server/rsc-entry/rsc-stream.d.ts +3 -2
  232. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  233. package/dist/server/rsc-entry/ssr-renderer.d.ts +2 -0
  234. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  235. package/dist/server/skippable-prefix.d.ts +23 -0
  236. package/dist/server/skippable-prefix.d.ts.map +1 -0
  237. package/dist/server/slot-interception.d.ts +80 -0
  238. package/dist/server/slot-interception.d.ts.map +1 -0
  239. package/dist/server/slot-resolver.d.ts +70 -8
  240. package/dist/server/slot-resolver.d.ts.map +1 -1
  241. package/dist/server/ssr-bridge-types.d.ts +6 -0
  242. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  243. package/dist/server/ssr-entry.d.ts.map +1 -1
  244. package/dist/server/ssr-wrappers.d.ts +24 -13
  245. package/dist/server/ssr-wrappers.d.ts.map +1 -1
  246. package/dist/server/state-tree-diff.d.ts +6 -27
  247. package/dist/server/state-tree-diff.d.ts.map +1 -1
  248. package/dist/server/static-generator.d.ts +6 -0
  249. package/dist/server/static-generator.d.ts.map +1 -1
  250. package/dist/server/static-not-found.d.ts +52 -0
  251. package/dist/server/static-not-found.d.ts.map +1 -0
  252. package/dist/shared/als-slots.d.ts +41 -0
  253. package/dist/shared/als-slots.d.ts.map +1 -0
  254. package/dist/shared/base-path.d.ts +56 -0
  255. package/dist/shared/base-path.d.ts.map +1 -0
  256. package/dist/shared/param-value.d.ts +80 -0
  257. package/dist/shared/param-value.d.ts.map +1 -0
  258. package/dist/shared/payload-root.d.ts +108 -0
  259. package/dist/shared/payload-root.d.ts.map +1 -0
  260. package/dist/shared/rsc-cache-key.d.ts +163 -0
  261. package/dist/shared/rsc-cache-key.d.ts.map +1 -0
  262. package/dist/shared/rsc-error-envelope.d.ts +25 -0
  263. package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
  264. package/dist/shared/rsc-manifest.d.ts +28 -0
  265. package/dist/shared/rsc-manifest.d.ts.map +1 -0
  266. package/dist/shared/rsc-payload-path.d.ts +42 -0
  267. package/dist/shared/rsc-payload-path.d.ts.map +1 -0
  268. package/dist/shared/segment-info.d.ts +59 -0
  269. package/dist/shared/segment-info.d.ts.map +1 -0
  270. package/dist/shared/slot-params.d.ts +51 -0
  271. package/dist/shared/slot-params.d.ts.map +1 -0
  272. package/dist/shared/static-platform-files.d.ts +71 -0
  273. package/dist/shared/static-platform-files.d.ts.map +1 -0
  274. package/docs/api/31-api-client.mdx +4 -2
  275. package/docs/learn/02-pages-and-layouts.mdx +1 -1
  276. package/docs/learn/11-error-handling.mdx +2 -0
  277. package/docs/learn/12-client-navigation.mdx +2 -2
  278. package/docs/learn/14-deploying.mdx +23 -0
  279. package/docs/more/01-advanced-routing.mdx +172 -2
  280. package/docs/more/04-metadata-and-fonts.mdx +1 -1
  281. package/package.json +2 -2
  282. package/src/adapters/build-output-helper.ts +116 -3
  283. package/src/adapters/cloudflare.ts +86 -11
  284. package/src/adapters/fs-identity.ts +156 -0
  285. package/src/adapters/nitro.ts +6 -6
  286. package/src/adapters/shared.ts +196 -21
  287. package/src/adapters/types.ts +13 -1
  288. package/src/cache/fast-hash.ts +5 -0
  289. package/src/client/browser-entry/action-dispatch.ts +9 -4
  290. package/src/client/browser-entry/hydrate.ts +40 -29
  291. package/src/client/browser-entry/index.ts +15 -1
  292. package/src/client/browser-entry/post-hydration.ts +10 -9
  293. package/src/client/browser-entry/router-init.ts +104 -48
  294. package/src/client/browser-entry/rsc-stream.ts +11 -2
  295. package/src/client/error-boundary.tsx +20 -15
  296. package/src/client/history.ts +13 -6
  297. package/src/client/internal.ts +4 -3
  298. package/src/client/link.tsx +55 -8
  299. package/src/client/navigation-api.ts +3 -3
  300. package/src/client/navigation-commit.ts +174 -0
  301. package/src/client/navigation-context.ts +40 -67
  302. package/src/client/navigation-root.tsx +326 -101
  303. package/src/client/params-context.ts +192 -0
  304. package/src/client/router-effects.ts +231 -0
  305. package/src/client/router-lifecycle.ts +288 -0
  306. package/src/client/router-pipeline.ts +389 -0
  307. package/src/client/router-ref.ts +1 -1
  308. package/src/client/router-skew.ts +30 -0
  309. package/src/client/router-types.ts +230 -0
  310. package/src/client/router.ts +242 -707
  311. package/src/client/rsc-fetch.ts +169 -102
  312. package/src/client/segment-cache.ts +121 -44
  313. package/src/client/ssr-data.ts +6 -0
  314. package/src/client/stale-client.ts +191 -0
  315. package/src/client/state.ts +14 -1
  316. package/src/client/top-loader.tsx +2 -1
  317. package/src/client/unload-guard.ts +34 -2
  318. package/src/client/use-cookie.ts +9 -2
  319. package/src/client/use-router.ts +1 -1
  320. package/src/client/use-segment-params.ts +41 -18
  321. package/src/index.ts +5 -1
  322. package/src/plugin-context.ts +32 -0
  323. package/src/plugins/adapter-build.ts +4 -0
  324. package/src/plugins/build-manifest.ts +34 -13
  325. package/src/plugins/entries.ts +4 -0
  326. package/src/plugins/fonts.ts +11 -8
  327. package/src/plugins/request-dep/analysis.ts +447 -0
  328. package/src/plugins/request-dep/index.ts +376 -0
  329. package/src/plugins/request-dep/origin.ts +310 -0
  330. package/src/plugins/routing.ts +59 -2
  331. package/src/plugins/static-build.ts +315 -73
  332. package/src/routing/codegen-types.ts +18 -0
  333. package/src/routing/codegen.ts +50 -10
  334. package/src/routing/collision-probe.ts +438 -0
  335. package/src/routing/collision-spaces.ts +281 -0
  336. package/src/routing/interception.ts +896 -50
  337. package/src/routing/manifest-codegen.ts +5 -3
  338. package/src/routing/scanner.ts +114 -89
  339. package/src/routing/segment-classify.ts +57 -0
  340. package/src/routing/segment-keys.ts +146 -0
  341. package/src/routing/slot-placement.ts +97 -0
  342. package/src/routing/walkers.ts +8 -0
  343. package/src/search-params/define.ts +6 -29
  344. package/src/segment-params/define.ts +4 -27
  345. package/src/server/action-handler.ts +3 -1
  346. package/src/server/actions.ts +6 -3
  347. package/src/server/als-registry.ts +2 -1
  348. package/src/server/build-manifest.ts +14 -1
  349. package/src/server/chain-url-parts.ts +163 -0
  350. package/src/server/children-interception.ts +115 -0
  351. package/src/server/default-status-page.ts +127 -0
  352. package/src/server/deny-renderer.ts +81 -20
  353. package/src/server/head-response.ts +54 -0
  354. package/src/server/param-coercion.ts +48 -18
  355. package/src/server/pipeline-helpers.ts +0 -45
  356. package/src/server/pipeline-interception.ts +81 -32
  357. package/src/server/pipeline-outcome.ts +2 -4
  358. package/src/server/pipeline-phases.ts +68 -16
  359. package/src/server/pipeline.ts +57 -10
  360. package/src/server/prebuilt-runtime.ts +4 -4
  361. package/src/server/publish-params.ts +42 -0
  362. package/src/server/request-context.ts +97 -18
  363. package/src/server/route-element-builder.ts +89 -98
  364. package/src/server/route-handler.ts +8 -8
  365. package/src/server/route-matcher.ts +21 -9
  366. package/src/server/rsc-cache-key-guard.ts +170 -0
  367. package/src/server/rsc-entry/api-handler.ts +6 -8
  368. package/src/server/rsc-entry/error-renderer.ts +64 -25
  369. package/src/server/rsc-entry/helpers.ts +31 -16
  370. package/src/server/rsc-entry/index.ts +36 -28
  371. package/src/server/rsc-entry/render-route.ts +9 -4
  372. package/src/server/rsc-entry/revalidate-renderer.ts +1 -1
  373. package/src/server/rsc-entry/rsc-payload.ts +14 -25
  374. package/src/server/rsc-entry/rsc-stream.ts +4 -3
  375. package/src/server/rsc-entry/ssr-renderer.ts +13 -9
  376. package/src/server/skippable-prefix.ts +92 -0
  377. package/src/server/slot-interception.ts +168 -0
  378. package/src/server/slot-resolver.ts +253 -156
  379. package/src/server/ssr-bridge-types.ts +6 -0
  380. package/src/server/ssr-entry.ts +12 -4
  381. package/src/server/ssr-wrappers.tsx +33 -32
  382. package/src/server/state-tree-diff.ts +14 -55
  383. package/src/server/static-generator.ts +65 -27
  384. package/src/server/static-not-found.ts +134 -0
  385. package/src/shared/als-slots.ts +72 -0
  386. package/src/shared/base-path.ts +80 -0
  387. package/src/shared/param-value.ts +244 -0
  388. package/src/shared/payload-root.ts +151 -0
  389. package/src/shared/rsc-cache-key.ts +269 -0
  390. package/src/shared/rsc-error-envelope.ts +31 -0
  391. package/src/shared/rsc-manifest.ts +29 -0
  392. package/src/shared/rsc-payload-path.ts +45 -0
  393. package/src/shared/segment-info.ts +60 -0
  394. package/src/shared/slot-params.ts +111 -0
  395. package/src/shared/static-platform-files.ts +75 -0
  396. package/dist/_chunks/build-output-helper-DOGYFb_X.js +0 -196
  397. package/dist/_chunks/build-output-helper-DOGYFb_X.js.map +0 -1
  398. package/dist/_chunks/canonicalize-DQHyFClh.js.map +0 -1
  399. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js +0 -668
  400. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js.map +0 -1
  401. package/dist/_chunks/define-COtkxMRT.js +0 -191
  402. package/dist/_chunks/define-COtkxMRT.js.map +0 -1
  403. package/dist/_chunks/define-c4au4I9R.js +0 -82
  404. package/dist/_chunks/define-c4au4I9R.js.map +0 -1
  405. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +0 -1
  406. package/dist/_chunks/logger-AWfuX-KJ.js.map +0 -1
  407. package/dist/_chunks/navigation-root-bUDZLw74.js +0 -124
  408. package/dist/_chunks/navigation-root-bUDZLw74.js.map +0 -1
  409. package/dist/_chunks/plugin-context---kTF5v8.js.map +0 -1
  410. package/dist/_chunks/router-ref-CtmF-aPv.js.map +0 -1
  411. package/dist/_chunks/ssr-data-BOWsq18U.js.map +0 -1
  412. package/dist/_chunks/use-segment-params-D1CzlgBo.js +0 -151
  413. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +0 -1
  414. package/dist/_chunks/walkers-_6zKFlch.js.map +0 -1
  415. package/dist/client/error-boundary.js.map +0 -1
  416. package/dist/plugins/request-dep.d.ts +0 -32
  417. package/dist/plugins/request-dep.d.ts.map +0 -1
  418. package/src/plugins/request-dep.ts +0 -499
@@ -97,8 +97,8 @@ export interface NavigationApiController {
97
97
  /**
98
98
  * Resolve the deferred promise created by setRouterNavigating(true),
99
99
  * clearing the browser's native loading state. Call this when the
100
- * navigation fully completes — aligned with when the TopLoader's
101
- * pendingUrl clears (same finally block in router.navigate).
100
+ * navigation fully completes — the same finally block in router.navigate
101
+ * that clears the router's pending store.
102
102
  */
103
103
  completeRouterNavigation: () => void;
104
104
 
@@ -147,7 +147,7 @@ export function setupNavigationApi(callbacks: NavigationApiCallbacks): Navigatio
147
147
  // setRouterNavigating(true) is called, resolved by completeRouterNavigation().
148
148
  // The navigate event handler intercepts with this promise so the browser's
149
149
  // native loading state (tab spinner) stays active until the navigation
150
- // completes — aligned with TopLoader's pendingUrl lifecycle.
150
+ // completes — the same lifecycle the TopLoader is driven by.
151
151
  let routerNavDeferred: { promise: Promise<void>; resolve: () => void } | null = null;
152
152
 
153
153
  function handleNavigate(event: NavigateEvent): void {
@@ -0,0 +1,174 @@
1
+ /**
2
+ * What it means for a page to be "current" on the client.
3
+ *
4
+ * One module owns every write that makes a navigation's destination the
5
+ * current page, and the read that describes the current page back to the
6
+ * server. Keeping them together is the point: `X-Timber-State-Tree` is
7
+ * derived from the segment cache, so the thing that publishes and the thing
8
+ * that reports have to agree about when a page becomes current.
9
+ *
10
+ * See design/19-client-navigation.md §"State Update Invariants".
11
+ */
12
+
13
+ import { buildSegmentTree, type SegmentCache } from './segment-cache.js';
14
+ import type { HistoryStack } from './history.js';
15
+ import type { SegmentInfo, StateTree } from '../shared/segment-info.js';
16
+ import type { ParamsSource } from '../shared/payload-root.js';
17
+ import { setNavigationState, type NavigationState } from './navigation-context.js';
18
+
19
+ /** Everything a commit needs to describe the page it makes current. */
20
+ export interface NavigationCommitInput {
21
+ payload: unknown;
22
+ /** The params that payload published — replayed with it on popstate. */
23
+ params: ParamsSource;
24
+ /**
25
+ * The rendered chain's metadata, or null/undefined when this commit
26
+ * carries none at all — a revalidation payload, or a history entry
27
+ * stored before the channel existed.
28
+ *
29
+ * An empty *array* is a different statement from an absent one: the
30
+ * server rendered a route with no layout-bearing segments (a layoutless
31
+ * app — the missing-root-layout check is a warning, not an error), so
32
+ * the correct tree is the empty one. Collapsing the two left the
33
+ * departing route's tree in place, which `treePaths` then reported as
34
+ * mounted — enough to select an intercepting rewrite whose slot is not
35
+ * on screen (TIM-1282).
36
+ */
37
+ segmentInfo?: SegmentInfo[] | null;
38
+ /** When true, clear the segment cache if segmentInfo is absent
39
+ * (popstate replay for entries without layout metadata). */
40
+ clearSegmentCacheOnEmpty?: boolean;
41
+ }
42
+
43
+ /**
44
+ * A navigation's destination, split into what a render needs and what a
45
+ * commit publishes.
46
+ */
47
+ export interface PreparedNavigation {
48
+ /** The state the incoming tree renders with. Pure — safe before winning. */
49
+ navState: NavigationState;
50
+ /** Publishes the destination. Call only once the render has won. */
51
+ commit: () => void;
52
+ }
53
+
54
+ export interface NavigationCommitter {
55
+ prepareNavigation(url: string, opts: NavigationCommitInput): PreparedNavigation;
56
+ currentStateTree(): StateTree | undefined;
57
+ updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void;
58
+ }
59
+
60
+ /**
61
+ * Derive the navigation state (pathname + search) a URL renders with.
62
+ *
63
+ * Pure: publishing it — the module-level fallback for tests and SSR, and the
64
+ * globalThis bridge — is `prepareNavigation`'s commit, which runs only once
65
+ * the render is known to have won (TIM-1301). Callers pass the returned value
66
+ * explicitly to renderRoot/wrapPayload, so a render never depends on the
67
+ * publish having happened first.
68
+ */
69
+ export function deriveNavigationState(url: string): NavigationState {
70
+ // Params are not part of it. They travel with the payload and are published
71
+ // by the one client-owned `ParamsProvider` as the new tree renders, which is
72
+ // also what clears the previous route's — a route with no params of its own
73
+ // still publishes an empty record (TIM-1294/TIM-1297, and the clearing
74
+ // requirement from TIM-1285).
75
+ const parsed = new URL(url, 'http://localhost');
76
+ return { pathname: parsed.pathname || '/', search: parsed.search };
77
+ }
78
+
79
+ export function createNavigationCommitter(deps: {
80
+ segmentCache: SegmentCache;
81
+ historyStack: HistoryStack;
82
+ /** Read at call time — the router's `clientSegmentCache` opt-in. */
83
+ clientSegmentCache: () => boolean | undefined;
84
+ }): NavigationCommitter {
85
+ const { segmentCache, historyStack } = deps;
86
+
87
+ /**
88
+ * Update the segment cache from server-provided segment metadata.
89
+ *
90
+ * Runs whether or not `clientSegmentCache` is enabled: the tree is also
91
+ * where the mounted tree paths come from, and those cross on every
92
+ * navigation. What the flag gates is which parts get serialized — see
93
+ * `currentStateTree`.
94
+ */
95
+ function updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void {
96
+ if (!segmentInfo || segmentInfo.length === 0) return;
97
+ const tree = buildSegmentTree(segmentInfo);
98
+ if (tree) {
99
+ segmentCache.set('/', tree);
100
+ }
101
+ }
102
+
103
+ return {
104
+ updateSegmentCache,
105
+
106
+ /**
107
+ * The X-Timber-State-Tree to send with the next RSC request.
108
+ *
109
+ * Two different things travel on one header. `segments`/`slots` are the
110
+ * caching opt-in and are omitted unless `clientSegmentCache` is on.
111
+ * `treePaths` is how the server learns which route is actually mounted,
112
+ * which stops being derivable from the address bar as soon as a modal is
113
+ * open — so it crosses regardless (TIM-1282). Undefined when there is
114
+ * nothing to say, so a no-op header never enters the `_rsc` cache key.
115
+ *
116
+ * Reads what the last *committed* navigation published, so a superseded
117
+ * navigation's destination can never end up describing the mounted tree
118
+ * (TIM-1301).
119
+ */
120
+ currentStateTree(): StateTree | undefined {
121
+ const tree = segmentCache.serializeStateTree();
122
+ if (deps.clientSegmentCache()) return tree;
123
+ return tree.treePaths ? { segments: [], treePaths: tree.treePaths } : undefined;
124
+ },
125
+
126
+ /**
127
+ * Prepare all navigation-owned state for a new page — without publishing
128
+ * any of it. Every code path that changes the "current page" must go
129
+ * through this function, which is what makes "forgot a field" impossible
130
+ * by construction.
131
+ *
132
+ * Returns the destination's `NavigationState`, which is a pure function of
133
+ * the URL and is what the incoming tree is *rendered* with, plus a
134
+ * `commit` thunk that performs the writes that make a page current:
135
+ * 1. Segment cache — update from server-provided segment metadata
136
+ * 2. Navigation state — pathname/search for usePathname/useSearchParams
137
+ * 3. History stack — store the payload for instant back/forward replay
138
+ *
139
+ * Nothing is written until `commit()` runs, and on a transitioned
140
+ * navigation it runs only once the transition is known to have won — see
141
+ * `renderViaTransition` and `NavigationRoot`. A navigation superseded
142
+ * while its payload was in flight never calls it, so the cache, the
143
+ * pathname the client reports and the history stack all keep describing
144
+ * the route still on screen (TIM-1301).
145
+ *
146
+ * Callers with state of their own to publish — the address bar, the
147
+ * client's record of the mounted tree — wrap this thunk rather than
148
+ * commit beside it, so there stays exactly one moment at which a page
149
+ * becomes current.
150
+ */
151
+ prepareNavigation(url: string, opts: NavigationCommitInput): PreparedNavigation {
152
+ const navState = deriveNavigationState(url);
153
+
154
+ return {
155
+ navState,
156
+ commit() {
157
+ if (opts.segmentInfo && opts.segmentInfo.length > 0) {
158
+ updateSegmentCache(opts.segmentInfo);
159
+ } else if (opts.segmentInfo?.length === 0 || opts.clearSegmentCacheOnEmpty) {
160
+ segmentCache.clear();
161
+ }
162
+
163
+ setNavigationState(navState);
164
+
165
+ historyStack.push(url, {
166
+ payload: opts.payload,
167
+ params: opts.params,
168
+ segmentInfo: opts.segmentInfo,
169
+ });
170
+ },
171
+ };
172
+ },
173
+ };
174
+ }
@@ -3,17 +3,19 @@
3
3
  /**
4
4
  * NavigationContext — React context for navigation state.
5
5
  *
6
- * Holds the current route params and pathname, updated atomically
7
- * with the RSC tree on each navigation. This replaces the previous
8
- * useSyncExternalStore approach for useSegmentParams() and usePathname(),
9
- * which suffered from a timing gap: the new tree could commit before
10
- * the external store re-renders fired, causing a frame where both
11
- * old and new active states were visible simultaneously.
6
+ * Holds the current pathname and search, updated atomically with the RSC
7
+ * tree on each navigation. This replaces the previous useSyncExternalStore
8
+ * approach for usePathname() and useSearchParams(), which suffered from a
9
+ * timing gap: the new tree could commit before the external store
10
+ * re-renders fired, causing a frame where both old and new active states
11
+ * were visible simultaneously.
12
+ *
13
+ * Segment params are NOT here — see the note on NavigationState below.
12
14
  *
13
15
  * By wrapping the RSC payload element in NavigationProvider inside
14
16
  * renderRoot(), the context value and the element tree are passed to
15
17
  * reactRoot.render() in the same call — atomic by construction.
16
- * All consumers (useParams, usePathname) see the new values in the
18
+ * All consumers (usePathname, useSearchParams) see the new values in the
17
19
  * same render pass as the new tree.
18
20
  *
19
21
  * During SSR, no NavigationProvider is mounted. Hooks fall back to
@@ -40,13 +42,23 @@
40
42
  */
41
43
 
42
44
  import React, { createElement, type ReactNode } from 'react';
45
+ import type { SlotParamsRecord } from '../shared/slot-params.js';
43
46
 
44
47
  // ---------------------------------------------------------------------------
45
48
  // Context type
46
49
  // ---------------------------------------------------------------------------
47
50
 
51
+ /**
52
+ * What the browser knows about the current location.
53
+ *
54
+ * Params are deliberately absent: they are a property of the tree the server
55
+ * rendered, not of the address bar, and they now travel inside the payload as
56
+ * the payload root. Keeping a copy here meant the router had to thread
57
+ * the record from a response header into context on every path — navigation,
58
+ * traversal, prefetch, revalidation — and each of those was a place to drop it
59
+ * (TIM-1294).
60
+ */
48
61
  export interface NavigationState {
49
- params: Record<string, string | string[]>;
50
62
  pathname: string;
51
63
  search: string;
52
64
  }
@@ -68,15 +80,10 @@ export interface NavigationState {
68
80
  * reads from context B. globalThis guarantees a single instance.
69
81
  *
70
82
  * See design/27-chunking-strategy.md §"Singleton Safety"
71
- *
72
- * NOTE: Despite similar naming, `usePendingNavigationUrl()` here is an
73
- * internal helper — the public hook is `usePendingNavigation()` in
74
- * use-pending-navigation.ts.
75
83
  */
76
84
 
77
85
  // Symbol keys for globalThis storage — prevents collisions with user code
78
86
  const NAV_CTX_KEY = Symbol.for('__timber_nav_ctx');
79
- const PENDING_CTX_KEY = Symbol.for('__timber_pending_nav_ctx');
80
87
 
81
88
  function getOrCreateContext(): React.Context<NavigationState | null> | undefined {
82
89
  const existing = (globalThis as Record<symbol, unknown>)[NAV_CTX_KEY] as
@@ -95,7 +102,7 @@ function getOrCreateContext(): React.Context<NavigationState | null> | undefined
95
102
  /**
96
103
  * Read the navigation context. Returns null during SSR (no provider)
97
104
  * or in the RSC environment (no context available).
98
- * Internal — used by useSegmentParams() and usePathname().
105
+ * Internal — used by usePathname() and useSearchParams().
99
106
  */
100
107
  export function useNavigationContext(): NavigationState | null {
101
108
  const ctx = getOrCreateContext();
@@ -155,7 +162,7 @@ const NAV_STATE_KEY = Symbol.for('__timber_nav_state');
155
162
  function _getNavStateStore(): { current: NavigationState } {
156
163
  const g = globalThis as Record<symbol, unknown>;
157
164
  if (!g[NAV_STATE_KEY]) {
158
- g[NAV_STATE_KEY] = { current: { params: {}, pathname: '/', search: '' } };
165
+ g[NAV_STATE_KEY] = { current: { pathname: '/', search: '' } };
159
166
  }
160
167
  return g[NAV_STATE_KEY] as { current: NavigationState };
161
168
  }
@@ -169,59 +176,25 @@ export function getNavigationState(): NavigationState {
169
176
  }
170
177
 
171
178
  // ---------------------------------------------------------------------------
172
- // Pending Navigation Context (same module for singleton guarantee)
179
+ // Pending navigation state lives in the router, not here
173
180
  // ---------------------------------------------------------------------------
174
181
 
175
182
  /**
176
- * Separate context for the in-flight navigation URL. Provided by
177
- * NavigationRoot (urgent useState), consumed by usePendingNavigation
178
- * and TopLoader. Per-link pending state uses useOptimistic instead
179
- * (see design/19-client-navigation.md §"Per-Link Pending State").
180
- *
181
- * Uses globalThis via Symbol.for for the same reason as NavigationContext
182
- * above — the bundler may duplicate this module across chunks, and module-
183
- * level variables would create separate context instances.
184
- */
185
-
186
- function getOrCreatePendingContext(): React.Context<string | null> | undefined {
187
- const existing = (globalThis as Record<symbol, unknown>)[PENDING_CTX_KEY] as
188
- | React.Context<string | null>
189
- | undefined;
190
- if (existing !== undefined) return existing;
191
- if (typeof React.createContext === 'function') {
192
- const ctx = React.createContext<string | null>(null);
193
- (globalThis as Record<symbol, unknown>)[PENDING_CTX_KEY] = ctx;
194
- return ctx;
195
- }
196
- return undefined;
197
- }
198
-
199
- /**
200
- * Read the pending navigation URL from context.
201
- * Returns null during SSR (no provider) or in the RSC environment.
202
- */
203
- export function usePendingNavigationUrl(): string | null {
204
- const ctx = getOrCreatePendingContext();
205
- if (!ctx) return null;
206
- if (typeof React.useContext !== 'function') return null;
207
- // eslint-disable-next-line react-hooks/rules-of-hooks -- conditional on environment, not render path
208
- return React.useContext(ctx);
209
- }
210
-
211
- /**
212
- * Provider for the pending navigation URL. Wraps children with
213
- * the pending context Provider.
183
+ * There was a second React context here — `PendingNavigationContext`, holding
184
+ * the in-flight navigation URL, provided by `NavigationRoot` out of a
185
+ * `useState` — plus a `usePendingNavigationUrl()` reader for it. Both are gone
186
+ * (TIM-1307).
187
+ *
188
+ * Nothing read them. `usePendingNavigation()` (use-pending-navigation.ts) and
189
+ * `TopLoader` both subscribe to the router's external pending store via
190
+ * `useSyncExternalStore`: sync priority, immune to transition entanglement,
191
+ * and cleared by `runNavigation`'s supersession-guarded `finally` (TIM-1034).
192
+ * The context was a parallel representation of the same fact that no consumer
193
+ * ever migrated to, and one that could not even agree with the store — a
194
+ * navigation superseded by a cached popstate replay left its URL set until the
195
+ * next full navigation, because the staleness guard skipped the clear and no
196
+ * other path touched it.
197
+ *
198
+ * One representation, and it is the router's. See
199
+ * design/19-client-navigation.md §"How Pending State Works".
214
200
  */
215
- export function PendingNavigationProvider({
216
- value,
217
- children,
218
- }: {
219
- value: string | null;
220
- children?: ReactNode;
221
- }): React.ReactElement {
222
- const ctx = getOrCreatePendingContext();
223
- if (!ctx) {
224
- return children as React.ReactElement;
225
- }
226
- return createElement(ctx.Provider, { value }, children);
227
- }