@rangojs/router 0.0.0-experimental.259 → 0.0.0-experimental.25dbaac3

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 (1077) hide show
  1. package/{CLAUDE.md → AGENTS.md} +4 -0
  2. package/README.md +471 -51
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +490 -94
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +3423 -1718
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/dist/vite/package-resolution.js +112 -0
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/dist/vite/virtual-entries.js +110 -0
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +21 -18
  811. package/skills/breadcrumbs/SKILL.md +252 -0
  812. package/skills/cache-guide/SKILL.md +41 -5
  813. package/skills/caching/SKILL.md +49 -8
  814. package/skills/document-cache/SKILL.md +2 -2
  815. package/skills/handler-use/SKILL.md +362 -0
  816. package/skills/hooks/SKILL.md +94 -52
  817. package/skills/host-router/SKILL.md +218 -0
  818. package/skills/intercept/SKILL.md +99 -0
  819. package/skills/layout/SKILL.md +84 -2
  820. package/skills/links/SKILL.md +93 -17
  821. package/skills/loader/SKILL.md +367 -36
  822. package/skills/middleware/SKILL.md +145 -33
  823. package/skills/migrate-nextjs/SKILL.md +562 -0
  824. package/skills/migrate-react-router/SKILL.md +769 -0
  825. package/skills/parallel/SKILL.md +249 -2
  826. package/skills/prerender/SKILL.md +261 -49
  827. package/skills/rango/SKILL.md +26 -24
  828. package/skills/response-routes/SKILL.md +11 -3
  829. package/skills/route/SKILL.md +100 -5
  830. package/skills/router-setup/SKILL.md +172 -5
  831. package/skills/server-actions/SKILL.md +739 -0
  832. package/skills/streams-and-websockets/SKILL.md +283 -0
  833. package/skills/theme/SKILL.md +5 -4
  834. package/skills/typesafety/SKILL.md +95 -38
  835. package/skills/use-cache/SKILL.md +16 -2
  836. package/src/__internal.ts +93 -1
  837. package/src/bin/rango.ts +56 -19
  838. package/src/browser/action-coordinator.ts +97 -0
  839. package/src/browser/app-shell.ts +52 -0
  840. package/src/browser/app-version.ts +14 -0
  841. package/src/browser/event-controller.ts +78 -52
  842. package/src/browser/history-state.ts +80 -0
  843. package/src/browser/intercept-utils.ts +1 -1
  844. package/src/browser/link-interceptor.ts +23 -3
  845. package/src/browser/merge-segment-loaders.ts +9 -2
  846. package/src/browser/navigation-bridge.ts +234 -453
  847. package/src/browser/navigation-client.ts +191 -86
  848. package/src/browser/navigation-store.ts +71 -41
  849. package/src/browser/navigation-transaction.ts +297 -0
  850. package/src/browser/partial-update.ts +215 -167
  851. package/src/browser/prefetch/cache.ts +314 -0
  852. package/src/browser/prefetch/fetch.ts +282 -0
  853. package/src/browser/prefetch/observer.ts +65 -0
  854. package/src/browser/prefetch/policy.ts +48 -0
  855. package/src/browser/prefetch/queue.ts +191 -0
  856. package/src/browser/prefetch/resource-ready.ts +77 -0
  857. package/src/browser/rango-state.ts +152 -0
  858. package/src/browser/react/Link.tsx +241 -47
  859. package/src/browser/react/NavigationProvider.tsx +136 -16
  860. package/src/browser/react/context.ts +11 -0
  861. package/src/browser/react/filter-segment-order.ts +55 -0
  862. package/src/browser/react/index.ts +2 -6
  863. package/src/browser/react/location-state-shared.ts +29 -11
  864. package/src/browser/react/location-state.ts +6 -4
  865. package/src/browser/react/nonce-context.ts +23 -0
  866. package/src/browser/react/shallow-equal.ts +27 -0
  867. package/src/browser/react/use-action.ts +23 -45
  868. package/src/browser/react/use-client-cache.ts +5 -3
  869. package/src/browser/react/use-handle.ts +28 -120
  870. package/src/browser/react/use-navigation.ts +29 -34
  871. package/src/browser/react/use-params.ts +16 -35
  872. package/src/browser/react/use-pathname.ts +2 -3
  873. package/src/browser/react/use-router.ts +31 -14
  874. package/src/browser/react/use-search-params.ts +2 -1
  875. package/src/browser/react/use-segments.ts +82 -118
  876. package/src/browser/response-adapter.ts +73 -0
  877. package/src/browser/rsc-router.tsx +202 -67
  878. package/src/browser/scroll-restoration.ts +47 -45
  879. package/src/browser/segment-reconciler.ts +36 -9
  880. package/src/browser/server-action-bridge.ts +464 -409
  881. package/src/browser/types.ts +100 -40
  882. package/src/browser/validate-redirect-origin.ts +29 -0
  883. package/src/build/generate-manifest.ts +44 -19
  884. package/src/build/generate-route-types.ts +7 -0
  885. package/src/build/index.ts +1 -0
  886. package/src/build/route-trie.ts +67 -25
  887. package/src/build/route-types/codegen.ts +13 -4
  888. package/src/build/route-types/include-resolution.ts +21 -1
  889. package/src/build/route-types/per-module-writer.ts +15 -3
  890. package/src/build/route-types/router-processing.ts +391 -90
  891. package/src/build/route-types/scan-filter.ts +8 -1
  892. package/src/build/runtime-discovery.ts +13 -1
  893. package/src/cache/background-task.ts +34 -0
  894. package/src/cache/cache-key-utils.ts +44 -0
  895. package/src/cache/cache-policy.ts +125 -0
  896. package/src/cache/cache-runtime.ts +140 -123
  897. package/src/cache/cache-scope.ts +124 -90
  898. package/src/cache/cf/cf-cache-store.ts +467 -22
  899. package/src/cache/cf/index.ts +5 -1
  900. package/src/cache/document-cache.ts +109 -75
  901. package/src/cache/handle-capture.ts +81 -0
  902. package/src/cache/index.ts +1 -15
  903. package/src/cache/memory-segment-store.ts +43 -69
  904. package/src/cache/profile-registry.ts +43 -8
  905. package/src/cache/read-through-swr.ts +134 -0
  906. package/src/cache/segment-codec.ts +140 -117
  907. package/src/cache/taint.ts +85 -3
  908. package/src/cache/types.ts +1 -115
  909. package/src/client.rsc.tsx +2 -1
  910. package/src/client.tsx +86 -254
  911. package/src/context-var.ts +72 -2
  912. package/src/debug.ts +2 -2
  913. package/src/errors.ts +6 -1
  914. package/src/handle.ts +41 -1
  915. package/src/handles/MetaTags.tsx +5 -2
  916. package/src/handles/breadcrumbs.ts +66 -0
  917. package/src/handles/index.ts +1 -0
  918. package/src/host/cookie-handler.ts +8 -3
  919. package/src/host/index.ts +0 -3
  920. package/src/host/router.ts +14 -1
  921. package/src/href-client.ts +3 -1
  922. package/src/index.rsc.ts +48 -32
  923. package/src/index.ts +104 -64
  924. package/src/loader.rsc.ts +12 -4
  925. package/src/loader.ts +8 -0
  926. package/src/outlet-context.ts +1 -1
  927. package/src/prerender/store.ts +61 -18
  928. package/src/prerender.ts +207 -88
  929. package/src/response-utils.ts +28 -0
  930. package/src/reverse.ts +36 -7
  931. package/src/root-error-boundary.tsx +30 -26
  932. package/src/route-definition/dsl-helpers.ts +249 -46
  933. package/src/route-definition/helpers-types.ts +73 -20
  934. package/src/route-definition/index.ts +3 -3
  935. package/src/route-definition/redirect.ts +24 -4
  936. package/src/route-definition/resolve-handler-use.ts +155 -0
  937. package/src/route-map-builder.ts +45 -3
  938. package/src/route-name.ts +53 -0
  939. package/src/route-types.ts +25 -0
  940. package/src/router/content-negotiation.ts +101 -2
  941. package/src/router/debug-manifest.ts +16 -3
  942. package/src/router/find-match.ts +4 -2
  943. package/src/router/handler-context.ts +221 -39
  944. package/src/router/intercept-resolution.ts +17 -8
  945. package/src/router/lazy-includes.ts +12 -5
  946. package/src/router/loader-resolution.ts +164 -31
  947. package/src/router/logging.ts +104 -4
  948. package/src/router/manifest.ts +53 -9
  949. package/src/router/match-api.ts +150 -206
  950. package/src/router/match-context.ts +3 -0
  951. package/src/router/match-handlers.ts +186 -11
  952. package/src/router/match-middleware/background-revalidation.ts +94 -86
  953. package/src/router/match-middleware/cache-lookup.ts +164 -19
  954. package/src/router/match-middleware/cache-store.ts +55 -10
  955. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  956. package/src/router/match-middleware/segment-resolution.ts +61 -5
  957. package/src/router/match-pipelines.ts +8 -43
  958. package/src/router/match-result.ts +122 -18
  959. package/src/router/metrics.ts +238 -13
  960. package/src/router/middleware-types.ts +64 -61
  961. package/src/router/middleware.ts +316 -145
  962. package/src/router/navigation-snapshot.ts +182 -0
  963. package/src/router/pattern-matching.ts +134 -15
  964. package/src/router/prerender-match.ts +150 -16
  965. package/src/router/preview-match.ts +30 -96
  966. package/src/router/request-classification.ts +310 -0
  967. package/src/router/revalidation.ts +102 -9
  968. package/src/router/route-snapshot.ts +245 -0
  969. package/src/router/router-context.ts +20 -0
  970. package/src/router/router-interfaces.ts +200 -43
  971. package/src/router/router-options.ts +265 -12
  972. package/src/router/router-registry.ts +5 -2
  973. package/src/router/segment-resolution/fresh.ts +365 -256
  974. package/src/router/segment-resolution/helpers.ts +268 -0
  975. package/src/router/segment-resolution/loader-cache.ts +103 -98
  976. package/src/router/segment-resolution/revalidation.ts +711 -423
  977. package/src/router/segment-resolution/static-store.ts +2 -2
  978. package/src/router/segment-resolution.ts +1 -3
  979. package/src/router/segment-wrappers.ts +5 -0
  980. package/src/router/telemetry-otel.ts +299 -0
  981. package/src/router/telemetry.ts +300 -0
  982. package/src/router/timeout.ts +148 -0
  983. package/src/router/trie-matching.ts +30 -6
  984. package/src/router/types.ts +8 -1
  985. package/src/router/url-params.ts +49 -0
  986. package/src/router.ts +269 -25
  987. package/src/rsc/handler-context.ts +13 -2
  988. package/src/rsc/handler.ts +784 -629
  989. package/src/rsc/helpers.ts +168 -20
  990. package/src/rsc/index.ts +0 -20
  991. package/src/rsc/loader-fetch.ts +105 -43
  992. package/src/rsc/manifest-init.ts +7 -2
  993. package/src/rsc/origin-guard.ts +141 -0
  994. package/src/rsc/progressive-enhancement.ts +262 -20
  995. package/src/rsc/response-route-handler.ts +360 -0
  996. package/src/rsc/rsc-rendering.ts +70 -44
  997. package/src/rsc/runtime-warnings.ts +42 -0
  998. package/src/rsc/server-action.ts +178 -66
  999. package/src/rsc/ssr-setup.ts +128 -0
  1000. package/src/rsc/types.ts +37 -3
  1001. package/src/search-params.ts +38 -23
  1002. package/src/segment-content-promise.ts +67 -0
  1003. package/src/segment-loader-promise.ts +122 -0
  1004. package/src/segment-system.tsx +109 -23
  1005. package/src/server/context.ts +227 -24
  1006. package/src/server/cookie-store.ts +190 -0
  1007. package/src/server/fetchable-loader-store.ts +11 -6
  1008. package/src/server/handle-store.ts +103 -12
  1009. package/src/server/loader-registry.ts +20 -54
  1010. package/src/server/request-context.ts +475 -105
  1011. package/src/server.ts +6 -0
  1012. package/src/ssr/index.tsx +74 -27
  1013. package/src/static-handler.ts +25 -6
  1014. package/src/theme/ThemeProvider.tsx +6 -1
  1015. package/src/theme/index.ts +4 -18
  1016. package/src/theme/theme-context.ts +1 -28
  1017. package/src/theme/theme-script.ts +2 -1
  1018. package/src/types/cache-types.ts +10 -5
  1019. package/src/types/error-types.ts +3 -0
  1020. package/src/types/global-namespace.ts +22 -0
  1021. package/src/types/handler-context.ts +242 -82
  1022. package/src/types/index.ts +1 -1
  1023. package/src/types/loader-types.ts +50 -21
  1024. package/src/types/request-scope.ts +126 -0
  1025. package/src/types/route-config.ts +17 -26
  1026. package/src/types/route-entry.ts +46 -0
  1027. package/src/types/segments.ts +19 -5
  1028. package/src/urls/include-helper.ts +72 -21
  1029. package/src/urls/index.ts +1 -0
  1030. package/src/urls/path-helper-types.ts +69 -18
  1031. package/src/urls/path-helper.ts +65 -15
  1032. package/src/urls/pattern-types.ts +33 -1
  1033. package/src/urls/response-types.ts +47 -23
  1034. package/src/urls/type-extraction.ts +23 -15
  1035. package/src/use-loader.tsx +103 -13
  1036. package/src/vite/debug.ts +184 -0
  1037. package/src/vite/discovery/bundle-postprocess.ts +62 -85
  1038. package/src/vite/discovery/discover-routers.ts +87 -29
  1039. package/src/vite/discovery/gate-state.ts +171 -0
  1040. package/src/vite/discovery/prerender-collection.ts +224 -106
  1041. package/src/vite/discovery/route-types-writer.ts +7 -7
  1042. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1043. package/src/vite/discovery/state.ts +20 -13
  1044. package/src/vite/discovery/virtual-module-codegen.ts +5 -2
  1045. package/src/vite/index.ts +14 -51
  1046. package/src/vite/plugin-types.ts +51 -79
  1047. package/src/vite/plugins/cjs-to-esm.ts +5 -0
  1048. package/src/vite/plugins/client-ref-dedup.ts +131 -0
  1049. package/src/vite/plugins/client-ref-hashing.ts +19 -7
  1050. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1051. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1052. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1053. package/src/vite/plugins/expose-action-id.ts +53 -31
  1054. package/src/vite/plugins/expose-id-utils.ts +12 -0
  1055. package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
  1056. package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
  1057. package/src/vite/plugins/expose-internal-ids.ts +567 -319
  1058. package/src/vite/plugins/performance-tracks.ts +96 -0
  1059. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1060. package/src/vite/plugins/use-cache-transform.ts +139 -38
  1061. package/src/vite/plugins/version-injector.ts +37 -11
  1062. package/src/vite/plugins/version-plugin.ts +200 -18
  1063. package/src/vite/rango.ts +233 -221
  1064. package/src/vite/router-discovery.ts +887 -176
  1065. package/src/vite/utils/banner.ts +4 -4
  1066. package/src/vite/utils/package-resolution.ts +41 -1
  1067. package/src/vite/utils/prerender-utils.ts +113 -0
  1068. package/src/vite/utils/shared-utils.ts +22 -11
  1069. package/skills/testing/SKILL.md +0 -226
  1070. package/src/browser/lru-cache.ts +0 -61
  1071. package/src/browser/react/prefetch.ts +0 -27
  1072. package/src/browser/request-controller.ts +0 -164
  1073. package/src/cache/memory-store.ts +0 -253
  1074. package/src/route-definition/route-function.ts +0 -119
  1075. package/src/router.gen.ts +0 -6
  1076. package/src/static-handler.gen.ts +0 -5
  1077. package/src/urls.gen.ts +0 -8
