@rangojs/router 0.0.0-experimental.133 → 0.0.0-experimental.134

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 (859) hide show
  1. package/dist/vite/index.js +22 -9
  2. package/package.json +1 -1
  3. package/skills/composability/SKILL.md +0 -1
  4. package/skills/handler-use/SKILL.md +7 -7
  5. package/skills/intercept/SKILL.md +38 -13
  6. package/skills/migrate-nextjs/SKILL.md +3 -3
  7. package/skills/prerender/SKILL.md +20 -17
  8. package/skills/router-setup/SKILL.md +1 -2
  9. package/skills/testing/SKILL.md +1 -0
  10. package/skills/view-transitions/SKILL.md +43 -0
  11. package/src/browser/navigation-bridge.ts +65 -16
  12. package/src/browser/navigation-client.ts +15 -1
  13. package/src/browser/navigation-store.ts +82 -8
  14. package/src/browser/network-error-handler.ts +34 -7
  15. package/src/browser/partial-update.ts +27 -2
  16. package/src/browser/prefetch/cache.ts +8 -0
  17. package/src/browser/prefetch/fetch.ts +32 -4
  18. package/src/browser/react/NavigationProvider.tsx +195 -4
  19. package/src/browser/react/deferred-handle-resolution.ts +75 -0
  20. package/src/browser/response-adapter.ts +38 -9
  21. package/src/browser/types.ts +32 -1
  22. package/src/handles/MetaTags.tsx +6 -0
  23. package/src/index.rsc.ts +6 -1
  24. package/src/index.ts +6 -4
  25. package/src/internal-debug.ts +11 -8
  26. package/src/render-error-thrower.tsx +20 -0
  27. package/src/route-content-wrapper.tsx +12 -5
  28. package/src/route-definition/dsl-helpers.ts +21 -32
  29. package/src/route-definition/helper-factories.ts +0 -2
  30. package/src/route-definition/helpers-types.ts +38 -39
  31. package/src/route-definition/index.ts +1 -2
  32. package/src/route-definition/resolve-handler-use.ts +0 -1
  33. package/src/route-definition/use-item-types.ts +3 -6
  34. package/src/route-types.ts +0 -5
  35. package/src/router/match-api.ts +5 -1
  36. package/src/router/segment-resolution/fresh.ts +4 -0
  37. package/src/router/segment-resolution/revalidation.ts +3 -0
  38. package/src/router/segment-resolution/view-transition-default.ts +35 -15
  39. package/src/rsc/progressive-enhancement.ts +31 -2
  40. package/src/rsc/rsc-rendering.ts +7 -2
  41. package/src/rsc/server-action.ts +19 -2
  42. package/src/rsc/transition-gate.ts +89 -0
  43. package/src/segment-system.tsx +26 -8
  44. package/src/server/context.ts +13 -0
  45. package/src/server/request-context.ts +41 -3
  46. package/src/testing/index.ts +6 -0
  47. package/src/testing/run-transition-when.ts +164 -0
  48. package/src/types/handler-context.ts +1 -1
  49. package/src/types/index.ts +2 -0
  50. package/src/types/segments.ts +100 -0
  51. package/src/urls/path-helper-types.ts +10 -7
  52. package/src/urls/urls-function.ts +0 -1
  53. package/src/vite/inject-client-debug.ts +36 -0
  54. package/src/vite/router-discovery.ts +8 -13
  55. package/dist/__internal.d.ts +0 -83
  56. package/dist/__internal.d.ts.map +0 -1
  57. package/dist/__internal.js +0 -19
  58. package/dist/__internal.js.map +0 -1
  59. package/dist/__mocks__/version.d.ts +0 -7
  60. package/dist/__mocks__/version.d.ts.map +0 -1
  61. package/dist/__mocks__/version.js +0 -7
  62. package/dist/__mocks__/version.js.map +0 -1
  63. package/dist/__tests__/client-href.test.d.ts +0 -2
  64. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  65. package/dist/__tests__/client-href.test.js +0 -74
  66. package/dist/__tests__/client-href.test.js.map +0 -1
  67. package/dist/__tests__/component-utils.test.d.ts +0 -2
  68. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  69. package/dist/__tests__/component-utils.test.js +0 -51
  70. package/dist/__tests__/component-utils.test.js.map +0 -1
  71. package/dist/__tests__/event-controller.test.d.ts +0 -2
  72. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  73. package/dist/__tests__/event-controller.test.js +0 -538
  74. package/dist/__tests__/event-controller.test.js.map +0 -1
  75. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  76. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  77. package/dist/__tests__/helpers/route-tree.js +0 -374
  78. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  79. package/dist/__tests__/match-result.test.d.ts +0 -2
  80. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  81. package/dist/__tests__/match-result.test.js +0 -154
  82. package/dist/__tests__/match-result.test.js.map +0 -1
  83. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  84. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  85. package/dist/__tests__/navigation-store.test.js +0 -440
  86. package/dist/__tests__/navigation-store.test.js.map +0 -1
  87. package/dist/__tests__/partial-update.test.d.ts +0 -2
  88. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  89. package/dist/__tests__/partial-update.test.js +0 -1009
  90. package/dist/__tests__/partial-update.test.js.map +0 -1
  91. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  92. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  93. package/dist/__tests__/reverse-types.test.js +0 -656
  94. package/dist/__tests__/reverse-types.test.js.map +0 -1
  95. package/dist/__tests__/route-definition.test.d.ts +0 -2
  96. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  97. package/dist/__tests__/route-definition.test.js +0 -55
  98. package/dist/__tests__/route-definition.test.js.map +0 -1
  99. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  100. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  101. package/dist/__tests__/router-helpers.test.js +0 -377
  102. package/dist/__tests__/router-helpers.test.js.map +0 -1
  103. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  104. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  105. package/dist/__tests__/router-integration-2.test.js +0 -426
  106. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  107. package/dist/__tests__/router-integration.test.d.ts +0 -2
  108. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  109. package/dist/__tests__/router-integration.test.js +0 -1051
  110. package/dist/__tests__/router-integration.test.js.map +0 -1
  111. package/dist/__tests__/search-params.test.d.ts +0 -5
  112. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  113. package/dist/__tests__/search-params.test.js +0 -306
  114. package/dist/__tests__/search-params.test.js.map +0 -1
  115. package/dist/__tests__/segment-system.test.d.ts +0 -2
  116. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  117. package/dist/__tests__/segment-system.test.js +0 -627
  118. package/dist/__tests__/segment-system.test.js.map +0 -1
  119. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  120. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  121. package/dist/__tests__/static-handler-types.test.js +0 -63
  122. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  123. package/dist/__tests__/urls.test.d.ts +0 -2
  124. package/dist/__tests__/urls.test.d.ts.map +0 -1
  125. package/dist/__tests__/urls.test.js +0 -421
  126. package/dist/__tests__/urls.test.js.map +0 -1
  127. package/dist/__tests__/use-mount.test.d.ts +0 -2
  128. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  129. package/dist/__tests__/use-mount.test.js +0 -35
  130. package/dist/__tests__/use-mount.test.js.map +0 -1
  131. package/dist/bin/rango.d.ts +0 -2
  132. package/dist/bin/rango.d.ts.map +0 -1
  133. package/dist/bin/rango.js.map +0 -1
  134. package/dist/browser/event-controller.d.ts +0 -191
  135. package/dist/browser/event-controller.d.ts.map +0 -1
  136. package/dist/browser/event-controller.js +0 -559
  137. package/dist/browser/event-controller.js.map +0 -1
  138. package/dist/browser/index.d.ts +0 -2
  139. package/dist/browser/index.d.ts.map +0 -1
  140. package/dist/browser/index.js +0 -14
  141. package/dist/browser/index.js.map +0 -1
  142. package/dist/browser/link-interceptor.d.ts +0 -38
  143. package/dist/browser/link-interceptor.d.ts.map +0 -1
  144. package/dist/browser/link-interceptor.js +0 -99
  145. package/dist/browser/link-interceptor.js.map +0 -1
  146. package/dist/browser/logging.d.ts +0 -10
  147. package/dist/browser/logging.d.ts.map +0 -1
  148. package/dist/browser/logging.js +0 -29
  149. package/dist/browser/logging.js.map +0 -1
  150. package/dist/browser/lru-cache.d.ts +0 -17
  151. package/dist/browser/lru-cache.d.ts.map +0 -1
  152. package/dist/browser/lru-cache.js +0 -50
  153. package/dist/browser/lru-cache.js.map +0 -1
  154. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  155. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  156. package/dist/browser/merge-segment-loaders.js +0 -102
  157. package/dist/browser/merge-segment-loaders.js.map +0 -1
  158. package/dist/browser/navigation-bridge.d.ts +0 -102
  159. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  160. package/dist/browser/navigation-bridge.js +0 -708
  161. package/dist/browser/navigation-bridge.js.map +0 -1
  162. package/dist/browser/navigation-client.d.ts +0 -25
  163. package/dist/browser/navigation-client.d.ts.map +0 -1
  164. package/dist/browser/navigation-client.js +0 -157
  165. package/dist/browser/navigation-client.js.map +0 -1
  166. package/dist/browser/navigation-store.d.ts +0 -101
  167. package/dist/browser/navigation-store.d.ts.map +0 -1
  168. package/dist/browser/navigation-store.js +0 -625
  169. package/dist/browser/navigation-store.js.map +0 -1
  170. package/dist/browser/partial-update.d.ts +0 -75
  171. package/dist/browser/partial-update.d.ts.map +0 -1
  172. package/dist/browser/partial-update.js +0 -426
  173. package/dist/browser/partial-update.js.map +0 -1
  174. package/dist/browser/react/Link.d.ts +0 -86
  175. package/dist/browser/react/Link.d.ts.map +0 -1
  176. package/dist/browser/react/Link.js +0 -128
  177. package/dist/browser/react/Link.js.map +0 -1
  178. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  179. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  180. package/dist/browser/react/NavigationProvider.js +0 -216
  181. package/dist/browser/react/NavigationProvider.js.map +0 -1
  182. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  183. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  184. package/dist/browser/react/ScrollRestoration.js +0 -57
  185. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  186. package/dist/browser/react/context.d.ts +0 -46
  187. package/dist/browser/react/context.d.ts.map +0 -1
  188. package/dist/browser/react/context.js +0 -10
  189. package/dist/browser/react/context.js.map +0 -1
  190. package/dist/browser/react/index.d.ts +0 -11
  191. package/dist/browser/react/index.d.ts.map +0 -1
  192. package/dist/browser/react/index.js +0 -22
  193. package/dist/browser/react/index.js.map +0 -1
  194. package/dist/browser/react/location-state-shared.d.ts +0 -63
  195. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  196. package/dist/browser/react/location-state-shared.js +0 -81
  197. package/dist/browser/react/location-state-shared.js.map +0 -1
  198. package/dist/browser/react/location-state.d.ts +0 -23
  199. package/dist/browser/react/location-state.d.ts.map +0 -1
  200. package/dist/browser/react/location-state.js +0 -29
  201. package/dist/browser/react/location-state.js.map +0 -1
  202. package/dist/browser/react/mount-context.d.ts +0 -24
  203. package/dist/browser/react/mount-context.d.ts.map +0 -1
  204. package/dist/browser/react/mount-context.js +0 -24
  205. package/dist/browser/react/mount-context.js.map +0 -1
  206. package/dist/browser/react/use-action.d.ts +0 -64
  207. package/dist/browser/react/use-action.d.ts.map +0 -1
  208. package/dist/browser/react/use-action.js +0 -134
  209. package/dist/browser/react/use-action.js.map +0 -1
  210. package/dist/browser/react/use-client-cache.d.ts +0 -41
  211. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  212. package/dist/browser/react/use-client-cache.js +0 -39
  213. package/dist/browser/react/use-client-cache.js.map +0 -1
  214. package/dist/browser/react/use-handle.d.ts +0 -31
  215. package/dist/browser/react/use-handle.d.ts.map +0 -1
  216. package/dist/browser/react/use-handle.js +0 -144
  217. package/dist/browser/react/use-handle.js.map +0 -1
  218. package/dist/browser/react/use-href.d.ts +0 -33
  219. package/dist/browser/react/use-href.d.ts.map +0 -1
  220. package/dist/browser/react/use-href.js +0 -39
  221. package/dist/browser/react/use-href.js.map +0 -1
  222. package/dist/browser/react/use-link-status.d.ts +0 -37
  223. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  224. package/dist/browser/react/use-link-status.js +0 -99
  225. package/dist/browser/react/use-link-status.js.map +0 -1
  226. package/dist/browser/react/use-mount.d.ts +0 -25
  227. package/dist/browser/react/use-mount.d.ts.map +0 -1
  228. package/dist/browser/react/use-mount.js +0 -30
  229. package/dist/browser/react/use-mount.js.map +0 -1
  230. package/dist/browser/react/use-navigation.d.ts +0 -27
  231. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  232. package/dist/browser/react/use-navigation.js +0 -87
  233. package/dist/browser/react/use-navigation.js.map +0 -1
  234. package/dist/browser/react/use-segments.d.ts +0 -38
  235. package/dist/browser/react/use-segments.d.ts.map +0 -1
  236. package/dist/browser/react/use-segments.js +0 -130
  237. package/dist/browser/react/use-segments.js.map +0 -1
  238. package/dist/browser/request-controller.d.ts +0 -26
  239. package/dist/browser/request-controller.d.ts.map +0 -1
  240. package/dist/browser/request-controller.js +0 -147
  241. package/dist/browser/request-controller.js.map +0 -1
  242. package/dist/browser/rsc-router.d.ts +0 -129
  243. package/dist/browser/rsc-router.d.ts.map +0 -1
  244. package/dist/browser/rsc-router.js +0 -195
  245. package/dist/browser/rsc-router.js.map +0 -1
  246. package/dist/browser/scroll-restoration.d.ts +0 -93
  247. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  248. package/dist/browser/scroll-restoration.js +0 -321
  249. package/dist/browser/scroll-restoration.js.map +0 -1
  250. package/dist/browser/segment-structure-assert.d.ts +0 -17
  251. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  252. package/dist/browser/segment-structure-assert.js +0 -59
  253. package/dist/browser/segment-structure-assert.js.map +0 -1
  254. package/dist/browser/server-action-bridge.d.ts +0 -26
  255. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  256. package/dist/browser/server-action-bridge.js +0 -668
  257. package/dist/browser/server-action-bridge.js.map +0 -1
  258. package/dist/browser/shallow.d.ts +0 -12
  259. package/dist/browser/shallow.d.ts.map +0 -1
  260. package/dist/browser/shallow.js +0 -34
  261. package/dist/browser/shallow.js.map +0 -1
  262. package/dist/browser/types.d.ts +0 -369
  263. package/dist/browser/types.d.ts.map +0 -1
  264. package/dist/browser/types.js +0 -2
  265. package/dist/browser/types.js.map +0 -1
  266. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  267. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  268. package/dist/build/__tests__/generate-cli.test.js +0 -237
  269. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  270. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  271. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  272. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  273. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  274. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  275. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  276. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  277. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  278. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  279. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  280. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  281. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  282. package/dist/build/generate-manifest.d.ts +0 -81
  283. package/dist/build/generate-manifest.d.ts.map +0 -1
  284. package/dist/build/generate-manifest.js +0 -276
  285. package/dist/build/generate-manifest.js.map +0 -1
  286. package/dist/build/generate-route-types.d.ts +0 -115
  287. package/dist/build/generate-route-types.d.ts.map +0 -1
  288. package/dist/build/generate-route-types.js +0 -740
  289. package/dist/build/generate-route-types.js.map +0 -1
  290. package/dist/build/index.d.ts +0 -21
  291. package/dist/build/index.d.ts.map +0 -1
  292. package/dist/build/index.js +0 -21
  293. package/dist/build/index.js.map +0 -1
  294. package/dist/build/route-trie.d.ts +0 -71
  295. package/dist/build/route-trie.d.ts.map +0 -1
  296. package/dist/build/route-trie.js +0 -175
  297. package/dist/build/route-trie.js.map +0 -1
  298. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  299. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  300. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  301. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  302. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  303. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  304. package/dist/cache/__tests__/document-cache.test.js +0 -345
  305. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  306. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  307. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  308. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  309. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  310. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  311. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  312. package/dist/cache/__tests__/memory-store.test.js +0 -367
  313. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  314. package/dist/cache/cache-scope.d.ts +0 -102
  315. package/dist/cache/cache-scope.d.ts.map +0 -1
  316. package/dist/cache/cache-scope.js +0 -440
  317. package/dist/cache/cache-scope.js.map +0 -1
  318. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  319. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  320. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  321. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  322. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  323. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  324. package/dist/cache/cf/cf-cache-store.js +0 -242
  325. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  326. package/dist/cache/cf/index.d.ts +0 -14
  327. package/dist/cache/cf/index.d.ts.map +0 -1
  328. package/dist/cache/cf/index.js +0 -17
  329. package/dist/cache/cf/index.js.map +0 -1
  330. package/dist/cache/document-cache.d.ts +0 -64
  331. package/dist/cache/document-cache.d.ts.map +0 -1
  332. package/dist/cache/document-cache.js +0 -228
  333. package/dist/cache/document-cache.js.map +0 -1
  334. package/dist/cache/index.d.ts +0 -19
  335. package/dist/cache/index.d.ts.map +0 -1
  336. package/dist/cache/index.js +0 -21
  337. package/dist/cache/index.js.map +0 -1
  338. package/dist/cache/memory-segment-store.d.ts +0 -110
  339. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  340. package/dist/cache/memory-segment-store.js +0 -117
  341. package/dist/cache/memory-segment-store.js.map +0 -1
  342. package/dist/cache/memory-store.d.ts +0 -41
  343. package/dist/cache/memory-store.d.ts.map +0 -1
  344. package/dist/cache/memory-store.js +0 -191
  345. package/dist/cache/memory-store.js.map +0 -1
  346. package/dist/cache/types.d.ts +0 -317
  347. package/dist/cache/types.d.ts.map +0 -1
  348. package/dist/cache/types.js +0 -12
  349. package/dist/cache/types.js.map +0 -1
  350. package/dist/client.d.ts +0 -248
  351. package/dist/client.d.ts.map +0 -1
  352. package/dist/client.js +0 -367
  353. package/dist/client.js.map +0 -1
  354. package/dist/client.rsc.d.ts +0 -26
  355. package/dist/client.rsc.d.ts.map +0 -1
  356. package/dist/client.rsc.js +0 -46
  357. package/dist/client.rsc.js.map +0 -1
  358. package/dist/component-utils.d.ts +0 -36
  359. package/dist/component-utils.d.ts.map +0 -1
  360. package/dist/component-utils.js +0 -61
  361. package/dist/component-utils.js.map +0 -1
  362. package/dist/components/DefaultDocument.d.ts +0 -13
  363. package/dist/components/DefaultDocument.d.ts.map +0 -1
  364. package/dist/components/DefaultDocument.js +0 -15
  365. package/dist/components/DefaultDocument.js.map +0 -1
  366. package/dist/debug.d.ts +0 -58
  367. package/dist/debug.d.ts.map +0 -1
  368. package/dist/debug.js +0 -157
  369. package/dist/debug.js.map +0 -1
  370. package/dist/default-error-boundary.d.ts +0 -11
  371. package/dist/default-error-boundary.d.ts.map +0 -1
  372. package/dist/default-error-boundary.js +0 -45
  373. package/dist/default-error-boundary.js.map +0 -1
  374. package/dist/deps/browser.d.ts +0 -2
  375. package/dist/deps/browser.d.ts.map +0 -1
  376. package/dist/deps/browser.js +0 -3
  377. package/dist/deps/browser.js.map +0 -1
  378. package/dist/deps/html-stream-client.d.ts +0 -2
  379. package/dist/deps/html-stream-client.d.ts.map +0 -1
  380. package/dist/deps/html-stream-client.js +0 -3
  381. package/dist/deps/html-stream-client.js.map +0 -1
  382. package/dist/deps/html-stream-server.d.ts +0 -2
  383. package/dist/deps/html-stream-server.d.ts.map +0 -1
  384. package/dist/deps/html-stream-server.js +0 -3
  385. package/dist/deps/html-stream-server.js.map +0 -1
  386. package/dist/deps/rsc.d.ts +0 -2
  387. package/dist/deps/rsc.d.ts.map +0 -1
  388. package/dist/deps/rsc.js +0 -4
  389. package/dist/deps/rsc.js.map +0 -1
  390. package/dist/deps/ssr.d.ts +0 -2
  391. package/dist/deps/ssr.d.ts.map +0 -1
  392. package/dist/deps/ssr.js +0 -3
  393. package/dist/deps/ssr.js.map +0 -1
  394. package/dist/errors.d.ts +0 -174
  395. package/dist/errors.d.ts.map +0 -1
  396. package/dist/errors.js +0 -241
  397. package/dist/errors.js.map +0 -1
  398. package/dist/handle.d.ts +0 -78
  399. package/dist/handle.d.ts.map +0 -1
  400. package/dist/handle.js +0 -82
  401. package/dist/handle.js.map +0 -1
  402. package/dist/handles/MetaTags.d.ts +0 -14
  403. package/dist/handles/MetaTags.d.ts.map +0 -1
  404. package/dist/handles/MetaTags.js +0 -136
  405. package/dist/handles/MetaTags.js.map +0 -1
  406. package/dist/handles/index.d.ts +0 -6
  407. package/dist/handles/index.d.ts.map +0 -1
  408. package/dist/handles/index.js +0 -6
  409. package/dist/handles/index.js.map +0 -1
  410. package/dist/handles/meta.d.ts +0 -39
  411. package/dist/handles/meta.d.ts.map +0 -1
  412. package/dist/handles/meta.js +0 -202
  413. package/dist/handles/meta.js.map +0 -1
  414. package/dist/host/__tests__/errors.test.d.ts +0 -2
  415. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  416. package/dist/host/__tests__/errors.test.js +0 -76
  417. package/dist/host/__tests__/errors.test.js.map +0 -1
  418. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  419. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  420. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  421. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  422. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  423. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  424. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  425. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  426. package/dist/host/__tests__/router.test.d.ts +0 -2
  427. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  428. package/dist/host/__tests__/router.test.js +0 -241
  429. package/dist/host/__tests__/router.test.js.map +0 -1
  430. package/dist/host/__tests__/testing.test.d.ts +0 -2
  431. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  432. package/dist/host/__tests__/testing.test.js +0 -64
  433. package/dist/host/__tests__/testing.test.js.map +0 -1
  434. package/dist/host/__tests__/utils.test.d.ts +0 -2
  435. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  436. package/dist/host/__tests__/utils.test.js +0 -29
  437. package/dist/host/__tests__/utils.test.js.map +0 -1
  438. package/dist/host/cookie-handler.d.ts +0 -34
  439. package/dist/host/cookie-handler.d.ts.map +0 -1
  440. package/dist/host/cookie-handler.js +0 -124
  441. package/dist/host/cookie-handler.js.map +0 -1
  442. package/dist/host/errors.d.ts +0 -56
  443. package/dist/host/errors.d.ts.map +0 -1
  444. package/dist/host/errors.js +0 -79
  445. package/dist/host/errors.js.map +0 -1
  446. package/dist/host/index.d.ts +0 -29
  447. package/dist/host/index.d.ts.map +0 -1
  448. package/dist/host/index.js +0 -32
  449. package/dist/host/index.js.map +0 -1
  450. package/dist/host/pattern-matcher.d.ts +0 -36
  451. package/dist/host/pattern-matcher.d.ts.map +0 -1
  452. package/dist/host/pattern-matcher.js +0 -172
  453. package/dist/host/pattern-matcher.js.map +0 -1
  454. package/dist/host/router.d.ts +0 -26
  455. package/dist/host/router.d.ts.map +0 -1
  456. package/dist/host/router.js +0 -218
  457. package/dist/host/router.js.map +0 -1
  458. package/dist/host/testing.d.ts +0 -36
  459. package/dist/host/testing.d.ts.map +0 -1
  460. package/dist/host/testing.js +0 -55
  461. package/dist/host/testing.js.map +0 -1
  462. package/dist/host/types.d.ts +0 -115
  463. package/dist/host/types.d.ts.map +0 -1
  464. package/dist/host/types.js +0 -7
  465. package/dist/host/types.js.map +0 -1
  466. package/dist/host/utils.d.ts +0 -21
  467. package/dist/host/utils.d.ts.map +0 -1
  468. package/dist/host/utils.js +0 -23
  469. package/dist/host/utils.js.map +0 -1
  470. package/dist/href-client.d.ts +0 -131
  471. package/dist/href-client.d.ts.map +0 -1
  472. package/dist/href-client.js +0 -64
  473. package/dist/href-client.js.map +0 -1
  474. package/dist/href-context.d.ts +0 -29
  475. package/dist/href-context.d.ts.map +0 -1
  476. package/dist/href-context.js +0 -21
  477. package/dist/href-context.js.map +0 -1
  478. package/dist/index.d.ts +0 -73
  479. package/dist/index.d.ts.map +0 -1
  480. package/dist/index.js +0 -91
  481. package/dist/index.js.map +0 -1
  482. package/dist/index.rsc.d.ts +0 -32
  483. package/dist/index.rsc.d.ts.map +0 -1
  484. package/dist/index.rsc.js +0 -40
  485. package/dist/index.rsc.js.map +0 -1
  486. package/dist/internal-debug.d.ts +0 -2
  487. package/dist/internal-debug.d.ts.map +0 -1
  488. package/dist/internal-debug.js +0 -5
  489. package/dist/internal-debug.js.map +0 -1
  490. package/dist/loader.d.ts +0 -14
  491. package/dist/loader.d.ts.map +0 -1
  492. package/dist/loader.js +0 -20
  493. package/dist/loader.js.map +0 -1
  494. package/dist/loader.rsc.d.ts +0 -19
  495. package/dist/loader.rsc.d.ts.map +0 -1
  496. package/dist/loader.rsc.js +0 -99
  497. package/dist/loader.rsc.js.map +0 -1
  498. package/dist/network-error-thrower.d.ts +0 -17
  499. package/dist/network-error-thrower.d.ts.map +0 -1
  500. package/dist/network-error-thrower.js +0 -14
  501. package/dist/network-error-thrower.js.map +0 -1
  502. package/dist/outlet-context.d.ts +0 -13
  503. package/dist/outlet-context.d.ts.map +0 -1
  504. package/dist/outlet-context.js +0 -3
  505. package/dist/outlet-context.js.map +0 -1
  506. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  507. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  508. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  509. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  510. package/dist/prerender/param-hash.d.ts +0 -16
  511. package/dist/prerender/param-hash.d.ts.map +0 -1
  512. package/dist/prerender/param-hash.js +0 -36
  513. package/dist/prerender/param-hash.js.map +0 -1
  514. package/dist/prerender/store.d.ts +0 -38
  515. package/dist/prerender/store.d.ts.map +0 -1
  516. package/dist/prerender/store.js +0 -61
  517. package/dist/prerender/store.js.map +0 -1
  518. package/dist/prerender.d.ts +0 -66
  519. package/dist/prerender.d.ts.map +0 -1
  520. package/dist/prerender.js +0 -57
  521. package/dist/prerender.js.map +0 -1
  522. package/dist/reverse.d.ts +0 -196
  523. package/dist/reverse.d.ts.map +0 -1
  524. package/dist/reverse.js +0 -78
  525. package/dist/reverse.js.map +0 -1
  526. package/dist/root-error-boundary.d.ts +0 -33
  527. package/dist/root-error-boundary.d.ts.map +0 -1
  528. package/dist/root-error-boundary.js +0 -165
  529. package/dist/root-error-boundary.js.map +0 -1
  530. package/dist/route-content-wrapper.d.ts +0 -46
  531. package/dist/route-content-wrapper.d.ts.map +0 -1
  532. package/dist/route-content-wrapper.js +0 -77
  533. package/dist/route-content-wrapper.js.map +0 -1
  534. package/dist/route-definition.d.ts +0 -421
  535. package/dist/route-definition.d.ts.map +0 -1
  536. package/dist/route-definition.js +0 -868
  537. package/dist/route-definition.js.map +0 -1
  538. package/dist/route-map-builder.d.ts +0 -155
  539. package/dist/route-map-builder.d.ts.map +0 -1
  540. package/dist/route-map-builder.js +0 -237
  541. package/dist/route-map-builder.js.map +0 -1
  542. package/dist/route-types.d.ts +0 -165
  543. package/dist/route-types.d.ts.map +0 -1
  544. package/dist/route-types.js +0 -7
  545. package/dist/route-types.js.map +0 -1
  546. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  547. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  548. package/dist/router/__tests__/handler-context.test.js +0 -65
  549. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  550. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  551. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  552. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  553. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  554. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  555. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  556. package/dist/router/__tests__/match-context.test.js +0 -92
  557. package/dist/router/__tests__/match-context.test.js.map +0 -1
  558. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  559. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  560. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  561. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  562. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  563. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  564. package/dist/router/__tests__/match-result.test.js +0 -457
  565. package/dist/router/__tests__/match-result.test.js.map +0 -1
  566. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  567. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  568. package/dist/router/__tests__/on-error.test.js +0 -678
  569. package/dist/router/__tests__/on-error.test.js.map +0 -1
  570. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  571. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  572. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  573. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  574. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  575. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  576. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  577. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  578. package/dist/router/error-handling.d.ts +0 -77
  579. package/dist/router/error-handling.d.ts.map +0 -1
  580. package/dist/router/error-handling.js +0 -202
  581. package/dist/router/error-handling.js.map +0 -1
  582. package/dist/router/handler-context.d.ts +0 -20
  583. package/dist/router/handler-context.d.ts.map +0 -1
  584. package/dist/router/handler-context.js +0 -198
  585. package/dist/router/handler-context.js.map +0 -1
  586. package/dist/router/intercept-resolution.d.ts +0 -66
  587. package/dist/router/intercept-resolution.d.ts.map +0 -1
  588. package/dist/router/intercept-resolution.js +0 -246
  589. package/dist/router/intercept-resolution.js.map +0 -1
  590. package/dist/router/loader-resolution.d.ts +0 -64
  591. package/dist/router/loader-resolution.d.ts.map +0 -1
  592. package/dist/router/loader-resolution.js +0 -284
  593. package/dist/router/loader-resolution.js.map +0 -1
  594. package/dist/router/logging.d.ts +0 -15
  595. package/dist/router/logging.d.ts.map +0 -1
  596. package/dist/router/logging.js +0 -99
  597. package/dist/router/logging.js.map +0 -1
  598. package/dist/router/manifest.d.ts +0 -22
  599. package/dist/router/manifest.d.ts.map +0 -1
  600. package/dist/router/manifest.js +0 -181
  601. package/dist/router/manifest.js.map +0 -1
  602. package/dist/router/match-api.d.ts +0 -35
  603. package/dist/router/match-api.d.ts.map +0 -1
  604. package/dist/router/match-api.js +0 -406
  605. package/dist/router/match-api.js.map +0 -1
  606. package/dist/router/match-context.d.ts +0 -206
  607. package/dist/router/match-context.d.ts.map +0 -1
  608. package/dist/router/match-context.js +0 -17
  609. package/dist/router/match-context.js.map +0 -1
  610. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  611. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  612. package/dist/router/match-middleware/background-revalidation.js +0 -75
  613. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  614. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  615. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  616. package/dist/router/match-middleware/cache-lookup.js +0 -257
  617. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  618. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  619. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  620. package/dist/router/match-middleware/cache-store.js +0 -108
  621. package/dist/router/match-middleware/cache-store.js.map +0 -1
  622. package/dist/router/match-middleware/index.d.ts +0 -81
  623. package/dist/router/match-middleware/index.d.ts.map +0 -1
  624. package/dist/router/match-middleware/index.js +0 -80
  625. package/dist/router/match-middleware/index.js.map +0 -1
  626. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  627. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  628. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  629. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  630. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  631. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  632. package/dist/router/match-middleware/segment-resolution.js +0 -53
  633. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  634. package/dist/router/match-pipelines.d.ts +0 -147
  635. package/dist/router/match-pipelines.d.ts.map +0 -1
  636. package/dist/router/match-pipelines.js +0 -82
  637. package/dist/router/match-pipelines.js.map +0 -1
  638. package/dist/router/match-result.d.ts +0 -126
  639. package/dist/router/match-result.d.ts.map +0 -1
  640. package/dist/router/match-result.js +0 -93
  641. package/dist/router/match-result.js.map +0 -1
  642. package/dist/router/metrics.d.ts +0 -20
  643. package/dist/router/metrics.d.ts.map +0 -1
  644. package/dist/router/metrics.js +0 -47
  645. package/dist/router/metrics.js.map +0 -1
  646. package/dist/router/middleware.d.ts +0 -249
  647. package/dist/router/middleware.d.ts.map +0 -1
  648. package/dist/router/middleware.js +0 -434
  649. package/dist/router/middleware.js.map +0 -1
  650. package/dist/router/middleware.test.d.ts +0 -2
  651. package/dist/router/middleware.test.d.ts.map +0 -1
  652. package/dist/router/middleware.test.js +0 -816
  653. package/dist/router/middleware.test.js.map +0 -1
  654. package/dist/router/pattern-matching.d.ts +0 -149
  655. package/dist/router/pattern-matching.d.ts.map +0 -1
  656. package/dist/router/pattern-matching.js +0 -349
  657. package/dist/router/pattern-matching.js.map +0 -1
  658. package/dist/router/revalidation.d.ts +0 -44
  659. package/dist/router/revalidation.d.ts.map +0 -1
  660. package/dist/router/revalidation.js +0 -147
  661. package/dist/router/revalidation.js.map +0 -1
  662. package/dist/router/router-context.d.ts +0 -135
  663. package/dist/router/router-context.d.ts.map +0 -1
  664. package/dist/router/router-context.js +0 -36
  665. package/dist/router/router-context.js.map +0 -1
  666. package/dist/router/segment-resolution.d.ts +0 -127
  667. package/dist/router/segment-resolution.d.ts.map +0 -1
  668. package/dist/router/segment-resolution.js +0 -919
  669. package/dist/router/segment-resolution.js.map +0 -1
  670. package/dist/router/trie-matching.d.ts +0 -40
  671. package/dist/router/trie-matching.d.ts.map +0 -1
  672. package/dist/router/trie-matching.js +0 -127
  673. package/dist/router/trie-matching.js.map +0 -1
  674. package/dist/router/types.d.ts +0 -136
  675. package/dist/router/types.d.ts.map +0 -1
  676. package/dist/router/types.js +0 -7
  677. package/dist/router/types.js.map +0 -1
  678. package/dist/router.d.ts +0 -753
  679. package/dist/router.d.ts.map +0 -1
  680. package/dist/router.gen.d.ts +0 -6
  681. package/dist/router.gen.d.ts.map +0 -1
  682. package/dist/router.gen.js +0 -6
  683. package/dist/router.gen.js.map +0 -1
  684. package/dist/router.js +0 -1304
  685. package/dist/router.js.map +0 -1
  686. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  687. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  688. package/dist/rsc/__tests__/helpers.test.js +0 -140
  689. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  690. package/dist/rsc/handler.d.ts +0 -45
  691. package/dist/rsc/handler.d.ts.map +0 -1
  692. package/dist/rsc/handler.js +0 -1172
  693. package/dist/rsc/handler.js.map +0 -1
  694. package/dist/rsc/helpers.d.ts +0 -16
  695. package/dist/rsc/helpers.d.ts.map +0 -1
  696. package/dist/rsc/helpers.js +0 -55
  697. package/dist/rsc/helpers.js.map +0 -1
  698. package/dist/rsc/index.d.ts +0 -22
  699. package/dist/rsc/index.d.ts.map +0 -1
  700. package/dist/rsc/index.js +0 -23
  701. package/dist/rsc/index.js.map +0 -1
  702. package/dist/rsc/nonce.d.ts +0 -9
  703. package/dist/rsc/nonce.d.ts.map +0 -1
  704. package/dist/rsc/nonce.js +0 -18
  705. package/dist/rsc/nonce.js.map +0 -1
  706. package/dist/rsc/types.d.ts +0 -206
  707. package/dist/rsc/types.d.ts.map +0 -1
  708. package/dist/rsc/types.js +0 -8
  709. package/dist/rsc/types.js.map +0 -1
  710. package/dist/search-params.d.ts +0 -103
  711. package/dist/search-params.d.ts.map +0 -1
  712. package/dist/search-params.js +0 -74
  713. package/dist/search-params.js.map +0 -1
  714. package/dist/segment-system.d.ts +0 -75
  715. package/dist/segment-system.d.ts.map +0 -1
  716. package/dist/segment-system.js +0 -336
  717. package/dist/segment-system.js.map +0 -1
  718. package/dist/server/context.d.ts +0 -245
  719. package/dist/server/context.d.ts.map +0 -1
  720. package/dist/server/context.js +0 -197
  721. package/dist/server/context.js.map +0 -1
  722. package/dist/server/fetchable-loader-store.d.ts +0 -18
  723. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  724. package/dist/server/fetchable-loader-store.js +0 -18
  725. package/dist/server/fetchable-loader-store.js.map +0 -1
  726. package/dist/server/handle-store.d.ts +0 -85
  727. package/dist/server/handle-store.d.ts.map +0 -1
  728. package/dist/server/handle-store.js +0 -142
  729. package/dist/server/handle-store.js.map +0 -1
  730. package/dist/server/loader-registry.d.ts +0 -55
  731. package/dist/server/loader-registry.d.ts.map +0 -1
  732. package/dist/server/loader-registry.js +0 -132
  733. package/dist/server/loader-registry.js.map +0 -1
  734. package/dist/server/request-context.d.ts +0 -226
  735. package/dist/server/request-context.d.ts.map +0 -1
  736. package/dist/server/request-context.js +0 -290
  737. package/dist/server/request-context.js.map +0 -1
  738. package/dist/server/root-layout.d.ts +0 -4
  739. package/dist/server/root-layout.d.ts.map +0 -1
  740. package/dist/server/root-layout.js +0 -5
  741. package/dist/server/root-layout.js.map +0 -1
  742. package/dist/server.d.ts +0 -15
  743. package/dist/server.d.ts.map +0 -1
  744. package/dist/server.js +0 -20
  745. package/dist/server.js.map +0 -1
  746. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  747. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  748. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  749. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  750. package/dist/ssr/index.d.ts +0 -98
  751. package/dist/ssr/index.d.ts.map +0 -1
  752. package/dist/ssr/index.js +0 -158
  753. package/dist/ssr/index.js.map +0 -1
  754. package/dist/static-handler.d.ts +0 -50
  755. package/dist/static-handler.d.ts.map +0 -1
  756. package/dist/static-handler.gen.d.ts +0 -5
  757. package/dist/static-handler.gen.d.ts.map +0 -1
  758. package/dist/static-handler.gen.js +0 -5
  759. package/dist/static-handler.gen.js.map +0 -1
  760. package/dist/static-handler.js +0 -29
  761. package/dist/static-handler.js.map +0 -1
  762. package/dist/theme/ThemeProvider.d.ts +0 -20
  763. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  764. package/dist/theme/ThemeProvider.js +0 -240
  765. package/dist/theme/ThemeProvider.js.map +0 -1
  766. package/dist/theme/ThemeScript.d.ts +0 -48
  767. package/dist/theme/ThemeScript.d.ts.map +0 -1
  768. package/dist/theme/ThemeScript.js +0 -13
  769. package/dist/theme/ThemeScript.js.map +0 -1
  770. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  771. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  772. package/dist/theme/__tests__/theme.test.js +0 -103
  773. package/dist/theme/__tests__/theme.test.js.map +0 -1
  774. package/dist/theme/constants.d.ts +0 -29
  775. package/dist/theme/constants.d.ts.map +0 -1
  776. package/dist/theme/constants.js +0 -48
  777. package/dist/theme/constants.js.map +0 -1
  778. package/dist/theme/index.d.ts +0 -31
  779. package/dist/theme/index.d.ts.map +0 -1
  780. package/dist/theme/index.js +0 -36
  781. package/dist/theme/index.js.map +0 -1
  782. package/dist/theme/theme-context.d.ts +0 -40
  783. package/dist/theme/theme-context.d.ts.map +0 -1
  784. package/dist/theme/theme-context.js +0 -60
  785. package/dist/theme/theme-context.js.map +0 -1
  786. package/dist/theme/theme-script.d.ts +0 -27
  787. package/dist/theme/theme-script.d.ts.map +0 -1
  788. package/dist/theme/theme-script.js +0 -147
  789. package/dist/theme/theme-script.js.map +0 -1
  790. package/dist/theme/types.d.ts +0 -163
  791. package/dist/theme/types.d.ts.map +0 -1
  792. package/dist/theme/types.js +0 -11
  793. package/dist/theme/types.js.map +0 -1
  794. package/dist/theme/use-theme.d.ts +0 -12
  795. package/dist/theme/use-theme.d.ts.map +0 -1
  796. package/dist/theme/use-theme.js +0 -40
  797. package/dist/theme/use-theme.js.map +0 -1
  798. package/dist/types.d.ts +0 -1479
  799. package/dist/types.d.ts.map +0 -1
  800. package/dist/types.js +0 -10
  801. package/dist/types.js.map +0 -1
  802. package/dist/urls.d.ts +0 -441
  803. package/dist/urls.d.ts.map +0 -1
  804. package/dist/urls.gen.d.ts +0 -8
  805. package/dist/urls.gen.d.ts.map +0 -1
  806. package/dist/urls.gen.js +0 -8
  807. package/dist/urls.gen.js.map +0 -1
  808. package/dist/urls.js +0 -443
  809. package/dist/urls.js.map +0 -1
  810. package/dist/use-loader.d.ts +0 -127
  811. package/dist/use-loader.d.ts.map +0 -1
  812. package/dist/use-loader.js +0 -237
  813. package/dist/use-loader.js.map +0 -1
  814. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  815. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  816. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  817. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  818. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  819. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  820. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  821. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  822. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  823. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  824. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  825. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  826. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  827. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  828. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  829. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  830. package/dist/vite/ast-handler-extract.d.ts +0 -49
  831. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  832. package/dist/vite/ast-handler-extract.js +0 -249
  833. package/dist/vite/ast-handler-extract.js.map +0 -1
  834. package/dist/vite/expose-action-id.d.ts +0 -19
  835. package/dist/vite/expose-action-id.d.ts.map +0 -1
  836. package/dist/vite/expose-action-id.js +0 -250
  837. package/dist/vite/expose-action-id.js.map +0 -1
  838. package/dist/vite/expose-id-utils.d.ts +0 -69
  839. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  840. package/dist/vite/expose-id-utils.js +0 -289
  841. package/dist/vite/expose-id-utils.js.map +0 -1
  842. package/dist/vite/expose-internal-ids.d.ts +0 -22
  843. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  844. package/dist/vite/expose-internal-ids.js +0 -886
  845. package/dist/vite/expose-internal-ids.js.map +0 -1
  846. package/dist/vite/index.d.ts +0 -149
  847. package/dist/vite/index.d.ts.map +0 -1
  848. package/dist/vite/index.js.bak +0 -5448
  849. package/dist/vite/index.js.map +0 -1
  850. package/dist/vite/index.named-routes.gen.ts +0 -103
  851. package/dist/vite/package-resolution.d.ts +0 -43
  852. package/dist/vite/package-resolution.d.ts.map +0 -1
  853. package/dist/vite/package-resolution.js +0 -112
  854. package/dist/vite/package-resolution.js.map +0 -1
  855. package/dist/vite/virtual-entries.d.ts +0 -25
  856. package/dist/vite/virtual-entries.d.ts.map +0 -1
  857. package/dist/vite/virtual-entries.js +0 -110
  858. package/dist/vite/virtual-entries.js.map +0 -1
  859. package/src/network-error-thrower.tsx +0 -18
