@rangojs/router 0.0.0-experimental.23 → 0.0.0-experimental.24535dcb

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 (1250) hide show
  1. package/AGENTS.md +11 -3
  2. package/README.md +303 -740
  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 +730 -184
  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/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
  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/{src/handles/index.ts → dist/handles/index.js} +1 -1
  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/dist/href-context.d.ts +29 -0
  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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
  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/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +4373 -1328
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/index.named-routes.gen.ts +103 -0
  802. package/dist/vite/package-resolution.d.ts +43 -0
  803. package/dist/vite/package-resolution.d.ts.map +1 -0
  804. package/dist/vite/package-resolution.js +112 -0
  805. package/dist/vite/package-resolution.js.map +1 -0
  806. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  807. package/dist/vite/virtual-entries.d.ts +25 -0
  808. package/dist/vite/virtual-entries.d.ts.map +1 -0
  809. package/dist/vite/virtual-entries.js +110 -0
  810. package/dist/vite/virtual-entries.js.map +1 -0
  811. package/package.json +96 -24
  812. package/skills/api-client/SKILL.md +211 -0
  813. package/skills/breadcrumbs/SKILL.md +329 -0
  814. package/skills/bundle-analysis/SKILL.md +159 -0
  815. package/skills/cache-guide/SKILL.md +251 -24
  816. package/skills/caching/SKILL.md +375 -17
  817. package/skills/catalog.json +271 -0
  818. package/skills/comparison/SKILL.md +50 -0
  819. package/skills/comparison/agents/openai.yaml +4 -0
  820. package/skills/comparison/references/framework-comparison.md +837 -0
  821. package/skills/composability/SKILL.md +110 -4
  822. package/skills/css/SKILL.md +76 -0
  823. package/skills/debug-manifest/SKILL.md +5 -3
  824. package/skills/defer-hydration/SKILL.md +235 -0
  825. package/skills/document-cache/SKILL.md +87 -56
  826. package/skills/fonts/SKILL.md +1 -1
  827. package/skills/handler-use/SKILL.md +364 -0
  828. package/skills/hooks/SKILL.md +73 -690
  829. package/skills/hooks/data.md +273 -0
  830. package/skills/hooks/handle-and-actions.md +103 -0
  831. package/skills/hooks/navigation.md +110 -0
  832. package/skills/hooks/outlets.md +41 -0
  833. package/skills/hooks/state.md +228 -0
  834. package/skills/hooks/urls.md +135 -0
  835. package/skills/host-router/SKILL.md +129 -27
  836. package/skills/i18n/SKILL.md +276 -0
  837. package/skills/intercept/SKILL.md +94 -18
  838. package/skills/layout/SKILL.md +62 -19
  839. package/skills/links/SKILL.md +249 -17
  840. package/skills/loader/SKILL.md +319 -31
  841. package/skills/middleware/SKILL.md +59 -16
  842. package/skills/migrate-nextjs/SKILL.md +745 -0
  843. package/skills/migrate-react-router/SKILL.md +153 -0
  844. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  845. package/skills/migrate-react-router/component-migration.md +196 -0
  846. package/skills/migrate-react-router/data-and-actions.md +225 -0
  847. package/skills/migrate-react-router/route-mapping.md +271 -0
  848. package/skills/mime-routes/SKILL.md +29 -2
  849. package/skills/observability/SKILL.md +202 -0
  850. package/skills/parallel/SKILL.md +225 -10
  851. package/skills/ppr/SKILL.md +616 -0
  852. package/skills/prerender/SKILL.md +178 -124
  853. package/skills/rango/SKILL.md +318 -24
  854. package/skills/react-compiler/SKILL.md +168 -0
  855. package/skills/response-routes/SKILL.md +138 -49
  856. package/skills/route/SKILL.md +175 -13
  857. package/skills/router-setup/SKILL.md +137 -12
  858. package/skills/scripts/SKILL.md +179 -0
  859. package/skills/server-actions/SKILL.md +776 -0
  860. package/skills/shell-manifest/SKILL.md +185 -0
  861. package/skills/streams-and-websockets/SKILL.md +283 -0
  862. package/skills/tailwind/SKILL.md +28 -4
  863. package/skills/testing/SKILL.md +130 -0
  864. package/skills/testing/bindings.md +103 -0
  865. package/skills/testing/cache-prerender.md +127 -0
  866. package/skills/testing/client-components.md +124 -0
  867. package/skills/testing/e2e-parity.md +125 -0
  868. package/skills/testing/flight.md +91 -0
  869. package/skills/testing/handles.md +131 -0
  870. package/skills/testing/loader.md +128 -0
  871. package/skills/testing/middleware.md +99 -0
  872. package/skills/testing/render-handler.md +122 -0
  873. package/skills/testing/response-routes.md +95 -0
  874. package/skills/testing/reverse-and-types.md +85 -0
  875. package/skills/testing/server-actions.md +107 -0
  876. package/skills/testing/server-tree.md +128 -0
  877. package/skills/testing/setup.md +123 -0
  878. package/skills/theme/SKILL.md +1 -1
  879. package/skills/typesafety/SKILL.md +45 -614
  880. package/skills/typesafety/env-and-bindings.md +254 -0
  881. package/skills/typesafety/generated-files-and-cli.md +335 -0
  882. package/skills/typesafety/params-and-search.md +153 -0
  883. package/skills/typesafety/route-types.md +209 -0
  884. package/skills/use-cache/SKILL.md +74 -15
  885. package/skills/vercel/SKILL.md +128 -0
  886. package/skills/view-transitions/SKILL.md +337 -0
  887. package/src/__augment-tests__/augment.ts +81 -0
  888. package/src/__augment-tests__/augmented.check.ts +116 -0
  889. package/src/__internal.ts +67 -40
  890. package/src/browser/action-coordinator.ts +53 -36
  891. package/src/browser/action-fence.ts +47 -0
  892. package/src/browser/app-shell.ts +39 -0
  893. package/src/browser/app-version.ts +14 -0
  894. package/src/browser/connection-warmup.ts +134 -0
  895. package/src/browser/cookie-name.ts +140 -0
  896. package/src/browser/event-controller.ts +257 -158
  897. package/src/browser/history-state.ts +21 -0
  898. package/src/browser/index.ts +3 -3
  899. package/src/browser/invalidate-client-cache.ts +52 -0
  900. package/src/browser/link-interceptor.ts +4 -0
  901. package/src/browser/logging.ts +28 -0
  902. package/src/browser/merge-segment-loaders.ts +6 -4
  903. package/src/browser/navigation-bridge.ts +212 -34
  904. package/src/browser/navigation-client.ts +233 -58
  905. package/src/browser/navigation-store-handle.ts +38 -0
  906. package/src/browser/navigation-store.ts +203 -80
  907. package/src/browser/navigation-transaction.ts +18 -66
  908. package/src/browser/network-error-handler.ts +34 -7
  909. package/src/browser/partial-update.ts +242 -126
  910. package/src/browser/prefetch/cache.ts +344 -30
  911. package/src/browser/prefetch/fetch.ts +373 -48
  912. package/src/browser/prefetch/policy.ts +6 -0
  913. package/src/browser/prefetch/queue.ts +144 -23
  914. package/src/browser/prefetch/resource-ready.ts +77 -0
  915. package/src/browser/rango-state.ts +158 -76
  916. package/src/browser/react/Link.tsx +135 -18
  917. package/src/browser/react/NavigationProvider.tsx +240 -122
  918. package/src/browser/react/ScrollRestoration.tsx +10 -6
  919. package/src/browser/react/context.ts +7 -2
  920. package/src/browser/react/filter-segment-order.ts +66 -7
  921. package/src/browser/react/index.ts +0 -48
  922. package/src/browser/react/location-state-shared.ts +178 -8
  923. package/src/browser/react/location-state.ts +39 -14
  924. package/src/browser/react/use-action.ts +6 -15
  925. package/src/browser/react/use-handle.ts +23 -69
  926. package/src/browser/react/use-href.tsx +8 -1
  927. package/src/browser/react/use-link-status.ts +33 -8
  928. package/src/browser/react/use-navigation.ts +32 -7
  929. package/src/browser/react/use-params.ts +20 -10
  930. package/src/browser/react/use-reverse.ts +106 -0
  931. package/src/browser/react/use-router.ts +46 -11
  932. package/src/browser/react/use-search-params.ts +0 -5
  933. package/src/browser/react/use-segments.ts +11 -21
  934. package/src/browser/response-adapter.ts +99 -8
  935. package/src/browser/rsc-router.tsx +276 -76
  936. package/src/browser/scroll-restoration.ts +61 -47
  937. package/src/browser/segment-reconciler.ts +44 -7
  938. package/src/browser/segment-structure-assert.ts +2 -2
  939. package/src/browser/server-action-bridge.ts +244 -71
  940. package/src/browser/types.ts +160 -12
  941. package/src/browser/validate-redirect-origin.ts +43 -16
  942. package/src/build/collect-fallback-refs.ts +107 -0
  943. package/src/build/generate-manifest.ts +207 -158
  944. package/src/build/generate-route-types.ts +6 -1
  945. package/src/build/index.ts +11 -3
  946. package/src/build/prefix-tree-utils.ts +123 -0
  947. package/src/build/route-trie.ts +215 -42
  948. package/src/build/route-types/ast-route-extraction.ts +15 -8
  949. package/src/build/route-types/codegen.ts +16 -5
  950. package/src/build/route-types/include-resolution.ts +464 -63
  951. package/src/build/route-types/param-extraction.ts +6 -3
  952. package/src/build/route-types/per-module-writer.ts +22 -6
  953. package/src/build/route-types/router-processing.ts +336 -110
  954. package/src/build/route-types/scan-filter.ts +9 -2
  955. package/src/build/route-types/source-scan.ts +216 -0
  956. package/src/build/runtime-discovery.ts +13 -21
  957. package/src/cache/cache-error.ts +104 -0
  958. package/src/cache/cache-key-utils.ts +58 -13
  959. package/src/cache/cache-policy.ts +108 -34
  960. package/src/cache/cache-runtime.ts +436 -69
  961. package/src/cache/cache-scope.ts +235 -103
  962. package/src/cache/cache-tag.ts +149 -0
  963. package/src/cache/cf/cf-base64.ts +33 -0
  964. package/src/cache/cf/cf-cache-constants.ts +127 -0
  965. package/src/cache/cf/cf-cache-store.ts +2442 -170
  966. package/src/cache/cf/cf-cache-types.ts +349 -0
  967. package/src/cache/cf/cf-kv-utils.ts +46 -0
  968. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  969. package/src/cache/cf/index.ts +11 -17
  970. package/src/cache/document-cache.ts +144 -49
  971. package/src/cache/handle-snapshot.ts +70 -0
  972. package/src/cache/index.ts +24 -20
  973. package/src/cache/memory-segment-store.ts +243 -37
  974. package/src/cache/profile-registry.ts +46 -31
  975. package/src/cache/read-through-swr.ts +56 -12
  976. package/src/cache/segment-codec.ts +13 -21
  977. package/src/cache/shell-snapshot.ts +417 -0
  978. package/src/cache/tag-invalidation.ts +230 -0
  979. package/src/cache/taint.ts +55 -0
  980. package/src/cache/types.ts +180 -99
  981. package/src/cache/vercel/index.ts +11 -0
  982. package/src/cache/vercel/vercel-cache-store.ts +1127 -0
  983. package/src/client.rsc.tsx +42 -21
  984. package/src/client.tsx +117 -336
  985. package/src/cloudflare/index.ts +11 -0
  986. package/src/cloudflare/tracing.ts +108 -0
  987. package/src/component-utils.ts +19 -0
  988. package/src/components/DefaultDocument.tsx +8 -2
  989. package/src/context-var.ts +84 -2
  990. package/src/debug.ts +2 -2
  991. package/src/decode-loader-results.ts +52 -0
  992. package/src/defer.ts +185 -0
  993. package/src/deps/ssr.ts +0 -1
  994. package/src/encode-kv.ts +49 -0
  995. package/src/errors.ts +30 -4
  996. package/src/escape-script.ts +52 -0
  997. package/src/handle.ts +104 -34
  998. package/src/handles/MetaTags.tsx +24 -53
  999. package/src/handles/Scripts.tsx +183 -0
  1000. package/src/handles/breadcrumbs.ts +93 -0
  1001. package/src/handles/deferred-resolution.ts +127 -0
  1002. package/src/handles/is-thenable.ts +18 -0
  1003. package/src/handles/meta.ts +14 -40
  1004. package/src/handles/script.ts +244 -0
  1005. package/src/host/cookie-handler.ts +9 -60
  1006. package/src/host/errors.ts +13 -22
  1007. package/src/host/index.ts +9 -2
  1008. package/src/host/pattern-matcher.ts +23 -52
  1009. package/src/host/router.ts +107 -99
  1010. package/src/host/testing.ts +40 -27
  1011. package/src/host/types.ts +37 -4
  1012. package/src/host/utils.ts +1 -1
  1013. package/src/href-client.ts +137 -22
  1014. package/src/index.rsc.ts +84 -29
  1015. package/src/index.ts +134 -43
  1016. package/src/internal-debug.ts +11 -10
  1017. package/src/loader-store.ts +500 -0
  1018. package/src/loader.rsc.ts +20 -13
  1019. package/src/loader.ts +12 -11
  1020. package/src/missing-id-error.ts +68 -0
  1021. package/src/outlet-context.ts +1 -1
  1022. package/src/outlet-provider.tsx +1 -5
  1023. package/src/prerender/param-hash.ts +16 -16
  1024. package/src/prerender/store.ts +37 -41
  1025. package/src/prerender.ts +215 -86
  1026. package/src/redirect-origin.ts +114 -0
  1027. package/src/regex-escape.ts +8 -0
  1028. package/src/render-error-thrower.tsx +20 -0
  1029. package/src/response-utils.ts +62 -0
  1030. package/src/reverse.ts +65 -15
  1031. package/src/root-error-boundary.tsx +1 -19
  1032. package/src/route-content-wrapper.tsx +19 -77
  1033. package/src/route-definition/dsl-helpers.ts +485 -303
  1034. package/src/route-definition/helper-factories.ts +28 -140
  1035. package/src/route-definition/helpers-types.ts +153 -77
  1036. package/src/route-definition/index.ts +4 -2
  1037. package/src/route-definition/redirect.ts +53 -12
  1038. package/src/route-definition/resolve-handler-use.ts +160 -0
  1039. package/src/route-definition/use-item-types.ts +29 -0
  1040. package/src/route-map-builder.ts +48 -21
  1041. package/src/route-types.ts +37 -46
  1042. package/src/router/basename.ts +14 -0
  1043. package/src/router/content-negotiation.ts +164 -17
  1044. package/src/router/error-handling.ts +45 -18
  1045. package/src/router/find-match.ts +130 -29
  1046. package/src/router/handler-context.ts +110 -39
  1047. package/src/router/instrument.ts +355 -0
  1048. package/src/router/intercept-resolution.ts +50 -24
  1049. package/src/router/lazy-includes.ts +89 -63
  1050. package/src/router/loader-resolution.ts +286 -56
  1051. package/src/router/logging.ts +5 -8
  1052. package/src/router/manifest.ts +105 -56
  1053. package/src/router/match-api.ts +179 -219
  1054. package/src/router/match-context.ts +0 -22
  1055. package/src/router/match-handlers.ts +211 -165
  1056. package/src/router/match-middleware/background-revalidation.ts +66 -22
  1057. package/src/router/match-middleware/cache-lookup.ts +214 -263
  1058. package/src/router/match-middleware/cache-store.ts +105 -50
  1059. package/src/router/match-middleware/intercept-resolution.ts +8 -28
  1060. package/src/router/match-middleware/segment-resolution.ts +52 -18
  1061. package/src/router/match-pipelines.ts +1 -42
  1062. package/src/router/match-result.ts +127 -52
  1063. package/src/router/metrics.ts +158 -47
  1064. package/src/router/middleware-types.ts +22 -120
  1065. package/src/router/middleware.ts +398 -231
  1066. package/src/router/navigation-snapshot.ts +133 -0
  1067. package/src/router/params-util.ts +23 -0
  1068. package/src/router/parse-pattern.ts +115 -0
  1069. package/src/router/pattern-matching.ts +183 -137
  1070. package/src/router/prefetch-cache-ttl.ts +51 -0
  1071. package/src/router/prefetch-limits.ts +37 -0
  1072. package/src/router/prerender-match.ts +207 -58
  1073. package/src/router/preview-match.ts +35 -103
  1074. package/src/router/request-classification.ts +291 -0
  1075. package/src/router/revalidation.ts +144 -74
  1076. package/src/router/route-snapshot.ts +256 -0
  1077. package/src/router/router-context.ts +11 -29
  1078. package/src/router/router-interfaces.ts +160 -36
  1079. package/src/router/router-options.ts +214 -22
  1080. package/src/router/router-registry.ts +2 -5
  1081. package/src/router/segment-resolution/fresh.ts +301 -78
  1082. package/src/router/segment-resolution/helpers.ts +116 -31
  1083. package/src/router/segment-resolution/loader-cache.ts +140 -39
  1084. package/src/router/segment-resolution/loader-mask.ts +67 -0
  1085. package/src/router/segment-resolution/loader-snapshot.ts +251 -0
  1086. package/src/router/segment-resolution/revalidation.ts +478 -388
  1087. package/src/router/segment-resolution/static-store.ts +19 -5
  1088. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1089. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1090. package/src/router/segment-resolution.ts +5 -1
  1091. package/src/router/segment-wrappers.ts +8 -5
  1092. package/src/router/state-cookie-name.ts +33 -0
  1093. package/src/router/substitute-pattern-params.ts +75 -0
  1094. package/src/router/telemetry-otel.ts +160 -200
  1095. package/src/router/telemetry.ts +105 -20
  1096. package/src/router/timeout.ts +0 -20
  1097. package/src/router/tracing.ts +215 -0
  1098. package/src/router/trie-matching.ts +188 -58
  1099. package/src/router/types.ts +10 -63
  1100. package/src/router/url-params.ts +57 -0
  1101. package/src/router.ts +222 -67
  1102. package/src/rsc/full-payload.ts +70 -0
  1103. package/src/rsc/handler-context.ts +3 -2
  1104. package/src/rsc/handler.ts +726 -457
  1105. package/src/rsc/helpers.ts +168 -46
  1106. package/src/rsc/index.ts +2 -5
  1107. package/src/rsc/json-route-result.ts +38 -0
  1108. package/src/rsc/loader-fetch.ts +127 -31
  1109. package/src/rsc/manifest-init.ts +33 -42
  1110. package/src/rsc/nonce.ts +10 -1
  1111. package/src/rsc/origin-guard.ts +39 -25
  1112. package/src/rsc/progressive-enhancement.ts +159 -23
  1113. package/src/rsc/redirect-guard.ts +100 -0
  1114. package/src/rsc/response-cache-serve.ts +238 -0
  1115. package/src/rsc/response-error.ts +79 -12
  1116. package/src/rsc/response-route-handler.ts +99 -189
  1117. package/src/rsc/rsc-rendering.ts +479 -104
  1118. package/src/rsc/runtime-warnings.ts +23 -10
  1119. package/src/rsc/server-action.ts +293 -115
  1120. package/src/rsc/shell-capture.ts +1158 -0
  1121. package/src/rsc/shell-serve.ts +150 -0
  1122. package/src/rsc/ssr-setup.ts +144 -0
  1123. package/src/rsc/transition-gate.ts +89 -0
  1124. package/src/rsc/types.ts +64 -6
  1125. package/src/runtime-env.ts +18 -0
  1126. package/src/search-params.ts +49 -41
  1127. package/src/segment-content-promise.ts +67 -0
  1128. package/src/segment-loader-promise.ts +167 -0
  1129. package/src/segment-system.tsx +418 -131
  1130. package/src/serialize.ts +243 -0
  1131. package/src/server/context.ts +367 -61
  1132. package/src/server/cookie-parse.ts +32 -0
  1133. package/src/server/cookie-store.ts +152 -5
  1134. package/src/server/handle-store.ts +40 -38
  1135. package/src/server/loader-registry.ts +38 -46
  1136. package/src/server/request-context.ts +576 -176
  1137. package/src/ssr/index.tsx +467 -174
  1138. package/src/ssr/inject-rsc-eager.ts +167 -0
  1139. package/src/ssr/ssr-root.tsx +228 -0
  1140. package/src/static-handler.ts +27 -18
  1141. package/src/testing/cache-status.ts +162 -0
  1142. package/src/testing/collect-handle.ts +46 -0
  1143. package/src/testing/dispatch.ts +813 -0
  1144. package/src/testing/dom.entry.ts +22 -0
  1145. package/src/testing/e2e/fixture.ts +188 -0
  1146. package/src/testing/e2e/index.ts +128 -0
  1147. package/src/testing/e2e/matchers.ts +35 -0
  1148. package/src/testing/e2e/page-helpers.ts +272 -0
  1149. package/src/testing/e2e/parity.ts +387 -0
  1150. package/src/testing/e2e/server.ts +195 -0
  1151. package/src/testing/flight-matchers.ts +97 -0
  1152. package/src/testing/flight-normalize.ts +11 -0
  1153. package/src/testing/flight-runtime.d.ts +57 -0
  1154. package/src/testing/flight-tree.ts +682 -0
  1155. package/src/testing/flight.entry.ts +52 -0
  1156. package/src/testing/flight.ts +257 -0
  1157. package/src/testing/generated-routes.ts +199 -0
  1158. package/src/testing/index.ts +105 -0
  1159. package/src/testing/internal/context.ts +371 -0
  1160. package/src/testing/internal/flight-client-globals.ts +30 -0
  1161. package/src/testing/internal/seed-vars.ts +54 -0
  1162. package/src/testing/render-handler.ts +357 -0
  1163. package/src/testing/render-route.tsx +584 -0
  1164. package/src/testing/run-loader.ts +385 -0
  1165. package/src/testing/run-middleware.ts +205 -0
  1166. package/src/testing/run-transition-when.ts +164 -0
  1167. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1168. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1169. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1170. package/src/testing/vitest-stubs/version.ts +5 -0
  1171. package/src/testing/vitest.ts +305 -0
  1172. package/src/theme/ThemeProvider.tsx +56 -84
  1173. package/src/theme/ThemeScript.tsx +7 -9
  1174. package/src/theme/constants.ts +52 -13
  1175. package/src/theme/index.ts +0 -7
  1176. package/src/theme/theme-context.ts +1 -5
  1177. package/src/theme/theme-script.ts +22 -21
  1178. package/src/theme/use-theme.ts +0 -3
  1179. package/src/types/boundaries.ts +0 -35
  1180. package/src/types/cache-types.ts +17 -8
  1181. package/src/types/error-types.ts +30 -90
  1182. package/src/types/global-namespace.ts +54 -41
  1183. package/src/types/handler-context.ts +237 -89
  1184. package/src/types/index.ts +3 -10
  1185. package/src/types/loader-types.ts +44 -15
  1186. package/src/types/request-scope.ts +112 -0
  1187. package/src/types/route-config.ts +23 -46
  1188. package/src/types/route-entry.ts +19 -7
  1189. package/src/types/segments.ts +137 -19
  1190. package/src/urls/include-helper.ts +40 -75
  1191. package/src/urls/include-provider.ts +71 -0
  1192. package/src/urls/index.ts +2 -11
  1193. package/src/urls/path-helper-types.ts +102 -23
  1194. package/src/urls/path-helper.ts +62 -111
  1195. package/src/urls/pattern-types.ts +84 -19
  1196. package/src/urls/response-types.ts +25 -22
  1197. package/src/urls/type-extraction.ts +98 -154
  1198. package/src/urls/urls-function.ts +1 -19
  1199. package/src/use-loader.tsx +346 -89
  1200. package/src/vercel/index.ts +11 -0
  1201. package/src/vercel/tracing.ts +88 -0
  1202. package/src/vite/debug.ts +185 -0
  1203. package/src/vite/discovery/bundle-postprocess.ts +36 -38
  1204. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1205. package/src/vite/discovery/discover-routers.ts +130 -85
  1206. package/src/vite/discovery/discovery-errors.ts +255 -0
  1207. package/src/vite/discovery/gate-state.ts +171 -0
  1208. package/src/vite/discovery/prerender-collection.ts +214 -132
  1209. package/src/vite/discovery/route-types-writer.ts +40 -84
  1210. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1211. package/src/vite/discovery/state.ts +57 -6
  1212. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  1213. package/src/vite/index.ts +19 -3
  1214. package/src/vite/inject-client-debug.ts +88 -0
  1215. package/src/vite/plugin-types.ts +234 -62
  1216. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  1217. package/src/vite/plugins/client-ref-dedup.ts +16 -11
  1218. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  1219. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1220. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1221. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1222. package/src/vite/plugins/expose-action-id.ts +49 -98
  1223. package/src/vite/plugins/expose-id-utils.ts +96 -51
  1224. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  1225. package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
  1226. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  1227. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  1228. package/src/vite/plugins/expose-internal-ids.ts +553 -317
  1229. package/src/vite/plugins/performance-tracks.ts +89 -0
  1230. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1231. package/src/vite/plugins/use-cache-transform.ts +73 -83
  1232. package/src/vite/plugins/vercel-output.ts +384 -0
  1233. package/src/vite/plugins/version-injector.ts +40 -29
  1234. package/src/vite/plugins/version-plugin.ts +46 -37
  1235. package/src/vite/plugins/virtual-entries.ts +138 -27
  1236. package/src/vite/rango.ts +353 -303
  1237. package/src/vite/router-discovery.ts +1090 -166
  1238. package/src/vite/utils/ast-handler-extract.ts +26 -35
  1239. package/src/vite/utils/banner.ts +4 -4
  1240. package/src/vite/utils/bundle-analysis.ts +10 -15
  1241. package/src/vite/utils/client-chunks.ts +184 -0
  1242. package/src/vite/utils/directive-prologue.ts +40 -0
  1243. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1244. package/src/vite/utils/manifest-utils.ts +4 -59
  1245. package/src/vite/utils/package-resolution.ts +20 -52
  1246. package/src/vite/utils/prerender-utils.ts +98 -38
  1247. package/src/vite/utils/shared-utils.ts +144 -44
  1248. package/src/browser/action-response-classifier.ts +0 -99
  1249. package/src/browser/shallow.ts +0 -40
  1250. package/src/router/middleware-cookies.ts +0 -55
