@rangojs/router 0.0.0-experimental.18 → 0.0.0-experimental.1878aa49

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 (1030) hide show
  1. package/{CLAUDE.md → AGENTS.md} +4 -0
  2. package/README.md +91 -19
  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 +348 -80
  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 +883 -444
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/dist/vite/virtual-entries.js +110 -0
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +17 -16
  809. package/skills/breadcrumbs/SKILL.md +250 -0
  810. package/skills/cache-guide/SKILL.md +32 -0
  811. package/skills/caching/SKILL.md +49 -8
  812. package/skills/document-cache/SKILL.md +2 -2
  813. package/skills/hooks/SKILL.md +34 -32
  814. package/skills/host-router/SKILL.md +218 -0
  815. package/skills/intercept/SKILL.md +79 -0
  816. package/skills/layout/SKILL.md +62 -2
  817. package/skills/links/SKILL.md +3 -1
  818. package/skills/loader/SKILL.md +166 -23
  819. package/skills/middleware/SKILL.md +83 -0
  820. package/skills/parallel/SKILL.md +183 -2
  821. package/skills/prerender/SKILL.md +189 -19
  822. package/skills/rango/SKILL.md +0 -1
  823. package/skills/route/SKILL.md +76 -5
  824. package/skills/router-setup/SKILL.md +172 -5
  825. package/skills/typesafety/SKILL.md +35 -23
  826. package/src/__internal.ts +93 -1
  827. package/src/bin/rango.ts +56 -19
  828. package/src/browser/action-coordinator.ts +97 -0
  829. package/src/browser/app-version.ts +14 -0
  830. package/src/browser/event-controller.ts +30 -27
  831. package/src/browser/history-state.ts +80 -0
  832. package/src/browser/intercept-utils.ts +1 -1
  833. package/src/browser/link-interceptor.ts +4 -3
  834. package/src/browser/merge-segment-loaders.ts +9 -2
  835. package/src/browser/navigation-bridge.ts +160 -31
  836. package/src/browser/navigation-client.ts +141 -88
  837. package/src/browser/navigation-store.ts +44 -39
  838. package/src/browser/navigation-transaction.ts +55 -214
  839. package/src/browser/partial-update.ts +181 -164
  840. package/src/browser/prefetch/cache.ts +206 -0
  841. package/src/browser/prefetch/fetch.ts +150 -0
  842. package/src/browser/prefetch/policy.ts +48 -0
  843. package/src/browser/prefetch/queue.ts +160 -0
  844. package/src/browser/prefetch/resource-ready.ts +77 -0
  845. package/src/browser/react/Link.tsx +97 -36
  846. package/src/browser/react/NavigationProvider.tsx +49 -5
  847. package/src/browser/react/context.ts +7 -2
  848. package/src/browser/react/index.ts +2 -6
  849. package/src/browser/react/location-state-shared.ts +1 -1
  850. package/src/browser/react/location-state.ts +2 -0
  851. package/src/browser/react/nonce-context.ts +23 -0
  852. package/src/browser/react/use-action.ts +9 -1
  853. package/src/browser/react/use-handle.ts +3 -25
  854. package/src/browser/react/use-params.ts +2 -4
  855. package/src/browser/react/use-pathname.ts +2 -3
  856. package/src/browser/react/use-router.ts +22 -9
  857. package/src/browser/react/use-search-params.ts +2 -1
  858. package/src/browser/react/use-segments.ts +7 -60
  859. package/src/browser/response-adapter.ts +73 -0
  860. package/src/browser/rsc-router.tsx +154 -64
  861. package/src/browser/scroll-restoration.ts +37 -37
  862. package/src/browser/segment-reconciler.ts +6 -1
  863. package/src/browser/server-action-bridge.ts +463 -426
  864. package/src/browser/types.ts +61 -36
  865. package/src/browser/validate-redirect-origin.ts +29 -0
  866. package/src/build/generate-manifest.ts +8 -0
  867. package/src/build/generate-route-types.ts +7 -0
  868. package/src/build/route-trie.ts +19 -3
  869. package/src/build/route-types/codegen.ts +13 -4
  870. package/src/build/route-types/include-resolution.ts +21 -1
  871. package/src/build/route-types/per-module-writer.ts +15 -3
  872. package/src/build/route-types/router-processing.ts +391 -90
  873. package/src/build/runtime-discovery.ts +13 -1
  874. package/src/cache/background-task.ts +34 -0
  875. package/src/cache/cache-key-utils.ts +44 -0
  876. package/src/cache/cache-policy.ts +125 -0
  877. package/src/cache/cache-runtime.ts +136 -96
  878. package/src/cache/cache-scope.ts +119 -80
  879. package/src/cache/cf/cf-cache-store.ts +462 -15
  880. package/src/cache/cf/index.ts +5 -1
  881. package/src/cache/document-cache.ts +88 -53
  882. package/src/cache/handle-capture.ts +81 -0
  883. package/src/cache/index.ts +1 -0
  884. package/src/cache/memory-segment-store.ts +18 -7
  885. package/src/cache/profile-registry.ts +43 -8
  886. package/src/cache/read-through-swr.ts +134 -0
  887. package/src/cache/segment-codec.ts +101 -112
  888. package/src/cache/taint.ts +81 -0
  889. package/src/client.rsc.tsx +2 -1
  890. package/src/client.tsx +54 -76
  891. package/src/context-var.ts +72 -2
  892. package/src/debug.ts +2 -2
  893. package/src/errors.ts +6 -1
  894. package/src/handle.ts +1 -1
  895. package/src/handles/MetaTags.tsx +5 -2
  896. package/src/handles/breadcrumbs.ts +66 -0
  897. package/src/handles/index.ts +1 -0
  898. package/src/host/cookie-handler.ts +8 -3
  899. package/src/host/index.ts +0 -3
  900. package/src/host/router.ts +14 -1
  901. package/src/href-client.ts +3 -1
  902. package/src/index.rsc.ts +24 -23
  903. package/src/index.ts +45 -52
  904. package/src/loader.rsc.ts +12 -4
  905. package/src/loader.ts +8 -0
  906. package/src/prerender/store.ts +60 -18
  907. package/src/prerender.ts +76 -18
  908. package/src/reverse.ts +11 -7
  909. package/src/root-error-boundary.tsx +30 -26
  910. package/src/route-definition/dsl-helpers.ts +41 -13
  911. package/src/route-definition/helpers-types.ts +6 -5
  912. package/src/route-definition/index.ts +0 -3
  913. package/src/route-definition/redirect.ts +24 -4
  914. package/src/route-map-builder.ts +45 -3
  915. package/src/route-name.ts +53 -0
  916. package/src/route-types.ts +7 -0
  917. package/src/router/content-negotiation.ts +1 -1
  918. package/src/router/debug-manifest.ts +16 -3
  919. package/src/router/find-match.ts +4 -2
  920. package/src/router/handler-context.ts +159 -34
  921. package/src/router/intercept-resolution.ts +17 -8
  922. package/src/router/lazy-includes.ts +8 -1
  923. package/src/router/loader-resolution.ts +11 -3
  924. package/src/router/logging.ts +104 -4
  925. package/src/router/manifest.ts +45 -7
  926. package/src/router/match-api.ts +62 -8
  927. package/src/router/match-context.ts +3 -0
  928. package/src/router/match-handlers.ts +185 -11
  929. package/src/router/match-middleware/background-revalidation.ts +94 -86
  930. package/src/router/match-middleware/cache-lookup.ts +138 -13
  931. package/src/router/match-middleware/cache-store.ts +55 -10
  932. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  933. package/src/router/match-middleware/segment-resolution.ts +8 -5
  934. package/src/router/match-pipelines.ts +8 -43
  935. package/src/router/match-result.ts +22 -15
  936. package/src/router/metrics.ts +238 -13
  937. package/src/router/middleware-types.ts +60 -12
  938. package/src/router/middleware.ts +214 -42
  939. package/src/router/pattern-matching.ts +61 -10
  940. package/src/router/prerender-match.ts +40 -8
  941. package/src/router/preview-match.ts +7 -1
  942. package/src/router/revalidation.ts +87 -8
  943. package/src/router/router-context.ts +20 -0
  944. package/src/router/router-interfaces.ts +73 -5
  945. package/src/router/router-options.ts +250 -19
  946. package/src/router/segment-resolution/fresh.ts +277 -45
  947. package/src/router/segment-resolution/helpers.ts +49 -25
  948. package/src/router/segment-resolution/loader-cache.ts +38 -146
  949. package/src/router/segment-resolution/revalidation.ts +619 -275
  950. package/src/router/segment-wrappers.ts +5 -0
  951. package/src/router/telemetry-otel.ts +299 -0
  952. package/src/router/telemetry.ts +300 -0
  953. package/src/router/timeout.ts +148 -0
  954. package/src/router/trie-matching.ts +20 -2
  955. package/src/router/types.ts +8 -1
  956. package/src/router.ts +230 -25
  957. package/src/rsc/handler-context.ts +11 -0
  958. package/src/rsc/handler.ts +492 -96
  959. package/src/rsc/helpers.ts +25 -16
  960. package/src/rsc/index.ts +0 -20
  961. package/src/rsc/loader-fetch.ts +84 -42
  962. package/src/rsc/manifest-init.ts +5 -1
  963. package/src/rsc/origin-guard.ts +141 -0
  964. package/src/rsc/progressive-enhancement.ts +249 -19
  965. package/src/rsc/response-route-handler.ts +37 -26
  966. package/src/rsc/rsc-rendering.ts +40 -41
  967. package/src/rsc/runtime-warnings.ts +42 -0
  968. package/src/rsc/server-action.ts +150 -68
  969. package/src/rsc/ssr-setup.ts +128 -0
  970. package/src/rsc/types.ts +18 -1
  971. package/src/search-params.ts +38 -23
  972. package/src/segment-system.tsx +140 -4
  973. package/src/server/context.ts +187 -20
  974. package/src/server/fetchable-loader-store.ts +11 -6
  975. package/src/server/handle-store.ts +66 -9
  976. package/src/server/loader-registry.ts +20 -54
  977. package/src/server/request-context.ts +188 -41
  978. package/src/server.ts +6 -0
  979. package/src/ssr/index.tsx +66 -26
  980. package/src/static-handler.ts +7 -0
  981. package/src/theme/ThemeProvider.tsx +6 -1
  982. package/src/theme/index.ts +4 -18
  983. package/src/theme/theme-context.ts +1 -28
  984. package/src/theme/theme-script.ts +2 -1
  985. package/src/types/cache-types.ts +9 -4
  986. package/src/types/error-types.ts +3 -0
  987. package/src/types/global-namespace.ts +9 -0
  988. package/src/types/handler-context.ts +167 -55
  989. package/src/types/loader-types.ts +11 -5
  990. package/src/types/route-config.ts +17 -8
  991. package/src/types/route-entry.ts +35 -0
  992. package/src/types/segments.ts +2 -5
  993. package/src/urls/include-helper.ts +49 -8
  994. package/src/urls/index.ts +1 -0
  995. package/src/urls/path-helper-types.ts +30 -12
  996. package/src/urls/path-helper.ts +18 -3
  997. package/src/urls/pattern-types.ts +33 -1
  998. package/src/urls/response-types.ts +27 -2
  999. package/src/urls/type-extraction.ts +23 -15
  1000. package/src/use-loader.tsx +12 -4
  1001. package/src/vite/discovery/bundle-postprocess.ts +32 -52
  1002. package/src/vite/discovery/discover-routers.ts +53 -23
  1003. package/src/vite/discovery/prerender-collection.ts +58 -41
  1004. package/src/vite/discovery/route-types-writer.ts +7 -7
  1005. package/src/vite/discovery/state.ts +4 -9
  1006. package/src/vite/discovery/virtual-module-codegen.ts +5 -2
  1007. package/src/vite/index.ts +4 -3
  1008. package/src/vite/plugin-types.ts +0 -83
  1009. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  1010. package/src/vite/plugins/client-ref-hashing.ts +3 -3
  1011. package/src/vite/plugins/expose-action-id.ts +1 -3
  1012. package/src/vite/plugins/performance-tracks.ts +88 -0
  1013. package/src/vite/plugins/refresh-cmd.ts +65 -0
  1014. package/src/vite/plugins/use-cache-transform.ts +91 -3
  1015. package/src/vite/plugins/version-plugin.ts +13 -1
  1016. package/src/vite/rango.ts +172 -210
  1017. package/src/vite/router-discovery.ts +115 -44
  1018. package/src/vite/utils/banner.ts +3 -3
  1019. package/src/vite/utils/prerender-utils.ts +81 -0
  1020. package/src/vite/utils/shared-utils.ts +6 -3
  1021. package/skills/testing/SKILL.md +0 -226
  1022. package/src/browser/prefetch-cache.ts +0 -48
  1023. package/src/browser/prefetch-fetch.ts +0 -109
  1024. package/src/browser/prefetch-queue.ts +0 -81
  1025. package/src/browser/request-controller.ts +0 -164
  1026. package/src/route-definition/route-function.ts +0 -119
  1027. package/src/router.gen.ts +0 -6
  1028. package/src/static-handler.gen.ts +0 -5
  1029. package/src/urls.gen.ts +0 -8
  1030. /package/src/browser/{prefetch-observer.ts → prefetch/observer.ts} +0 -0