@@ -28,14 +28,28 @@ const DEFAULT_ACTION_STATE: TrackedActionState = {
28
28
  // Maximum number of history entries to cache (URLs visited)
29
29
  const HISTORY_CACHE_SIZE = 20;
30
30
 
31
- // Cache entry: [url-key, segments, stale, handleData?, routerId?]
32
- // stale=true means the data may be outdated and should be revalidated on access
31
+ // Cache entry:
32
+ // [url-key, segments, stale, handleData?, routerId?, navInstance?, handlesPending?]
33
+ // stale=true means the data may be outdated and should be revalidated on access.
34
+ // navInstance is the monotonic nav-instance token (see navInstance below): it
35
+ // identifies the per-commit visit that owns this entry. generateHistoryKey is
36
+ // URL-only, so A->B->A reuses the same key; the token lets a late async
37
+ // resolution tell its own visit's entry apart from a newer same-URL visit's, so
38
+ // a stale nav can never clobber a fresher one.
39
+ // handlesPending=true means the entry's handle data is INCOMPLETE (a deferred
40
+ // Meta was still pending when the user navigated away, so it never streamed). A
41
+ // popstate return must REVALIDATE WITH A FULL RE-RENDER (no client segment IDs)
42
+ // to re-stream the handles — a diff-only revalidation omits unchanged segments'
43
+ // handles, so the deferred Meta would never land. Cleared once the deferred Meta
44
+ // resolves while the entry is still owned.
33
45
  type HistoryCacheEntry = [
34
46
  string,
35
47
  ResolvedSegment[],
36
48
  boolean,
37
49
  HandleData?,
38
50
  string?,
51
+ number?,
52
+ boolean?,
39
53
  ];
40
54
 
41
55
  /**
@@ -44,7 +58,7 @@ type HistoryCacheEntry = [
44
58
  * since mutations happen at the array level, not on individual data objects.
45
59
  * This preserves any non-serializable types (React elements, functions, etc.)
46
60
  */
47
- function cloneHandleData(handleData: HandleData): HandleData {
61
+ export function cloneHandleData(handleData: HandleData): HandleData {
48
62
  const cloned: HandleData = {};
49
63
  for (const [handleKey, segmentMap] of Object.entries(handleData)) {
50
64
  cloned[handleKey] = {};
@@ -239,6 +253,14 @@ export function createNavigationStore(
239
253
  // Oldest entries (at front) are removed when over cacheSize limit
240
254
  const historyCache: HistoryCacheEntry[] = [];
241
255
 
256
+ // Monotonic nav-instance token. Bumped each time a cache entry is created or
257
+ // replaced in cacheSegmentsForHistory (i.e. once per commit). Because
258
+ // generateHistoryKey is URL-only, two visits to the same URL share a key; this
259
+ // token gives each visit a distinct identity so a late async handle resolution
260
+ // can tell whether it still owns the live page / the target cache entry, and
261
+ // never overwrite a newer same-URL visit's state.
262
+ let navInstance = 0;
263
+
242
264
  // Current history key (set on navigation, stored in history.state)
243
265
  let currentHistoryKey = config?.initialHistoryKey || generateHistoryKey();
244
266
 
@@ -248,6 +270,10 @@ export function createNavigationStore(
248
270
  config.initialHistoryKey,
249
271
  config.initialSegments,
250
272
  false,
273
+ undefined,
274
+ undefined,
275
+ ++navInstance,
276
+ false,
251
277
  ]);
252
278
  }
253
279
 
@@ -565,6 +591,29 @@ export function createNavigationStore(
565
591
  currentHistoryKey = key;
566
592
  },
567
593
 
594
+ /**
595
+ * Current nav-instance token: the instance of the most recently committed
596
+ * navigation (the value last written by cacheSegmentsForHistory). A late
597
+ * async handle resolution captures this at the start of its own nav and
598
+ * compares it back here to detect whether a NEWER navigation has since
599
+ * committed (token advanced), guarding against a stale nav writing a fresher
600
+ * nav's live state.
601
+ */
602
+ getNavInstance(): number {
603
+ return navInstance;
604
+ },
605
+
606
+ /**
607
+ * The nav-instance token recorded on a specific cache entry, or undefined if
608
+ * no entry exists for that key. Because the history key is URL-only, this is
609
+ * how a late resolution tells "the entry I seeded is still mine" from "a
610
+ * newer same-URL visit replaced my entry".
611
+ */
612
+ getCacheEntryInstance(historyKey: string): number | undefined {
613
+ const entry = historyCache.find(([key]) => key === historyKey);
614
+ return entry ? entry[5] : undefined;
615
+ },
616
+
568
617
  /**
569
618
  * Store segments for a history entry
570
619
  * Updates existing entry if key exists, otherwise adds new entry
@@ -583,6 +632,11 @@ export function createNavigationStore(
583
632
  ? cloneHandleData(handleData)
584
633
  : undefined;
585
634
 
635
+ // Each commit (create or replace) is a new nav instance. The bump happens
636
+ // here, exactly once per cacheSegmentsForHistory call, so getNavInstance()
637
+ // reflects the visit whose entry this is.
638
+ const instance = ++navInstance;
639
+
586
640
  // Check if entry already exists and update it
587
641
  const existingIndex = historyCache.findIndex(
588
642
  ([key]) => key === historyKey,
@@ -594,6 +648,8 @@ export function createNavigationStore(
594
648
  false,
595
649
  clonedHandleData,
596
650
  currentRouterId,
651
+ instance,
652
+ false, // fresh commit: handles complete unless a deferred apply marks it
597
653
  ];
598
654
  } else {
599
655
  // Add new entry at the end (not stale)
@@ -603,6 +659,8 @@ export function createNavigationStore(
603
659
  false,
604
660
  clonedHandleData,
605
661
  currentRouterId,
662
+ instance,
663
+ false,
606
664
  ]);
607
665
  // Remove oldest entries if over limit
608
666
  while (historyCache.length > cacheSize) {
@@ -621,6 +679,7 @@ export function createNavigationStore(
621
679
  stale: boolean;
622
680
  handleData?: HandleData;
623
681
  routerId?: string;
682
+ handlesPending?: boolean;
624
683
  }
625
684
  | undefined {
626
685
  const entry = historyCache.find(([key]) => key === historyKey);
@@ -630,6 +689,7 @@ export function createNavigationStore(
630
689
  stale: entry[2],
631
690
  handleData: entry[3],
632
691
  routerId: entry[4],
692
+ handlesPending: entry[6],
633
693
  };
634
694
  },
635
695
 
@@ -641,11 +701,23 @@ export function createNavigationStore(
641
701
  },
642
702
 
643
703
  /**
644
- * Update only the handleData for an existing cache entry
645
- * Does nothing if the cache entry doesn't exist
646
- * This is used to fix stale handleData after async handles processing
704
+ * Update only the handleData (and optionally the stale flag) for an existing
705
+ * cache entry. Does nothing if the cache entry doesn't exist.
706
+ *
707
+ * Used to fix stale handleData after async handles processing AND to flip an
708
+ * entry's stale / handlesPending bits for the deferred-Meta
709
+ * invalidate+revalidate path: while a nav's Meta is deferred-pending its
710
+ * entry is marked stale + handlesPending (a popstate return then revalidates
711
+ * with a full re-render instead of serving the carry/seed as fresh), and once
712
+ * the deferred Meta resolves both are cleared. When a flag is omitted the
713
+ * entry's current value is preserved.
647
714
  */
648
- updateCacheHandleData(historyKey: string, handleData: HandleData): void {
715
+ updateCacheHandleData(
716
+ historyKey: string,
717
+ handleData: HandleData,
718
+ stale?: boolean,
719
+ handlesPending?: boolean,
720
+ ): void {
649
721
  const existingIndex = historyCache.findIndex(
650
722
  ([key]) => key === historyKey,
651
723
  );
@@ -656,9 +728,11 @@ export function createNavigationStore(
656
728
  historyCache[existingIndex] = [
657
729
  entry[0],
658
730
  entry[1],
659
- entry[2],
731
+ stale ?? entry[2], // set stale when provided, else preserve current
660
732
  clonedHandleData,
661
733
  entry[4], // preserve routerId
734
+ entry[5], // preserve navInstance (entry ownership identity)
735
+ handlesPending ?? entry[6], // set when provided, else preserve current
662
736
  ];
663
737
  }
664
738
  },
@@ -1,5 +1,5 @@
1
1
  import { NetworkError, isNetworkError } from "../errors.js";
2
- import { NetworkErrorThrower } from "../network-error-thrower.js";
2
+ import { RenderErrorThrower } from "../render-error-thrower.js";
3
3
  import type { UpdateSubscriber } from "./types.js";
4
4
  import { createElement, startTransition } from "react";
5
5
 
@@ -24,18 +24,18 @@ export function toNetworkError(
24
24
  }
25
25
 
26
26
  /**
27
- * Emit a NetworkError to the UI via the onUpdate subscriber.
28
- * Wraps in startTransition and renders a NetworkErrorThrower component
29
- * that throws during render to trigger the nearest error boundary.
27
+ * Render an error into the segment tree via the onUpdate subscriber so the
28
+ * nearest error boundary catches it. Wrapped in startTransition; RenderErrorThrower
29
+ * throws during render (async rejections do not reach boundaries on their own).
30
30
  */
31
- export function emitNetworkError(
31
+ function emitErrorToBoundary(
32
32
  onUpdate: UpdateSubscriber,
33
- error: NetworkError,
33
+ error: unknown,
34
34
  pathname: string,
35
35
  ): void {
36
36
  startTransition(() => {
37
37
  onUpdate({
38
- root: createElement(NetworkErrorThrower, { error }),
38
+ root: createElement(RenderErrorThrower, { error }),
39
39
  metadata: {
40
40
  pathname,
41
41
  segments: [],
@@ -45,6 +45,33 @@ export function emitNetworkError(
45
45
  });
46
46
  }
47
47
 
48
+ /**
49
+ * Emit a NetworkError to the nearest error boundary (offline, failed fetch).
50
+ */
51
+ export function emitNetworkError(
52
+ onUpdate: UpdateSubscriber,
53
+ error: NetworkError,
54
+ pathname: string,
55
+ ): void {
56
+ emitErrorToBoundary(onUpdate, error, pathname);
57
+ }
58
+
59
+ /**
60
+ * Emit a navigation processing error to the nearest error boundary. Used when a
61
+ * navigation response cannot be processed (an undecodable Flight body, or any
62
+ * unanticipated failure while building the response) -- for both fresh and
63
+ * prefetched responses, since both funnel through the navigation catch. Without
64
+ * this, such a failure becomes an uncaught rejection that silently aborts the
65
+ * navigation instead of surfacing the route's error boundary.
66
+ */
67
+ export function emitNavigationError(
68
+ onUpdate: UpdateSubscriber,
69
+ error: unknown,
70
+ pathname: string,
71
+ ): void {
72
+ emitErrorToBoundary(onUpdate, error, pathname);
73
+ }
74
+
48
75
  /**
49
76
  * Check if an error is safe to suppress in background operations.
50
77
  *
@@ -188,7 +188,11 @@ export function createPartialUpdater(
188
188
  routerId: store.getRouterId?.(),
189
189
  });
190
190
  const streamingToken = tx.startStreaming();
191
- const { payload, streamComplete: rawStreamComplete } = fetchResult;
191
+ const {
192
+ payload,
193
+ streamComplete: rawStreamComplete,
194
+ fullyPrefetched,
195
+ } = fetchResult;
192
196
  debugLog("payload.metadata", payload.metadata);
193
197
 
194
198
  // Side effect only: end the streaming token once the stream settles.
@@ -395,7 +399,14 @@ export function createPartialUpdater(
395
399
 
396
400
  const renderOptions = {
397
401
  isAction: mode.type === "action",
398
- forceAwait: mode.type === "stale-revalidation",
402
+ // forceAwait unwraps the ROUTER loader promises during render so they
403
+ // land without a loading()/fallback frame. A fully-prefetched nav has
404
+ // its router data already resolved (the prefetch stream drained), so
405
+ // awaiting it here is free and lets us commit NORMALLY (not in a
406
+ // transition) below — a normal commit still shows fallbacks for any
407
+ // CLIENT component that suspends on mount, which a transition would
408
+ // wrongly suppress by holding the old UI until that suspense settles.
409
+ forceAwait: mode.type === "stale-revalidation" || fullyPrefetched,
399
410
  interceptSegments:
400
411
  reconciled.interceptSegments.length > 0
401
412
  ? reconciled.interceptSegments
@@ -505,6 +516,20 @@ export function createPartialUpdater(
505
516
  });
506
517
  });
507
518
  } else {
519
+ // Normal commit (cold/partial nav AND fully-prefetched nav). For a
520
+ // fully-prefetched nav, renderOptions.forceAwait (above) unwrapped the
521
+ // already-resolved ROUTER loader data AND route content during render, so
522
+ // the new tree carries it inline with no loading()/fallback frame — yet we
523
+ // still commit NORMALLY here rather than in a transition. A transition
524
+ // holds the OLD UI until ALL suspense in the new tree settles, including a
525
+ // CLIENT component that starts its own data request only when mounted
526
+ // (post-commit) under a persistent boundary; that would retain the
527
+ // previous page indefinitely with no feedback. A normal commit lets such
528
+ // client-initiated suspense reveal a fallback (correct) while the router
529
+ // data — genuinely ready — never flashes. Cold/partial navs
530
+ // (fullyPrefetched=false) do not forceAwait, so they stream their
531
+ // fallbacks. Explicit transition() routes keep the broader content-hold
532
+ // via the hasTransition branch above (the documented opt-in).
508
533
  onUpdate({
509
534
  root: newTree,
510
535
  metadata: payload.metadata!,
@@ -65,6 +65,14 @@ export interface DecodedPrefetch {
65
65
  * when it adopted an inflight entry through the wildcard key.
66
66
  */
67
67
  scope: "source" | "wildcard";
68
+ /**
69
+ * Synchronously-readable flag, flipped to true when `streamComplete` resolves
70
+ * (the entire RSC stream has drained). Navigation reads this at click time to
71
+ * tell a FULLY warmed prefetch (payload commits without suspending → safe to
72
+ * commit in a startTransition, no fallback flash) from a partially-warmed one
73
+ * (still streaming → stream its fallbacks like a cold load). Starts false.
74
+ */
75
+ complete: boolean;
68
76
  }
69
77
 
70
78
  let cacheTTL = 300_000;
@@ -244,14 +244,21 @@ function executePrefetchFetch(
244
244
  const storageKey = scope === "source" ? sourceKey : wildcardKey;
245
245
 
246
246
  // Track stream completion off a tee so navigation's scroll/revalidation
247
- // gating matches the fresh-fetch path; decode the other branch.
247
+ // gating matches the fresh-fetch path; decode the other branch. The
248
+ // completion callback reports whether the stream ended on a clean EOF
249
+ // (true) or was aborted/errored (false) — only a clean end can mark the
250
+ // entry complete (see below).
248
251
  let resolveStreamComplete!: () => void;
252
+ let endedCleanly = false;
249
253
  const streamComplete = new Promise<void>((resolve) => {
250
254
  resolveStreamComplete = resolve;
251
255
  });
252
256
  const tracked = teeWithCompletion(
253
257
  response,
254
- () => resolveStreamComplete(),
258
+ (clean) => {
259
+ endedCleanly = clean;
260
+ resolveStreamComplete();
261
+ },
255
262
  effectiveSignal,
256
263
  // Speculative prefetch: a never-consumed/aborted stream error is benign.
257
264
  true,
@@ -264,7 +271,12 @@ function executePrefetchFetch(
264
271
  // error is still surfaced to navigation if it consumes the entry.
265
272
  payload.catch(() => {});
266
273
 
267
- const entry: DecodedPrefetch = { payload, streamComplete, scope };
274
+ const entry: DecodedPrefetch = {
275
+ payload,
276
+ streamComplete,
277
+ scope,
278
+ complete: false,
279
+ };
268
280
  storePrefetch(storageKey, entry, gen);
269
281
  // The stall timeout now owns the body stream: arm eviction (publishedKey)
270
282
  // and clear the timer once the stream completes. The tee's finally resolves
@@ -272,7 +284,23 @@ function executePrefetchFetch(
272
284
  // no lingering timer while a stalled one is evicted when the timer fires.
273
285
  publishedKey = storageKey;
274
286
  publishedEntry = entry;
275
- streamComplete.then(() => clearTimeout(timeoutId));
287
+ // Evict a broken prefetch IMMEDIATELY on the earliest failure signal — do not
288
+ // wait for both branches to settle. A decode that rejects while the tracking
289
+ // stream is still draining (or hung) would otherwise leave the rejected payload
290
+ // consumable (navigation reads entry.payload regardless of `complete`) until EOF
291
+ // or the stall timeout. removePrefetch is identity-guarded, so a fresh entry
292
+ // republished under the same key is never dropped, and a double call is a no-op.
293
+ payload.catch(() => removePrefetch(storageKey, entry));
294
+ streamComplete.then(() => {
295
+ if (!endedCleanly) removePrefetch(storageKey, entry);
296
+ });
297
+ // Mark complete ONLY on a fully-healthy prefetch (decode resolved AND clean EOF).
298
+ Promise.allSettled([payload, streamComplete]).then(([decode]) => {
299
+ if (decode.status === "fulfilled" && endedCleanly) {
300
+ entry.complete = true;
301
+ }
302
+ clearTimeout(timeoutId);
303
+ });
276
304
  return entry;
277
305
  })
278
306
  .catch(() => null)
@@ -31,6 +31,57 @@ import { handleNavigationEnd } from "../scroll-restoration.js";
31
31
  import { createAppShellRef, type AppShellRef } from "../app-shell.js";
32
32
  import { startConnectionWarmup } from "../connection-warmup.js";
33
33
  import { debugLog } from "../logging.js";
34
+ import { cloneHandleData } from "../navigation-store.js";
35
+ import { collectHandleData } from "../../handle.js";
36
+ import { Meta } from "../../handles/meta.js";
37
+ import type { MetaDescriptor } from "../../router/types.js";
38
+ import {
39
+ HEAD_RESOLVE_HANDLE_NAMES,
40
+ hasDeferredHandleValue,
41
+ resolveDeferredHandleValues,
42
+ } from "./deferred-handle-resolution.js";
43
+
44
+ /** Meta handle-name key. Meta is the only head-placed handle whose consumer
45
+ * use()s a deferred value above the route <Suspense>, so it must be resolved in
46
+ * the store before apply; every other handle keeps the promise contract. */
47
+ const META = "__rsc_router_meta__";
48
+
49
+ /**
50
+ * Carry the previous page's COLLECTED Meta forward so the title is kept (no
51
+ * blank) while a deferred Meta resolves on a soft navigation.
52
+ *
53
+ * Why a carry-forward and not just preserving the previous Meta data: handle
54
+ * collection (useHandle/MetaTags) is driven by the event controller's
55
+ * `segmentOrder`, which becomes the NEW route's order so the synchronous
56
+ * breadcrumbs render immediately. The previous route's title lives under a
57
+ * segment that is NOT in the new order, so it would stop being collected — the
58
+ * title would fall back to the layout default. Re-keying the previous COLLECTED
59
+ * descriptors under a segment that IS in the new order keeps them visible.
60
+ *
61
+ * Title descriptors are wrapped as `{ title: { absolute } }` so re-collection
62
+ * under a (possibly template-bearing) new layout does not re-apply a title
63
+ * template to an already-final title. Promise and default (charSet/viewport)
64
+ * descriptors are dropped: Promise ones would suspend MetaTags, and the defaults
65
+ * are re-added by collectMeta.
66
+ */
67
+ function carriedPreviousMeta(prev: MetaDescriptor[]): MetaDescriptor[] {
68
+ const out: MetaDescriptor[] = [];
69
+ for (const d of prev) {
70
+ if (d && typeof (d as { then?: unknown }).then === "function") continue;
71
+ const base = d as Exclude<MetaDescriptor, Promise<unknown>>;
72
+ if ("charSet" in base) continue;
73
+ if ("name" in base && (base as { name?: unknown }).name === "viewport") {
74
+ continue;
75
+ }
76
+ if ("title" in base) {
77
+ const t = (base as { title: unknown }).title;
78
+ out.push({ title: { absolute: typeof t === "string" ? t : String(t) } });
79
+ continue;
80
+ }
81
+ out.push(base);
82
+ }
83
+ return out;
84
+ }
34
85
 
35
86
  /**
36
87
  * Process handles from an async generator, updating the event controller
@@ -66,6 +117,19 @@ async function processHandles(
66
117
  historyKey,
67
118
  } = opts;
68
119
 
120
+ // This nav's instance token, captured before any await — processHandles runs
121
+ // right after its own commit, so this is that commit's token. generateHistoryKey
122
+ // is URL-only, so an A->B->A revisit reuses the key; the token lets a late
123
+ // resolution tell its own visit apart from a newer same-URL visit, so a stale
124
+ // nav can never clobber a fresher one's live state or cache (P1).
125
+ const myInstance = store.getNavInstance();
126
+
127
+ // True while this nav still owns the live page: same history key AND the most
128
+ // recent commit is still ours (no newer nav has committed since).
129
+ const stillLive = (): boolean =>
130
+ historyKey === store.getHistoryKey() &&
131
+ myInstance === store.getNavInstance();
132
+
69
133
  let yieldCount = 0;
70
134
  for await (const handleData of handlesGenerator) {
71
135
  // Check if user navigated away before each update.
@@ -79,7 +143,132 @@ async function processHandles(
79
143
  }
80
144
 
81
145
  yieldCount++;
82
- eventController.setHandleData(handleData, matched, isPartial, resolvedIds);
146
+
147
+ // Resolve ONLY Meta in the store before applying. Meta is the sole
148
+ // head-placed handle whose consumer use()s a deferred value above the route
149
+ // <Suspense>; an uncontained suspension there would revert the just-committed
150
+ // route and hide its loading fallback. Every other handle (Breadcrumbs,
151
+ // custom handles) keeps the DeferredHandleEntry contract: its deferred values
152
+ // reach the consumer AS A PROMISE and are narrowed via isThenable(). So sync
153
+ // handles AND non-Meta deferred promises apply/stream through immediately —
154
+ // only Meta is held back and swapped in once resolved.
155
+ const metaDeferred = hasDeferredHandleValue(
156
+ handleData,
157
+ HEAD_RESOLVE_HANDLE_NAMES,
158
+ );
159
+
160
+ // Apply now. The non-deferred-Meta case applies the whole snapshot in one
161
+ // call (Meta included). When Meta IS deferred, replace the deferred Meta with
162
+ // the previous page's COLLECTED Meta (stale-while-revalidate — never a blank
163
+ // title) keyed under one of the NEW route's Meta segments, so it stays
164
+ // collected under the new segment order while the synchronous and non-Meta
165
+ // deferred handles update with normal cleanup. The resolved Meta is swapped
166
+ // in by the partial merge below.
167
+ if (metaDeferred) {
168
+ const immediate: HandleData = { ...handleData };
169
+ const metaSegments = handleData[META] ?? {};
170
+ // Anchor: the last new Meta segment in matched order (collected after the
171
+ // shared layout, so its carried title wins). Falls back to any new Meta
172
+ // segment if matched ordering does not surface one.
173
+ const metaSegmentIds = Object.keys(metaSegments);
174
+ const ordered = (matched ?? []).filter((id) =>
175
+ metaSegmentIds.includes(id),
176
+ );
177
+ const anchor = ordered.at(-1) ?? metaSegmentIds.at(-1);
178
+
179
+ const prevState = eventController.getHandleState();
180
+ const prevCollected = collectHandleData(
181
+ Meta,
182
+ prevState.data,
183
+ prevState.segmentOrder,
184
+ ) as MetaDescriptor[];
185
+ const carried = carriedPreviousMeta(prevCollected);
186
+
187
+ if (anchor && carried.length > 0) {
188
+ immediate[META] = { [anchor]: carried };
189
+ } else {
190
+ // No previous Meta to carry and/or no anchor: leave Meta unset until it
191
+ // resolves (the documented no-previous-Meta behavior).
192
+ delete immediate[META];
193
+ }
194
+ eventController.setHandleData(immediate, matched, isPartial, resolvedIds);
195
+ } else {
196
+ eventController.setHandleData(
197
+ handleData,
198
+ matched,
199
+ isPartial,
200
+ resolvedIds,
201
+ );
202
+ }
203
+
204
+ // Snapshot of the nav's full applied handle state (sync handles, non-Meta
205
+ // deferred promises, and — when Meta is deferred — the carried previous Meta).
206
+ // Captured AFTER applying so it reflects what is actually on screen now.
207
+ const baseSnapshot = cloneHandleData(eventController.getHandleState().data);
208
+
209
+ if (!metaDeferred) {
210
+ // Non-deferred: the applied snapshot is final. Keep the cache in sync and
211
+ // fresh. The token guard stops a stale same-URL nav writing a newer entry.
212
+ if (store.getCacheEntryInstance(historyKey) === myInstance) {
213
+ store.updateCacheHandleData(historyKey, baseSnapshot, false);
214
+ }
215
+ continue;
216
+ }
217
+
218
+ // Meta is deferred-pending. The applied snapshot carries the PREVIOUS page's
219
+ // Meta (or none), not this route's final title, so the cache entry must NOT
220
+ // be served as fresh on a popstate return. Mark it STALE and handlesPending
221
+ // (token-guarded). This is the P1 fix: the deferred Meta is a SERVER-side
222
+ // promise streamed via Flight, so a navigate-away ABORTS the stream and the
223
+ // client's deferred-Meta promise never resolves — the .then below never
224
+ // fires. stale makes a popstate return revalidate; handlesPending makes that
225
+ // revalidation a FULL re-render (no client segment IDs) so the server
226
+ // re-streams the handles. A diff-only revalidation would omit the unchanged
227
+ // segments' handles and the deferred Meta would never land — see the
228
+ // segmentIds branch in navigation-bridge.ts.
229
+ if (store.getCacheEntryInstance(historyKey) === myInstance) {
230
+ store.updateCacheHandleData(historyKey, baseSnapshot, true, true);
231
+ }
232
+
233
+ // Resolve Meta late, then swap it in. The swap is a PARTIAL merge with
234
+ // resolvedIds=undefined so the stale-clear loop (which scans all handle
235
+ // names under resolvedIds) cannot wipe the non-Meta buckets we already
236
+ // applied. When the deferred Meta DOES resolve while this nav still owns the
237
+ // entry (no navigate-away abort), write the resolved handle data and clear
238
+ // stale + handlesPending — the entry is now complete, so a popstate return
239
+ // serves it without revalidating.
240
+ //
241
+ // Order-safety: each stream yield is a full cumulative snapshot and a
242
+ // segment's handle array is atomic, so concurrent Meta resolutions of
243
+ // different yields write identical per-segment arrays or touch disjoint
244
+ // segments — neither can clobber the other.
245
+ void resolveDeferredHandleValues(
246
+ handleData,
247
+ HEAD_RESOLVE_HANDLE_NAMES,
248
+ ).then((resolved) => {
249
+ const cacheValue = { ...baseSnapshot, [META]: resolved[META] };
250
+ if (stillLive()) {
251
+ // Still on the live page: swap Meta in and refresh the cache as fresh.
252
+ eventController.setHandleData(
253
+ { [META]: resolved[META] },
254
+ matched,
255
+ true,
256
+ undefined,
257
+ );
258
+ store.updateCacheHandleData(
259
+ historyKey,
260
+ eventController.getHandleState().data,
261
+ false,
262
+ false,
263
+ );
264
+ } else if (store.getCacheEntryInstance(historyKey) === myInstance) {
265
+ // Navigated away, but THIS nav still owns the target cache entry: write
266
+ // the resolved data and clear stale + handlesPending so a popstate return
267
+ // is fresh.
268
+ store.updateCacheHandleData(historyKey, cacheValue, false, false);
269
+ }
270
+ // else: a newer nav to the same URL superseded us — do nothing.
271
+ });
83
272
  }
84
273
 
85
274
  // Check again before final updates
@@ -97,8 +286,9 @@ async function processHandles(
97
286
  // After handles processing completes, update the cache's handleData.
98
287
  // This fixes a race condition where commit() caches stale handleData before
99
288
  // the async handles processing completes.
100
- // Only update if we're still on the same page (historyKey matches).
101
- if (historyKey === store.getHistoryKey()) {
289
+ // Only update if we're still on the same page AND this is still the live nav
290
+ // (the token guard stops a stale same-URL nav writing a newer nav's state).
291
+ if (stillLive()) {
102
292
  const finalHandleData = eventController.getHandleState().data;
103
293
  store.updateCacheHandleData(historyKey, finalHandleData);
104
294
  }
@@ -362,7 +552,8 @@ export function NavigationProvider({
362
552
  payload.root instanceof Promise ? use(payload.root) : payload.root;
363
553
 
364
554
  // Wrap content in RootErrorBoundary to catch:
365
- // 1. Errors from NetworkErrorThrower (rendered during network failures)
555
+ // 1. Errors from RenderErrorThrower (network failures and unprocessable
556
+ // navigation responses, routed here by the navigation bridge)
366
557
  // 2. Client component errors that occur before/outside the segment tree's error boundary
367
558
  // 3. Errors during promise resolution or navigation state updates
368
559
  // This acts as a safety net - the segment tree has its own RootErrorBoundary that