@@ -7,60 +7,15 @@
7
7
  import type { RouteEntry, TrailingSlashMode } from "../types";
8
8
  import type { EntryData } from "../server/context";
9
9
  import { debugLog, isRouterDebugEnabled } from "./logging.js";
10
+ import { escapeRegExp } from "../regex-escape.js";
11
+ import { safeDecodeURIComponent } from "./url-params.js";
12
+ import { parsePattern, type ParsedSegment } from "./parse-pattern.js";
10
13
 
11
- /**
12
- * Parsed segment info
13
- */
14
- export interface ParsedSegment {
15
- type: "static" | "param" | "wildcard";
16
- value: string; // static text, param name, or "*"
17
- optional: boolean;
18
- constraint?: string[]; // enum values like ["en", "gb"]
19
- }
20
-
21
- /**
22
- * Parse a route pattern into segments
23
- *
24
- * Supports:
25
- * - Static: /blog, /about
26
- * - Params: /:slug, /:id
27
- * - Optional: /:locale?, /:page?
28
- * - Constrained: /:locale(en|gb), /:type(post|page)
29
- * - Optional + Constrained: /:locale(en|gb)?
30
- * - Wildcard: /*
31
- */
32
- export function parsePattern(pattern: string): ParsedSegment[] {
33
- const segments: ParsedSegment[] = [];
34
- // Match: /segment where segment can be:
35
- // - static text
36
- // - :param
37
- // - :param?
38
- // - :param(a|b)
39
- // - :param(a|b)?
40
- // - *
41
- const segmentRegex =
42
- /\/(:([a-zA-Z_][a-zA-Z0-9_]*)(\(([^)]+)\))?(\?)?|(\*)|([^/]+))/g;
43
-
44
- let match;
45
- while ((match = segmentRegex.exec(pattern)) !== null) {
46
- const [, , paramName, , constraint, optional, wildcard, staticText] = match;
47
-
48
- if (wildcard) {
49
- segments.push({ type: "wildcard", value: "*", optional: false });
50
- } else if (paramName) {
51
- segments.push({
52
- type: "param",
53
- value: paramName,
54
- optional: optional === "?",
55
- constraint: constraint ? constraint.split("|") : undefined,
56
- });
57
- } else if (staticText) {
58
- segments.push({ type: "static", value: staticText, optional: false });
59
- }
60
- }
61
-
62
- return segments;
63
- }
14
+ // `parsePattern`/`ParsedSegment` live in the dependency-free `parse-pattern.ts`
15
+ // so the client reverse helper can import them without dragging this module's
16
+ // server-only deps into the browser bundle. Re-exported here for existing
17
+ // importers (build/route-trie, middleware, tests).
18
+ export { parsePattern, type ParsedSegment };
64
19
 