@@ -10,7 +10,11 @@ import type { ReactNode } from "react";
10
10
  import { invariant } from "../../errors";
11
11
  import { revalidate } from "../loader-resolution.js";
12
12
  import { evaluateRevalidation } from "../revalidation.js";
13
- import type { EntryData } from "../../server/context";
13
+ import {
14
+ getParallelEntries,
15
+ getParallelSlotEntries,
16
+ type EntryData,
17
+ } from "../../server/context";
14
18
  import type {
15
19
  HandlerContext,
16
20
  InternalHandlerContext,
@@ -22,7 +26,11 @@ import type {
22
26
  SegmentRevalidationResult,
23
27
  ActionContext,
24
28
  } from "../types.js";
25
- import { debugLog } from "../logging.js";
29
+ import {
30
+ debugLog,
31
+ pushRevalidationTraceEntry,
32
+ isTraceActive,
33
+ } from "../logging.js";
26
34
  import { resolveLoaderData } from "./loader-cache.js";
27
35
  import {
28
36
  handleHandlerResult,
@@ -31,6 +39,89 @@ import {
31
39
  resolveLayoutComponent,
32
40
  resolveWithErrorBoundary,
33
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
+ // Revalidation telemetry helper
94
+ // ---------------------------------------------------------------------------
95
+
96
+ /**
97
+ * Emit revalidation.decision telemetry for a segment if a sink is configured.
98
+ * Called after evaluateRevalidation returns to capture the decision.
99
+ * Silently no-ops when called outside RouterContext (e.g. in unit tests).
100
+ */
101
+ function emitRevalidationDecision(
102
+ segmentId: string,
103
+ pathname: string,
104
+ routeKey: string,
105
+ shouldRevalidate: boolean,
106
+ ): void {
107
+ let routerCtx;
108
+ try {
109
+ routerCtx = getRouterContext();
110
+ } catch {
111
+ return;
112
+ }
113
+ if (routerCtx?.telemetry) {
114
+ safeEmit(resolveSink(routerCtx.telemetry), {
115
+ type: "revalidation.decision",
116
+ timestamp: performance.now(),
117
+ requestId: routerCtx.requestId,
118
+ segmentId,
119
+ pathname,
120
+ routeKey,
121
+ shouldRevalidate,
122
+ });
123
+ }
124
+ }
34
125
 
35
126
  // ---------------------------------------------------------------------------
36
127
  // Revalidation path (partial match)
@@ -81,7 +172,20 @@ export async function resolveLoadersWithRevalidation<TEnv>(
81
172
  }) => {
82
173
  const shouldRun = await revalidate(
83
174
  async () => {
84
- if (!clientSegmentIds.has(segmentId)) return true;
175
+ if (!clientSegmentIds.has(segmentId)) {
176
+ if (isTraceActive()) {
177
+ pushRevalidationTraceEntry({
178
+ segmentId,
179
+ segmentType: "loader",
180
+ belongsToRoute,
181
+ source: "loader",
182
+ defaultShouldRevalidate: true,
183
+ finalShouldRevalidate: true,
184
+ reason: "new-segment",
185
+ });
186
+ }
187
+ return true;
188
+ }
85
189
 
86
190
  const dummySegment: ResolvedSegment = {
87
191
  id: segmentId,
@@ -109,11 +213,13 @@ export async function resolveLoadersWithRevalidation<TEnv>(
109
213
  context: ctx,
110
214
  actionContext,
111
215
  stale,
216
+ traceSource: "loader",
112
217
  });
113
218
  },
114
219
  async () => true,
115
220
  () => false,
116
221
  );
222
+ emitRevalidationDecision(segmentId, ctx.pathname, routeKey, shouldRun);
117
223
  return { shouldRun, loaderEntry, loader, segmentId, index };
118
224
  },
119
225
  ),
@@ -130,7 +236,9 @@ export async function resolveLoadersWithRevalidation<TEnv>(
130
236
  params: ctx.params,
131
237
  loaderId: loader.$$id,
132
238
  loaderData: deps.wrapLoaderPromise(
133
- resolveLoaderData(loaderEntry, ctx, ctx.pathname),
239
+ runInsideLoaderScope(() =>
240
+ resolveLoaderData(loaderEntry, ctx, ctx.pathname),
241
+ ),
134
242
  entry,
135
243
  segmentId,
136
244
  ctx.pathname,
@@ -156,27 +264,66 @@ export async function resolveLoadersOnlyWithRevalidation<TEnv>(
156
264
  routeKey: string,
157
265
  deps: SegmentResolutionDeps<TEnv>,
158
266
  actionContext?: ActionContext,
267
+ stale?: boolean,
159
268
  ): Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }> {
160
269
  const allLoaderSegments: ResolvedSegment[] = [];
161
270
  const allMatchedIds: string[] = [];
271
+ const seenIds = new Set<string>();
272
+
273
+ async function collectEntryLoaders(
274
+ entry: EntryData,
275
+ belongsToRoute: boolean,
276
+ shortCodeOverride?: string,
277
+ ): Promise<void> {
278
+ // Skip if all loaders from this entry have already been resolved
279
+ // via a parent (e.g., cache boundary wrapping a layout with shared loaders).
280
+ const loaderEntries = entry.loader ?? [];
281
+ const sc = shortCodeOverride ?? entry.shortCode;
282
+ const allAlreadySeen =
283
+ loaderEntries.length > 0 &&
284
+ loaderEntries.every((le, i) =>
285
+ seenIds.has(`${sc}D${i}.${le.loader.$$id}`),
286
+ );
287
+ if (!allAlreadySeen) {
288
+ const { segments, matchedIds } = await resolveLoadersWithRevalidation(
289
+ entry,
290
+ context,
291
+ belongsToRoute,
292
+ clientSegmentIds,
293
+ prevParams,
294
+ request,
295
+ prevUrl,
296
+ nextUrl,
297
+ routeKey,
298
+ deps,
299
+ actionContext,
300
+ shortCodeOverride,
301
+ stale,
302
+ );
303
+ for (const seg of segments) {
304
+ if (!seenIds.has(seg.id)) {
305
+ seenIds.add(seg.id);
306
+ allLoaderSegments.push(seg);
307
+ }
308
+ }
309
+ allMatchedIds.push(...matchedIds);
310
+ }
311
+
312
+ const seenParallelEntryIds = new Set<string>();
313
+ for (const parallelEntry of getParallelEntries(entry.parallel)) {
314
+ if (seenParallelEntryIds.has(parallelEntry.id)) continue;
315
+ seenParallelEntryIds.add(parallelEntry.id);
316
+ await collectEntryLoaders(parallelEntry, belongsToRoute, entry.shortCode);
317
+ }
318
+
319
+ const childBelongsToRoute = belongsToRoute || entry.type === "route";
320
+ for (const layoutEntry of entry.layout) {
321
+ await collectEntryLoaders(layoutEntry, childBelongsToRoute);
322
+ }
323
+ }
162
324
 
163
325
  for (const entry of entries) {
164
- const belongsToRoute = entry.type === "route";
165
- const { segments, matchedIds } = await resolveLoadersWithRevalidation(
166
- entry,
167
- context,
168
- belongsToRoute,
169
- clientSegmentIds,
170
- prevParams,
171
- request,
172
- prevUrl,
173
- nextUrl,
174
- routeKey,
175
- deps,
176
- actionContext,
177
- );
178
- allLoaderSegments.push(...segments);
179
- allMatchedIds.push(...matchedIds);
326
+ await collectEntryLoaders(entry, entry.type === "route");
180
327
  }
181
328
 
182
329
  return { segments: allLoaderSegments, matchedIds: allMatchedIds };
@@ -200,22 +347,20 @@ export function buildEntryRevalidateMap(
200
347
  map.set(entry.shortCode, { entry, revalidate: entry.revalidate });
201
348
 
202
349
  if (entry.type !== "parallel") {
203
- for (const parallelEntry of entry.parallel) {
204
- if (parallelEntry.type === "parallel") {
205
- const slots = Object.keys(parallelEntry.handler) as `@${string}`[];
206
- for (const slot of slots) {
207
- const parallelId = `${parallelEntry.shortCode}.${slot}`;
208
- map.set(parallelId, {
209
- entry: parallelEntry,
210
- revalidate: parallelEntry.revalidate,
211
- });
212
- }
213
- }
350
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
351
+ entry.parallel,
352
+ )) {
353
+ const parallelParentShortCode = parentShortCode ?? entry.shortCode;
354
+ const parallelId = `${parallelParentShortCode}.${slot}`;
355
+ map.set(parallelId, {
356
+ entry: parallelEntry,
357
+ revalidate: parallelEntry.revalidate,
358
+ });
214
359
  }
215
360
  }
216
361
 
217
362
  for (const layoutEntry of entry.layout) {
218
- processEntry(layoutEntry);
363
+ processEntry(layoutEntry, entry.shortCode);
219
364
  }
220
365
  }
221
366
 
@@ -247,7 +392,10 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
247
392
  const segments: ResolvedSegment[] = [];
248
393
  const matchedIds: string[] = [];
249
394
 
250
- for (const parallelEntry of entry.parallel) {
395
+ const resolvedParallelEntries = new Set<string>();
396
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
397
+ entry.parallel,
398
+ )) {
251
399
  invariant(
252
400
  parallelEntry.type === "parallel",
253
401
  `Expected parallel entry, got: ${parallelEntry.type}`,
@@ -258,92 +406,61 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
258
406
  | ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
259
407
  | ReactNode
260
408
  >;
409
+ // In production, static handler bodies are evicted and the slot value
410
+ // may be undefined. The static store holds the pre-rendered component.
411
+ // We defer the handler check until after tryStaticSlot.
412
+ const handler = slots[slot];
413
+
414
+ const parallelId = `${entry.shortCode}.${slot}`;
415
+
416
+ const isFullRefetch = clientSegmentIds.size === 0;
417
+ const isNewParent = !clientSegmentIds.has(entry.shortCode);
418
+ if (
419
+ isFullRefetch ||
420
+ clientSegmentIds.has(parallelId) ||
421
+ belongsToRoute ||
422
+ isNewParent
423
+ ) {
424
+ matchedIds.push(parallelId);
425
+ }
261
426
 
262
- for (const [slot, handler] of Object.entries(slots)) {
263
- const parallelId = `${entry.shortCode}.${slot}`;
264
-
265
- const isFullRefetch = clientSegmentIds.size === 0;
266
- // When the parent layout is new (not in client's segment set),
267
- // all its parallel children must be resolved and tracked.
268
- // Without this, navigating to a new layout with parallels
269
- // (e.g., BlogLayout with @sidebar) from a different route
270
- // would silently drop those parallel segments.
271
- const isNewParent = !clientSegmentIds.has(entry.shortCode);
272
- if (
273
- isFullRefetch ||
274
- clientSegmentIds.has(parallelId) ||
275
- belongsToRoute ||
276
- isNewParent
277
- ) {
278
- matchedIds.push(parallelId);
279
- }
280
-
281
- const shouldResolve = await (async () => {
282
- if (isFullRefetch) return true;
283
- if (!clientSegmentIds.has(parallelId))
284
- return belongsToRoute || isNewParent;
285
-
286
- const dummySegment: ResolvedSegment = {
287
- id: parallelId,
288
- namespace: parallelEntry.id,
289
- type: "parallel",
290
- index: 0,
291
- component: null as any,
292
- params,
293
- slot,
294
- belongsToRoute,
295
- parallelName: `${parallelEntry.id}.${slot}`,
296
- ...(parallelEntry.mountPath
297
- ? { mountPath: parallelEntry.mountPath }
298
- : {}),
299
- };
300
-
301
- return await evaluateRevalidation({
302
- segment: dummySegment,
303
- prevParams,
304
- getPrevSegment: null,
305
- request,
306
- prevUrl,
307
- nextUrl,
308
- revalidations: parallelEntry.revalidate.map((fn, i) => ({
309
- name: `revalidate${i}`,
310
- fn,
311
- })),
312
- routeKey,
313
- context,
314
- actionContext,
315
- stale,
316
- });
317
- })();
318
-
319
- let component: ReactNode | undefined;
320
- if (shouldResolve) {
321
- component = await tryStaticSlot(parallelEntry, slot, parallelId);
427
+ const shouldResolve = await (async () => {
428
+ if (isFullRefetch) {
429
+ if (isTraceActive()) {
430
+ pushRevalidationTraceEntry({
431
+ segmentId: parallelId,
432
+ segmentType: "parallel",
433
+ belongsToRoute,
434
+ source: "parallel",
435
+ defaultShouldRevalidate: true,
436
+ finalShouldRevalidate: true,
437
+ reason: "full-refetch",
438
+ });
439
+ }
440
+ return true;
322
441
  }
323
- if (component === undefined) {
324
- const hasLoadingFallback =
325
- parallelEntry.loading !== undefined &&
326
- parallelEntry.loading !== false;
327
- if (!shouldResolve) {
328
- component = null;
329
- } else if (hasLoadingFallback) {
330
- component = (
331
- typeof handler === "function" ? handler(context) : handler
332
- ) as ReactNode;
333
- } else {
334
- component =
335
- typeof handler === "function" ? await handler(context) : handler;
442
+ if (!clientSegmentIds.has(parallelId)) {
443
+ const result = belongsToRoute || isNewParent;
444
+ if (isTraceActive()) {
445
+ pushRevalidationTraceEntry({
446
+ segmentId: parallelId,
447
+ segmentType: "parallel",
448
+ belongsToRoute,
449
+ source: "parallel",
450
+ defaultShouldRevalidate: result,
451
+ finalShouldRevalidate: result,
452
+ reason: result ? "new-segment" : "skip-parent-chain",
453
+ });
336
454
  }
455
+ return result;
337
456
  }
338
457
 
339
- segments.push({
458
+ const dummySegment: ResolvedSegment = {
340
459
  id: parallelId,
341
460
  namespace: parallelEntry.id,
342
461
  type: "parallel",
343
462
  index: 0,
344
- component,
345
- loading: parallelEntry.loading === false ? null : parallelEntry.loading,
346
- transition: parallelEntry.transition,
463
+ component: null as any,
347
464
  params,
348
465
  slot,
349
466
  belongsToRoute,
@@ -351,28 +468,111 @@ export async function resolveParallelSegmentsWithRevalidation<TEnv>(
351
468
  ...(parallelEntry.mountPath
352
469
  ? { mountPath: parallelEntry.mountPath }
353
470
  : {}),
354
- });
355
- }
471
+ };
356
472
 
357
- if (!parallelEntry.loading) {
358
- const loaderResult = await resolveLoadersWithRevalidation(
359
- parallelEntry,
360
- context,
361
- belongsToRoute,
362
- clientSegmentIds,
473
+ return await evaluateRevalidation({
474
+ segment: dummySegment,
363
475
  prevParams,
476
+ getPrevSegment: null,
364
477
  request,
365
478
  prevUrl,
366
479
  nextUrl,
480
+ revalidations: parallelEntry.revalidate.map((fn, i) => ({
481
+ name: `revalidate${i}`,
482
+ fn,
483
+ })),
367
484
  routeKey,
368
- deps,
485
+ context,
369
486
  actionContext,
370
- entry.shortCode,
371
487
  stale,
372
- );
373
- segments.push(...loaderResult.segments);
374
- matchedIds.push(...loaderResult.matchedIds);
488
+ traceSource: "parallel",
489
+ });
490
+ })();
491
+ emitRevalidationDecision(
492
+ parallelId,
493
+ context.pathname,
494
+ routeKey,
495
+ shouldResolve,
496
+ );
497
+
498
+ let component: ReactNode | undefined;
499
+ if (shouldResolve) {
500
+ component = await tryStaticSlot(parallelEntry, slot, parallelId);
375
501
  }
502
+ if (component === undefined) {
503
+ const hasLoadingFallback =
504
+ parallelEntry.loading !== undefined && parallelEntry.loading !== false;
505
+ if (!shouldResolve) {
506
+ component = null;
507
+ } else if (handler === undefined) {
508
+ // Handler evicted (production static slot) but static lookup missed.
509
+ // Nothing to render — use null so the client keeps its cached version.
510
+ component = null;
511
+ } else if (hasLoadingFallback) {
512
+ const result =
513
+ typeof handler === "function" ? handler(context) : handler;
514
+ if (result instanceof Promise) {
515
+ const tracked = deps.trackHandler(result, {
516
+ segmentId: parallelId,
517
+ segmentType: "parallel",
518
+ });
519
+ observeStreamedHandler(
520
+ tracked,
521
+ parallelId,
522
+ "parallel",
523
+ context.pathname,
524
+ routeKey,
525
+ params,
526
+ );
527
+ component = tracked as ReactNode;
528
+ } else {
529
+ component = result as ReactNode;
530
+ }
531
+ } else {
532
+ component =
533
+ typeof handler === "function" ? await handler(context) : handler;
534
+ }
535
+ }
536
+
537
+ segments.push({
538
+ id: parallelId,
539
+ namespace: parallelEntry.id,
540
+ type: "parallel",
541
+ index: 0,
542
+ component,
543
+ loading: parallelEntry.loading === false ? null : parallelEntry.loading,
544
+ transition: parallelEntry.transition,
545
+ params,
546
+ slot,
547
+ belongsToRoute,
548
+ parallelName: `${parallelEntry.id}.${slot}`,
549
+ ...(parallelEntry.mountPath
550
+ ? { mountPath: parallelEntry.mountPath }
551
+ : {}),
552
+ });
553
+
554
+ if (resolvedParallelEntries.has(parallelEntry.id)) {
555
+ continue;
556
+ }
557
+
558
+ const loaderResult = await resolveLoadersWithRevalidation(
559
+ parallelEntry,
560
+ context,
561
+ belongsToRoute,
562
+ clientSegmentIds,
563
+ prevParams,
564
+ request,
565
+ prevUrl,
566
+ nextUrl,
567
+ routeKey,
568
+ deps,
569
+ actionContext,
570
+ entry.shortCode,
571
+ stale,
572
+ );
573
+ segments.push(...loaderResult.segments);
574
+ matchedIds.push(...loaderResult.matchedIds);
575
+ resolvedParallelEntries.add(parallelEntry.id);
376
576
  }
377
577
 
378
578
  return { segments, matchedIds };
@@ -407,7 +607,24 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
407
607
  clientHasSegment: hasSegment,
408
608
  belongsToRoute,
409
609
  });
410
- if (!hasSegment) return true;
610
+ if (!hasSegment) {
611
+ if (isTraceActive()) {
612
+ const segType =
613
+ entry.type === "cache"
614
+ ? "layout"
615
+ : (entry.type as "layout" | "route");
616
+ pushRevalidationTraceEntry({
617
+ segmentId: entry.shortCode,
618
+ segmentType: segType,
619
+ belongsToRoute,
620
+ source: "segment-resolution",
621
+ defaultShouldRevalidate: true,
622
+ finalShouldRevalidate: true,
623
+ reason: "new-segment",
624
+ });
625
+ }
626
+ return true;
627
+ }
411
628
 
412
629
  const dummySegment: ResolvedSegment = {
413
630
  id: entry.shortCode,
@@ -441,7 +658,15 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
441
658
  context,
442
659
  actionContext,
443
660
  stale,
661
+ traceSource:
662
+ entry.type === "route" ? "route-handler" : "layout-handler",
444
663
  });
664
+ emitRevalidationDecision(
665
+ entry.shortCode,
666
+ context.pathname,
667
+ routeKey,
668
+ shouldRevalidate,
669
+ );
445
670
  debugLog("segment.revalidate", "entry revalidation decision", {
446
671
  segmentId: entry.shortCode,
447
672
  shouldRevalidate,
@@ -449,40 +674,66 @@ export async function resolveEntryHandlerWithRevalidation<TEnv>(
449
674
  return shouldRevalidate;
450
675
  },
451
676
  async () => {
677
+ const doneHandler = track(`handler:${entry.id}`, 2);
452
678
  (context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
453
679
  entry.shortCode;
454
680
  if (entry.type === "layout" || entry.type === "cache") {
455
- return resolveLayoutComponent(entry, context);
681
+ const layoutComponent = await resolveLayoutComponent(entry, context);
682
+ doneHandler();
683
+ return layoutComponent;
456
684
  }
457
685
  const staticComponent = await tryStaticHandler(entry, entry.shortCode);
458
- if (staticComponent !== undefined) return staticComponent;
686
+ if (staticComponent !== undefined) {
687
+ doneHandler();
688
+ return staticComponent;
689
+ }
459
690
  const routeEntry = entry as Extract<EntryData, { type: "route" }>;
460
691
  if (!routeEntry.loading) {
461
- return handleHandlerResult(await routeEntry.handler(context));
692
+ const result = handleHandlerResult(await routeEntry.handler(context));
693
+ doneHandler();
694
+ return result;
462
695
  }
463
696
  if (!actionContext) {
464
697
  const result = handleHandlerResult(routeEntry.handler(context));
465
- return {
466
- content:
467
- result instanceof Promise ? deps.trackHandler(result) : result,
468
- };
698
+ if (result instanceof Promise) {
699
+ result.finally(doneHandler).catch(() => {});
700
+ const tracked = deps.trackHandler(result, {
701
+ segmentId: entry.shortCode,
702
+ segmentType: entry.type,
703
+ });
704
+ observeStreamedHandler(
705
+ tracked,
706
+ entry.shortCode,
707
+ entry.type,
708
+ context.pathname,
709
+ routeKey,
710
+ params,
711
+ );
712
+ return { content: tracked };
713
+ }
714
+ doneHandler();
715
+ return { content: result };
469
716
  }
470
717
  debugLog("segment.action", "resolving action route with awaited value", {
471
718
  entryId: entry.id,
472
719
  });
720
+ const actionResult = handleHandlerResult(
721
+ await routeEntry.handler(context),
722
+ );
723
+ doneHandler();
473
724
  return {
474
- content: Promise.resolve(
475
- handleHandlerResult(await routeEntry.handler(context)),
476
- ),
725
+ content: Promise.resolve(actionResult),
477
726
  };
478
727
  },
479
728
  () => null,
480
729
  );
481
730
 
731
+ // Normalize void handlers (undefined) to null so the reconciler's
732
+ // component === null checks work consistently for both void and explicit null.
482
733
  const resolvedComponent =
483
734
  component && typeof component === "object" && "content" in component
484
- ? (component as { content: ReactNode }).content
485
- : component;
735
+ ? ((component as { content: ReactNode }).content ?? null)
736
+ : (component ?? null);
486
737
 
487
738
  const segment: ResolvedSegment = {
488
739
  id: entry.shortCode,
@@ -590,31 +841,32 @@ export async function resolveSegmentWithRevalidation<TEnv>(
590
841
  }
591
842
  }
592
843
 
593
- const parallelResult = await resolveParallelSegmentsWithRevalidation(
594
- entry,
595
- params,
596
- context,
597
- belongsToRoute,
598
- clientSegmentIds,
599
- prevParams,
600
- request,
601
- prevUrl,
602
- nextUrl,
603
- routeKey,
604
- deps,
605
- actionContext,
606
- stale,
607
- );
608
- segments.push(...parallelResult.segments);
609
- matchedIds.push(...parallelResult.matchedIds);
610
-
611
- // Push handler BEFORE orphan layouts for layout/cache entries (matching SSR
612
- // order in resolveSegment). Route handler was already executed and is pushed
613
- // after children for tree composition.
614
844
  if (routeHandlerResult) {
845
+ // Route entry: handler already executed above; resolve parallels
846
+ // (handler data visible) then push handler segment last for tree order.
847
+ const parallelResult = await resolveParallelSegmentsWithRevalidation(
848
+ entry,
849
+ params,
850
+ context,
851
+ belongsToRoute,
852
+ clientSegmentIds,
853
+ prevParams,
854
+ request,
855
+ prevUrl,
856
+ nextUrl,
857
+ routeKey,
858
+ deps,
859
+ actionContext,
860
+ stale,
861
+ );
862
+ segments.push(...parallelResult.segments);
863
+ matchedIds.push(...parallelResult.matchedIds);
864
+
615
865
  segments.push(routeHandlerResult.segment);
616
866
  matchedIds.push(routeHandlerResult.matchedId);
617
867
  } else {
868
+ // Layout/cache entry: handler-first — resolve handler before parallels
869
+ // so ctx.set() values are visible to parallel children.
618
870
  const handlerResult = await resolveEntryHandlerWithRevalidation(
619
871
  entry,
620
872
  params,
@@ -632,9 +884,25 @@ export async function resolveSegmentWithRevalidation<TEnv>(
632
884
  );
633
885
  segments.push(handlerResult.segment);
634
886
  matchedIds.push(handlerResult.matchedId);
635
- }
636
887
 
637
- if (entry.type === "layout" || entry.type === "cache") {
888
+ const parallelResult = await resolveParallelSegmentsWithRevalidation(
889
+ entry,
890
+ params,
891
+ context,
892
+ belongsToRoute,
893
+ clientSegmentIds,
894
+ prevParams,
895
+ request,
896
+ prevUrl,
897
+ nextUrl,
898
+ routeKey,
899
+ deps,
900
+ actionContext,
901
+ stale,
902
+ );
903
+ segments.push(...parallelResult.segments);
904
+ matchedIds.push(...parallelResult.matchedIds);
905
+
638
906
  for (const orphan of entry.layout) {
639
907
  const orphanResult = await resolveOrphanLayoutWithRevalidation(
640
908
  orphan,
@@ -705,123 +973,26 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
705
973
  segments.push(...loaderResult.segments);
706
974
  matchedIds.push(...loaderResult.matchedIds);
707
975
 
708
- for (const parallelEntry of orphan.parallel) {
709
- invariant(
710
- parallelEntry.type === "parallel",
711
- `Expected parallel entry, got: ${parallelEntry.type}`,
712
- );
713
-
714
- const loaderResult = await resolveLoadersWithRevalidation(
715
- parallelEntry,
716
- context,
717
- belongsToRoute,
718
- clientSegmentIds,
719
- prevParams,
720
- request,
721
- prevUrl,
722
- nextUrl,
723
- routeKey,
724
- deps,
725
- actionContext,
726
- undefined,
727
- stale,
728
- );
729
- segments.push(...loaderResult.segments);
730
- matchedIds.push(...loaderResult.matchedIds);
731
-
732
- const slots = parallelEntry.handler as Record<
733
- `@${string}`,
734
- | ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
735
- | ReactNode
736
- >;
737
-
738
- for (const [slot, handler] of Object.entries(slots)) {
739
- // Use orphan.shortCode (the parent layout) to match the SSR path
740
- // (resolveParallelEntry receives parentShortCode = orphan.shortCode).
741
- // Using parallelEntry.shortCode would generate IDs the client doesn't know about.
742
- const parallelId = `${orphan.shortCode}.${slot}`;
743
- matchedIds.push(parallelId);
744
-
745
- const shouldResolve = await (async () => {
746
- if (!clientSegmentIds.has(parallelId)) return true;
747
-
748
- const dummySegment: ResolvedSegment = {
749
- id: parallelId,
750
- namespace: parallelEntry.id,
751
- type: "parallel",
752
- index: 0,
753
- component: null as any,
754
- params,
755
- slot,
756
- belongsToRoute,
757
- parallelName: `${parallelEntry.id}.${slot}`,
758
- ...(parallelEntry.mountPath
759
- ? { mountPath: parallelEntry.mountPath }
760
- : {}),
761
- };
762
-
763
- return await evaluateRevalidation({
764
- segment: dummySegment,
765
- prevParams,
766
- getPrevSegment: null,
767
- request,
768
- prevUrl,
769
- nextUrl,
770
- revalidations: parallelEntry.revalidate.map((fn, i) => ({
771
- name: `revalidate${i}`,
772
- fn,
773
- })),
774
- routeKey,
775
- context,
776
- actionContext,
777
- stale,
778
- });
779
- })();
780
-
781
- let component: ReactNode | undefined;
782
- if (shouldResolve) {
783
- component = await tryStaticSlot(parallelEntry, slot, parallelId);
784
- }
785
- if (component === undefined) {
786
- const hasLoadingFallback =
787
- parallelEntry.loading !== undefined &&
788
- parallelEntry.loading !== false;
789
- if (!shouldResolve) {
790
- component = null;
791
- } else if (hasLoadingFallback) {
792
- component = (
793
- typeof handler === "function" ? handler(context) : handler
794
- ) as ReactNode;
795
- } else {
796
- component =
797
- typeof handler === "function" ? await handler(context) : handler;
798
- }
799
- }
800
-
801
- segments.push({
802
- id: parallelId,
803
- namespace: parallelEntry.id,
804
- type: "parallel",
805
- index: 0,
806
- component,
807
- loading: parallelEntry.loading === false ? null : parallelEntry.loading,
808
- transition: parallelEntry.transition,
809
- params,
810
- slot,
811
- belongsToRoute,
812
- parallelName: `${parallelEntry.id}.${slot}`,
813
- ...(parallelEntry.mountPath
814
- ? { mountPath: parallelEntry.mountPath }
815
- : {}),
816
- });
817
- }
818
- }
819
-
976
+ // Handler-first: resolve orphan layout handler before its parallels
977
+ // so ctx.set() values are visible to parallel children.
820
978
  matchedIds.push(orphan.shortCode);
821
979
 
822
980
  const component = await revalidate(
823
981
  async () => {
824
- if (!clientSegmentIds.has(orphan.shortCode)) return true;
982
+ if (!clientSegmentIds.has(orphan.shortCode)) {
983
+ if (isTraceActive()) {
984
+ pushRevalidationTraceEntry({
985
+ segmentId: orphan.shortCode,
986
+ segmentType: "layout",
987
+ belongsToRoute,
988
+ source: "orphan-layout",
989
+ defaultShouldRevalidate: true,
990
+ finalShouldRevalidate: true,
991
+ reason: "new-segment",
992
+ });
993
+ }
994
+ return true;
995
+ }
825
996
 
826
997
  const dummySegment: ResolvedSegment = {
827
998
  id: orphan.shortCode,
@@ -835,7 +1006,7 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
835
1006
  ...(orphan.mountPath ? { mountPath: orphan.mountPath } : {}),
836
1007
  };
837
1008
 
838
- return await evaluateRevalidation({
1009
+ const shouldRevalidate = await evaluateRevalidation({
839
1010
  segment: dummySegment,
840
1011
  prevParams,
841
1012
  getPrevSegment: null,
@@ -850,7 +1021,15 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
850
1021
  context,
851
1022
  actionContext,
852
1023
  stale,
1024
+ traceSource: "orphan-layout",
853
1025
  });
1026
+ emitRevalidationDecision(
1027
+ orphan.shortCode,
1028
+ context.pathname,
1029
+ routeKey,
1030
+ shouldRevalidate,
1031
+ );
1032
+ return shouldRevalidate;
854
1033
  },
855
1034
  async () => resolveLayoutComponent(orphan, context),
856
1035
  () => null,
@@ -870,6 +1049,162 @@ export async function resolveOrphanLayoutWithRevalidation<TEnv>(
870
1049
  ...(orphan.mountPath ? { mountPath: orphan.mountPath } : {}),
871
1050
  });
872
1051
 
1052
+ const resolvedParallelEntries = new Set<string>();
1053
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
1054
+ orphan.parallel,
1055
+ )) {
1056
+ invariant(
1057
+ parallelEntry.type === "parallel",
1058
+ `Expected parallel entry, got: ${parallelEntry.type}`,
1059
+ );
1060
+
1061
+ if (!resolvedParallelEntries.has(parallelEntry.id)) {
1062
+ const loaderResult = await resolveLoadersWithRevalidation(
1063
+ parallelEntry,
1064
+ context,
1065
+ belongsToRoute,
1066
+ clientSegmentIds,
1067
+ prevParams,
1068
+ request,
1069
+ prevUrl,
1070
+ nextUrl,
1071
+ routeKey,
1072
+ deps,
1073
+ actionContext,
1074
+ undefined,
1075
+ stale,
1076
+ );
1077
+ segments.push(...loaderResult.segments);
1078
+ matchedIds.push(...loaderResult.matchedIds);
1079
+ resolvedParallelEntries.add(parallelEntry.id);
1080
+ }
1081
+
1082
+ const slots = parallelEntry.handler as Record<
1083
+ `@${string}`,
1084
+ | ((ctx: HandlerContext<any, TEnv>) => ReactNode | Promise<ReactNode>)
1085
+ | ReactNode
1086
+ >;
1087
+ // Handler may be undefined in production after static handler eviction.
1088
+ const handler = slots[slot];
1089
+
1090
+ // Use orphan.shortCode (the parent layout) to match the SSR path
1091
+ // (resolveParallelEntry receives parentShortCode = orphan.shortCode).
1092
+ // Using parallelEntry.shortCode would generate IDs the client doesn't know about.
1093
+ const parallelId = `${orphan.shortCode}.${slot}`;
1094
+ matchedIds.push(parallelId);
1095
+
1096
+ const shouldResolve = await (async () => {
1097
+ if (!clientSegmentIds.has(parallelId)) {
1098
+ if (isTraceActive()) {
1099
+ pushRevalidationTraceEntry({
1100
+ segmentId: parallelId,
1101
+ segmentType: "parallel",
1102
+ belongsToRoute,
1103
+ source: "parallel",
1104
+ defaultShouldRevalidate: true,
1105
+ finalShouldRevalidate: true,
1106
+ reason: "new-segment",
1107
+ });
1108
+ }
1109
+ return true;
1110
+ }
1111
+
1112
+ const dummySegment: ResolvedSegment = {
1113
+ id: parallelId,
1114
+ namespace: parallelEntry.id,
1115
+ type: "parallel",
1116
+ index: 0,
1117
+ component: null as any,
1118
+ params,
1119
+ slot,
1120
+ belongsToRoute,
1121
+ parallelName: `${parallelEntry.id}.${slot}`,
1122
+ ...(parallelEntry.mountPath
1123
+ ? { mountPath: parallelEntry.mountPath }
1124
+ : {}),
1125
+ };
1126
+
1127
+ return await evaluateRevalidation({
1128
+ segment: dummySegment,
1129
+ prevParams,
1130
+ getPrevSegment: null,
1131
+ request,
1132
+ prevUrl,
1133
+ nextUrl,
1134
+ revalidations: parallelEntry.revalidate.map((fn, i) => ({
1135
+ name: `revalidate${i}`,
1136
+ fn,
1137
+ })),
1138
+ routeKey,
1139
+ context,
1140
+ actionContext,
1141
+ stale,
1142
+ traceSource: "parallel",
1143
+ });
1144
+ })();
1145
+ emitRevalidationDecision(
1146
+ parallelId,
1147
+ context.pathname,
1148
+ routeKey,
1149
+ shouldResolve,
1150
+ );
1151
+
1152
+ let component: ReactNode | undefined;
1153
+ if (shouldResolve) {
1154
+ component = await tryStaticSlot(parallelEntry, slot, parallelId);
1155
+ }
1156
+ if (component === undefined) {
1157
+ const hasLoadingFallback =
1158
+ parallelEntry.loading !== undefined && parallelEntry.loading !== false;
1159
+ if (!shouldResolve) {
1160
+ component = null;
1161
+ } else if (handler === undefined) {
1162
+ // Handler evicted (production static slot) but static lookup missed.
1163
+ component = null;
1164
+ } else if (hasLoadingFallback) {
1165
+ const result =
1166
+ typeof handler === "function" ? handler(context) : handler;
1167
+ if (result instanceof Promise) {
1168
+ const tracked = deps.trackHandler(result, {
1169
+ segmentId: parallelId,
1170
+ segmentType: "parallel",
1171
+ });
1172
+ observeStreamedHandler(
1173
+ tracked,
1174
+ parallelId,
1175
+ "parallel",
1176
+ context.pathname,
1177
+ routeKey,
1178
+ params,
1179
+ );
1180
+ component = tracked as ReactNode;
1181
+ } else {
1182
+ component = result as ReactNode;
1183
+ }
1184
+ } else {
1185
+ component =
1186
+ typeof handler === "function" ? await handler(context) : handler;
1187
+ }
1188
+ }
1189
+
1190
+ segments.push({
1191
+ id: parallelId,
1192
+ namespace: parallelEntry.id,
1193
+ type: "parallel",
1194
+ index: 0,
1195
+ component,
1196
+ loading: parallelEntry.loading === false ? null : parallelEntry.loading,
1197
+ transition: parallelEntry.transition,
1198
+ params,
1199
+ slot,
1200
+ belongsToRoute,
1201
+ parallelName: `${parallelEntry.id}.${slot}`,
1202
+ ...(parallelEntry.mountPath
1203
+ ? { mountPath: parallelEntry.mountPath }
1204
+ : {}),
1205
+ });
1206
+ }
1207
+
873
1208
  return { segments, matchedIds };
874
1209
  }
875
1210
 
@@ -892,12 +1227,15 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
892
1227
  localRouteName: string,
893
1228
  pathname: string,
894
1229
  deps: SegmentResolutionDeps<TEnv>,
1230
+ stale?: boolean,
895
1231
  ): Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }> {
896
1232
  const allSegments: ResolvedSegment[] = [];
897
1233
  const matchedIds: string[] = [];
898
1234
  const seenSegIds = new Set<string>();
899
1235
  const seenMatchIds = new Set<string>();
900
1236
 
1237
+ const telemetry = getRouterContext()?.telemetry;
1238
+
901
1239
  for (const entry of entries) {
902
1240
  if (entry.type === "route" && interceptResult) {
903
1241
  debugLog(
@@ -916,6 +1254,11 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
916
1254
  }
917
1255
 
918
1256
  const nonParallelEntry = entry as Exclude<EntryData, { type: "parallel" }>;
1257
+ if (entry.type === "cache") {
1258
+ const store = RSCRouterContext.getStore();
1259
+ if (store) store.insideCacheScope = true;
1260
+ }
1261
+ const doneEntry = track(`segment:${entry.id}`, 1);
919
1262
  const resolved = await resolveWithErrorBoundary(
920
1263
  nonParallelEntry,
921
1264
  params,
@@ -933,13 +1276,14 @@ export async function resolveAllSegmentsWithRevalidation<TEnv>(
933
1276
  loaderPromises,
934
1277
  deps,
935
1278
  actionContext,
936
- false,
1279
+ stale,
937
1280
  ),
938
1281
  (seg) => ({ segments: [seg], matchedIds: [seg.id] }),
939
1282
  deps,
940
- undefined,
1283
+ { request, url: context.url, routeKey, isPartial: true, telemetry },
941
1284
  pathname,
942
1285
  );
1286
+ doneEntry();
943
1287
 
944
1288
  // Deduplicate segments and matchedIds by ID, matching resolveAllSegments.
945
1289
  // include() scopes can produce entries that resolve the same shared