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

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 (570) hide show
  1. package/dist/_chunks/{actions-O_LsyCE4.js → actions-35jnMdeJ.js} +4 -3
  2. package/dist/_chunks/{actions-O_LsyCE4.js.map → actions-35jnMdeJ.js.map} +1 -1
  3. package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
  4. package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
  5. package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
  6. package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
  7. package/dist/_chunks/base-path-DaQrzbez.js +80 -0
  8. package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
  9. package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
  10. package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
  11. package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
  12. package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
  13. package/dist/_chunks/{cache-api-B-lhk9p4.js → cache-api-DjNrIWRR.js} +8 -14
  14. package/dist/_chunks/cache-api-DjNrIWRR.js.map +1 -0
  15. package/dist/_chunks/cli-check-CpmN7Nh-.js +256 -0
  16. package/dist/_chunks/cli-check-CpmN7Nh-.js.map +1 -0
  17. package/dist/_chunks/cli-schema-sync-CGMp_Psg.js +298 -0
  18. package/dist/_chunks/cli-schema-sync-CGMp_Psg.js.map +1 -0
  19. package/dist/_chunks/{cloudflare-CnT5Lr7U.js → cloudflare-CGP6BZKO.js} +92 -14
  20. package/dist/_chunks/{cloudflare-CnT5Lr7U.js.map → cloudflare-CGP6BZKO.js.map} +1 -1
  21. package/dist/_chunks/convention-lint-kXsgc_-7.js +784 -0
  22. package/dist/_chunks/convention-lint-kXsgc_-7.js.map +1 -0
  23. package/dist/_chunks/error-boundary-D-ODYX41.js +353 -0
  24. package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -0
  25. package/dist/_chunks/{fast-hash-D6hIVt1Y.js → fast-hash-C-tVYrLb.js} +6 -1
  26. package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
  27. package/dist/_chunks/file-cache-DmX7OqZP.js +454 -0
  28. package/dist/_chunks/file-cache-DmX7OqZP.js.map +1 -0
  29. package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
  30. package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
  31. package/dist/_chunks/{logger-AWfuX-KJ.js → logger-D8xJZXIN.js} +34 -51
  32. package/dist/_chunks/logger-D8xJZXIN.js.map +1 -0
  33. package/dist/_chunks/mdx-file-C005ay-P.js +25 -0
  34. package/dist/_chunks/mdx-file-C005ay-P.js.map +1 -0
  35. package/dist/_chunks/{plugin-context---kTF5v8.js → plugin-context-rCinWLiE.js} +8 -2
  36. package/dist/_chunks/plugin-context-rCinWLiE.js.map +1 -0
  37. package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
  38. package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
  39. package/dist/_chunks/{resolve-schema-Dz3fcFUo.js → resolve-schema-5ma5pp1b.js} +2 -2
  40. package/dist/_chunks/{resolve-schema-Dz3fcFUo.js.map → resolve-schema-5ma5pp1b.js.map} +1 -1
  41. package/dist/_chunks/{router-ref-CtmF-aPv.js → router-ref-DuYuV_0Q.js} +2 -2
  42. package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
  43. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
  44. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
  45. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
  46. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
  47. package/dist/_chunks/rsc-media-type-DRqE_lD_.js +46 -0
  48. package/dist/_chunks/rsc-media-type-DRqE_lD_.js.map +1 -0
  49. package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
  50. package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
  51. package/dist/_chunks/scanner-C8b0Gcw3.js +1564 -0
  52. package/dist/_chunks/scanner-C8b0Gcw3.js.map +1 -0
  53. package/dist/_chunks/schema-bridge-Cc2Gngu1.js +199 -0
  54. package/dist/_chunks/schema-bridge-Cc2Gngu1.js.map +1 -0
  55. package/dist/_chunks/{segment-classify-Byy425ng.js → segment-classify-C539Pa2O.js} +23 -2
  56. package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
  57. package/dist/_chunks/segment-context-CjOlyB8Y.js +97 -0
  58. package/dist/_chunks/segment-context-CjOlyB8Y.js.map +1 -0
  59. package/dist/_chunks/{canonicalize-DQHyFClh.js → segment-keys-BawYuNFO.js} +61 -2
  60. package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
  61. package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
  62. package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
  63. package/dist/_chunks/{ssr-data-BOWsq18U.js → ssr-data-14MXm7Pj.js} +17 -2
  64. package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
  65. package/dist/_chunks/{use-query-states-DFvWd-EA.js → use-query-states-BbU5Ge1V.js} +74 -26
  66. package/dist/_chunks/use-query-states-BbU5Ge1V.js.map +1 -0
  67. package/dist/_chunks/use-segment-params-C4r4BD9T.js +398 -0
  68. package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -0
  69. package/dist/_chunks/walkers-RzN6AFjr.js +141 -0
  70. package/dist/_chunks/walkers-RzN6AFjr.js.map +1 -0
  71. package/dist/adapters/build-output-helper.d.ts +37 -0
  72. package/dist/adapters/build-output-helper.d.ts.map +1 -1
  73. package/dist/adapters/cloudflare-dev.js +1 -1
  74. package/dist/adapters/cloudflare-kv-cache.js +1 -1
  75. package/dist/adapters/cloudflare.d.ts.map +1 -1
  76. package/dist/adapters/cloudflare.js +1 -1
  77. package/dist/adapters/compress-module.d.ts +12 -0
  78. package/dist/adapters/compress-module.d.ts.map +1 -1
  79. package/dist/adapters/fs-identity.d.ts +64 -0
  80. package/dist/adapters/fs-identity.d.ts.map +1 -0
  81. package/dist/adapters/nitro.d.ts.map +1 -1
  82. package/dist/adapters/nitro.js +56 -5
  83. package/dist/adapters/nitro.js.map +1 -1
  84. package/dist/adapters/shared.d.ts +57 -1
  85. package/dist/adapters/shared.d.ts.map +1 -1
  86. package/dist/adapters/types.d.ts +13 -1
  87. package/dist/adapters/types.d.ts.map +1 -1
  88. package/dist/cache/fast-hash.d.ts +5 -0
  89. package/dist/cache/fast-hash.d.ts.map +1 -1
  90. package/dist/cache/index.js +1 -1
  91. package/dist/cdn/cloudflare-purge.js +30 -0
  92. package/dist/cdn/cloudflare-purge.js.map +1 -0
  93. package/dist/cdn/fastly-purge.js +33 -0
  94. package/dist/cdn/fastly-purge.js.map +1 -0
  95. package/dist/cdn/index.js +94 -0
  96. package/dist/cdn/index.js.map +1 -0
  97. package/dist/cdn/workers-cache-purge.js +35 -0
  98. package/dist/cdn/workers-cache-purge.js.map +1 -0
  99. package/dist/cli-check.d.ts +153 -0
  100. package/dist/cli-check.d.ts.map +1 -0
  101. package/dist/cli.d.ts +34 -8
  102. package/dist/cli.d.ts.map +1 -1
  103. package/dist/cli.js +46 -21
  104. package/dist/cli.js.map +1 -1
  105. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  106. package/dist/client/browser-entry/hydrate.d.ts +20 -9
  107. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  108. package/dist/client/browser-entry/index.d.ts +1 -1
  109. package/dist/client/browser-entry/index.d.ts.map +1 -1
  110. package/dist/client/browser-entry/post-hydration.d.ts +4 -1
  111. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
  112. package/dist/client/browser-entry/router-init.d.ts +3 -0
  113. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  114. package/dist/client/browser-entry/rsc-stream.d.ts +8 -0
  115. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -1
  116. package/dist/client/error-boundary.d.ts +7 -0
  117. package/dist/client/error-boundary.d.ts.map +1 -1
  118. package/dist/client/error-boundary.js +1 -162
  119. package/dist/client/history.d.ts +13 -6
  120. package/dist/client/history.d.ts.map +1 -1
  121. package/dist/client/index.d.ts +1 -0
  122. package/dist/client/index.d.ts.map +1 -1
  123. package/dist/client/index.js +42 -41
  124. package/dist/client/index.js.map +1 -1
  125. package/dist/client/internal.d.ts +4 -3
  126. package/dist/client/internal.d.ts.map +1 -1
  127. package/dist/client/internal.js +877 -311
  128. package/dist/client/internal.js.map +1 -1
  129. package/dist/client/link.d.ts +1 -7
  130. package/dist/client/link.d.ts.map +1 -1
  131. package/dist/client/navigation-api.d.ts +2 -2
  132. package/dist/client/navigation-commit.d.ts +87 -0
  133. package/dist/client/navigation-commit.d.ts.map +1 -0
  134. package/dist/client/navigation-context.d.ts +37 -20
  135. package/dist/client/navigation-context.d.ts.map +1 -1
  136. package/dist/client/navigation-root.d.ts +63 -23
  137. package/dist/client/navigation-root.d.ts.map +1 -1
  138. package/dist/client/params-context.d.ts +81 -0
  139. package/dist/client/params-context.d.ts.map +1 -0
  140. package/dist/client/router-effects.d.ts +129 -0
  141. package/dist/client/router-effects.d.ts.map +1 -0
  142. package/dist/client/router-lifecycle.d.ts +55 -0
  143. package/dist/client/router-lifecycle.d.ts.map +1 -0
  144. package/dist/client/router-pipeline.d.ts +84 -0
  145. package/dist/client/router-pipeline.d.ts.map +1 -0
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router-ref.d.ts.map +1 -1
  148. package/dist/client/router-skew.d.ts +21 -0
  149. package/dist/client/router-skew.d.ts.map +1 -0
  150. package/dist/client/router-types.d.ts +207 -0
  151. package/dist/client/router-types.d.ts.map +1 -0
  152. package/dist/client/router.d.ts +1 -182
  153. package/dist/client/router.d.ts.map +1 -1
  154. package/dist/client/rsc-fetch.d.ts +47 -26
  155. package/dist/client/rsc-fetch.d.ts.map +1 -1
  156. package/dist/client/segment-cache.d.ts +87 -34
  157. package/dist/client/segment-cache.d.ts.map +1 -1
  158. package/dist/client/ssr-data.d.ts +6 -0
  159. package/dist/client/ssr-data.d.ts.map +1 -1
  160. package/dist/client/stale-client.d.ts +69 -0
  161. package/dist/client/stale-client.d.ts.map +1 -0
  162. package/dist/client/state.d.ts +10 -1
  163. package/dist/client/state.d.ts.map +1 -1
  164. package/dist/client/top-loader.d.ts +2 -1
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/unload-guard.d.ts +5 -0
  167. package/dist/client/unload-guard.d.ts.map +1 -1
  168. package/dist/client/use-cookie.d.ts.map +1 -1
  169. package/dist/client/use-query-states.d.ts +9 -3
  170. package/dist/client/use-query-states.d.ts.map +1 -1
  171. package/dist/client/use-router.d.ts +1 -1
  172. package/dist/client/use-segment-params.d.ts +18 -8
  173. package/dist/client/use-segment-params.d.ts.map +1 -1
  174. package/dist/codec.js +1 -1
  175. package/dist/cookies/define-cookie.d.ts.map +1 -1
  176. package/dist/cookies/index.js +5 -5
  177. package/dist/cookies/index.js.map +1 -1
  178. package/dist/index.d.ts +4 -1
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +1009 -759
  181. package/dist/index.js.map +1 -1
  182. package/dist/params/index.js +1 -1
  183. package/dist/plugin-context.d.ts +46 -0
  184. package/dist/plugin-context.d.ts.map +1 -1
  185. package/dist/plugins/adapter-build.d.ts.map +1 -1
  186. package/dist/plugins/build-manifest.d.ts +1 -1
  187. package/dist/plugins/build-manifest.d.ts.map +1 -1
  188. package/dist/plugins/entries.d.ts.map +1 -1
  189. package/dist/plugins/fonts.d.ts.map +1 -1
  190. package/dist/plugins/request-dep/analysis.d.ts +106 -0
  191. package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
  192. package/dist/plugins/request-dep/index.d.ts +75 -0
  193. package/dist/plugins/request-dep/index.d.ts.map +1 -0
  194. package/dist/plugins/request-dep/origin.d.ts +61 -0
  195. package/dist/plugins/request-dep/origin.d.ts.map +1 -0
  196. package/dist/plugins/routing.d.ts.map +1 -1
  197. package/dist/plugins/shims.d.ts.map +1 -1
  198. package/dist/plugins/static-build.d.ts +160 -8
  199. package/dist/plugins/static-build.d.ts.map +1 -1
  200. package/dist/routing/codegen-shared.d.ts +3 -44
  201. package/dist/routing/codegen-shared.d.ts.map +1 -1
  202. package/dist/routing/codegen-types.d.ts +28 -31
  203. package/dist/routing/codegen-types.d.ts.map +1 -1
  204. package/dist/routing/codegen-write.d.ts +51 -0
  205. package/dist/routing/codegen-write.d.ts.map +1 -0
  206. package/dist/routing/codegen.d.ts.map +1 -1
  207. package/dist/routing/collision-probe.d.ts +104 -0
  208. package/dist/routing/collision-probe.d.ts.map +1 -0
  209. package/dist/routing/collision-spaces.d.ts +26 -0
  210. package/dist/routing/collision-spaces.d.ts.map +1 -0
  211. package/dist/routing/convention-lint.d.ts +18 -4
  212. package/dist/routing/convention-lint.d.ts.map +1 -1
  213. package/dist/routing/export-detect.d.ts +16 -0
  214. package/dist/routing/export-detect.d.ts.map +1 -1
  215. package/dist/routing/index.js +4 -3
  216. package/dist/routing/interception.d.ts +235 -6
  217. package/dist/routing/interception.d.ts.map +1 -1
  218. package/dist/routing/link-codegen.d.ts +19 -4
  219. package/dist/routing/link-codegen.d.ts.map +1 -1
  220. package/dist/routing/manifest-codegen.d.ts +1 -7
  221. package/dist/routing/manifest-codegen.d.ts.map +1 -1
  222. package/dist/routing/scanner.d.ts.map +1 -1
  223. package/dist/routing/segment-classify.d.ts +33 -0
  224. package/dist/routing/segment-classify.d.ts.map +1 -1
  225. package/dist/routing/segment-keys.d.ts +95 -0
  226. package/dist/routing/segment-keys.d.ts.map +1 -0
  227. package/dist/routing/slot-placement.d.ts +48 -0
  228. package/dist/routing/slot-placement.d.ts.map +1 -0
  229. package/dist/routing/types.d.ts +0 -6
  230. package/dist/routing/types.d.ts.map +1 -1
  231. package/dist/routing/walkers.d.ts +6 -0
  232. package/dist/routing/walkers.d.ts.map +1 -1
  233. package/dist/schema-bridge.d.ts +60 -9
  234. package/dist/schema-bridge.d.ts.map +1 -1
  235. package/dist/search-params/define.d.ts +62 -14
  236. package/dist/search-params/define.d.ts.map +1 -1
  237. package/dist/search-params/index.d.ts +0 -1
  238. package/dist/search-params/index.d.ts.map +1 -1
  239. package/dist/search-params/index.js +221 -10
  240. package/dist/search-params/index.js.map +1 -1
  241. package/dist/search-params/parse-total.d.ts +70 -0
  242. package/dist/search-params/parse-total.d.ts.map +1 -0
  243. package/dist/search-params/wrappers.d.ts +26 -3
  244. package/dist/search-params/wrappers.d.ts.map +1 -1
  245. package/dist/server/access-gate.d.ts +19 -8
  246. package/dist/server/access-gate.d.ts.map +1 -1
  247. package/dist/server/action-handler.d.ts.map +1 -1
  248. package/dist/server/actions.d.ts +6 -3
  249. package/dist/server/actions.d.ts.map +1 -1
  250. package/dist/server/als-registry.d.ts +18 -1
  251. package/dist/server/als-registry.d.ts.map +1 -1
  252. package/dist/server/build-manifest.d.ts +13 -1
  253. package/dist/server/build-manifest.d.ts.map +1 -1
  254. package/dist/server/chain-url-parts.d.ts +82 -0
  255. package/dist/server/chain-url-parts.d.ts.map +1 -0
  256. package/dist/server/children-interception.d.ts +49 -0
  257. package/dist/server/children-interception.d.ts.map +1 -0
  258. package/dist/server/compress.d.ts.map +1 -1
  259. package/dist/server/default-status-page.d.ts +45 -0
  260. package/dist/server/default-status-page.d.ts.map +1 -0
  261. package/dist/server/deny-boundary.d.ts +148 -15
  262. package/dist/server/deny-boundary.d.ts.map +1 -1
  263. package/dist/server/deny-renderer.d.ts +15 -4
  264. package/dist/server/deny-renderer.d.ts.map +1 -1
  265. package/dist/server/error-boundary-wrapper.d.ts +85 -15
  266. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  267. package/dist/server/head-response.d.ts +35 -0
  268. package/dist/server/head-response.d.ts.map +1 -0
  269. package/dist/server/index.d.ts +0 -1
  270. package/dist/server/index.d.ts.map +1 -1
  271. package/dist/server/index.js +3 -2
  272. package/dist/server/index.js.map +1 -1
  273. package/dist/server/internal.d.ts +3 -1
  274. package/dist/server/internal.d.ts.map +1 -1
  275. package/dist/server/internal.js +712 -418
  276. package/dist/server/internal.js.map +1 -1
  277. package/dist/server/metadata-collector.d.ts +52 -0
  278. package/dist/server/metadata-collector.d.ts.map +1 -0
  279. package/dist/server/param-coercion.d.ts +22 -6
  280. package/dist/server/param-coercion.d.ts.map +1 -1
  281. package/dist/server/pipeline-helpers.d.ts +0 -18
  282. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  283. package/dist/server/pipeline-interception.d.ts +59 -9
  284. package/dist/server/pipeline-interception.d.ts.map +1 -1
  285. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  286. package/dist/server/pipeline-phases.d.ts.map +1 -1
  287. package/dist/server/pipeline.d.ts +11 -0
  288. package/dist/server/pipeline.d.ts.map +1 -1
  289. package/dist/server/primitives.d.ts +23 -0
  290. package/dist/server/primitives.d.ts.map +1 -1
  291. package/dist/server/publish-params.d.ts +33 -0
  292. package/dist/server/publish-params.d.ts.map +1 -0
  293. package/dist/server/request-context.d.ts +48 -0
  294. package/dist/server/request-context.d.ts.map +1 -1
  295. package/dist/server/route-element-builder.d.ts +22 -3
  296. package/dist/server/route-element-builder.d.ts.map +1 -1
  297. package/dist/server/route-handler.d.ts.map +1 -1
  298. package/dist/server/route-matcher.d.ts +13 -0
  299. package/dist/server/route-matcher.d.ts.map +1 -1
  300. package/dist/server/rsc-cache-key-guard.d.ts +78 -0
  301. package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
  302. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  303. package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -1
  304. package/dist/server/rsc-entry/error-renderer.d.ts +15 -3
  305. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  306. package/dist/server/rsc-entry/helpers.d.ts +2 -17
  307. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  308. package/dist/server/rsc-entry/index.d.ts +0 -1
  309. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  310. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  311. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -1
  312. package/dist/server/rsc-entry/rsc-payload.d.ts +1 -2
  313. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  314. package/dist/server/rsc-entry/rsc-stream.d.ts +15 -2
  315. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  316. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  317. package/dist/server/skippable-prefix.d.ts +23 -0
  318. package/dist/server/skippable-prefix.d.ts.map +1 -0
  319. package/dist/server/slot-interception.d.ts +80 -0
  320. package/dist/server/slot-interception.d.ts.map +1 -0
  321. package/dist/server/slot-resolver.d.ts +70 -8
  322. package/dist/server/slot-resolver.d.ts.map +1 -1
  323. package/dist/server/ssr-bridge-types.d.ts +17 -0
  324. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  325. package/dist/server/ssr-entry.d.ts +0 -1
  326. package/dist/server/ssr-entry.d.ts.map +1 -1
  327. package/dist/server/ssr-wrappers.d.ts +24 -13
  328. package/dist/server/ssr-wrappers.d.ts.map +1 -1
  329. package/dist/server/state-tree-diff.d.ts +6 -27
  330. package/dist/server/state-tree-diff.d.ts.map +1 -1
  331. package/dist/server/static-generator.d.ts +6 -0
  332. package/dist/server/static-generator.d.ts.map +1 -1
  333. package/dist/server/static-not-found.d.ts +52 -0
  334. package/dist/server/static-not-found.d.ts.map +1 -0
  335. package/dist/server/status-code-resolver.d.ts +8 -1
  336. package/dist/server/status-code-resolver.d.ts.map +1 -1
  337. package/dist/server/tree-builder.d.ts +28 -36
  338. package/dist/server/tree-builder.d.ts.map +1 -1
  339. package/dist/server/types.d.ts +12 -7
  340. package/dist/server/types.d.ts.map +1 -1
  341. package/dist/server/utils/element-type.d.ts +40 -0
  342. package/dist/server/utils/element-type.d.ts.map +1 -0
  343. package/dist/shared/als-slots.d.ts +41 -0
  344. package/dist/shared/als-slots.d.ts.map +1 -0
  345. package/dist/shared/base-path.d.ts +56 -0
  346. package/dist/shared/base-path.d.ts.map +1 -0
  347. package/dist/shared/param-value.d.ts +80 -0
  348. package/dist/shared/param-value.d.ts.map +1 -0
  349. package/dist/shared/payload-root.d.ts +108 -0
  350. package/dist/shared/payload-root.d.ts.map +1 -0
  351. package/dist/shared/rsc-cache-key.d.ts +163 -0
  352. package/dist/shared/rsc-cache-key.d.ts.map +1 -0
  353. package/dist/shared/rsc-error-envelope.d.ts +25 -0
  354. package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
  355. package/dist/shared/rsc-manifest.d.ts +28 -0
  356. package/dist/shared/rsc-manifest.d.ts.map +1 -0
  357. package/dist/shared/rsc-media-type.d.ts +40 -0
  358. package/dist/shared/rsc-media-type.d.ts.map +1 -0
  359. package/dist/shared/rsc-payload-path.d.ts +42 -0
  360. package/dist/shared/rsc-payload-path.d.ts.map +1 -0
  361. package/dist/shared/segment-info.d.ts +59 -0
  362. package/dist/shared/segment-info.d.ts.map +1 -0
  363. package/dist/shared/slot-params.d.ts +51 -0
  364. package/dist/shared/slot-params.d.ts.map +1 -0
  365. package/dist/shared/static-platform-files.d.ts +71 -0
  366. package/dist/shared/static-platform-files.d.ts.map +1 -0
  367. package/docs/api/30-api-server.mdx +1 -1
  368. package/docs/api/31-api-client.mdx +4 -2
  369. package/docs/api/33-api-search-params.mdx +38 -16
  370. package/docs/api/35-api-typescript.mdx +3 -3
  371. package/docs/api/36-cli.mdx +34 -7
  372. package/docs/learn/00-introduction.mdx +1 -1
  373. package/docs/learn/02-pages-and-layouts.mdx +2 -2
  374. package/docs/learn/05-typed-params.mdx +8 -8
  375. package/docs/learn/07-typed-routes.mdx +12 -7
  376. package/docs/learn/11-error-handling.mdx +18 -0
  377. package/docs/learn/12-client-navigation.mdx +2 -2
  378. package/docs/learn/14-deploying.mdx +23 -0
  379. package/docs/more/01-advanced-routing.mdx +173 -3
  380. package/docs/more/03-coming-from-nextjs.mdx +2 -2
  381. package/docs/more/04-metadata-and-fonts.mdx +1 -1
  382. package/docs/more/50-ai-agent-instructions.mdx +6 -4
  383. package/package.json +9 -6
  384. package/src/adapters/build-output-helper.ts +116 -3
  385. package/src/adapters/cloudflare.ts +90 -12
  386. package/src/adapters/compress-module.ts +79 -1
  387. package/src/adapters/fs-identity.ts +156 -0
  388. package/src/adapters/nitro.ts +6 -6
  389. package/src/adapters/shared.ts +196 -21
  390. package/src/adapters/types.ts +13 -1
  391. package/src/cache/fast-hash.ts +5 -0
  392. package/src/cli-check.ts +458 -0
  393. package/src/cli.ts +59 -24
  394. package/src/client/browser-entry/action-dispatch.ts +11 -5
  395. package/src/client/browser-entry/hydrate.ts +40 -29
  396. package/src/client/browser-entry/index.ts +15 -6
  397. package/src/client/browser-entry/post-hydration.ts +10 -9
  398. package/src/client/browser-entry/router-init.ts +104 -48
  399. package/src/client/browser-entry/rsc-stream.ts +11 -2
  400. package/src/client/error-boundary.tsx +85 -16
  401. package/src/client/history.ts +13 -6
  402. package/src/client/index.ts +14 -3
  403. package/src/client/internal.ts +4 -3
  404. package/src/client/link.tsx +120 -72
  405. package/src/client/navigation-api.ts +3 -3
  406. package/src/client/navigation-commit.ts +197 -0
  407. package/src/client/navigation-context.ts +40 -67
  408. package/src/client/navigation-root.tsx +326 -101
  409. package/src/client/params-context.ts +192 -0
  410. package/src/client/router-effects.ts +231 -0
  411. package/src/client/router-lifecycle.ts +288 -0
  412. package/src/client/router-pipeline.ts +393 -0
  413. package/src/client/router-ref.ts +1 -1
  414. package/src/client/router-skew.ts +30 -0
  415. package/src/client/router-types.ts +230 -0
  416. package/src/client/router.ts +243 -707
  417. package/src/client/rsc-fetch.ts +183 -106
  418. package/src/client/segment-cache.ts +129 -44
  419. package/src/client/ssr-data.ts +6 -0
  420. package/src/client/stale-client.ts +191 -0
  421. package/src/client/state.ts +14 -1
  422. package/src/client/top-loader.tsx +2 -1
  423. package/src/client/unload-guard.ts +34 -2
  424. package/src/client/use-cookie.ts +9 -2
  425. package/src/client/use-query-states.ts +102 -39
  426. package/src/client/use-router.ts +1 -1
  427. package/src/client/use-segment-params.ts +41 -18
  428. package/src/cookies/define-cookie.ts +6 -1
  429. package/src/index.ts +25 -4
  430. package/src/plugin-context.ts +58 -0
  431. package/src/plugins/adapter-build.ts +4 -0
  432. package/src/plugins/build-manifest.ts +34 -13
  433. package/src/plugins/entries.ts +4 -0
  434. package/src/plugins/fonts.ts +11 -8
  435. package/src/plugins/request-dep/analysis.ts +447 -0
  436. package/src/plugins/request-dep/index.ts +376 -0
  437. package/src/plugins/request-dep/origin.ts +310 -0
  438. package/src/plugins/routing.ts +97 -102
  439. package/src/plugins/shims.ts +0 -1
  440. package/src/plugins/static-build.ts +391 -95
  441. package/src/routing/codegen-shared.ts +3 -79
  442. package/src/routing/codegen-types.ts +28 -31
  443. package/src/routing/codegen-write.ts +139 -0
  444. package/src/routing/codegen.ts +86 -172
  445. package/src/routing/collision-probe.ts +438 -0
  446. package/src/routing/collision-spaces.ts +281 -0
  447. package/src/routing/convention-lint.ts +139 -40
  448. package/src/routing/export-detect.ts +151 -7
  449. package/src/routing/interception.ts +896 -50
  450. package/src/routing/link-codegen.ts +32 -65
  451. package/src/routing/manifest-codegen.ts +6 -62
  452. package/src/routing/scanner.ts +117 -92
  453. package/src/routing/segment-classify.ts +57 -0
  454. package/src/routing/segment-keys.ts +146 -0
  455. package/src/routing/slot-placement.ts +97 -0
  456. package/src/routing/types.ts +0 -6
  457. package/src/routing/walkers.ts +8 -0
  458. package/src/schema-bridge.ts +180 -58
  459. package/src/search-params/define.ts +108 -66
  460. package/src/search-params/index.ts +0 -1
  461. package/src/search-params/parse-total.ts +78 -0
  462. package/src/search-params/wrappers.ts +60 -11
  463. package/src/server/access-gate.tsx +60 -40
  464. package/src/server/action-handler.ts +4 -5
  465. package/src/server/actions.ts +6 -3
  466. package/src/server/als-registry.ts +18 -1
  467. package/src/server/build-manifest.ts +14 -1
  468. package/src/server/chain-url-parts.ts +163 -0
  469. package/src/server/children-interception.ts +115 -0
  470. package/src/server/compress.ts +9 -1
  471. package/src/server/default-status-page.ts +127 -0
  472. package/src/server/deny-boundary.ts +269 -41
  473. package/src/server/deny-renderer.ts +111 -39
  474. package/src/server/error-boundary-wrapper.ts +166 -79
  475. package/src/server/head-response.ts +54 -0
  476. package/src/server/index.ts +1 -3
  477. package/src/server/internal.ts +2 -2
  478. package/src/server/metadata-collector.ts +115 -0
  479. package/src/server/param-coercion.ts +51 -69
  480. package/src/server/pipeline-helpers.ts +2 -47
  481. package/src/server/pipeline-interception.ts +81 -32
  482. package/src/server/pipeline-outcome.ts +4 -5
  483. package/src/server/pipeline-phases.ts +77 -25
  484. package/src/server/pipeline.ts +57 -10
  485. package/src/server/prebuilt-runtime.ts +4 -4
  486. package/src/server/primitives.ts +25 -0
  487. package/src/server/publish-params.ts +42 -0
  488. package/src/server/request-context.ts +97 -18
  489. package/src/server/route-element-builder.ts +241 -253
  490. package/src/server/route-handler.ts +8 -8
  491. package/src/server/route-matcher.ts +21 -9
  492. package/src/server/rsc-cache-key-guard.ts +164 -0
  493. package/src/server/rsc-entry/api-handler.ts +6 -8
  494. package/src/server/rsc-entry/deny-fallback.ts +3 -2
  495. package/src/server/rsc-entry/error-renderer.ts +94 -35
  496. package/src/server/rsc-entry/helpers.ts +33 -28
  497. package/src/server/rsc-entry/index.ts +36 -33
  498. package/src/server/rsc-entry/render-route.ts +18 -10
  499. package/src/server/rsc-entry/revalidate-renderer.ts +3 -2
  500. package/src/server/rsc-entry/rsc-payload.ts +113 -40
  501. package/src/server/rsc-entry/rsc-stream.ts +29 -5
  502. package/src/server/rsc-entry/ssr-renderer.ts +38 -22
  503. package/src/server/skippable-prefix.ts +92 -0
  504. package/src/server/slot-interception.ts +168 -0
  505. package/src/server/slot-resolver.ts +263 -158
  506. package/src/server/ssr-bridge-types.ts +18 -0
  507. package/src/server/ssr-entry.ts +20 -10
  508. package/src/server/ssr-wrappers.tsx +33 -32
  509. package/src/server/state-tree-diff.ts +14 -55
  510. package/src/server/static-generator.ts +68 -29
  511. package/src/server/static-not-found.ts +134 -0
  512. package/src/server/status-code-resolver.ts +28 -11
  513. package/src/server/tree-builder.ts +35 -218
  514. package/src/server/types.ts +12 -7
  515. package/src/server/utils/element-type.ts +72 -0
  516. package/src/shared/als-slots.ts +72 -0
  517. package/src/shared/base-path.ts +80 -0
  518. package/src/shared/param-value.ts +244 -0
  519. package/src/shared/payload-root.ts +151 -0
  520. package/src/shared/rsc-cache-key.ts +269 -0
  521. package/src/shared/rsc-error-envelope.ts +31 -0
  522. package/src/shared/rsc-manifest.ts +29 -0
  523. package/src/shared/rsc-media-type.ts +43 -0
  524. package/src/shared/rsc-payload-path.ts +45 -0
  525. package/src/shared/segment-info.ts +60 -0
  526. package/src/shared/slot-params.ts +111 -0
  527. package/src/shared/static-platform-files.ts +75 -0
  528. package/dist/_chunks/build-output-helper-DOGYFb_X.js +0 -196
  529. package/dist/_chunks/build-output-helper-DOGYFb_X.js.map +0 -1
  530. package/dist/_chunks/cache-api-B-lhk9p4.js.map +0 -1
  531. package/dist/_chunks/canonicalize-DQHyFClh.js.map +0 -1
  532. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js +0 -668
  533. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js.map +0 -1
  534. package/dist/_chunks/define-COtkxMRT.js +0 -191
  535. package/dist/_chunks/define-COtkxMRT.js.map +0 -1
  536. package/dist/_chunks/define-c4au4I9R.js +0 -82
  537. package/dist/_chunks/define-c4au4I9R.js.map +0 -1
  538. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +0 -1
  539. package/dist/_chunks/logger-AWfuX-KJ.js.map +0 -1
  540. package/dist/_chunks/navigation-root-bUDZLw74.js +0 -124
  541. package/dist/_chunks/navigation-root-bUDZLw74.js.map +0 -1
  542. package/dist/_chunks/plugin-context---kTF5v8.js.map +0 -1
  543. package/dist/_chunks/registry-DbJPKoBp.js +0 -20
  544. package/dist/_chunks/registry-DbJPKoBp.js.map +0 -1
  545. package/dist/_chunks/router-ref-CtmF-aPv.js.map +0 -1
  546. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +0 -119
  547. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +0 -1
  548. package/dist/_chunks/segment-classify-Byy425ng.js.map +0 -1
  549. package/dist/_chunks/segment-context-ZDnXDkbz.js +0 -34
  550. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +0 -1
  551. package/dist/_chunks/ssr-data-BOWsq18U.js.map +0 -1
  552. package/dist/_chunks/use-query-states-DFvWd-EA.js.map +0 -1
  553. package/dist/_chunks/use-segment-params-D1CzlgBo.js +0 -151
  554. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +0 -1
  555. package/dist/_chunks/walkers-_6zKFlch.js +0 -1002
  556. package/dist/_chunks/walkers-_6zKFlch.js.map +0 -1
  557. package/dist/client/error-boundary.js.map +0 -1
  558. package/dist/plugins/request-dep.d.ts +0 -32
  559. package/dist/plugins/request-dep.d.ts.map +0 -1
  560. package/dist/search-params/registry.d.ts +0 -20
  561. package/dist/search-params/registry.d.ts.map +0 -1
  562. package/dist/segment-params/define.d.ts +0 -89
  563. package/dist/segment-params/define.d.ts.map +0 -1
  564. package/dist/segment-params/index.d.ts +0 -3
  565. package/dist/segment-params/index.d.ts.map +0 -1
  566. package/dist/segment-params/index.js +0 -2
  567. package/src/plugins/request-dep.ts +0 -499
  568. package/src/search-params/registry.ts +0 -31
  569. package/src/segment-params/define.ts +0 -249
  570. package/src/segment-params/index.ts +0 -9