65
20
  /**
66
21
  * Compiled pattern result containing regex, param metadata, and trailing slash info.
@@ -68,8 +23,22 @@ export function parsePattern(pattern: string): ParsedSegment[] {
68
23
  export interface CompiledPattern {
69
24
  regex: RegExp;
70
25
  paramNames: string[];
71
- optionalParams: Set<string>;
72
26
  hasTrailingSlash: boolean;
27
+ /**
28
+ * Param-name → allowed values for constrained params (e.g. `:lang(en|gb)`).
29
+ * Validated against the **decoded** param value after regex extraction so
30
+ * a URL like `/en%20GB` still matches `:lang(en GB)` — matching the trie
31
+ * path's behavior (trie-matching.ts:validateAndBuild).
32
+ */
33
+ constraints?: Record<string, string[]>;
34
+ /**
35
+ * The pattern's catch-all param, if any (`*` for bare `/*`, the name for a
36
+ * named `:name+`/`:name*`). A zero-or-more catch-all (`oneOrMore: false`)
37
+ * whose optional group is absent binds "" rather than being omitted — so
38
+ * `/docs` matches `/docs/:slug*` with `slug === ""`. `oneOrMore` keeps the
39
+ * same polarity as `ParsedSegment.oneOrMore` and the trie's `w1`.
40
+ */
41
+ catchAll?: { name: string; oneOrMore: boolean };
73
42
  }
