@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
@@ -6,47 +6,77 @@
6
6
  */
7
7
 
8
8
  import type { ReactNode } from "react";
9
- import { DataNotFoundError, invariant } from "../../errors";
9
+ import { invariant } from "../../errors";
10
10
  import {
11
- createErrorInfo,
12
- createErrorSegment,
13
- createNotFoundInfo,
14
- createNotFoundSegment,
15
- } from "../error-handling.js";
16
- import { getRequestContext } from "../../server/request-context.js";
17
- import { DefaultErrorFallback } from "../../default-error-boundary.js";
18
- import type { EntryData } from "../../server/context";
11
+ getParallelEntries,
12
+ getParallelSlotEntries,
13
+ type EntryData,
14
+ } from "../../server/context";
19
15
  import type {
20
16
  HandlerContext,
21
17
  InternalHandlerContext,
22
18
  ResolvedSegment,
23
- ErrorInfo,
24
19
  } from "../../types";
25
20
  import type { SegmentResolutionDeps } from "../types.js";
26
- import { debugLog } from "../logging.js";
27
- import { tryStaticLookup } from "./static-store.js";
28
21
  import { resolveLoaderData } from "./loader-cache.js";
22
+ import { _getRequestContext } from "../../server/request-context.js";
23
+ import { appendMetric } from "../metrics.js";
24
+ import {
25
+ handleHandlerResult,
26
+ tryStaticHandler,
27
+ tryStaticSlot,
28
+ resolveLayoutComponent,
29
+ resolveWithErrorBoundary,
30
+ } from "./helpers.js";
31
+ import { getRouterContext } from "../router-context.js";
32
+ import { resolveSink, safeEmit } from "../telemetry.js";
33
+ import {
34
+ track,
35
+ RSCRouterContext,
36
+ runInsideLoaderScope,
37
+ } from "../../server/context.js";
38
+
39
+ // ---------------------------------------------------------------------------
40
+ // Streamed handler telemetry
41
+ // ---------------------------------------------------------------------------
29
42
 
30
43
  /**
31
- * Handle Response returns from handlers.
32
- * When a handler returns a Response (e.g., redirect), throw it to trigger
33
- * the short-circuit mechanism. Otherwise return the ReactNode.
44
+ * Attach a fire-and-forget rejection observer to a streamed handler promise.
45
+ * React catches the actual error via its error boundary; this only emits
46
+ * the handler.error telemetry event.
34
47
  */