@@ -14,6 +14,8 @@
14
14
 
15
15
  import type { ClientBootstrapConfig } from '../html-injectors.js';
16
16
  import { flightInitScript } from '../flight-scripts.js';
17
+ import { appVisibleSearch } from '../../shared/rsc-cache-key.js';
18
+ import { getSlotParamsForClient } from '../request-context.js';
17
19
  import type { LayoutEntry } from '../deny-renderer.js';
18
20
  import { renderDenyPage } from '../deny-renderer.js';
19
21
  import type { RouteMatch } from '../pipeline.js';
@@ -31,7 +33,7 @@ import {
31
33
  isAbortError,
32
34
  } from './helpers.js';
33
35
  import { getCookiesForSsr } from '../cookie-context.js';
34
- import { getDenyStatus } from '../deny-boundary.js';
36
+ import { getDenyStatus, getFirstDeniedSegmentIndex } from '../deny-boundary.js';
35
37
  import { renderErrorPage, type GlobalErrorFile } from './error-renderer.js';
36
38
  import { callSsr } from './ssr-bridge.js';
37
39
  import type { RenderSignals } from './rsc-stream.js';
@@ -164,35 +166,36 @@ export async function renderSsrResponse(opts: SsrRenderOptions): Promise<Respons
164
166
  const errorAbort = new AbortController();