74
43
 
75
44
  // Module-level cache for compiled patterns. Route patterns are a finite set
@@ -129,38 +98,75 @@ export function compilePattern(pattern: string): CompiledPattern {
129
98
 
130
99
  const segments = parsePattern(normalizedPattern);
131
100
  const paramNames: string[] = [];
132
- const optionalParams = new Set<string>();
101
+ let constraints: Record<string, string[]> | undefined;
102
+ let catchAll: { name: string; oneOrMore: boolean } | undefined;
133
103
 
134
104
  let regexPattern = "";
135
105
 
136
106
  for (const segment of segments) {
137
107
  if (segment.type === "wildcard") {
138
- paramNames.push("*");
139
- regexPattern += "/(.*)";
108
+ // Wildcards capture the remainder under `segment.value` ("*" for the bare
109
+ // form, the param name for a named catch-all).
110
+ paramNames.push(segment.value);
111
+ catchAll = { name: segment.value, oneOrMore: Boolean(segment.oneOrMore) };
112
+ if (segment.oneOrMore) {
113
+ // `:name+` — one-or-more, rejects the zero-segment (bare-prefix) case.
114
+ regexPattern += "/(.+)";
115
+ } else {
116
+ // Zero-or-more catch-all: named `:name*` OR the bare `/*` (both parse to
117
+ // `oneOrMore: false`). The whole `/segment` is optional so the bare
118
+ // prefix matches directly, aligning the regex fallback with the trie
119
+ // (which already matches the bare prefix binding "" — trie-matching.ts);
120
+ // buildParamsFromMatch binds "" when the optional group is absent.
121
+ //
122
+ // The bare `/*` previously used a required `/(.*)`, so `/files/*` failed
123
+ // to match `/files` and fell through to trailing-slash normalization,
124
+ // emitting a corrupt `/file` redirect instead of a match (issue #636,
125
+ // parity row C1). It is the same alignment #635 made for named `:name*`.
126
+ regexPattern += "(?:/(.*))?";
127
+ }
140
128
  } else if (segment.type === "param") {
141
129
  paramNames.push(segment.value);
142
- const valuePattern = segment.constraint
143
- ? `(${segment.constraint.map(escapeRegex).join("|")})`
144
- : "([^/]+)";
130
+ const suffixPattern = segment.suffix ? escapeRegExp(segment.suffix) : "";
131
+ // Constrained params capture anything here; the allowed values are
132
+ // checked post-decode in findMatch so URL-encoded constraint values
133
+ // (e.g. `:lang(en GB)` via `/en%20GB`) still match.
134
+ const valuePattern = segment.suffix ? "([^/]+?)" : "([^/]+)";
135
+
136
+ if (segment.constraint) {
137
+ (constraints ??= {})[segment.value] = segment.constraint;
138
+ }
145
139
 
146
140
  if (segment.optional) {
147
- optionalParams.add(segment.value);
148
141
  // Optional: make the whole /segment optional
149
- regexPattern += `(?:/${valuePattern})?`;
142
+ regexPattern += `(?:/${valuePattern}${suffixPattern})?`;
150
143
  } else {
151
- regexPattern += `/${valuePattern}`;
144
+ regexPattern += `/${valuePattern}${suffixPattern}`;
152
145
  }
153
146
  } else {
154
147
  // Static segment
155
- regexPattern += `/${escapeRegex(segment.value)}`;
148
+ regexPattern += `/${escapeRegExp(segment.value)}`;
156
149
  }
157
150
  }
158
151
 
159
- // Handle root path
160
152
  if (regexPattern === "") {
161
153
  regexPattern = "/";
162
154
  }
163
155
 
156
+ // Patterns of only optional segments (e.g. `/:locale?`, `/:a?/:b?`) need
157
+ // an explicit `/` alternative so a bare `/` matches the absent form. The
158
+ // optional template `(?:/X)?` matches `/X` or empty string, but pathnames
159
+ // are never empty. Arises from `include("/:locale?", routes)` + inner
160
+ // `path("/")`. Skip when an explicit trailing slash already anchors the
161
+ // match.
162
+ const hasOnlyOptionalSegments =
163
+ !hasTrailingSlash &&
164
+ segments.length > 0 &&
165
+ segments.every((segment) => segment.type === "param" && segment.optional);
166
+ if (hasOnlyOptionalSegments) {
167
+ regexPattern = `(?:/|${regexPattern})`;
168
+ }
169
+
164
170
  // Add trailing slash to regex if pattern has one
165
171
  if (hasTrailingSlash) {
166
172
  regexPattern += "/";
@@ -169,16 +175,69 @@ export function compilePattern(pattern: string): CompiledPattern {
169
175
  return {
170
176
  regex: new RegExp(`^${regexPattern}$`),
171
177
  paramNames,
172
- optionalParams,
173
178
  hasTrailingSlash,
179
+ ...(constraints ? { constraints } : {}),
180
+ ...(catchAll ? { catchAll } : {}),
174
181
  };
175
182
  }
176
183
 
177
184
  /**
178
- * Escape special regex characters in a string
185
+ * Validate decoded params against a compiled pattern's constraints.
186
+ * Returns false if any constrained param has a non-empty value not in the
187
+ * allowed list. Absent optionals (key missing or `undefined`) are allowed;
188
+ * `""` is also tolerated as "absent" so user-provided params or fixtures
189
+ * that pass empty strings explicitly behave the same way.
179
190
  */
180
- function escapeRegex(str: string): string {
181
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
191
+ function satisfiesConstraints(
192
+ params: Record<string, string>,
193
+ constraints: Record<string, string[]> | undefined,
194
+ ): boolean {
195
+ if (!constraints) return true;
196
+ for (const name in constraints) {
197
+ const value = params[name];
198
+ if (
199
+ value !== undefined &&
200
+ value !== "" &&
201
+ !constraints[name].includes(value)
202
+ ) {
203
+ return false;
204
+ }
205
+ }
206
+ return true;
207
+ }
208
+
209
+ /**
210
+ * Build the named-params record from a regex match. Optional segments that
211
+ * didn't capture leave the corresponding group `undefined`; we skip those
212
+ * keys so `ctx.params.<name>` reads as `undefined` rather than `""`. This
213
+ * keeps the runtime aligned with the `ExtractParams` type and matches the
214
+ * trie matcher's contract (see `trie-matching.ts:validateAndBuild`).
215
+ *
216
+ * A zero-or-more catch-all (`compiled.catchAll`, `oneOrMore: false`) whose
217
+ * optional group didn't capture binds "" instead of being omitted, so `/docs`
218
+ * matches `/docs/:slug*` with `slug === ""`. Exported so the `renderRoute`
219
+ * testing harness (`matchLeaf`) shares this exact logic instead of forking it.
220
+ */
221
+ export function buildParamsFromMatch(
222
+ match: RegExpExecArray,
223
+ paramNames: string[],
224
+ catchAll?: { name: string; oneOrMore: boolean },
225
+ ): Record<string, string> {
226
+ const params: Record<string, string> = {};
227
+ paramNames.forEach((name, index) => {
228
+ const captured = match[index + 1];
229
+ if (captured !== undefined) {
230
+ // A catch-all remainder decodes identically whether split-per-segment or
231
+ // whole-string (a literal `/` never lives inside a `%XX` escape), so a
232
+ // single decode is correct and cheapest.
233
+ params[name] = safeDecodeURIComponent(captured);
234
+ } else if (catchAll && name === catchAll.name && !catchAll.oneOrMore) {
235
+ // A zero-or-more catch-all (`:name*` or the bare `/*`) whose optional
236
+ // group was absent binds "" rather than being omitted.
237
+ params[name] = "";
238
+ }
239
+ });
240
+ return params;
182
241
  }
183
242
 
184
243
  /**
@@ -197,43 +256,58 @@ function escapeRegex(str: string): string {
197
256
  export function extractStaticPrefix(pattern: string): string {
198
257
  if (!pattern || pattern === "/") return "";
199
258
 
200
- // Find the first occurrence of : or *
201
- const paramIndex = pattern.indexOf(":");
202
- const wildcardIndex = pattern.indexOf("*");
203
-
204
- let cutIndex = -1;
205
- if (paramIndex !== -1 && wildcardIndex !== -1) {
206
- cutIndex = Math.min(paramIndex, wildcardIndex);
207
- } else if (paramIndex !== -1) {
208
- cutIndex = paramIndex;
209
- } else if (wildcardIndex !== -1) {
210
- cutIndex = wildcardIndex;
211
- }
212
-
213
- if (cutIndex === -1) {
214
- // No params or wildcards - entire pattern is static
215
- return pattern;
259
+ // Walk segments and stop at the first that is a real param (`:name`) or a
260
+ // wildcard (`*`). A literal `:` or `*` not at a segment boundary (e.g. the
261
+ // `a:b` in `/a:b/c/:id`, or `tel:+1`) is a STATIC segment and must NOT
262
+ // terminate the prefix — `pattern.indexOf(":")` misread it as a param marker,
263
+ // returning "" and dropping the findMatch fast-skip optimization for that
264
+ // entry on every request. Classification mirrors parsePattern: a leading `:`
265
+ // marks a param, a leading `*` marks a wildcard.
266
+ const hasLeadingSlash = pattern.startsWith("/");
267
+ const body = hasLeadingSlash ? pattern.slice(1) : pattern;
268
+ const segments = body.split("/");
269
+
270
+ const staticSegments: string[] = [];
271
+ for (const segment of segments) {
272
+ if (segment.startsWith(":") || segment.startsWith("*")) {
273
+ break;
274
+ }
275
+ staticSegments.push(segment);
216
276
  }
217
277
 
218
- if (cutIndex === 0) {
219
- // Pattern starts with : or * - no static prefix
220
- return "";
221
- }
278
+ // No leading static segment (first segment is a param/wildcard) -> no prefix.
279
+ if (staticSegments.length === 0) return "";
280
+ // Every segment was static (no param/wildcard) -> the whole pattern is the
281
+ // prefix. Preserve a trailing slash only when it existed in the input; a
282
+ // split of "/a/b" yields ["a","b"] (no empty tail) so a re-join is exact.
283
+ if (staticSegments.length === segments.length) return pattern;
222
284
 
223
- // Find the last / before the param
224
- const lastSlash = pattern.lastIndexOf("/", cutIndex - 1);
225
- if (lastSlash === -1 || lastSlash === 0) {
226
- return "";
227
- }
285
+ const prefix = staticSegments.join("/");
286
+ return hasLeadingSlash ? "/" + prefix : prefix;
287
+ }
228
288
 
229
- return pattern.slice(0, lastSlash);
289
+ /**
290
+ * Join a URL prefix to a sub-prefix, collapsing the duplicate slash when the
291
+ * base ends with "/" and the sub-prefix starts with "/". This mirrors the
292
+ * canonical join in `include()` (urls/include-helper.ts) and `runWithPrefixes`
293
+ * (server/context.ts) so a nested lazy include's runtime staticPrefix matches
294
+ * the build-time trie's `sp` (e.g. `include("/parent/", …)` containing
295
+ * `include("/child", …)` resolves to `/parent/child`, not `/parent//child`).
296
+ */
297
+ export function joinPrefix(base: string | undefined, prefix: string): string {
298
+ if (!base) return prefix;
299
+ return base.endsWith("/") && prefix.startsWith("/")
300
+ ? base + prefix.slice(1)
301
+ : base + prefix;
230
302
  }
231
303
 
232
304
  /**
233
305
  * Match a pathname against registered routes
234
306
  *
235
- * Note: Optional params that are absent in the path will have empty string value.
236
- * Use the pattern definition to determine if a param is optional.
307
+ * Note: Optional params that are absent in the path are omitted from the
308
+ * returned `params` (read as `undefined`), matching the trie matcher and
309
+ * the `ExtractParams<"/:locale?/...">` type. Use the pattern definition to
310
+ * determine which keys are optional.
237
311
  *
238
312
  * Trailing slash handling (priority order):
239
313
  * 1. Per-route `trailingSlash` config from route()
@@ -251,10 +325,7 @@ export interface RouteMatchResult<TEnv = any> {
251
325
  entry: RouteEntry<TEnv>;
252
326
  routeKey: string;
253
327
  params: Record<string, string>;
254
- optionalParams: Set<string>;
255
328
  redirectTo?: string;
256
- /** Ancestry shortCodes for layout pruning (from trie match) */
257
- ancestry?: string[];
258
329
  /** Route has pre-rendered data available (from trie) */
259
330
  pr?: true;
260
331
  /** Passthrough: handler kept for live fallback on unknown params (from trie) */
@@ -332,8 +403,6 @@ export function findMatch<TEnv>(
332
403
  : pathname + "/";
333
404
 
334
405
  for (const entry of routesEntries) {
335
- // Short-circuit: skip entry if pathname doesn't start with static prefix
336
- // staticPrefix is pre-computed at registration time, so this is O(1)
337
406
  if (entry.staticPrefix && !pathname.startsWith(entry.staticPrefix)) {
338
407
  if (effectiveDebug) {
339
408
  debugStats.entriesSkipped++;
@@ -345,8 +414,6 @@ export function findMatch<TEnv>(
345
414
  continue;
346
415
  }
347
416
 
348
- // Check if this is a lazy entry that needs evaluation
349
- // When staticPrefix matches but routes are not yet populated, signal caller to evaluate
350
417
  if (entry.lazy && !entry.lazyEvaluated) {
351
418
  if (effectiveDebug) {
352
419
  debugLog("findMatch", "lazy entry requires evaluation", {
@@ -367,7 +434,6 @@ export function findMatch<TEnv>(
367
434
  debugStats.routesChecked++;
368
435
  }
369
436
 
370
- // Join prefix and pattern, handling edge cases
371
437
  let fullPattern: string;
372
438
  if (entry.prefix === "" || entry.prefix === "/") {
373
439
  fullPattern = pattern;
@@ -377,14 +443,12 @@ export function findMatch<TEnv>(
377
443
  fullPattern = entry.prefix + pattern;
378
444
  }
379
445
 
380
- const { regex, paramNames, optionalParams, hasTrailingSlash } =
446
+ const { regex, paramNames, hasTrailingSlash, constraints, catchAll } =
381
447
  getCompiledPattern(fullPattern);
382
448
 
383
- // Get trailing slash mode for this route (per-route config or pattern-based)
384
449
  const trailingSlashMode: TrailingSlashMode | undefined =
385
450
  entry.trailingSlash?.[routeKey];
386
451
 
387
- // Prerender flag from entry metadata (set by urls() for prerender handlers)
388
452
  const prFlag = entry.prerenderRouteKeys?.has(routeKey)
389
453
  ? { pr: true as const }
390
454
  : {};
@@ -392,13 +456,13 @@ export function findMatch<TEnv>(
392
456
  ? { pt: true as const }
393
457
  : {};
394
458
 
395
- // Try exact match first
396
459
  const match = regex.exec(pathname);
397
460
  if (match) {
398
- const params: Record<string, string> = {};
399
- paramNames.forEach((name, index) => {
400
- params[name] = match[index + 1] ?? "";
401
- });
461
+ const params = buildParamsFromMatch(match, paramNames, catchAll);
462
+
463
+ if (!satisfiesConstraints(params, constraints)) {
464
+ continue;
465
+ }
402
466
 
403
467
  if (effectiveDebug) {
404
468
  debugLog("findMatch", "matched route", {
@@ -408,29 +472,24 @@ export function findMatch<TEnv>(
408
472
  });
409
473
  }
410
474
 
411
- // Check if trailing slash mode requires redirect even on exact match
412
475
  if (
413
476
  trailingSlashMode === "always" &&
414
477
  !pathnameHasTrailingSlash &&
415
478
  pathname !== "/"
416
479
  ) {
417
- // Mode says always have trailing slash, but pathname doesn't have it
418
480
  return {
419
481
  entry,
420
482
  routeKey,
421
483
  params,
422
- optionalParams,
423
484
  redirectTo: pathname + "/",
424
485
  ...prFlag,
425
486
  ...ptFlag,
426
487
  };
427
488
  } else if (trailingSlashMode === "never" && pathnameHasTrailingSlash) {
428
- // Mode says never have trailing slash, but pathname has it
429
489
  return {
430
490
  entry,
431
491
  routeKey,
432
492
  params,
433
- optionalParams,
434
493
  redirectTo: pathname.slice(0, -1),
435
494
  ...prFlag,
436
495
  ...ptFlag,
@@ -441,39 +500,33 @@ export function findMatch<TEnv>(
441
500
  entry,
442
501
  routeKey,
443
502
  params,
444
- optionalParams,
445
503
  ...prFlag,
446
504
  ...ptFlag,
447
505
  };
448
506
  }
449
507
 
450
- // Try alternate pathname (opposite trailing slash)
451
508
  const altMatch = regex.exec(alternatePathname);
452
509
  if (altMatch) {
453
- const params: Record<string, string> = {};
454
- paramNames.forEach((name, index) => {
455
- params[name] = altMatch[index + 1] ?? "";
456
- });
510
+ const params = buildParamsFromMatch(altMatch, paramNames, catchAll);
511
+
512
+ if (!satisfiesConstraints(params, constraints)) {
513
+ continue;
514
+ }
457
515
 
458
- // Determine redirect behavior based on mode
459
516
  if (trailingSlashMode === "ignore") {
460
- // Match without redirect
461
517
  return {
462
518
  entry,
463
519
  routeKey,
464
520
  params,
465
- optionalParams,
466
521
  ...prFlag,
467
522
  ...ptFlag,
468
523
  };
469
524
  } else if (trailingSlashMode === "never") {
470
- // Redirect to no trailing slash
471
525
  if (pathnameHasTrailingSlash) {
472
526
  return {
473
527
  entry,
474
528
  routeKey,
475
529
  params,
476
- optionalParams,
477
530
  redirectTo: alternatePathname,
478
531
  ...prFlag,
479
532
  ...ptFlag,
@@ -483,18 +536,15 @@ export function findMatch<TEnv>(
483
536
  entry,
484
537
  routeKey,
485
538
  params,
486
- optionalParams,
487
539
  ...prFlag,
488
540
  ...ptFlag,
489
541
  };
490
542
  } else if (trailingSlashMode === "always") {
491
- // Redirect to with trailing slash
492
543
  if (!pathnameHasTrailingSlash) {
493
544
  return {
494
545
  entry,
495
546
  routeKey,
496
547
  params,
497
- optionalParams,
498
548
  redirectTo: alternatePathname,
499
549
  ...prFlag,
500
550
  ...ptFlag,
@@ -504,13 +554,10 @@ export function findMatch<TEnv>(
504
554
  entry,
505
555
  routeKey,
506
556
  params,
507
- optionalParams,
508
557
  ...prFlag,
509
558
  ...ptFlag,
510
559
  };
511
560
  } else {
512
- // No explicit mode - use pattern-based detection
513
- // Redirect to canonical form (what the pattern defines)
514
561
  const canonicalPath = hasTrailingSlash
515
562
  ? alternatePathname
516
563
  : pathname.slice(0, -1);
@@ -518,7 +565,6 @@ export function findMatch<TEnv>(
518
565
  entry,
519
566
  routeKey,
520
567
  params,
521
- optionalParams,
522
568
  redirectTo: canonicalPath,
523
569
  ...prFlag,
524
570
  ...ptFlag,
@@ -539,7 +585,7 @@ export function* traverseBack(entry: EntryData): Generator<EntryData> {
539
585
  let current: EntryData | null = entry;
540
586
  const items = [] as EntryData[];
541
587
  while (current !== null) {
542
- items.push(current); // Move up to next parent
588
+ items.push(current);
543
589
  current = current.parent;
544
590
  }
545
591
  for (let i = items.length - 1; i >= 0; i--) {
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Resolve the prefetch cache TTL once, at router init, into the three derived
3
+ * values the rest of the router consumes: seconds (for the Cache-Control
4
+ * max-age), milliseconds (for the client-side in-memory cache), and the
5
+ * Cache-Control header string (or false when caching is disabled).
6
+ *
7
+ * `false` disables prefetch caching (seconds 0). A non-finite input
8
+ * (NaN/Infinity, e.g. from an env-derived number that failed to parse) is
9
+ * treated as the default rather than producing a malformed
10
+ * `Cache-Control: max-age=NaN` header; CDNs/browsers ignore such a directive,
11
+ * which would silently disable caching on EVERY prefetch response. Negative
12
+ * finite values clamp to 0 (disabled).
13
+ *
14
+ * Policy note: this is the prefetch-TTL policy specifically. Other finite-number
15
+ * guards in the codebase deliberately differ — defer.ts treats Infinity as an
16
+ * intentional disable, and profile-registry.ts THROWS on non-finite/negative ttl
17
+ * at config time. They are NOT the same guard, so don't unify them.
18
+ */
19
+ export interface ResolvedPrefetchCacheTTL {
20
+ /** TTL in seconds for the Cache-Control max-age directive. */
21
+ seconds: number;
22
+ /** TTL in milliseconds for the client-side in-memory prefetch cache. */
23
+ ms: number;
24
+ /** Cache-Control header value, or false when caching is disabled. */
25
+ cacheControl: string | false;
26
+ }
27
+
28
+ const DEFAULT_PREFETCH_CACHE_TTL_SECONDS = 300;
29
+
30
+ export function resolvePrefetchCacheTTL(
31
+ rawTTL: number | false | undefined,
32
+ ): ResolvedPrefetchCacheTTL {
33
+ let seconds: number;
34
+ if (rawTTL === false) {
35
+ seconds = 0;
36
+ } else if (rawTTL === undefined) {
37
+ seconds = DEFAULT_PREFETCH_CACHE_TTL_SECONDS;
38
+ } else if (typeof rawTTL === "number" && Number.isFinite(rawTTL)) {
39
+ seconds = Math.max(0, Math.floor(rawTTL));
40
+ } else {
41
+ // Non-finite (NaN/Infinity): fall back to the default rather than emit a
42
+ // malformed max-age=NaN/Infinity that CDNs and browsers reject.
43
+ seconds = DEFAULT_PREFETCH_CACHE_TTL_SECONDS;
44
+ }
45
+
46
+ return {
47
+ seconds,
48
+ ms: seconds * 1000,
49
+ cacheControl: seconds === 0 ? false : `private, max-age=${seconds}`,
50
+ };
51
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Resolve the client-side prefetch limits — the in-memory prefetch cache size
3
+ * and the speculative-prefetch queue concurrency — once, at router init. Both
4
+ * are positive-integer counts shipped to the browser in payload metadata; the
5
+ * browser entry feeds them to the prefetch cache (`initPrefetchCache`) and the
6
+ * prefetch queue (`setPrefetchConcurrency`) at startup.
7
+ *
8
+ * Policy note: this is a SEPARATE policy from resolvePrefetchCacheTTL
9
+ * (prefetch-cache-ttl.ts). These are counts, not durations, so the disable
10
+ * paths differ: a TTL of `false`/0 intentionally turns prefetching off, but a
11
+ * cache size or concurrency of 0 would silently break prefetching while leaving
12
+ * it nominally enabled — never the intent of passing a number. So any value
13
+ * that is not a finite integer >= 1 (0, negative, fractional below 1, NaN,
14
+ * Infinity, undefined) falls back to the default. Finite values >= 1 are
15
+ * floored. Do not unify this guard with the TTL guard.
16
+ */
17
+
18
+ export const DEFAULT_PREFETCH_CACHE_SIZE = 100;
19
+ export const DEFAULT_PREFETCH_CONCURRENCY = 2;
20
+
21
+ export function resolvePrefetchCacheSize(raw: number | undefined): number {
22
+ return resolvePositiveCount(raw, DEFAULT_PREFETCH_CACHE_SIZE);
23
+ }
24
+
25
+ export function resolvePrefetchConcurrency(raw: number | undefined): number {
26
+ return resolvePositiveCount(raw, DEFAULT_PREFETCH_CONCURRENCY);
27
+ }
28
+
29
+ function resolvePositiveCount(
30
+ raw: number | undefined,
31
+ fallback: number,
32
+ ): number {
33
+ if (typeof raw === "number" && Number.isFinite(raw) && raw >= 1) {
34
+ return Math.floor(raw);
35
+ }
36
+ return fallback;
37
+ }