@@ -7,23 +7,18 @@
7
7
  */
8
8
 
9
9
  import type { ReactNode } from "react";
10
- import { DataNotFoundError, invariant } from "../../errors";
11
- import {
12
- createErrorInfo,
13
- createErrorSegment,
14
- createNotFoundInfo,
15
- createNotFoundSegment,
16
- } from "../error-handling.js";
10
+ import { invariant } from "../../errors";
17
11
  import { revalidate } from "../loader-resolution.js";
18
12
  import { evaluateRevalidation } from "../revalidation.js";
19
- import { getRequestContext } from "../../server/request-context.js";
20
- import { DefaultErrorFallback } from "../../default-error-boundary.js";
21
- import type { EntryData } from "../../server/context";
13
+ import {
14
+ getParallelEntries,
15
+ getParallelSlotEntries,
16
+ type EntryData,
17
+ } from "../../server/context";
22
18
  import type {
23
19
  HandlerContext,
24
20
  InternalHandlerContext,
25
21
  ResolvedSegment,
26
- ErrorInfo,
27
22
  ShouldRevalidateFn,
28
23
  } from "../../types";
29
24
  import type {
@@ -31,10 +26,123 @@ import type {
31
26
  SegmentRevalidationResult,
32
27
  ActionContext,
33
28
  } from "../types.js";
34
- import { debugLog } from "../logging.js";
35
- import { tryStaticLookup } from "./static-store.js";
36
- import { handleHandlerResult } from "./fresh.js";
29
+ import {
30
+ debugLog,
31
+ pushRevalidationTraceEntry,
32
+ isTraceActive,
33
+ } from "../logging.js";
37
34
  import { resolveLoaderData } from "./loader-cache.js";
35
+ import {
36
+ handleHandlerResult,
37
+ tryStaticHandler,
38
+ tryStaticSlot,
39
+ resolveLayoutComponent,
40
+ resolveWithErrorBoundary,
41
+ } from "./helpers.js";
42
+ import { getRouterContext } from "../router-context.js";
43
+ import { resolveSink, safeEmit } from "../telemetry.js";
44
+ import {
45
+ track,
46
+ RSCRouterContext,
47
+ runInsideLoaderScope,
48
+ } from "../../server/context.js";
49
+
50
+ // ---------------------------------------------------------------------------
51
+ // Telemetry helpers
52
+ // ---------------------------------------------------------------------------
53
+
54
+ /**
55
+ * Attach a fire-and-forget rejection observer to a streamed handler promise.
56
+ * Silently no-ops when called outside RouterContext (e.g. in unit tests).
57
+ */
58
+ function observeStreamedHandler(
59
+ promise: Promise<ReactNode>,
60
+ segmentId: string,
61
+ segmentType: string,
62
+ pathname?: string,
63
+ routeKey?: string,
64
+ params?: Record<string, string>,
65
+ ): void {
66
+ let routerCtx;
67
+ try {
68
+ routerCtx = getRouterContext();
69
+ } catch {
70
+ return;
71
+ }
72
+ if (!routerCtx?.telemetry) return;
73
+ const sink = resolveSink(routerCtx.telemetry);
74
+ const reqId = routerCtx.requestId;
75
+ promise.catch((err: unknown) => {
76
+ const errorObj = err instanceof Error ? err : new Error(String(err));
77
+ safeEmit(sink, {
78
+ type: "handler.error",
79
+ timestamp: performance.now(),
80
+ requestId: reqId,
81
+ segmentId,
82
+ segmentType,
83
+ error: errorObj,
84
+ handledByBoundary: true,
85
+ pathname,
86
+ routeKey,
87
+ params,
88
+ });
89
+ });
90
+ }
91
+
92
+ /**
93
+ * Trace a parallel slot that's being force-rendered on a full refetch (client
94
+ * has no cached state). User revalidate fns are bypassed in this case — see
95
+ * the call sites for the load-bearing rationale.
96
+ */
97
+ function traceFullRefetchedParallelSlot(
98
+ parallelId: string,
99
+ belongsToRoute: boolean,
100
+ ): void {
101
+ if (!isTraceActive()) return;
102
+ pushRevalidationTraceEntry({
103
+ segmentId: parallelId,
104
+ segmentType: "parallel",
105
+ belongsToRoute,
106
+ source: "parallel",
107
+ defaultShouldRevalidate: true,
108
+ finalShouldRevalidate: true,
109
+ reason: "full-refetch",
110
+ });
111
+ }
112
+
113
+ // ---------------------------------------------------------------------------
114
+ // Revalidation telemetry helper
115
+ // ---------------------------------------------------------------------------
116
+
117
+ /**
118
+ * Emit revalidation.decision telemetry for a segment if a sink is configured.
119
+ * Called after evaluateRevalidation returns to capture the decision.
120
+ * Silently no-ops when called outside RouterContext (e.g. in unit tests).
121
+ */
122
+ function emitRevalidationDecision(
123
+ segmentId: string,
124
+ pathname: string,
125
+ routeKey: string,
126
+ shouldRevalidate: boolean,
127
+ ): void {
128
+ let routerCtx;
129
+ try {
130
+ routerCtx = getRouterContext();
131
+ } catch {
132
+ return;
133
+ }
134
+ if (routerCtx?.telemetry) {
135
+ safeEmit(resolveSink(routerCtx.telemetry), {
136
+ type: "revalidation.decision",
137
+ timestamp: performance.now(),
138
+ requestId: routerCtx.requestId,
139
+ segmentId,
140
+ pathname,
141
+ routeKey,
142
+ shouldRevalidate,
143
+ });
144
+ }
145
+ }
38
146
 
39
147
  // ---------------------------------------------------------------------------
40
148
  // Revalidation path (partial match)
@@ -85,7 +193,20 @@ export async function resolveLoadersWithRevalidation<TEnv>(
85
193
  }) => {
86
194
  const shouldRun = await revalidate(
87
195
  async () => {
88
- if (!clientSegmentIds.has(segmentId)) return true;
196
+ if (!clientSegmentIds.has(segmentId)) {
197
+ if (isTraceActive()) {
198
+ pushRevalidationTraceEntry({
199
+ segmentId,
200
+ segmentType: "loader",
201
+ belongsToRoute,
202
+ source: "loader",
203
+ defaultShouldRevalidate: true,
204
+ finalShouldRevalidate: true,
205
+ reason: "new-segment",
206
+ });
207
+ }
208
+ return true;
209
+ }
89
210
 
90
211
  const dummySegment: ResolvedSegment = {
91
212
  id: segmentId,
@@ -113,11 +234,13 @@ export async function resolveLoadersWithRevalidation<TEnv>(
113
234
  context: ctx,
114
235
  actionContext,
115
236
  stale,
237
+ traceSource: "loader",
116
238
  });
117
239
  },
118
240
  async () => true,
119
241
  () => false,
120
242
  );
243
+ emitRevalidationDecision(segmentId, ctx.pathname, routeKey, shouldRun);
121
244
  return { shouldRun, loaderEntry, loader, segmentId, index };
122
245
  },