165
167
  signals.onUnhandledError = () => errorAbort.abort();
166
168
 
167
- // Embed segment metadata in HTML for initial hydration.
168
- // The client reads this to populate its segment cache before the
169
- // first navigation, enabling state tree diffing from the start.
170
- // Skipped when client JS is disabled — no client JS to consume it.
171
- const segmentScript = clientJsDisabled
172
- ? ''
173
- : `<script>self.__timber_segments=${htmlEscapeJsonString(JSON.stringify(buildSegmentInfo(segments, layoutComponents, opts.slotSkipInfo)))}</script>`;
169
+ // Segment metadata for initial hydration: deferred to shell-flush time.
170
+ // The SSR entry invokes this thunk AFTER renderSsrNodeStream /
171
+ // renderSsrStream returns (shell ready ⇒ AccessGates settled), so
172
+ // getFirstDeniedSegmentIndex() returns the authoritative ALS value
173
+ // rather than the pre-render Infinity. See TIM-1365, TIM-1359.
174
174
 
175
- // Embed route params in HTML so useSegmentParams() works on initial hydration.
176
- // Without this, useSegmentParams() returns {} until the first client navigation.
177
- const paramsScript =
178
- clientJsDisabled || Object.keys(match.segmentParams).length === 0
179
- ? ''
180
- : `<script>self.__timber_params=${htmlEscapeJsonString(JSON.stringify(match.segmentParams))}</script>`;
175
+ // Params reach the browser inside the payload — a field on the root row of
176
+ // the same Flight stream that is inlined for hydration. SSR itself renders
177
+ // only the tree, and the client components it renders read params from the
178
+ // ALS context seeded below, which is also where server components answer
179
+ // `getSegmentParams(slotPath)` from.
180
+ const slotParams = getSlotParamsForClient();
181
181
 