35
- export function handleHandlerResult(
36
- result: ReactNode | Response | Promise<ReactNode> | Promise<Response>,
37
- ): ReactNode {
38
- if (result instanceof Response) {
39
- throw result;
40
- }
41
- if (result instanceof Promise) {
42
- return result.then((resolved) => {
43
- if (resolved instanceof Response) {
44
- throw resolved;
45
- }
46
- return resolved;
47
- }) as ReactNode;
48
+ function observeStreamedHandler(
49
+ promise: Promise<ReactNode>,
50
+ segmentId: string,
51
+ segmentType: string,
52
+ pathname?: string,
53
+ routeKey?: string,
54
+ params?: Record<string, string>,
55
+ ): void {
56
+ let routerCtx;
57
+ try {
58
+ routerCtx = getRouterContext();
59
+ } catch {
60
+ return;
48
61
  }
49
- return result;
62
+ if (!routerCtx?.telemetry) return;
63
+ const sink = resolveSink(routerCtx.telemetry);
64
+ const reqId = routerCtx.requestId;
65
+ promise.catch((err: unknown) => {
66
+ const errorObj = err instanceof Error ? err : new Error(String(err));
67
+ safeEmit(sink, {
68
+ type: "handler.error",
69
+ timestamp: performance.now(),
70
+ requestId: reqId,
71
+ segmentId,
72
+ segmentType,
73
+ error: errorObj,
74
+ handledByBoundary: true,
75
+ pathname,
76
+ routeKey,
77
+ params,
78
+ });
79
+ });
50
80
  }
51
81
 
52
82
  // ---------------------------------------------------------------------------
@@ -70,9 +100,11 @@ export async function resolveLoaders<TEnv>(
70
100
  const shortCode = shortCodeOverride ?? entry.shortCode;
71
101
  const hasLoading = "loading" in entry && entry.loading !== undefined;
72
102
  const loadingDisabled = hasLoading && entry.loading === false;
103
+ const ms = _getRequestContext()?._metricsStore;
73
104
 
74
105
  if (!loadingDisabled) {
75
- return loaderEntries.map((loaderEntry, i) => {
106
+ // Streaming loaders: promises kick off now, settle during RSC serialization.
107
+ const segments = loaderEntries.map((loaderEntry, i) => {
76
108
  const { loader } = loaderEntry;
77
109
  const segmentId = `${shortCode}D${i}.${loader.$$id}`;
78
110
  return {
@@ -84,7 +116,9 @@ export async function resolveLoaders<TEnv>(
84
116
  params: ctx.params,
85
117
  loaderId: loader.$$id,
86
118
  loaderData: deps.wrapLoaderPromise(
87
- resolveLoaderData(loaderEntry, ctx, ctx.pathname),
119
+ runInsideLoaderScope(() =>
120
+ resolveLoaderData(loaderEntry, ctx, ctx.pathname),
121
+ ),
88
122
  entry,
89
123
  segmentId,
90
124
  ctx.pathname,
@@ -92,18 +126,38 @@ export async function resolveLoaders<TEnv>(
92
126
  belongsToRoute,
93
127
  };
94
128
  });
129
+
130
+ return segments;
95
131
  }
96
132
 
97
133
  // Loading disabled: still start all loaders in parallel, but only emit
98
134
  // settled promises so handlers don't stream loading placeholders.
99
- const pendingLoaderData = loaderEntries.map((loaderEntry) =>
100
- resolveLoaderData(loaderEntry, ctx, ctx.pathname),
101
- );
102
- await Promise.all(pendingLoaderData);
135
+ const pendingLoaderData = loaderEntries.map((loaderEntry) => {
136
+ const start = performance.now();
137
+ const promise = runInsideLoaderScope(() =>
138
+ resolveLoaderData(loaderEntry, ctx, ctx.pathname),
139
+ );
140
+ return { promise, start, loaderId: loaderEntry.loader.$$id };
141
+ });
142
+ await Promise.all(pendingLoaderData.map((p) => p.promise));
103
143
 
104
144
  return loaderEntries.map((loaderEntry, i) => {
105
145
  const { loader } = loaderEntry;
106
146
  const segmentId = `${shortCode}D${i}.${loader.$$id}`;
147
+ const pending = pendingLoaderData[i]!;
148
+ if (ms && !ms.metrics.some((m) => m.label === `loader:${loader.$$id}`)) {
149
+ // All loaders ran in parallel via Promise.all — each span covers
150
+ // from its own kickoff to the batch settlement, giving a ceiling
151
+ // on that loader's contribution to the overall wait.
152
+ const batchEnd = performance.now();
153
+ appendMetric(
154
+ ms,
155
+ `loader:${loader.$$id}`,
156
+ pending.start,
157
+ batchEnd - pending.start,
158
+ 2,
159
+ );
160
+ }
107
161
  return {
108
162
  id: segmentId,
109
163
  namespace: entry.id,
@@ -113,7 +167,7 @@ export async function resolveLoaders<TEnv>(
113
167
  params: ctx.params,
114
168
  loaderId: loader.$$id,
115
169
  loaderData: deps.wrapLoaderPromise(
116
- pendingLoaderData[i]!,
170
+ pending.promise,
117
171
  entry,
118
172
  segmentId,
119
173
  ctx.pathname,
@@ -154,38 +208,14 @@ export async function resolveSegment<TEnv>(
154
208
  segments.push(...loaderSegments);
155
209
  }
156
210
 
157
- for (const parallelEntry of entry.parallel) {
158
- const parallelSegments = await resolveParallelEntry(
159
- parallelEntry,
160
- params,
161
- context,
162
- false,
163
- entry.shortCode,
164
- deps,
165
- options,
166
- );
167
- segments.push(...parallelSegments);
168
- }
169
-
211
+ // Handler-first: layout handler executes before its parallels and orphan
212
+ // layouts so that ctx.set() values are visible to all children.
170
213
  (context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
171
214
  entry.shortCode;
172
215
 
173
- // Static handler interception: use pre-rendered component from build-time store.
174
- // Cast via any because the cache entry type in the union lacks isStaticPrerender.
175
- const entryAny = entry as any;
176
- let component: ReactNode | undefined;
177
- if (entryAny.isStaticPrerender && entryAny.staticHandlerId) {
178
- component = await tryStaticLookup(
179
- entryAny.staticHandlerId,
180
- entry.shortCode,
181
- );
182
- }
183
- if (component === undefined) {
184
- component =
185
- typeof entry.handler === "function"
186
- ? handleHandlerResult(await entry.handler(context))
187
- : entry.handler;
188
- }
216
+ const doneLayoutHandler = track(`handler:${entry.id}`, 2);
217
+ const component = await resolveLayoutComponent(entry, context);
218
+ doneLayoutHandler();
189
219
 
190
220
  segments.push({
191
221
  id: entry.shortCode,
@@ -201,6 +231,26 @@ export async function resolveSegment<TEnv>(
201
231
  ...(entry.mountPath ? { mountPath: entry.mountPath } : {}),
202
232
  });
203
233
 
234
+ const resolvedParallelEntries = new Set<string>();
235
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
236
+ entry.parallel,
237
+ )) {
238
+ const parallelSegments = await resolveParallelEntry(
239
+ parallelEntry,
240
+ params,
241
+ context,
242
+ false,
243
+ entry.shortCode,
244
+ deps,
245
+ options,
246
+ routeKey,
247
+ [slot],
248
+ !resolvedParallelEntries.has(parallelEntry.id),
249
+ );
250
+ segments.push(...parallelSegments);
251
+ resolvedParallelEntries.add(parallelEntry.id);
252
+ }
253
+
204
254
  for (const orphan of entry.layout) {
205
255
  const orphanSegments = await resolveOrphanLayout(
206
256
  orphan,
@@ -210,6 +260,7 @@ export async function resolveSegment<TEnv>(
210
260
  false,
211
261
  deps,
212
262
  options,
263
+ routeKey,
213
264
  );
214
265
  segments.push(...orphanSegments);
215
266
  }
@@ -228,22 +279,41 @@ export async function resolveSegment<TEnv>(
228
279
  // the correct tree composition order (layouts wrap the route content).
229
280
  (context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
230
281
  entry.shortCode;
231
- let component: ReactNode | undefined;
232
-
233
- // Static handler interception: use pre-rendered component from build-time store
234
- if (entry.isStaticPrerender && (entry as any).staticHandlerId) {
235
- component = await tryStaticLookup(
236
- (entry as any).staticHandlerId,
237
- entry.shortCode,
238
- );
239
- }
282
+ let component: ReactNode | undefined = await tryStaticHandler(
283
+ entry,
284
+ entry.shortCode,
285
+ );
240
286
  if (component === undefined) {
287
+ // For Passthrough routes at runtime, use the live handler instead of
288
+ // the build handler. At build time (context.build === true), always
289
+ // use the build handler from entry.handler.
290
+ const handler =
291
+ !context.build && entry.liveHandler ? entry.liveHandler : entry.handler;
292
+ const doneRouteHandler = track(`handler:${entry.id}`, 2);
241
293
  if (entry.loading) {
242
- const result = handleHandlerResult(entry.handler(context));
243
- component =
244
- result instanceof Promise ? deps.trackHandler(result) : result;
294
+ const result = handleHandlerResult(handler(context));
295
+ if (result instanceof Promise) {
296
+ result.finally(doneRouteHandler).catch(() => {});
297
+ const tracked = deps.trackHandler(result, {
298
+ segmentId: entry.shortCode,
299
+ segmentType: entry.type,
300
+ });
301
+ observeStreamedHandler(
302
+ tracked,
303
+ entry.shortCode,
304
+ entry.type,
305
+ context.pathname,
306
+ routeKey,
307
+ params,
308
+ );
309
+ component = tracked;
310
+ } else {
311
+ doneRouteHandler();
312
+ component = result;
313
+ }
245
314
  } else {
246
- component = handleHandlerResult(await entry.handler(context));
315
+ component = handleHandlerResult(await handler(context));
316
+ doneRouteHandler();
247
317
  }
248
318
  }
249
319
 
@@ -256,11 +326,16 @@ export async function resolveSegment<TEnv>(
256
326
  true,
257
327
  deps,
258
328
  options,
329
+ routeKey,
330
+ entry,
259
331
  );
260
332
  segments.push(...orphanSegments);
261
333
  }
262
334
 
263
- for (const parallelEntry of entry.parallel) {
335
+ const resolvedParallelEntries = new Set<string>();
336
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
337
+ entry.parallel,
338
+ )) {
264
339
  const parallelSegments = await resolveParallelEntry(
265
340
  parallelEntry,
266
341
  params,
@@ -269,8 +344,12 @@ export async function resolveSegment<TEnv>(
269
344
  entry.shortCode,
270
345
  deps,
271
346
  options,
347
+ routeKey,
348
+ [slot],
349
+ !resolvedParallelEntries.has(parallelEntry.id),
272
350
  );
273
351
  segments.push(...parallelSegments);
352
+ resolvedParallelEntries.add(parallelEntry.id);
274
353
  }
275
354
 
276
355
  segments.push({
@@ -278,7 +357,7 @@ export async function resolveSegment<TEnv>(
278
357
  namespace: entry.id,
279
358
  type: "route",
280
359
  index: 0,
281
- component,
360
+ component: component ?? null,
282
361
  loading: entry.loading === false ? null : entry.loading,
283
362
  transition: entry.transition,
284
363
  params,
@@ -303,6 +382,10 @@ export async function resolveOrphanLayout<TEnv>(
303
382
  belongsToRoute: boolean,
304
383
  deps: SegmentResolutionDeps<TEnv>,
305
384
  options?: ResolveSegmentOptions,
385
+ routeKey?: string,
386
+ /** Parent route entry — its loaders are inherited by the layout so
387
+ * parallel slots inside this layout can access them via useLoader(). */
388
+ parentRouteEntry?: EntryData,
306
389
  ): Promise<ResolvedSegment[]> {
307
390
  invariant(
308
391
  orphan.type === "layout" || orphan.type === "cache",
@@ -318,36 +401,37 @@ export async function resolveOrphanLayout<TEnv>(
318
401
  deps,
319
402
  );
320
403
  segments.push(...loaderSegments);
321
- }
322
404
 
323
- for (const parallelEntry of orphan.parallel) {
324
- const parallelSegments = await resolveParallelEntry(
325
- parallelEntry,
326
- params,
327
- context,
328
- belongsToRoute,
329
- orphan.shortCode,
330
- deps,
331
- options,
332
- );
333
- segments.push(...parallelSegments);
405
+ // Inherit parent route's loaders so parallel slots inside this layout
406
+ // can access them via useLoader(). Without this, the route's loaders
407
+ // are only in the route's OutletProvider (rendered as <Outlet /> content),
408
+ // which is a child — not a parent — of the layout's context.
409
+ if (
410
+ parentRouteEntry &&
411
+ parentRouteEntry.loader &&
412
+ parentRouteEntry.loader.length > 0 &&
413
+ Object.keys(orphan.parallel).length > 0
414
+ ) {
415
+ const inheritedLoaders = await resolveLoaders(
416
+ parentRouteEntry,
417
+ context,
418
+ belongsToRoute,
419
+ deps,
420
+ orphan.shortCode,
421
+ );
422
+ // Tag as inherited so buildMatchResult can deduplicate when safe
423
+ for (const s of inheritedLoaders) {
424
+ s._inherited = true;
425
+ }
426
+ segments.push(...inheritedLoaders);
427
+ }
334
428
  }
335
429
 
336
- // Static handler interception for orphan layouts
337
- const orphanAny = orphan as any;
338
- let component: ReactNode | undefined;
339
- if (orphanAny.isStaticPrerender && orphanAny.staticHandlerId) {
340
- component = await tryStaticLookup(
341
- orphanAny.staticHandlerId,
342
- orphan.shortCode,
343
- );
344
- }
345
- if (component === undefined) {
346
- component =
347
- typeof orphan.handler === "function"
348
- ? handleHandlerResult(await orphan.handler(context))
349
- : orphan.handler;
350
- }
430
+ // Handler-first: orphan layout handler executes before its parallels
431
+ // so that ctx.set() values are visible to parallel children.
432
+ const doneOrphanHandler = track(`handler:${orphan.id}`, 2);
433
+ const component = await resolveLayoutComponent(orphan, context);
434
+ doneOrphanHandler();
351
435
 
352
436
  segments.push({
353
437
  id: orphan.shortCode,
@@ -363,6 +447,26 @@ export async function resolveOrphanLayout<TEnv>(
363
447
  ...(orphan.mountPath ? { mountPath: orphan.mountPath } : {}),
364
448
  });
365
449
 
450
+ const resolvedParallelEntries = new Set<string>();
451
+ for (const { slot, entry: parallelEntry } of getParallelSlotEntries(
452
+ orphan.parallel,
453
+ )) {
454
+ const parallelSegments = await resolveParallelEntry(
455
+ parallelEntry,
456
+ params,
457
+ context,
458
+ belongsToRoute,
459
+ orphan.shortCode,
460
+ deps,
461
+ options,
462
+ routeKey,
463
+ [slot],
464
+ !resolvedParallelEntries.has(parallelEntry.id),
465
+ );
466
+ segments.push(...parallelSegments);
467
+ resolvedParallelEntries.add(parallelEntry.id);
468
+ }
469
+
366
470
  return segments;
367
471
  }
368
472
 
@@ -377,6 +481,9 @@ export async function resolveParallelEntry<TEnv>(
377
481
  parentShortCode: string,
378
482
  deps: SegmentResolutionDeps<TEnv>,
379
483
  options?: ResolveSegmentOptions,
484
+ routeKey?: string,
485
+ slotNames?: `@${string}`[],
486
+ includeLoaders: boolean = true,
380
487
  ): Promise<ResolvedSegment[]> {
381
488
  invariant(
382
489
  parallelEntry.type === "parallel",
@@ -391,28 +498,63 @@ export async function resolveParallelEntry<TEnv>(
391
498
  | ReactNode
392
499
  >;
393
500
 
394
- for (const [slot, handler] of Object.entries(slots)) {
395
- let component: ReactNode | undefined;
501
+ const slotsToResolve = slotNames ?? (Object.keys(slots) as `@${string}`[]);
396
502
 
397
- // Static handler interception for individual parallel slots
398
- const slotStaticId = (parallelEntry as any).staticHandlerIds?.[slot];
399
- if (slotStaticId) {
400
- component = await tryStaticLookup(
401
- slotStaticId,
402
- `${parentShortCode}.${slot}`,
403
- );
404
- }
503
+ for (const slot of slotsToResolve) {
504
+ // Try static lookup first — in production, handler bodies are evicted
505
+ // and replaced with stubs that have no .handler property (undefined).
506
+ // The static store holds the pre-rendered component for these slots.
507
+ let component: ReactNode | undefined = await tryStaticSlot(
508
+ parallelEntry,
509
+ slot,
510
+ `${parentShortCode}.${slot}`,
511
+ );
405
512
 
406
513
  if (component === undefined) {
514
+ const handler = slots[slot];
515
+ if (handler === undefined) {
516
+ continue;
517
+ }
518
+ // Pin `_currentSegmentId` to the slot's own id so handle pushes from
519
+ // inside the slot handler get their own bucket in the HandleStore.
520
+ // Parent-keying would collapse them into the parent layout's bucket;
521
+ // the partial-update merge then replaces the parent's bucket on a
522
+ // slot-only revalidation and drops layout-pushed Meta/Breadcrumbs.
523
+ // filterSegmentOrder() retains slot ids so the client preserves them.
524
+ (context as InternalHandlerContext<any, TEnv>)._currentSegmentId =
525
+ `${parentShortCode}.${slot}`;
526
+ const doneParallelHandler = track(
527
+ `handler:${parallelEntry.id}.${slot}`,
528
+ 2,
529
+ );
407
530
  const hasLoadingFallback =
408
531
  parallelEntry.loading !== undefined && parallelEntry.loading !== false;
409
532
  if (hasLoadingFallback) {
410
533
  const result =
411
534
  typeof handler === "function" ? handler(context) : handler;
412
- component = result as ReactNode;
535
+ if (result instanceof Promise) {
536
+ result.finally(doneParallelHandler).catch(() => {});
537
+ const tracked = deps.trackHandler(result, {
538
+ segmentId: `${parentShortCode}.${slot}`,
539
+ segmentType: "parallel",
540
+ });
541
+ observeStreamedHandler(
542
+ tracked,
543
+ `${parentShortCode}.${slot}`,
544
+ "parallel",
545
+ context.pathname,
546
+ routeKey,
547
+ params,
548
+ );
549
+ component = tracked as ReactNode;
550
+ } else {
551
+ doneParallelHandler();
552
+ component = result as ReactNode;
553
+ }
413
554
  } else {
414
555
  component =
415
556
  typeof handler === "function" ? await handler(context) : handler;
557
+ doneParallelHandler();
416
558
  }
417
559
  }
418
560
 
@@ -434,7 +576,7 @@ export async function resolveParallelEntry<TEnv>(
434
576
  });
435
577
  }
436
578
 
437
- if (!parallelEntry.loading && !options?.skipLoaders) {
579
+ if (!options?.skipLoaders && includeLoaders) {
438
580
  const loaderSegments = await resolveLoaders(
439
581
  parallelEntry,
440
582
  context,
@@ -442,142 +584,21 @@ export async function resolveParallelEntry<TEnv>(
442
584
  deps,
443
585
  parentShortCode,
444
586
  );
587
+ // Tag parallel-owned loaders so renderSegments can stream them
588
+ // using the parallel's loading() instead of awaiting on the layout
589
+ const parallelLoading =
590
+ parallelEntry.loading === false ? undefined : parallelEntry.loading;
591
+ if (parallelLoading) {
592
+ for (const seg of loaderSegments) {
593
+ seg.parallelLoading = parallelLoading;
594
+ }
595
+ }
445
596
  segments.push(...loaderSegments);
446
597
  }
447
598
 
448
599
  return segments;
449
600
  }
450
601
 
451
- /**
452
- * Wrapper that adds error boundary handling to segment resolution.
453
- */
454
- export async function resolveWithErrorHandling<TEnv>(
455
- entry: EntryData,
456
- routeKey: string,
457
- params: Record<string, string>,
458
- context: HandlerContext<any, TEnv>,
459
- loaderPromises: Map<string, Promise<any>>,
460
- resolveFn: () => Promise<ResolvedSegment[]>,
461
- deps: SegmentResolutionDeps<TEnv>,
462
- errorContext?: {
463
- env?: TEnv;
464
- isPartial?: boolean;
465
- requestStartTime?: number;
466
- },
467
- ): Promise<ResolvedSegment[]> {
468
- try {
469
- return await resolveFn();
470
- } catch (error) {
471
- if (error instanceof Response) {
472
- throw error;
473
- }
474
-
475
- if (error instanceof DataNotFoundError) {
476
- const notFoundFallback = deps.findNearestNotFoundBoundary(entry);
477
-
478
- if (notFoundFallback) {
479
- const notFoundInfo = createNotFoundInfo(
480
- error,
481
- entry.shortCode,
482
- entry.type,
483
- context.pathname,
484
- );
485
-
486
- // Safe request access: during build-time prerendering, context.request
487
- // is a throwing getter. Use undefined when unavailable.
488
- let safeRequest: Request | undefined;
489
- try {
490
- safeRequest = context.request;
491
- } catch {}
492
-
493
- deps.callOnError(error, "handler", {
494
- request: safeRequest as Request,
495
- url: context.url,
496
- routeKey,
497
- params,
498
- segmentId: entry.shortCode,
499
- segmentType: entry.type as any,
500
- env: errorContext?.env,
501
- isPartial: errorContext?.isPartial,
502
- handledByBoundary: true,
503
- metadata: { notFound: true, message: notFoundInfo.message },
504
- requestStartTime: errorContext?.requestStartTime,
505
- });
506
-
507
- debugLog("segment", "notFound boundary handled error", {
508
- segmentId: entry.shortCode,
509
- message: notFoundInfo.message,
510
- });
511
-
512
- const reqCtx = getRequestContext();
513
- if (reqCtx) {
514
- reqCtx.res = new Response(null, {
515
- status: 404,
516
- headers: reqCtx.res.headers,
517
- });
518
- }
519
-
520
- const notFoundSegment = createNotFoundSegment(
521
- notFoundInfo,
522
- notFoundFallback,
523
- entry,
524
- params,
525
- );
526
- return [notFoundSegment];
527
- }
528
- }
529
-
530
- const fallback = deps.findNearestErrorBoundary(entry);
531
- const segmentType: ErrorInfo["segmentType"] = entry.type;
532
- const errorInfo = createErrorInfo(error, entry.shortCode, segmentType);
533
- const effectiveFallback = fallback ?? DefaultErrorFallback;
534
-
535
- // Safe request access: during build-time prerendering, context.request
536
- // is a throwing getter. Use undefined when unavailable.
537
- let safeReq: Request | undefined;
538
- try {
539
- safeReq = context.request;
540
- } catch {}
541
-
542
- deps.callOnError(error, "handler", {
543
- request: safeReq as Request,
544
- url: context.url,
545
- routeKey,
546
- params,
547
- segmentId: entry.shortCode,
548
- segmentType: entry.type as any,
549
- env: errorContext?.env,
550
- isPartial: errorContext?.isPartial,
551
- handledByBoundary: !!fallback,
552
- requestStartTime: errorContext?.requestStartTime,
553
- });
554
-
555
- debugLog("segment", "error boundary handled error", {
556
- segmentId: entry.shortCode,
557
- boundary: fallback ? "custom" : "default",
558
- message: errorInfo.message,
559
- });
560
-
561
- {
562
- const reqCtx = getRequestContext();
563
- if (reqCtx) {
564
- reqCtx.res = new Response(null, {
565
- status: 500,
566
- headers: reqCtx.res.headers,
567
- });
568
- }
569
- }
570
-
571
- const errorSegment = createErrorSegment(
572
- errorInfo,
573
- effectiveFallback,
574
- entry,
575
- params,
576
- );
577
- return [errorSegment];
578
- }
579
- }
580
-
581
602
  /**
582
603
  * Resolve all segments for a route (used for single-cache-per-request pattern).
583
604
  */
@@ -593,13 +614,31 @@ export async function resolveAllSegments<TEnv>(
593
614
  const allSegments: ResolvedSegment[] = [];
594
615
  const seenIds = new Set<string>();
595
616
 
617
+ // Safe request access: during build-time prerendering, context.request
618
+ // is a throwing getter. Use undefined when unavailable.
619
+ let safeRequest: Request | undefined;
620
+ try {
621
+ safeRequest = context.request;
622
+ } catch {}
623
+
624
+ // Get telemetry sink from RouterContext (may not exist during prerendering)
625
+ let telemetry;
626
+ try {
627
+ telemetry = getRouterContext()?.telemetry;
628
+ } catch {}
629
+
596
630
  for (const entry of entries) {
597
- const resolvedSegments = await resolveWithErrorHandling(
631
+ // Set ALS flag when entering a cache() boundary so that ctx.get()
632
+ // can guard non-cacheable variable reads. Also guards response-level
633
+ // side effects (headers.set). Persists for all descendant entries.
634
+ if (entry.type === "cache") {
635
+ const store = RSCRouterContext.getStore();
636
+ if (store) store.insideCacheScope = true;
637
+ }
638
+ const doneEntry = track(`segment:${entry.id}`, 1);
639
+ const resolvedSegments = await resolveWithErrorBoundary(
598
640
  entry,
599
- routeKey,
600
641
  params,
601
- context,
602
- loaderPromises,
603
642
  () =>
604
643
  resolveSegment(
605
644
  entry,
@@ -611,8 +650,12 @@ export async function resolveAllSegments<TEnv>(
611
650
  false,
612
651
  options,
613
652
  ),
653
+ (seg) => [seg],
614
654
  deps,
655
+ { request: safeRequest, url: context.url, routeKey, telemetry },
656
+ context.pathname,
615
657
  );
658
+ doneEntry();
616
659
  // Deduplicate by segment ID. include() scopes can produce entries that
617
660
  // resolve the same shared layout/loader segment. Duplicates in the segment
618
661
  // array propagate to the client's matched[] and change the React tree depth.
@@ -636,11 +679,77 @@ export async function resolveLoadersOnly<TEnv>(
636
679
  deps: SegmentResolutionDeps<TEnv>,
637
680
  ): Promise<ResolvedSegment[]> {
638
681
  const loaderSegments: ResolvedSegment[] = [];
682
+ const seenIds = new Set<string>();
683
+
684
+ async function collectEntryLoaders(
685
+ entry: EntryData,
686
+ belongsToRoute: boolean,
687
+ shortCodeOverride?: string,
688
+ ): Promise<void> {
689
+ // Skip if all loaders from this entry have already been resolved
690
+ // via a parent (e.g., cache boundary wrapping a layout with shared loaders).
691
+ const entryLoaders = entry.loader ?? [];
692
+ const sc = shortCodeOverride ?? entry.shortCode;
693
+ const allAlreadySeen =
694
+ entryLoaders.length > 0 &&
695
+ entryLoaders.every((le, i) =>
696
+ seenIds.has(`${sc}D${i}.${le.loader.$$id}`),
697
+ );
698
+ if (!allAlreadySeen) {
699
+ const segments = await resolveLoaders(
700
+ entry,
701
+ context,
702
+ belongsToRoute,
703
+ deps,
704
+ shortCodeOverride,
705
+ );
706
+ for (const seg of segments) {
707
+ if (!seenIds.has(seg.id)) {
708
+ seenIds.add(seg.id);
709
+ loaderSegments.push(seg);
710
+ }
711
+ }
712
+ }
713
+
714
+ const seenParallelEntryIds = new Set<string>();
715
+ for (const parallelEntry of getParallelEntries(entry.parallel)) {
716
+ if (seenParallelEntryIds.has(parallelEntry.id)) continue;
717
+ seenParallelEntryIds.add(parallelEntry.id);
718
+ await collectEntryLoaders(parallelEntry, belongsToRoute, entry.shortCode);
719
+ }
720
+
721
+ const childBelongsToRoute = belongsToRoute || entry.type === "route";
722
+ for (const layoutEntry of entry.layout) {
723
+ await collectEntryLoaders(layoutEntry, childBelongsToRoute);
724
+ // Inherit route loaders for orphan layouts with parallels.
725
+ // Resolve directly — do NOT re-enter collectEntryLoaders with the
726
+ // route entry, as that would re-iterate route.layout and loop.
727
+ if (
728
+ entry.type === "route" &&
729
+ entry.loader &&
730
+ entry.loader.length > 0 &&
731
+ Object.keys(layoutEntry.parallel).length > 0
732
+ ) {
733
+ const inherited = await resolveLoaders(
734
+ entry,
735
+ context,
736
+ childBelongsToRoute,
737
+ deps,
738
+ layoutEntry.shortCode,
739
+ );
740
+ for (const seg of inherited) {
741
+ if (!seenIds.has(seg.id)) {
742
+ seenIds.add(seg.id);
743
+ seg._inherited = true;
744
+ loaderSegments.push(seg);
745
+ }
746
+ }
747
+ }
748
+ }
749
+ }
639
750
 
640
751
  for (const entry of entries) {
641
- const belongsToRoute = entry.type === "route";
642
- const segments = await resolveLoaders(entry, context, belongsToRoute, deps);
643
- loaderSegments.push(...segments);
752
+ await collectEntryLoaders(entry, entry.type === "route");
644
753
  }
645
754
 
646
755
  return loaderSegments;