123
246
  ),
@@ -134,7 +257,9 @@ export async function resolveLoadersWithRevalidation<TEnv>(
134
257
  params: ctx.params,
135
258
  loaderId: loader.$$id,
136
259
  loaderData: deps.wrapLoaderPromise(
137
- resolveLoaderData(loaderEntry, ctx, ctx.pathname),
260
+ runInsideLoaderScope(() =>
261
+ resolveLoaderData(loaderEntry, ctx, ctx.pathname),
262
+ ),
138
263
  entry,
139
264
  segmentId,
140
265
  ctx.pathname,
@@ -160,27 +285,99 @@ export async function resolveLoadersOnlyWithRevalidation<TEnv>(
160
285
  routeKey: string,
161
286
  deps: SegmentResolutionDeps<TEnv>,
162
287
  actionContext?: ActionContext,
288
+ stale?: boolean,
163
289
  ): Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }> {
164
290
  const allLoaderSegments: ResolvedSegment[] = [];
165
291
  const allMatchedIds: string[] = [];
292
+ const seenIds = new Set<string>();
293
+
294
+ async function collectEntryLoaders(
295
+ entry: EntryData,
296
+ belongsToRoute: boolean,
297
+ shortCodeOverride?: string,
298
+ ): Promise<void> {
299
+ // Skip if all loaders from this entry have already been resolved
300
+ // via a parent (e.g., cache boundary wrapping a layout with shared loaders).
301
+ const loaderEntries = entry.loader ?? [];
302
+ const sc = shortCodeOverride ?? entry.shortCode;
303
+ const allAlreadySeen =
304
+ loaderEntries.length > 0 &&
305
+ loaderEntries.every((le, i) =>
306
+ seenIds.has(`${sc}D${i}.${le.loader.$$id}`),
307
+ );
308
+ if (!allAlreadySeen) {
309
+ const { segments, matchedIds } = await resolveLoadersWithRevalidation(
310
+ entry,
311
+ context,
312
+ belongsToRoute,
313
+ clientSegmentIds,
314
+ prevParams,
315
+ request,
316
+ prevUrl,
317
+ nextUrl,
318
+ routeKey,
319
+ deps,
320
+ actionContext,
321
+ shortCodeOverride,
322
+ stale,
323
+ );
324
+ for (const seg of segments) {
325
+ if (!seenIds.has(seg.id)) {
326
+ seenIds.add(seg.id);
327
+ allLoaderSegments.push(seg);
328
+ }
329
+ }
330
+ allMatchedIds.push(...matchedIds);
331
+ }
332
+
333
+ const seenParallelEntryIds = new Set<string>();
334
+ for (const parallelEntry of getParallelEntries(entry.parallel)) {
335
+ if (seenParallelEntryIds.has(parallelEntry.id)) continue;
336
+ seenParallelEntryIds.add(parallelEntry.id);
337
+ await collectEntryLoaders(parallelEntry, belongsToRoute, entry.shortCode);
338
+ }
339
+
340
+ const childBelongsToRoute = belongsToRoute || entry.type === "route";
341
+ for (const layoutEntry of entry.layout) {
342
+ await collectEntryLoaders(layoutEntry, childBelongsToRoute);
343
+ // Inherit route loaders for orphan layouts with parallels.
344
+ // Resolve directly — do NOT re-enter collectEntryLoaders with the
345
+ // route entry, as that would re-iterate route.layout and loop.
346
+ if (
347
+ entry.type === "route" &&
348
+ entry.loader &&
349
+ entry.loader.length > 0 &&
350
+ Object.keys(layoutEntry.parallel).length > 0
351
+ ) {
352
+ const inherited = await resolveLoadersWithRevalidation(
353
+ entry,
354
+ context,
355
+ childBelongsToRoute,
356
+ clientSegmentIds,
357
+ prevParams,
358
+ request,
359
+ prevUrl,
360
+ nextUrl,
361
+ routeKey,
362
+ deps,
363
+ actionContext,
364
+ layoutEntry.shortCode,
365
+ stale,
366
+ );
367
+ for (const seg of inherited.segments) {
368
+ if (!seenIds.has(seg.id)) {
369
+ seenIds.add(seg.id);
370
+ seg._inherited = true;
371
+ allLoaderSegments.push(seg);
372
+ }
373
+ }
374
+ allMatchedIds.push(...inherited.matchedIds);
375
+ }
376
+ }
377
+ }
166
378
 
167
379
  for (const entry of entries) {
168
- const belongsToRoute = entry.type === "route";
169
- const { segments, matchedIds } = await resolveLoadersWithRevalidation(
170
- entry,
171
- context,
172
- belongsToRoute,
173
- clientSegmentIds,
174
- prevParams,
175
- request,
176
- prevUrl,
177
- nextUrl,
178
- routeKey,
179
- deps,
180
- actionContext,
181
- );
182
- allLoaderSegments.push(...segments);
183
- allMatchedIds.push(...matchedIds);
380
+ await collectEntryLoaders(entry, entry.type === "route");
184
381
  }
185
382
 
186
383
  return { segments: allLoaderSegments, matchedIds: allMatchedIds };
@@ -204,22 +401,20 @@ export function buildEntryRevalidateMap(
204
401
  map.set(entry.shortCode, { entry, revalidate: entry.revalidate });
205
402
 
206
403
  if (entry.type !== "parallel") {
207
- for (const parallelEntry of entry.parallel) {
208
- if (parallelEntry.type === "parallel") {
209
- const slots = Object.keys(parallelEntry.handler) as `@${string}`[];
210
- for (const slot of slots) {
211
- const parallelId = `${parallelEntry.shortCode}.${slot}`;
212
- map.set(parallelId, {
213
- entry: parallelEntry,
214
- revalidate: parallelEntry.revalidate,
215
- });
216
- }
217
- }
404
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
405
+ entry.parallel,
406
+ )) {
407
+ const parallelParentShortCode = parentShortCode ?? entry.shortCode;
408
+ const parallelId = `${parallelParentShortCode}.${slot}`;
409
+ map.set(parallelId, {
410
+ entry: parallelEntry,
411
+ revalidate: parallelEntry.revalidate,
412
+ });
218
413
  }
219
414
  }
220
415
 
221
416
  for (const layoutEntry of entry.layout) {
222
- processEntry(layoutEntry);
417
+ processEntry(layoutEntry, entry.shortCode);
223
418
  }
224
419
  }
225
420
 
@@ -251,7 +446,10 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
251
446
  const segments: ResolvedSegment[] = [];
252
447
  const matchedIds: string[] = [];
253
448
 
254
- for (const parallelEntry of entry.parallel) {
449
+ const resolvedParallelEntries = new Set<string>();
450
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
451
+ entry.parallel,
452
+ )) {
255
453
  invariant(
256
454
  parallelEntry.type === "parallel",
257
455
  `Expected parallel entry, got: ${parallelEntry.type}`,
@@ -262,94 +460,47 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
262
460
  | ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
263
461
  | ReactNode
264
462
  >;
265
-
266
- for (const [slot, handler] of Object.entries(slots)) {
267
- const parallelId = `${entry.shortCode}.${slot}`;
268
-
269
- const isFullRefetch = clientSegmentIds.size === 0;
270
- // When the parent layout is new (not in client's segment set),
271
- // all its parallel children must be resolved and tracked.
272
- // Without this, navigating to a new layout with parallels
273
- // (e.g., BlogLayout with @sidebar) from a different route
274
- // would silently drop those parallel segments.
275
- const isNewParent = !clientSegmentIds.has(entry.shortCode);
276
- if (
277
- isFullRefetch ||
278
- clientSegmentIds.has(parallelId) ||
279
- belongsToRoute ||
280
- isNewParent
281
- ) {
282
- matchedIds.push(parallelId);
283
- }
284
-
285
- const shouldResolve = await (async () => {
286
- if (isFullRefetch) return true;
287
- if (!clientSegmentIds.has(parallelId))
288
- return belongsToRoute || isNewParent;
289
-
290
- const dummySegment: ResolvedSegment = {
291
- id: parallelId,
292
- namespace: parallelEntry.id,
293
- type: "parallel",
294
- index: 0,
295
- component: null as any,
296
- params,
297
- slot,
298
- belongsToRoute,
299
- parallelName: `${parallelEntry.id}.${slot}`,
300
- ...(parallelEntry.mountPath
301
- ? { mountPath: parallelEntry.mountPath }
302
- : {}),
463
+ // In production, static handler bodies are evicted and the slot value
464
+ // may be undefined. The static store holds the pre-rendered component.
465
+ // We defer the handler check until after tryStaticSlot.
466
+ const handler = slots[slot];
467
+
468
+ const parallelId = `${entry.shortCode}.${slot}`;
469
+
470
+ const isFullRefetch = clientSegmentIds.size === 0;
471
+ const isNewParent = !clientSegmentIds.has(entry.shortCode);
472
+ // Always announce the slot in matchedIds — it's unconditionally appended
473
+ // to `segments` below, and a segment present in segments but missing from
474
+ // matched lets the client prune it (then it's missing from clientSegmentIds
475
+ // on the next request, perpetuating the staleness).
476
+ matchedIds.push(parallelId);
477
+
478
+ let shouldResolve: boolean;
479
+ if (isFullRefetch) {
480
+ // Client has nothing cached — slot MUST render. User revalidate fns are
481
+ // bypassed here because returning false would leave the segment blank
482
+ // with no client-side fallback.
483
+ traceFullRefetchedParallelSlot(parallelId, belongsToRoute);
484
+ shouldResolve = true;
485
+ } else {
486
+ // For non-empty client sets, consult user revalidate fns. When the slot
487
+ // is unknown to the client, override the type-derived default so the
488
+ // soft chain seeds with the right "new segment" / "parent-chain" value.
489
+ let defaultOverride: { value: boolean; reason: string } | undefined;
490
+ if (!clientSegmentIds.has(parallelId)) {
491
+ const value = belongsToRoute || isNewParent;
492
+ defaultOverride = {
493
+ value,
494
+ reason: value ? "new-segment" : "skip-parent-chain",
303
495
  };
304
-
305
- return await evaluateRevalidation({
306
- segment: dummySegment,
307
- prevParams,
308
- getPrevSegment: null,
309
- request,
310
- prevUrl,
311
- nextUrl,
312
- revalidations: parallelEntry.revalidate.map((fn, i) => ({
313
- name: `revalidate${i}`,
314
- fn,
315
- })),
316
- routeKey,
317
- context,
318
- actionContext,
319
- stale,
320
- });
321
- })();
322
-
323
- let component: ReactNode | undefined;
324
- // Static handler interception for individual parallel slots
325
- const slotStaticId = (parallelEntry as any).staticHandlerIds?.[slot];
326
- if (slotStaticId && shouldResolve) {
327
- component = await tryStaticLookup(slotStaticId, parallelId);
328
- }
329
- if (component === undefined) {
330
- const hasLoadingFallback =
331
- parallelEntry.loading !== undefined &&
332
- parallelEntry.loading !== false;
333
- if (!shouldResolve) {
334
- component = null;
335
- } else if (hasLoadingFallback) {
336
- component = (
337
- typeof handler === "function" ? handler(context) : handler
338
- ) as ReactNode;
339
- } else {
340
- component =
341
- typeof handler === "function" ? await handler(context) : handler;
342
- }
343
496
  }
344
497
 
345
- segments.push({
498
+ const dummySegment: ResolvedSegment = {
346
499
  id: parallelId,
347
500
  namespace: parallelEntry.id,
348
501
  type: "parallel",
349
502
  index: 0,
350
- component,
351
- loading: parallelEntry.loading === false ? null : parallelEntry.loading,
352
- transition: parallelEntry.transition,
503
+ component: null as any,
353
504
  params,
354
505
  slot,
355
506
  belongsToRoute,
@@ -357,28 +508,124 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
357
508
  ...(parallelEntry.mountPath
358
509
  ? { mountPath: parallelEntry.mountPath }
359
510
  : {}),
360
- });
361
- }
511
+ };
362
512
 
363
- if (!parallelEntry.loading) {
364
- const loaderResult = await resolveLoadersWithRevalidation(
365
- parallelEntry,
366
- context,
367
- belongsToRoute,
368
- clientSegmentIds,
513
+ shouldResolve = await evaluateRevalidation({
514
+ segment: dummySegment,
369
515
  prevParams,
516
+ getPrevSegment: null,
370
517
  request,
371
518
  prevUrl,
372
519
  nextUrl,
520
+ revalidations: parallelEntry.revalidate.map((fn, i) => ({
521
+ name: `revalidate${i}`,
522
+ fn,
523
+ })),
373
524
  routeKey,
374
- deps,
525
+ context,
375
526
  actionContext,
376
- entry.shortCode,
377
527
  stale,
378
- );
379
- segments.push(...loaderResult.segments);
380
- matchedIds.push(...loaderResult.matchedIds);
528
+ traceSource: "parallel",
529
+ defaultOverride,
530
+ });
531
+ }
532
+ emitRevalidationDecision(
533
+ parallelId,
534
+ context.pathname,
535
+ routeKey,
536
+ shouldResolve,
537
+ );
538
+
539
+ let component: ReactNode | undefined;
540
+ let handlerRan = false;
541
+ if (shouldResolve) {
542
+ component = await tryStaticSlot(parallelEntry, slot, parallelId);
543
+ // tryStaticSlot returning a value means the static cache supplied the
544
+ // component — handler did NOT run. handlerRan stays false.
545
+ }
546
+ if (component === undefined) {
547
+ const hasLoadingFallback =
548
+ parallelEntry.loading !== undefined && parallelEntry.loading !== false;
549
+ if (!shouldResolve) {
550
+ component = null;
551
+ } else if (handler === undefined) {
552
+ // Handler evicted (production static slot) but static lookup missed.
553
+ // Nothing to render — use null so the client keeps its cached version.
554
+ component = null;
555
+ } else {
556
+ // Slot-keyed pushes — slot owns its own bucket, parent layout owns
557
+ // its own. On slot-only revalidations the partial merge updates only
558
+ // the slot's bucket; the parent's bucket stays intact.
559
+ (context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
560
+ parallelId;
561
+ handlerRan = true;
562
+ if (hasLoadingFallback) {
563
+ const result =
564
+ typeof handler === "function" ? handler(context) : handler;
565
+ if (result instanceof Promise) {
566
+ const tracked = deps.trackHandler(result, {
567
+ segmentId: parallelId,
568
+ segmentType: "parallel",
569
+ });
570
+ observeStreamedHandler(
571
+ tracked,
572
+ parallelId,
573
+ "parallel",
574
+ context.pathname,
575
+ routeKey,
576
+ params,
577
+ );
578
+ component = tracked as ReactNode;
579
+ } else {
580
+ component = result as ReactNode;
581
+ }
582
+ } else {
583
+ component =
584
+ typeof handler === "function" ? await handler(context) : handler;
585
+ }
586
+ }
381
587
  }
588
+
589
+ segments.push({
590
+ id: parallelId,
591
+ namespace: parallelEntry.id,
592
+ type: "parallel",
593
+ index: 0,
594
+ component,
595
+ loading: parallelEntry.loading === false ? null : parallelEntry.loading,
596
+ transition: parallelEntry.transition,
597
+ params,
598
+ slot,
599
+ _handlerRan: handlerRan,
600
+ belongsToRoute,
601
+ parallelName: `${parallelEntry.id}.${slot}`,
602
+ ...(parallelEntry.mountPath
603
+ ? { mountPath: parallelEntry.mountPath }
604
+ : {}),
605
+ });
606
+
607
+ if (resolvedParallelEntries.has(parallelEntry.id)) {
608
+ continue;
609
+ }
610
+
611
+ const loaderResult = await resolveLoadersWithRevalidation(
612
+ parallelEntry,
613
+ context,
614
+ belongsToRoute,
615
+ clientSegmentIds,
616
+ prevParams,
617
+ request,
618
+ prevUrl,
619
+ nextUrl,
620
+ routeKey,
621
+ deps,
622
+ actionContext,
623
+ entry.shortCode,
624
+ stale,
625
+ );
626
+ segments.push(...loaderResult.segments);
627
+ matchedIds.push(...loaderResult.matchedIds);
628
+ resolvedParallelEntries.add(parallelEntry.id);
382
629
  }
383
630
 
384
631
  return { segments, matchedIds };
@@ -404,6 +651,7 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
404
651
  ): Promise<{ segment: ResolvedSegment; matchedId: string }> {
405
652
  const matchedId = entry.shortCode;
406
653
 
654
+ let handlerRan = false;
407
655
  const component = await revalidate(
408
656
  async () => {
409
657
  const hasSegment = clientSegmentIds.has(entry.shortCode);
@@ -413,7 +661,24 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
413
661
  clientHasSegment: hasSegment,
414
662
  belongsToRoute,
415
663
  });
416
- if (!hasSegment) return true;
664
+ if (!hasSegment) {
665
+ if (isTraceActive()) {
666
+ const segType =
667
+ entry.type === "cache"
668
+ ? "layout"
669
+ : (entry.type as "layout" | "route");
670
+ pushRevalidationTraceEntry({
671
+ segmentId: entry.shortCode,
672
+ segmentType: segType,
673
+ belongsToRoute,
674
+ source: "segment-resolution",
675
+ defaultShouldRevalidate: true,
676
+ finalShouldRevalidate: true,
677
+ reason: "new-segment",
678
+ });
679
+ }
680
+ return true;
681
+ }
417
682
 
418
683
  const dummySegment: ResolvedSegment = {
419
684
  id: entry.shortCode,
@@ -447,7 +712,15 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
447
712
  context,
448
713
  actionContext,
449
714
  stale,
715
+ traceSource:
716
+ entry.type === "route" ? "route-handler" : "layout-handler",
450
717
  });
718
+ emitRevalidationDecision(
719
+ entry.shortCode,
720
+ context.pathname,
721
+ routeKey,
722
+ shouldRevalidate,
723
+ );
451
724
  debugLog("segment.revalidate", "entry revalidation decision", {
452
725
  segmentId: entry.shortCode,
453
726
  shouldRevalidate,
@@ -455,49 +728,72 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
455
728
  return shouldRevalidate;
456
729
  },
457
730
  async () => {
731
+ handlerRan = true;
732
+ const doneHandler = track(`handler:${entry.id}`, 2);
458
733
  (context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
459
734
  entry.shortCode;
460
- // Static handler interception: use pre-rendered component from build-time store
461
- const entryAny = entry as any;
462
- if (entryAny.isStaticPrerender && entryAny.staticHandlerId) {
463
- const staticComponent = await tryStaticLookup(
464
- entryAny.staticHandlerId,
465
- entry.shortCode,
466
- );
467
- if (staticComponent !== undefined) return staticComponent;
468
- }
469
735
  if (entry.type === "layout" || entry.type === "cache") {
470
- return typeof entry.handler === "function"
471
- ? handleHandlerResult(await entry.handler(context))
472
- : entry.handler;
736
+ const layoutComponent = await resolveLayoutComponent(entry, context);
737
+ doneHandler();
738
+ return layoutComponent;
739
+ }
740
+ const staticComponent = await tryStaticHandler(entry, entry.shortCode);
741
+ if (staticComponent !== undefined) {
742
+ doneHandler();
743
+ return staticComponent;
473
744
  }
474
745
  const routeEntry = entry as Extract<EntryData, { type: "route" }>;
746
+ // For Passthrough routes at runtime, use the live handler instead of
747
+ // the build handler. At build time (context.build === true), always
748
+ // use the build handler from routeEntry.handler.
749
+ const handler =
750
+ !context.build && routeEntry.liveHandler
751
+ ? routeEntry.liveHandler
752
+ : routeEntry.handler;
475
753
  if (!routeEntry.loading) {
476
- return handleHandlerResult(await routeEntry.handler(context));
754
+ const result = handleHandlerResult(await handler(context));
755
+ doneHandler();
756
+ return result;
477
757
  }
478
758
  if (!actionContext) {
479
- const result = handleHandlerResult(routeEntry.handler(context));
480
- return {
481
- content:
482
- result instanceof Promise ? deps.trackHandler(result) : result,
483
- };
759
+ const result = handleHandlerResult(handler(context));
760
+ if (result instanceof Promise) {
761
+ result.finally(doneHandler).catch(() => {});
762
+ const tracked = deps.trackHandler(result, {
763
+ segmentId: entry.shortCode,
764
+ segmentType: entry.type,
765
+ });
766
+ observeStreamedHandler(
767
+ tracked,
768
+ entry.shortCode,
769
+ entry.type,
770
+ context.pathname,
771
+ routeKey,
772
+ params,
773
+ );
774
+ return { content: tracked };
775
+ }
776
+ doneHandler();
777
+ return { content: result };
484
778
  }
485
779
  debugLog("segment.action", "resolving action route with awaited value", {
486
780
  entryId: entry.id,
487
781
  });
782
+ const actionResult = handleHandlerResult(await handler(context));
783
+ doneHandler();
488
784
  return {
489
- content: Promise.resolve(
490
- handleHandlerResult(await routeEntry.handler(context)),
491
- ),
785
+ content: Promise.resolve(actionResult),
492
786
  };
493
787
  },
494
788
  () => null,
495
789
  );
496
790
 
791
+ // Normalize void handlers (undefined) to null so the reconciler's
792
+ // component === null checks work consistently for both void and explicit null.
497
793
  const resolvedComponent =
498
794
  component && typeof component === "object" && "content" in component
499
- ? (component as { content: ReactNode }).content
500
- : component;
795
+ ? ((component as { content: ReactNode }).content ?? null)
796
+ : (component ?? null);
501
797
 
502
798
  const segment: ResolvedSegment = {
503
799
  id: entry.shortCode,
@@ -514,6 +810,7 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
514
810
  ? { layoutName: entry.id }
515
811
  : {}),
516
812
  ...(entry.mountPath ? { mountPath: entry.mountPath } : {}),
813
+ _handlerRan: handlerRan,
517
814
  };
518
815
 
519
816
  return { segment, matchedId };
@@ -594,42 +891,43 @@ export async function resolveSegmentWithRevalidation<TEnv>(
594
891
  prevUrl,
595
892
  nextUrl,
596
893
  routeKey,
597
- loaderPromises,
598
894
  true,
599
895
  deps,
600
896
  actionContext,
601
897
  stale,
898
+ entry,
602
899
  );
603
900
  segments.push(...orphanResult.segments);
604
901
  matchedIds.push(...orphanResult.matchedIds);
605
902
  }
606
903
  }
607
904
 
608
- const parallelResult = await resolveParallelSegmentsWithRevalidation(
609
- entry,
610
- params,
611
- context,
612
- belongsToRoute,
613
- clientSegmentIds,
614
- prevParams,
615
- request,
616
- prevUrl,
617
- nextUrl,
618
- routeKey,
619
- deps,
620
- actionContext,
621
- stale,
622
- );
623
- segments.push(...parallelResult.segments);
624
- matchedIds.push(...parallelResult.matchedIds);
625
-
626
- // Push handler BEFORE orphan layouts for layout/cache entries (matching SSR
627
- // order in resolveSegment). Route handler was already executed and is pushed
628
- // after children for tree composition.
629
905
  if (routeHandlerResult) {
906
+ // Route entry: handler already executed above; resolve parallels
907
+ // (handler data visible) then push handler segment last for tree order.
908
+ const parallelResult = await resolveParallelSegmentsWithRevalidation(
909
+ entry,
910
+ params,
911
+ context,
912
+ belongsToRoute,
913
+ clientSegmentIds,
914
+ prevParams,
915
+ request,
916
+ prevUrl,
917
+ nextUrl,
918
+ routeKey,
919
+ deps,
920
+ actionContext,
921
+ stale,
922
+ );
923
+ segments.push(...parallelResult.segments);
924
+ matchedIds.push(...parallelResult.matchedIds);
925
+
630
926
  segments.push(routeHandlerResult.segment);
631
927
  matchedIds.push(routeHandlerResult.matchedId);
632
928
  } else {
929
+ // Layout/cache entry: handler-first — resolve handler before parallels
930
+ // so ctx.set() values are visible to parallel children.
633
931
  const handlerResult = await resolveEntryHandlerWithRevalidation(
634
932
  entry,
635
933
  params,
@@ -647,9 +945,25 @@ export async function resolveSegmentWithRevalidation<TEnv>(
647
945
  );
648
946
  segments.push(handlerResult.segment);
649
947
  matchedIds.push(handlerResult.matchedId);
650
- }
651
948
 
652
- if (entry.type === "layout" || entry.type === "cache") {
949
+ const parallelResult = await resolveParallelSegmentsWithRevalidation(
950
+ entry,
951
+ params,
952
+ context,
953
+ belongsToRoute,
954
+ clientSegmentIds,
955
+ prevParams,
956
+ request,
957
+ prevUrl,
958
+ nextUrl,
959
+ routeKey,
960
+ deps,
961
+ actionContext,
962
+ stale,
963
+ );
964
+ segments.push(...parallelResult.segments);
965
+ matchedIds.push(...parallelResult.matchedIds);
966
+
653
967
  for (const orphan of entry.layout) {
654
968
  const orphanResult = await resolveOrphanLayoutWithRevalidation(
655
969
  orphan,
@@ -661,7 +975,6 @@ export async function resolveSegmentWithRevalidation<TEnv>(
661
975
  prevUrl,
662
976
  nextUrl,
663
977
  routeKey,
664
- loaderPromises,
665
978
  false,
666
979
  deps,
667
980
  actionContext,
@@ -688,11 +1001,12 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
688
1001
  prevUrl: URL,
689
1002
  nextUrl: URL,
690
1003
  routeKey: string,
691
- loaderPromises: Map<string, Promise<any>>,
692
1004
  belongsToRoute: boolean,
693
1005
  deps: SegmentResolutionDeps<TEnv>,
694
1006
  actionContext?: ActionContext,
695
1007
  stale?: boolean,
1008
+ /** Parent route entry — its loaders are inherited so parallel slots can access them. */
1009
+ parentRouteEntry?: EntryData,
696
1010
  ): Promise<SegmentRevalidationResult> {
697
1011
  invariant(
698
1012
  orphan.type === "layout" || orphan.type === "cache",
@@ -720,14 +1034,16 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
720
1034
  segments.push(...loaderResult.segments);
721
1035
  matchedIds.push(...loaderResult.matchedIds);
722
1036
 
723
- for (const parallelEntry of orphan.parallel) {
724
- invariant(
725
- parallelEntry.type === "parallel",
726
- `Expected parallel entry, got: ${parallelEntry.type}`,
727
- );
728
-
729
- const loaderResult = await resolveLoadersWithRevalidation(
730
- parallelEntry,
1037
+ // Inherit parent route's loaders so parallel slots inside this layout
1038
+ // can access them via useLoader(). See resolveOrphanLayout in fresh.ts.
1039
+ if (
1040
+ parentRouteEntry &&
1041
+ parentRouteEntry.loader &&
1042
+ parentRouteEntry.loader.length > 0 &&
1043
+ Object.keys(orphan.parallel).length > 0
1044
+ ) {
1045
+ const inheritedResult = await resolveLoadersWithRevalidation(
1046
+ parentRouteEntry,
731
1047
  context,
732
1048
  belongsToRoute,
733
1049
  clientSegmentIds,
@@ -738,107 +1054,37 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
738
1054
  routeKey,
739
1055
  deps,
740
1056
  actionContext,
741
- undefined,
1057
+ orphan.shortCode,
742
1058
  stale,
743
1059
  );
744
- segments.push(...loaderResult.segments);
745
- matchedIds.push(...loaderResult.matchedIds);
746
-
747
- const slots = parallelEntry.handler as Record<
748
- `@${string}`,
749
- | ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
750
- | ReactNode
751
- >;
752
-
753
- for (const [slot, handler] of Object.entries(slots)) {
754
- // Use orphan.shortCode (the parent layout) to match the SSR path
755
- // (resolveParallelEntry receives parentShortCode = orphan.shortCode).
756
- // Using parallelEntry.shortCode would generate IDs the client doesn't know about.
757
- const parallelId = `${orphan.shortCode}.${slot}`;
758
- matchedIds.push(parallelId);
759
-
760
- const shouldResolve = await (async () => {
761
- if (!clientSegmentIds.has(parallelId)) return true;
762
-
763
- const dummySegment: ResolvedSegment = {
764
- id: parallelId,
765
- namespace: parallelEntry.id,
766
- type: "parallel",
767
- index: 0,
768
- component: null as any,
769
- params,
770
- slot,
771
- belongsToRoute,
772
- parallelName: `${parallelEntry.id}.${slot}`,
773
- ...(parallelEntry.mountPath
774
- ? { mountPath: parallelEntry.mountPath }
775
- : {}),
776
- };
777
-
778
- return await evaluateRevalidation({
779
- segment: dummySegment,
780
- prevParams,
781
- getPrevSegment: null,
782
- request,
783
- prevUrl,
784
- nextUrl,
785
- revalidations: parallelEntry.revalidate.map((fn, i) => ({
786
- name: `revalidate${i}`,
787
- fn,
788
- })),
789
- routeKey,
790
- context,
791
- actionContext,
792
- stale,
793
- });
794
- })();
795
-
796
- let component: ReactNode | undefined;
797
- // Static handler interception for individual parallel slots
798
- const slotStaticId = (parallelEntry as any).staticHandlerIds?.[slot];
799
- if (slotStaticId && shouldResolve) {
800
- component = await tryStaticLookup(slotStaticId, parallelId);
801
- }
802
- if (component === undefined) {
803
- const hasLoadingFallback =
804
- parallelEntry.loading !== undefined &&
805
- parallelEntry.loading !== false;
806
- if (!shouldResolve) {
807
- component = null;
808
- } else if (hasLoadingFallback) {
809
- component = (
810
- typeof handler === "function" ? handler(context) : handler
811
- ) as ReactNode;
812
- } else {
813
- component =
814
- typeof handler === "function" ? await handler(context) : handler;
815
- }
816
- }
817
-
818
- segments.push({
819
- id: parallelId,
820
- namespace: parallelEntry.id,
821
- type: "parallel",
822
- index: 0,
823
- component,
824
- loading: parallelEntry.loading === false ? null : parallelEntry.loading,
825
- transition: parallelEntry.transition,
826
- params,
827
- slot,
828
- belongsToRoute,
829
- parallelName: `${parallelEntry.id}.${slot}`,
830
- ...(parallelEntry.mountPath
831
- ? { mountPath: parallelEntry.mountPath }
832
- : {}),
833
- });
1060
+ // Tag as inherited so buildMatchResult can deduplicate when safe
1061
+ for (const s of inheritedResult.segments) {
1062
+ s._inherited = true;
834
1063
  }
1064
+ segments.push(...inheritedResult.segments);
1065
+ matchedIds.push(...inheritedResult.matchedIds);
835
1066
  }
836
1067
 
1068
+ // Handler-first: resolve orphan layout handler before its parallels
1069
+ // so ctx.set() values are visible to parallel children.
837
1070
  matchedIds.push(orphan.shortCode);
838
1071
 
839
1072
  const component = await revalidate(
840
1073
  async () => {
841
- if (!clientSegmentIds.has(orphan.shortCode)) return true;
1074
+ if (!clientSegmentIds.has(orphan.shortCode)) {
1075
+ if (isTraceActive()) {
1076
+ pushRevalidationTraceEntry({
1077
+ segmentId: orphan.shortCode,
1078
+ segmentType: "layout",
1079
+ belongsToRoute,
1080
+ source: "orphan-layout",
1081
+ defaultShouldRevalidate: true,
1082
+ finalShouldRevalidate: true,
1083
+ reason: "new-segment",
1084
+ });
1085
+ }
1086
+ return true;
1087
+ }
842
1088
 
843
1089
  const dummySegment: ResolvedSegment = {
844
1090
  id: orphan.shortCode,
@@ -852,7 +1098,7 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
852
1098
  ...(orphan.mountPath ? { mountPath: orphan.mountPath } : {}),
853
1099
  };
854
1100
 
855
- return await evaluateRevalidation({
1101
+ const shouldRevalidate = await evaluateRevalidation({
856
1102
  segment: dummySegment,
857
1103
  prevParams,
858
1104
  getPrevSegment: null,
@@ -867,22 +1113,17 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
867
1113
  context,
868
1114
  actionContext,
869
1115
  stale,
1116
+ traceSource: "orphan-layout",
870
1117
  });
1118
+ emitRevalidationDecision(
1119
+ orphan.shortCode,
1120
+ context.pathname,
1121
+ routeKey,
1122
+ shouldRevalidate,
1123
+ );
1124
+ return shouldRevalidate;
871
1125
  },
872
- async () => {
873
- // Static handler interception for orphan layouts
874
- const orphanAny = orphan as any;
875
- if (orphanAny.isStaticPrerender && orphanAny.staticHandlerId) {
876
- const staticComponent = await tryStaticLookup(
877
- orphanAny.staticHandlerId,
878
- orphan.shortCode,
879
- );
880
- if (staticComponent !== undefined) return staticComponent;
881
- }
882
- return typeof orphan.handler === "function"
883
- ? handleHandlerResult(await orphan.handler(context))
884
- : orphan.handler;
885
- },
1126
+ async () => resolveLayoutComponent(orphan, context),
886
1127
  () => null,
887
1128
  );
888
1129
 
@@ -900,136 +1141,172 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
900
1141
  ...(orphan.mountPath ? { mountPath: orphan.mountPath } : {}),
901
1142
  });
902
1143
 
903
- return { segments, matchedIds };
904
- }
905
-
906
- /**
907
- * Wrapper for segment resolution with revalidation that adds error boundary handling.
908
- */
909
- export async function resolveWithRevalidationErrorHandling<TEnv>(
910
- entry: EntryData,
911
- params: Record<string, string>,
912
- resolveFn: () => Promise<SegmentRevalidationResult>,
913
- deps: SegmentResolutionDeps<TEnv>,
914
- pathname?: string,
915
- errorContext?: {
916
- request: Request;
917
- url: URL;
918
- routeKey?: string;
919
- env?: TEnv;
920
- isPartial?: boolean;
921
- requestStartTime?: number;
922
- },
923
- ): Promise<SegmentRevalidationResult> {
924
- try {
925
- return await resolveFn();
926
- } catch (error) {
927
- if (error instanceof Response) {
928
- throw error;
929
- }
930
-
931
- if (error instanceof DataNotFoundError) {
932
- const notFoundFallback = deps.findNearestNotFoundBoundary(entry);
933
-
934
- if (notFoundFallback) {
935
- const notFoundInfo = createNotFoundInfo(
936
- error,
937
- entry.shortCode,
938
- entry.type,
939
- pathname,
940
- );
941
-
942
- if (errorContext) {
943
- deps.callOnError(error, "handler", {
944
- request: errorContext.request,
945
- url: errorContext.url,
946
- routeKey: errorContext.routeKey,
947
- params,
948
- segmentId: entry.shortCode,
949
- segmentType: entry.type as any,
950
- env: errorContext.env,
951
- isPartial: errorContext.isPartial,
952
- handledByBoundary: true,
953
- metadata: { notFound: true, message: notFoundInfo.message },
954
- requestStartTime: errorContext.requestStartTime,
955
- });
956
- }
957
-
958
- debugLog("segment", "notFound boundary handled error", {
959
- segmentId: entry.shortCode,
960
- message: notFoundInfo.message,
961
- });
962
-
963
- const reqCtx = getRequestContext();
964
- if (reqCtx) {
965
- reqCtx.res = new Response(null, {
966
- status: 404,
967
- headers: reqCtx.res.headers,
968
- });
969
- }
970
-
971
- const notFoundSegment = createNotFoundSegment(
972
- notFoundInfo,
973
- notFoundFallback,
974
- entry,
975
- params,
976
- );
1144
+ const resolvedParallelEntries = new Set<string>();
1145
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
1146
+ orphan.parallel,
1147
+ )) {
1148
+ invariant(
1149
+ parallelEntry.type === "parallel",
1150
+ `Expected parallel entry, got: ${parallelEntry.type}`,
1151
+ );
977
1152
 
978
- return {
979
- segments: [notFoundSegment],
980
- matchedIds: [notFoundSegment.id],
981
- };
982
- }
1153
+ if (!resolvedParallelEntries.has(parallelEntry.id)) {
1154
+ // shortCodeOverride must match the parent layout, not the parallel entry.
1155
+ const loaderResult = await resolveLoadersWithRevalidation(
1156
+ parallelEntry,
1157
+ context,
1158
+ belongsToRoute,
1159
+ clientSegmentIds,
1160
+ prevParams,
1161
+ request,
1162
+ prevUrl,
1163
+ nextUrl,
1164
+ routeKey,
1165
+ deps,
1166
+ actionContext,
1167
+ orphan.shortCode,
1168
+ stale,
1169
+ );
1170
+ segments.push(...loaderResult.segments);
1171
+ matchedIds.push(...loaderResult.matchedIds);
1172
+ resolvedParallelEntries.add(parallelEntry.id);
983
1173
  }
984
1174
 
985
- const fallback = deps.findNearestErrorBoundary(entry);
986
- const segmentType: ErrorInfo["segmentType"] = entry.type;
987
- const errorInfo = createErrorInfo(error, entry.shortCode, segmentType);
988
- const effectiveFallback = fallback ?? DefaultErrorFallback;
1175
+ const slots = parallelEntry.handler as Record<
1176
+ `@${string}`,
1177
+ | ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
1178
+ | ReactNode
1179
+ >;
1180
+ // Handler may be undefined in production after static handler eviction.
1181
+ const handler = slots[slot];
1182
+
1183
+ // Use orphan.shortCode (the parent layout) to match the SSR path
1184
+ // (resolveParallelEntry receives parentShortCode = orphan.shortCode).
1185
+ // Using parallelEntry.shortCode would generate IDs the client doesn't know about.
1186
+ const parallelId = `${orphan.shortCode}.${slot}`;
1187
+ matchedIds.push(parallelId);
1188
+
1189
+ const isFullRefetch = clientSegmentIds.size === 0;
1190
+ let shouldResolve: boolean;
1191
+ if (isFullRefetch) {
1192
+ // Same load-bearing rationale as the main parallel path: full refetch
1193
+ // means the client has nothing to fall back to, so the slot must render.
1194
+ traceFullRefetchedParallelSlot(parallelId, belongsToRoute);
1195
+ shouldResolve = true;
1196
+ } else {
1197
+ // When slot is unknown to the client, seed the soft chain with `true`
1198
+ // (orphan parallels always belong to the route — we want them rendered
1199
+ // unless the user explicitly opts out via revalidate()).
1200
+ const defaultOverride = clientSegmentIds.has(parallelId)
1201
+ ? undefined
1202
+ : { value: true, reason: "new-segment" };
989
1203
 
990
- if (errorContext) {
991
- deps.callOnError(error, "handler", {
992
- request: errorContext.request,
993
- url: errorContext.url,
994
- routeKey: errorContext.routeKey,
1204
+ const dummySegment: ResolvedSegment = {
1205
+ id: parallelId,
1206
+ namespace: parallelEntry.id,
1207
+ type: "parallel",
1208
+ index: 0,
1209
+ component: null as any,
995
1210
  params,
996
- segmentId: entry.shortCode,
997
- segmentType: entry.type as any,
998
- env: errorContext.env,
999
- isPartial: errorContext.isPartial,
1000
- handledByBoundary: !!fallback,
1001
- requestStartTime: errorContext.requestStartTime,
1211
+ slot,
1212
+ belongsToRoute,
1213
+ parallelName: `${parallelEntry.id}.${slot}`,
1214
+ ...(parallelEntry.mountPath
1215
+ ? { mountPath: parallelEntry.mountPath }
1216
+ : {}),
1217
+ };
1218
+
1219
+ shouldResolve = await evaluateRevalidation({
1220
+ segment: dummySegment,
1221
+ prevParams,
1222
+ getPrevSegment: null,
1223
+ request,
1224
+ prevUrl,
1225
+ nextUrl,
1226
+ revalidations: parallelEntry.revalidate.map((fn, i) => ({
1227
+ name: `revalidate${i}`,
1228
+ fn,
1229
+ })),
1230
+ routeKey,
1231
+ context,
1232
+ actionContext,
1233
+ stale,
1234
+ traceSource: "parallel",
1235
+ defaultOverride,
1002
1236
  });
1003
1237
  }
1238
+ emitRevalidationDecision(
1239
+ parallelId,
1240
+ context.pathname,
1241
+ routeKey,
1242
+ shouldResolve,
1243
+ );
1004
1244
 
1005
- debugLog("segment", "error boundary handled error", {
1006
- segmentId: entry.shortCode,
1007
- boundary: fallback ? "custom" : "default",
1008
- message: errorInfo.message,
1009
- });
1010
-
1011
- {
1012
- const reqCtx = getRequestContext();
1013
- if (reqCtx) {
1014
- reqCtx.res = new Response(null, {
1015
- status: 500,
1016
- headers: reqCtx.res.headers,
1017
- });
1245
+ let component: ReactNode | undefined;
1246
+ let handlerRan = false;
1247
+ if (shouldResolve) {
1248
+ component = await tryStaticSlot(parallelEntry, slot, parallelId);
1249
+ }
1250
+ if (component === undefined) {
1251
+ const hasLoadingFallback =
1252
+ parallelEntry.loading !== undefined && parallelEntry.loading !== false;
1253
+ if (!shouldResolve) {
1254
+ component = null;
1255
+ } else if (handler === undefined) {
1256
+ // Handler evicted (production static slot) but static lookup missed.
1257
+ component = null;
1258
+ } else {
1259
+ // Slot-keyed pushes — see resolveParallelSegmentsWithRevalidation.
1260
+ (context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
1261
+ parallelId;
1262
+ handlerRan = true;
1263
+ if (hasLoadingFallback) {
1264
+ const result =
1265
+ typeof handler === "function" ? handler(context) : handler;
1266
+ if (result instanceof Promise) {
1267
+ const tracked = deps.trackHandler(result, {
1268
+ segmentId: parallelId,
1269
+ segmentType: "parallel",
1270
+ });
1271
+ observeStreamedHandler(
1272
+ tracked,
1273
+ parallelId,
1274
+ "parallel",
1275
+ context.pathname,
1276
+ routeKey,
1277
+ params,
1278
+ );
1279
+ component = tracked as ReactNode;
1280
+ } else {
1281
+ component = result as ReactNode;
1282
+ }
1283
+ } else {
1284
+ component =
1285
+ typeof handler === "function" ? await handler(context) : handler;
1286
+ }
1018
1287
  }
1019
1288
  }
1020
1289
 
1021
- const errorSegment = createErrorSegment(
1022
- errorInfo,
1023
- effectiveFallback,
1024
- entry,
1290
+ segments.push({
1291
+ id: parallelId,
1292
+ namespace: parallelEntry.id,
1293
+ type: "parallel",
1294
+ index: 0,
1295
+ component,
1296
+ loading: parallelEntry.loading === false ? null : parallelEntry.loading,
1297
+ transition: parallelEntry.transition,
1025
1298
  params,
1026
- );
1027
-
1028
- return {
1029
- segments: [errorSegment],
1030
- matchedIds: [errorSegment.id],
1031
- };
1299
+ slot,
1300
+ _handlerRan: handlerRan,
1301
+ belongsToRoute,
1302
+ parallelName: `${parallelEntry.id}.${slot}`,
1303
+ ...(parallelEntry.mountPath
1304
+ ? { mountPath: parallelEntry.mountPath }
1305
+ : {}),
1306
+ });
1032
1307
  }
1308
+
1309
+ return { segments, matchedIds };
1033
1310
  }
1034
1311
 
1035
1312
  /**
@@ -1051,12 +1328,15 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
1051
1328
  localRouteName: string,
1052
1329
  pathname: string,
1053
1330
  deps: SegmentResolutionDeps<TEnv>,
1331
+ stale?: boolean,
1054
1332
  ): Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }> {
1055
1333
  const allSegments: ResolvedSegment[] = [];
1056
1334
  const matchedIds: string[] = [];
1057
1335
  const seenSegIds = new Set<string>();
1058
1336
  const seenMatchIds = new Set<string>();
1059
1337
 
1338
+ const telemetry = getRouterContext()?.telemetry;
1339
+
1060
1340
  for (const entry of entries) {
1061
1341
  if (entry.type === "route" && interceptResult) {
1062
1342
  debugLog(
@@ -1075,7 +1355,12 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
1075
1355
  }
1076
1356
 
1077
1357
  const nonParallelEntry = entry as Exclude<EntryData, { type: "parallel" }>;
1078
- const resolved = await resolveWithRevalidationErrorHandling(
1358
+ if (entry.type === "cache") {
1359
+ const store = RSCRouterContext.getStore();
1360
+ if (store) store.insideCacheScope = true;
1361
+ }
1362
+ const doneEntry = track(`segment:${entry.id}`, 1);
1363
+ const resolved = await resolveWithErrorBoundary(
1079
1364
  nonParallelEntry,
1080
1365
  params,
1081
1366
  () =>
@@ -1092,11 +1377,14 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
1092
1377
  loaderPromises,
1093
1378
  deps,
1094
1379
  actionContext,
1095
- false,
1380
+ stale,
1096
1381
  ),
1382
+ (seg) => ({ segments: [seg], matchedIds: [seg.id] }),
1097
1383
  deps,
1384
+ { request, url: context.url, routeKey, isPartial: true, telemetry },
1098
1385
  pathname,
1099
1386
  );
1387
+ doneEntry();
1100
1388
 
1101
1389
  // Deduplicate segments and matchedIds by ID, matching resolveAllSegments.
1102
1390
  // include() scopes can produce entries that resolve the same shared