182
182
  const navContext: NavContext = {
183
183
  pathname: new URL(req.url).pathname,
184
184
  segmentParams: match.segmentParams,
185
- searchParams: Object.fromEntries(new URL(req.url).searchParams),
185
+ searchParams: Object.fromEntries(appVisibleSearch(new URL(req.url)).params),
186
+ slotParams,
186
187
  statusCode: 200,
187
188
  responseHeaders,
188
189
  headHtml:
189
190
  headHtml +
190
191
  clientBootstrap.preloadLinks +
191
- segmentScript +
192
- paramsScript +
193
192
  // Initialize __timber_f in <head> so it exists before any streaming
194
193
  // chunk scripts arrive in <body>. See flight-scripts.ts, LOCAL-415.
195
194
  (clientJsDisabled ? '' : flightInitScript()),
195
+ getHeadSegmentScript: clientJsDisabled
196
+ ? undefined
197
+ : () =>
198
+ `<script>self.__timber_segments=${htmlEscapeJsonString(JSON.stringify(buildSegmentInfo(segments, layoutComponents, opts.slotSkipInfo, undefined, getFirstDeniedSegmentIndex())))}</script>`,
196
199
  bootstrapScriptContent: clientBootstrap.bootstrapScriptContent,
197
200
  // Skip RSC inline stream when client JS is disabled — no client to hydrate.
198
201
  rscStream: clientJsDisabled ? undefined : inlineStream,
@@ -211,6 +214,12 @@ export async function renderSsrResponse(opts: SsrRenderOptions): Promise<Respons
211
214
  // The boundary renders the deny page as its fallback AND sets the correct
212
215
  // HTTP status code on navContext — no redundant renderDenyPage() needed.
213
216
  // See TIM-664, LOCAL-298.
217
+ // Read the denied segment index from ALS — set by AccessGate during render
218
+ // (setFirstDeniedSegmentIndex). See TIM-1358, TIM-1365.
219
+ function resolvedDeniedIndex(): number {
220
+ return getFirstDeniedSegmentIndex();
221
+ }
222
+
214
223
  function checkCapturedSignals(skipHandledDeny = false): Response | Promise<Response> | null {
215
224
  if (signals.redirectSignal) {
216
225
  return buildRedirectResponse(signals.redirectSignal, req, responseHeaders);
@@ -229,7 +238,9 @@ export async function renderSsrResponse(opts: SsrRenderOptions): Promise<Respons
229
238
  responseHeaders,
230
239
  clientBootstrap,
231
240
  createDebugChannelSink,
232
- callSsr
241
+ callSsr,
242
+ undefined,
243
+ resolvedDeniedIndex()
233
244
  );
234
245
  }
235
246
  if (signals.renderError) {
@@ -242,7 +253,8 @@ export async function renderSsrResponse(opts: SsrRenderOptions): Promise<Respons
242
253
  match,
243
254
  responseHeaders,
244
255
  clientBootstrap,
245
- globalError
256
+ globalError,
257
+ resolvedDeniedIndex()
246
258
  );
247
259
  }
248
260
  return null;
@@ -417,7 +429,9 @@ export async function renderSsrResponse(opts: SsrRenderOptions): Promise<Respons
417
429
  responseHeaders,
418
430
  clientBootstrap,
419
431
  createDebugChannelSink,
420
- callSsr
432
+ callSsr,
433
+ undefined,
434
+ resolvedDeniedIndex()
421
435
  );
422
436
  }
423
437
  if (signals.renderError) {
@@ -432,7 +446,8 @@ export async function renderSsrResponse(opts: SsrRenderOptions): Promise<Respons
432
446
  match,
433
447
  responseHeaders,
434
448
  clientBootstrap,
435
- globalError
449
+ globalError,
450
+ resolvedDeniedIndex()
436
451
  );
437
452
  }
438
453
  // No captured signal — unhandled error in the RSC stream.
@@ -450,7 +465,8 @@ export async function renderSsrResponse(opts: SsrRenderOptions): Promise<Respons
450
465
  match,
451
466
  responseHeaders,
452
467
  clientBootstrap,
453
- globalError
468
+ globalError,
469
+ resolvedDeniedIndex()
454
470
  );
455
471
  }
456
472
 
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Skippable-prefix truncation.
3
+ *
4
+ * Extracted from `route-element-builder.ts`, which was over the 500-line limit
5
+ * (design/18-build-system.md). This is a self-contained question — "may this
6
+ * segment's layout still be skipped, given what its slots would render?" — with
7
+ * no dependency on element construction.
8
+ */
9
+
10
+ import type { ManifestSegmentNode } from './route-matcher.js';
11
+ import type { RouteMatch } from './pipeline.js';
12
+ import { shouldSkipSlot, type ClientStateTree } from './state-tree-diff.js';
13
+ import { consumedUrlParts } from './chain-url-parts.js';
14
+ import { computeSlotKey } from '../routing/segment-keys.js';
15
+
16
+ /**
17
+ * Truncate the skippable prefix when a skippable layout has slots whose
18
+ * content changed between the departing and destination URLs (TIM-1232).
19
+ *
20
+ * Without this, changed slots at skipped layouts are never sent to the
21
+ * client — the `continue` in the main loop skips slot resolution entirely.
22
+ * Removing the segment from the skippable set forces it to render with
23
+ * its slots. The prefix must stay contiguous, so all segments after the
24
+ * first changed-slot segment are also removed.
25
+ */
26
+ export function truncateSkippableForChangedSlots(
27
+ skippableSet: Set<number>,
28
+ segments: ManifestSegmentNode[],
29
+ segmentKeys: string[],
30
+ match: RouteMatch,
31
+ clientStateTree: ClientStateTree,
32
+ req: Request
33
+ ): void {
34
+ const departingUrl = req.headers.get('X-Timber-URL');
35
+ let depParsed: URL | null = null;
36
+ if (departingUrl) {
37
+ try {
38
+ depParsed = new URL(departingUrl, 'http://localhost');
39
+ } catch {
40
+ skippableSet.clear();
41
+ return;
42
+ }
43
+ }
44
+ const destPathname = new URL(req.url, 'http://localhost').pathname;
45
+ const depPathname = depParsed?.pathname ?? null;
46
+ const split = (p: string) => (p === '/' ? [] : p.slice(1).split('/'));
47
+ const destAll = split(destPathname);
48
+ const depAll = depPathname ? split(depPathname) : null;
49
+ const clientSlots = clientStateTree.slots ?? null;
50
+ const rawParams = match.rawSegmentParams ?? match.segmentParams ?? {};
51
+
52
+ for (let i = 0; i < segments.length; i++) {
53
+ if (!skippableSet.has(i)) continue;
54
+ const segment = segments[i];
55
+ const slotEntries = Object.entries(segment.slots ?? {});
56
+ if (slotEntries.length === 0) continue;
57
+
58
+ const segIdx = match.segments.indexOf(segment);
59
+ // The root consumes no URL part, and a climbing interception marker
60
+ // removes owner segments from the target — `consumedUrlParts` handles both,
61
+ // and is the same derivation slot matching and layout depth use.
62
+ const sliceAt = segIdx >= 0 ? consumedUrlParts(match.segments, segIdx, match).length : 0;
63
+ const destParts = destAll.slice(sliceAt);
64
+ const depParts = depAll ? depAll.slice(sliceAt) : null;
65
+ let parentChanged = false;
66
+ if (depAll) {
67
+ const dp = depAll.slice(0, sliceAt),
68
+ dd = destAll.slice(0, sliceAt);
69
+ parentChanged = dp.length !== dd.length || dp.some((p, j) => p !== dd[j]);
70
+ }
71
+
72
+ for (const [slotName, slotNode] of slotEntries) {
73
+ const m = slotNode as ManifestSegmentNode;
74
+ const k = computeSlotKey(segmentKeys[i], `@${slotName}`);
75
+ if (
76
+ m.children.some((c) => c.segmentType === 'intercepting') ||
77
+ parentChanged ||
78
+ depParts === null ||
79
+ !shouldSkipSlot({
80
+ slotKey: k,
81
+ clientSlots,
82
+ slotNode: m,
83
+ departingUrlParts: depParts,
84
+ destinationUrlParts: destParts,
85
+ })
86
+ ) {
87
+ for (let j = i; j < segments.length; j++) skippableSet.delete(j);
88
+ return;
89
+ }
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Intercepting-route resolution for parallel slots.
3
+ *
4
+ * This is the ONLY interception-aware part of the render pipeline. The normal
5
+ * children path — `tree-match.ts`, `route-matcher.ts` — has none, and must
6
+ * keep none: teaching the shared walker to match intercepting nodes would make
7
+ * the *main* route matcher render modals on hard navigation. Interception
8
+ * therefore lives here, behind one entry point the slot resolver calls when
9
+ * the pipeline has flagged a soft navigation.
10
+ *
11
+ * Split out of `slot-resolver.ts` when the matching rules grew (TIM-1281):
12
+ * anchoring, sibling priority, and the identity a marker'd directory name
13
+ * stands for are one subject, and slot resolution proper is another.
14
+ *
15
+ * See design/07-routing.md §"Intercepting Routes"
16
+ */
17
+
18
+ import type { ManifestFile, ManifestSegmentNode } from './route-matcher.js';
19
+ import type { SlotMatchResult } from './slot-resolver.js';
20
+ import {
21
+ groupByInterceptedAnchor,
22
+ interceptorProxy,
23
+ type InterceptorAnchorGroup,
24
+ } from '../routing/interception.js';
25
+ import { matchUrlParts } from './tree-match.js';
26
+ import { pathnameMatchesPattern } from './pipeline-interception.js';
27
+
28
+ /**
29
+ * Whether an anchor group applies to this target at all.
30
+ *
31
+ * The group's base is a build-time URL *pattern* — `computeInterceptedBase`
32
+ * climbs `slotNode.urlPath`, which carries directory names, so a dynamic
33
+ * ancestor survives as `[id]`. Every pattern part stands for exactly one URL
34
+ * part, which makes the anchor index simply the base's length —
35
+ * `groupByInterceptedAnchor` derives it there, once, for both the resolver and
36
+ * the build-time collision validator.
37
+ *
38
+ * The one part that breaks that 1:1 correspondence is a catch-all, whose
39
+ * width varies per request. An interception based below one is therefore
40
+ * only resolvable when the catch-all happens to have consumed a single
41
+ * segment; deeper, the fixed index lands on the wrong part, the base check
42
+ * below fails, and the interception is dropped so the canonical route
43
+ * renders. That is the fail-safe outcome, never a wrong page — but it is a
44
+ * modal that silently does not open, so `validateInterceptionPlacement`
45
+ * rejects the shape at build time (TIM-1288). The behaviour here is what
46
+ * that rule is stated against, and stays as the fail-safe if a tree ever
47
+ * reaches the resolver unvalidated.
48
+ *
49
+ * The base must also *match* the target's leading parts, not merely count
50
+ * them. A slot can hold interceptors at different marker depths, and the
51
+ * pipeline's rewrite gate only established that *some* rewrite matched — not
52
+ * this child's. Under a slot at `/gallery/albums`, a navigation to
53
+ * `/gallery/photo/9` is meant for `(..)photo/[id]`, but `(.)[id]` anchors one
54
+ * part deeper and its slice `['9']` matches, so without this check the album
55
+ * modal opens on a photo URL. Name-equality used to rule that out as a side
56
+ * effect of comparing the directory name; positional anchoring has to check
57
+ * it deliberately (TIM-1281).
58
+ *
59
+ * `pathnameMatchesPattern` is the pipeline's own pattern matcher, so a base
60
+ * accepted here is one that gate would accept too.
61
+ */
62
+ function anchorApplies(
63
+ group: InterceptorAnchorGroup<ManifestFile>,
64
+ targetParts: string[]
65
+ ): boolean {
66
+ if (group.anchorIndex > targetParts.length) return false;
67
+
68
+ const targetPrefix =
69
+ group.anchorIndex === 0 ? '/' : `/${targetParts.slice(0, group.anchorIndex).join('/')}`;
70
+ return pathnameMatchesPattern(targetPrefix, group.base);
71
+ }
72
+
73
+ /**
74
+ * Find a matching intercepting route in a slot's children for the target pathname.
75
+ *
76
+ * When interception is active, the pipeline has already re-matched the source URL.
77
+ * Here we check the slot's intercepting children (e.g. `(.)photo/[id]`) against
78
+ * the target pathname to find which intercepting page to render.
79
+ *
80
+ * Two things distinguish an intercepting child from an ordinary slot child,
81
+ * and both used to be handled by hand here (TIM-1281):
82
+ *
83
+ * **Where its segment sits in the target.** The marker says how far above the
84
+ * slot owner the intercepted route lives, which makes the intercepted
85
+ * segment's index in the target pathname a position rather than something to
86
+ * search for. The old code scanned the target from the end for a part equal
87
+ * to the directory name, which found the wrong index whenever a *value*
88
+ * happened to equal that name (`/gallery/photo/photo`) and could never work
89
+ * at all for a dynamic intercepted segment.
90
+ *
91
+ * The index is derived from `computeInterceptedBase` — a build-time URL
92
+ * pattern — and NOT from the re-matched source route. That route is matched
93
+ * from `interceptingPrefix`, which is itself a pattern, so under a dynamic
94
+ * ancestor its params are literals: re-matching `/docs/[...path]` binds
95
+ * `path` to `['[...path]']`, and any depth read from it is the pattern's,
96
+ * not the URL's.
97
+ *
98
+ * A pattern part maps 1:1 onto a URL part except for a catch-all, whose
99
+ * width varies per request; `anchorApplies` documents what that costs.
100
+ *
101
+ * **What its segment matches.** `(.)photo` matches the literal `photo`;
102
+ * `(.)[id]`, `(.)img-[id].png` and `(.)[...rest]` match the way the same
103
+ * bracket syntax matches anywhere else. Rather than re-classify here, the
104
+ * node is handed to the shared walker under its `effectiveUrlSegment`
105
+ * identity, so priority ordering, affix stripping, catch-all collection and
106
+ * the terminal-leaf rule all come from `tree-match.ts` — which stays
107
+ * interception-unaware, as it must: teaching it to match intercepting nodes
108
+ * would make the *main* route matcher render modals on hard navigation.
109
+ *
110
+ * **Siblings compete, so they are walked together.** Two interceptors that
111
+ * anchor at the same URL index — `(.)photo/page.tsx` and `(.)[slug]/page.tsx`
112
+ * — are both candidates for the same part, exactly like two ordinary
113
+ * siblings. Matching each in its own tree and returning the first that
114
+ * succeeded would resolve them in manifest (filesystem) order, so
115
+ * `/gallery/photo` would render the dynamic modal whenever the dynamic
116
+ * directory happened to be enumerated first. Grouping by anchor and handing
117
+ * the whole group to one walk restores static > dynamic > catch-all, and
118
+ * gives backtracking across siblings for free.
119
+ *
120
+ * Groups are tried deepest anchor first, so a `(.)` interception — the most
121
+ * local one — wins over a `(...)` that reaches the same page from the root.
122
+ *
123
+ * The grouping itself is `groupByInterceptedAnchor`, shared with the build so
124
+ * that what is walked together is what the collision validator checked together
125
+ * (TIM-1310). Two interceptors of the *same* kind at one anchor — `(.)[a]`
126
+ * beside `(.)[b]` — would otherwise resolve by manifest order here with nothing
127
+ * to say so; the validator rejects them, within the limits of a probe search,
128
+ * because it walks this same group.
129
+ *
130
+ * The matched chain carries the real node, not the identity proxy, so tree
131
+ * paths keep the directory name (`/gallery/@modal/(.)photo/[id]`).
132
+ */
133
+ export function findInterceptingMatch(
134
+ slotNode: ManifestSegmentNode,
135
+ targetPathname: string
136
+ ): SlotMatchResult | null {
137
+ const targetParts = targetPathname === '/' ? [] : targetPathname.slice(1).split('/');
138
+
139
+ // Deepest anchor first, from the grouping the build validates against.
140
+ for (const group of groupByInterceptedAnchor(slotNode.urlPath, slotNode.children)) {
141
+ if (!anchorApplies(group, targetParts)) continue;
142
+
143
+ // Proxies carry the identity the walker matches on; the map back to the
144
+ // real node is what the chain is rebuilt from.
145
+ const entries = group.interceptors.map((real) => ({ proxy: interceptorProxy(real), real }));
146
+ const anchorNode: ManifestSegmentNode = {
147
+ segmentName: '',
148
+ segmentType: 'static',
149
+ urlPath: slotNode.urlPath,
150
+ children: entries.map((e) => e.proxy),
151
+ slots: {},
152
+ };
153
+ const result = matchUrlParts(anchorNode, targetParts.slice(group.anchorIndex));
154
+ if (!result) continue;
155
+
156
+ // result.chain is [anchorNode, matchedProxy, ...descendants]. Drop the
157
+ // synthetic parent and restore the real node in the proxy's place.
158
+ const real = entries.find((e) => e.proxy === result.chain[1])?.real;
159
+ if (!real) continue;
160
+ const chain = [slotNode, real, ...result.chain.slice(2)];
161
+ const leaf = chain[chain.length - 1];
162
+ if (!leaf.page) continue;
163
+
164
+ return { page: leaf.page, chain, slotParams: result.params };
165
+ }
166
+
167
+ return null;
168
+ }