@rangojs/router 0.0.0-experimental.65 → 0.0.0-experimental.655f3c16

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 (852) hide show
  1. package/dist/vite/index.js +253 -81
  2. package/package.json +3 -3
  3. package/skills/handler-use/SKILL.md +362 -0
  4. package/skills/intercept/SKILL.md +20 -0
  5. package/skills/layout/SKILL.md +22 -0
  6. package/skills/middleware/SKILL.md +32 -3
  7. package/skills/migrate-nextjs/SKILL.md +560 -0
  8. package/skills/migrate-react-router/SKILL.md +764 -0
  9. package/skills/parallel/SKILL.md +59 -0
  10. package/skills/rango/SKILL.md +24 -22
  11. package/skills/route/SKILL.md +24 -0
  12. package/src/browser/navigation-bridge.ts +7 -1
  13. package/src/browser/navigation-client.ts +34 -6
  14. package/src/browser/partial-update.ts +5 -0
  15. package/src/browser/prefetch/cache.ts +16 -6
  16. package/src/browser/prefetch/fetch.ts +60 -4
  17. package/src/browser/react/Link.tsx +25 -2
  18. package/src/browser/segment-reconciler.ts +81 -15
  19. package/src/build/route-trie.ts +50 -24
  20. package/src/client.tsx +3 -10
  21. package/src/index.ts +41 -9
  22. package/src/reverse.ts +4 -1
  23. package/src/route-definition/dsl-helpers.ts +159 -20
  24. package/src/route-definition/helpers-types.ts +57 -13
  25. package/src/router/handler-context.ts +4 -1
  26. package/src/router/loader-resolution.ts +70 -47
  27. package/src/router/match-middleware/cache-lookup.ts +10 -5
  28. package/src/router/match-middleware/segment-resolution.ts +1 -1
  29. package/src/router/match-result.ts +82 -4
  30. package/src/router/segment-resolution/fresh.ts +5 -0
  31. package/src/router/segment-resolution/revalidation.ts +7 -1
  32. package/src/rsc/handler.ts +13 -5
  33. package/src/rsc/loader-fetch.ts +23 -3
  34. package/src/rsc/progressive-enhancement.ts +10 -2
  35. package/src/rsc/rsc-rendering.ts +5 -1
  36. package/src/rsc/server-action.ts +6 -0
  37. package/src/rsc/types.ts +1 -0
  38. package/src/segment-content-promise.ts +38 -0
  39. package/src/segment-system.tsx +25 -11
  40. package/src/server/handle-store.ts +19 -0
  41. package/src/server/request-context.ts +30 -2
  42. package/src/types/segments.ts +4 -0
  43. package/src/urls/path-helper-types.ts +30 -4
  44. package/src/use-loader.tsx +4 -1
  45. package/src/vite/discovery/prerender-collection.ts +124 -83
  46. package/src/vite/plugins/expose-id-utils.ts +12 -0
  47. package/src/vite/plugins/expose-internal-ids.ts +213 -2
  48. package/src/vite/utils/prerender-utils.ts +20 -6
  49. package/dist/__internal.d.ts +0 -83
  50. package/dist/__internal.d.ts.map +0 -1
  51. package/dist/__internal.js +0 -19
  52. package/dist/__internal.js.map +0 -1
  53. package/dist/__mocks__/version.d.ts +0 -7
  54. package/dist/__mocks__/version.d.ts.map +0 -1
  55. package/dist/__mocks__/version.js +0 -7
  56. package/dist/__mocks__/version.js.map +0 -1
  57. package/dist/__tests__/client-href.test.d.ts +0 -2
  58. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  59. package/dist/__tests__/client-href.test.js +0 -74
  60. package/dist/__tests__/client-href.test.js.map +0 -1
  61. package/dist/__tests__/component-utils.test.d.ts +0 -2
  62. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  63. package/dist/__tests__/component-utils.test.js +0 -51
  64. package/dist/__tests__/component-utils.test.js.map +0 -1
  65. package/dist/__tests__/event-controller.test.d.ts +0 -2
  66. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  67. package/dist/__tests__/event-controller.test.js +0 -538
  68. package/dist/__tests__/event-controller.test.js.map +0 -1
  69. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  70. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  71. package/dist/__tests__/helpers/route-tree.js +0 -374
  72. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  73. package/dist/__tests__/match-result.test.d.ts +0 -2
  74. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  75. package/dist/__tests__/match-result.test.js +0 -154
  76. package/dist/__tests__/match-result.test.js.map +0 -1
  77. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  78. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  79. package/dist/__tests__/navigation-store.test.js +0 -440
  80. package/dist/__tests__/navigation-store.test.js.map +0 -1
  81. package/dist/__tests__/partial-update.test.d.ts +0 -2
  82. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  83. package/dist/__tests__/partial-update.test.js +0 -1009
  84. package/dist/__tests__/partial-update.test.js.map +0 -1
  85. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  86. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  87. package/dist/__tests__/reverse-types.test.js +0 -656
  88. package/dist/__tests__/reverse-types.test.js.map +0 -1
  89. package/dist/__tests__/route-definition.test.d.ts +0 -2
  90. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  91. package/dist/__tests__/route-definition.test.js +0 -55
  92. package/dist/__tests__/route-definition.test.js.map +0 -1
  93. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  94. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  95. package/dist/__tests__/router-helpers.test.js +0 -377
  96. package/dist/__tests__/router-helpers.test.js.map +0 -1
  97. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  98. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  99. package/dist/__tests__/router-integration-2.test.js +0 -426
  100. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  101. package/dist/__tests__/router-integration.test.d.ts +0 -2
  102. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  103. package/dist/__tests__/router-integration.test.js +0 -1051
  104. package/dist/__tests__/router-integration.test.js.map +0 -1
  105. package/dist/__tests__/search-params.test.d.ts +0 -5
  106. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  107. package/dist/__tests__/search-params.test.js +0 -306
  108. package/dist/__tests__/search-params.test.js.map +0 -1
  109. package/dist/__tests__/segment-system.test.d.ts +0 -2
  110. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  111. package/dist/__tests__/segment-system.test.js +0 -627
  112. package/dist/__tests__/segment-system.test.js.map +0 -1
  113. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  114. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  115. package/dist/__tests__/static-handler-types.test.js +0 -63
  116. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  117. package/dist/__tests__/urls.test.d.ts +0 -2
  118. package/dist/__tests__/urls.test.d.ts.map +0 -1
  119. package/dist/__tests__/urls.test.js +0 -421
  120. package/dist/__tests__/urls.test.js.map +0 -1
  121. package/dist/__tests__/use-mount.test.d.ts +0 -2
  122. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  123. package/dist/__tests__/use-mount.test.js +0 -35
  124. package/dist/__tests__/use-mount.test.js.map +0 -1
  125. package/dist/bin/rango.d.ts +0 -2
  126. package/dist/bin/rango.d.ts.map +0 -1
  127. package/dist/bin/rango.js.map +0 -1
  128. package/dist/browser/event-controller.d.ts +0 -191
  129. package/dist/browser/event-controller.d.ts.map +0 -1
  130. package/dist/browser/event-controller.js +0 -559
  131. package/dist/browser/event-controller.js.map +0 -1
  132. package/dist/browser/index.d.ts +0 -2
  133. package/dist/browser/index.d.ts.map +0 -1
  134. package/dist/browser/index.js +0 -14
  135. package/dist/browser/index.js.map +0 -1
  136. package/dist/browser/link-interceptor.d.ts +0 -38
  137. package/dist/browser/link-interceptor.d.ts.map +0 -1
  138. package/dist/browser/link-interceptor.js +0 -99
  139. package/dist/browser/link-interceptor.js.map +0 -1
  140. package/dist/browser/logging.d.ts +0 -10
  141. package/dist/browser/logging.d.ts.map +0 -1
  142. package/dist/browser/logging.js +0 -29
  143. package/dist/browser/logging.js.map +0 -1
  144. package/dist/browser/lru-cache.d.ts +0 -17
  145. package/dist/browser/lru-cache.d.ts.map +0 -1
  146. package/dist/browser/lru-cache.js +0 -50
  147. package/dist/browser/lru-cache.js.map +0 -1
  148. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  149. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  150. package/dist/browser/merge-segment-loaders.js +0 -102
  151. package/dist/browser/merge-segment-loaders.js.map +0 -1
  152. package/dist/browser/navigation-bridge.d.ts +0 -102
  153. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  154. package/dist/browser/navigation-bridge.js +0 -708
  155. package/dist/browser/navigation-bridge.js.map +0 -1
  156. package/dist/browser/navigation-client.d.ts +0 -25
  157. package/dist/browser/navigation-client.d.ts.map +0 -1
  158. package/dist/browser/navigation-client.js +0 -157
  159. package/dist/browser/navigation-client.js.map +0 -1
  160. package/dist/browser/navigation-store.d.ts +0 -101
  161. package/dist/browser/navigation-store.d.ts.map +0 -1
  162. package/dist/browser/navigation-store.js +0 -625
  163. package/dist/browser/navigation-store.js.map +0 -1
  164. package/dist/browser/partial-update.d.ts +0 -75
  165. package/dist/browser/partial-update.d.ts.map +0 -1
  166. package/dist/browser/partial-update.js +0 -426
  167. package/dist/browser/partial-update.js.map +0 -1
  168. package/dist/browser/react/Link.d.ts +0 -86
  169. package/dist/browser/react/Link.d.ts.map +0 -1
  170. package/dist/browser/react/Link.js +0 -128
  171. package/dist/browser/react/Link.js.map +0 -1
  172. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  173. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  174. package/dist/browser/react/NavigationProvider.js +0 -216
  175. package/dist/browser/react/NavigationProvider.js.map +0 -1
  176. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  177. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  178. package/dist/browser/react/ScrollRestoration.js +0 -57
  179. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  180. package/dist/browser/react/context.d.ts +0 -46
  181. package/dist/browser/react/context.d.ts.map +0 -1
  182. package/dist/browser/react/context.js +0 -10
  183. package/dist/browser/react/context.js.map +0 -1
  184. package/dist/browser/react/index.d.ts +0 -11
  185. package/dist/browser/react/index.d.ts.map +0 -1
  186. package/dist/browser/react/index.js +0 -22
  187. package/dist/browser/react/index.js.map +0 -1
  188. package/dist/browser/react/location-state-shared.d.ts +0 -63
  189. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  190. package/dist/browser/react/location-state-shared.js +0 -81
  191. package/dist/browser/react/location-state-shared.js.map +0 -1
  192. package/dist/browser/react/location-state.d.ts +0 -23
  193. package/dist/browser/react/location-state.d.ts.map +0 -1
  194. package/dist/browser/react/location-state.js +0 -29
  195. package/dist/browser/react/location-state.js.map +0 -1
  196. package/dist/browser/react/mount-context.d.ts +0 -24
  197. package/dist/browser/react/mount-context.d.ts.map +0 -1
  198. package/dist/browser/react/mount-context.js +0 -24
  199. package/dist/browser/react/mount-context.js.map +0 -1
  200. package/dist/browser/react/use-action.d.ts +0 -64
  201. package/dist/browser/react/use-action.d.ts.map +0 -1
  202. package/dist/browser/react/use-action.js +0 -134
  203. package/dist/browser/react/use-action.js.map +0 -1
  204. package/dist/browser/react/use-client-cache.d.ts +0 -41
  205. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  206. package/dist/browser/react/use-client-cache.js +0 -39
  207. package/dist/browser/react/use-client-cache.js.map +0 -1
  208. package/dist/browser/react/use-handle.d.ts +0 -31
  209. package/dist/browser/react/use-handle.d.ts.map +0 -1
  210. package/dist/browser/react/use-handle.js +0 -144
  211. package/dist/browser/react/use-handle.js.map +0 -1
  212. package/dist/browser/react/use-href.d.ts +0 -33
  213. package/dist/browser/react/use-href.d.ts.map +0 -1
  214. package/dist/browser/react/use-href.js +0 -39
  215. package/dist/browser/react/use-href.js.map +0 -1
  216. package/dist/browser/react/use-link-status.d.ts +0 -37
  217. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  218. package/dist/browser/react/use-link-status.js +0 -99
  219. package/dist/browser/react/use-link-status.js.map +0 -1
  220. package/dist/browser/react/use-mount.d.ts +0 -25
  221. package/dist/browser/react/use-mount.d.ts.map +0 -1
  222. package/dist/browser/react/use-mount.js +0 -30
  223. package/dist/browser/react/use-mount.js.map +0 -1
  224. package/dist/browser/react/use-navigation.d.ts +0 -27
  225. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  226. package/dist/browser/react/use-navigation.js +0 -87
  227. package/dist/browser/react/use-navigation.js.map +0 -1
  228. package/dist/browser/react/use-segments.d.ts +0 -38
  229. package/dist/browser/react/use-segments.d.ts.map +0 -1
  230. package/dist/browser/react/use-segments.js +0 -130
  231. package/dist/browser/react/use-segments.js.map +0 -1
  232. package/dist/browser/request-controller.d.ts +0 -26
  233. package/dist/browser/request-controller.d.ts.map +0 -1
  234. package/dist/browser/request-controller.js +0 -147
  235. package/dist/browser/request-controller.js.map +0 -1
  236. package/dist/browser/rsc-router.d.ts +0 -129
  237. package/dist/browser/rsc-router.d.ts.map +0 -1
  238. package/dist/browser/rsc-router.js +0 -195
  239. package/dist/browser/rsc-router.js.map +0 -1
  240. package/dist/browser/scroll-restoration.d.ts +0 -93
  241. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  242. package/dist/browser/scroll-restoration.js +0 -321
  243. package/dist/browser/scroll-restoration.js.map +0 -1
  244. package/dist/browser/segment-structure-assert.d.ts +0 -17
  245. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  246. package/dist/browser/segment-structure-assert.js +0 -59
  247. package/dist/browser/segment-structure-assert.js.map +0 -1
  248. package/dist/browser/server-action-bridge.d.ts +0 -26
  249. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  250. package/dist/browser/server-action-bridge.js +0 -668
  251. package/dist/browser/server-action-bridge.js.map +0 -1
  252. package/dist/browser/shallow.d.ts +0 -12
  253. package/dist/browser/shallow.d.ts.map +0 -1
  254. package/dist/browser/shallow.js +0 -34
  255. package/dist/browser/shallow.js.map +0 -1
  256. package/dist/browser/types.d.ts +0 -369
  257. package/dist/browser/types.d.ts.map +0 -1
  258. package/dist/browser/types.js +0 -2
  259. package/dist/browser/types.js.map +0 -1
  260. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  261. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  262. package/dist/build/__tests__/generate-cli.test.js +0 -237
  263. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  264. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  265. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  266. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  267. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  268. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  269. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  270. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  271. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  272. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  273. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  274. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  275. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  276. package/dist/build/generate-manifest.d.ts +0 -81
  277. package/dist/build/generate-manifest.d.ts.map +0 -1
  278. package/dist/build/generate-manifest.js +0 -276
  279. package/dist/build/generate-manifest.js.map +0 -1
  280. package/dist/build/generate-route-types.d.ts +0 -115
  281. package/dist/build/generate-route-types.d.ts.map +0 -1
  282. package/dist/build/generate-route-types.js +0 -740
  283. package/dist/build/generate-route-types.js.map +0 -1
  284. package/dist/build/index.d.ts +0 -21
  285. package/dist/build/index.d.ts.map +0 -1
  286. package/dist/build/index.js +0 -21
  287. package/dist/build/index.js.map +0 -1
  288. package/dist/build/route-trie.d.ts +0 -71
  289. package/dist/build/route-trie.d.ts.map +0 -1
  290. package/dist/build/route-trie.js +0 -175
  291. package/dist/build/route-trie.js.map +0 -1
  292. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  293. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  294. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  295. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  296. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  297. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  298. package/dist/cache/__tests__/document-cache.test.js +0 -345
  299. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  300. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  301. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  302. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  303. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  304. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  305. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  306. package/dist/cache/__tests__/memory-store.test.js +0 -367
  307. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  308. package/dist/cache/cache-scope.d.ts +0 -102
  309. package/dist/cache/cache-scope.d.ts.map +0 -1
  310. package/dist/cache/cache-scope.js +0 -440
  311. package/dist/cache/cache-scope.js.map +0 -1
  312. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  313. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  314. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  315. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  316. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  317. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  318. package/dist/cache/cf/cf-cache-store.js +0 -242
  319. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  320. package/dist/cache/cf/index.d.ts +0 -14
  321. package/dist/cache/cf/index.d.ts.map +0 -1
  322. package/dist/cache/cf/index.js +0 -17
  323. package/dist/cache/cf/index.js.map +0 -1
  324. package/dist/cache/document-cache.d.ts +0 -64
  325. package/dist/cache/document-cache.d.ts.map +0 -1
  326. package/dist/cache/document-cache.js +0 -228
  327. package/dist/cache/document-cache.js.map +0 -1
  328. package/dist/cache/index.d.ts +0 -19
  329. package/dist/cache/index.d.ts.map +0 -1
  330. package/dist/cache/index.js +0 -21
  331. package/dist/cache/index.js.map +0 -1
  332. package/dist/cache/memory-segment-store.d.ts +0 -110
  333. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  334. package/dist/cache/memory-segment-store.js +0 -117
  335. package/dist/cache/memory-segment-store.js.map +0 -1
  336. package/dist/cache/memory-store.d.ts +0 -41
  337. package/dist/cache/memory-store.d.ts.map +0 -1
  338. package/dist/cache/memory-store.js +0 -191
  339. package/dist/cache/memory-store.js.map +0 -1
  340. package/dist/cache/types.d.ts +0 -317
  341. package/dist/cache/types.d.ts.map +0 -1
  342. package/dist/cache/types.js +0 -12
  343. package/dist/cache/types.js.map +0 -1
  344. package/dist/client.d.ts +0 -248
  345. package/dist/client.d.ts.map +0 -1
  346. package/dist/client.js +0 -367
  347. package/dist/client.js.map +0 -1
  348. package/dist/client.rsc.d.ts +0 -26
  349. package/dist/client.rsc.d.ts.map +0 -1
  350. package/dist/client.rsc.js +0 -46
  351. package/dist/client.rsc.js.map +0 -1
  352. package/dist/component-utils.d.ts +0 -36
  353. package/dist/component-utils.d.ts.map +0 -1
  354. package/dist/component-utils.js +0 -61
  355. package/dist/component-utils.js.map +0 -1
  356. package/dist/components/DefaultDocument.d.ts +0 -13
  357. package/dist/components/DefaultDocument.d.ts.map +0 -1
  358. package/dist/components/DefaultDocument.js +0 -15
  359. package/dist/components/DefaultDocument.js.map +0 -1
  360. package/dist/debug.d.ts +0 -58
  361. package/dist/debug.d.ts.map +0 -1
  362. package/dist/debug.js +0 -157
  363. package/dist/debug.js.map +0 -1
  364. package/dist/default-error-boundary.d.ts +0 -11
  365. package/dist/default-error-boundary.d.ts.map +0 -1
  366. package/dist/default-error-boundary.js +0 -45
  367. package/dist/default-error-boundary.js.map +0 -1
  368. package/dist/deps/browser.d.ts +0 -2
  369. package/dist/deps/browser.d.ts.map +0 -1
  370. package/dist/deps/browser.js +0 -3
  371. package/dist/deps/browser.js.map +0 -1
  372. package/dist/deps/html-stream-client.d.ts +0 -2
  373. package/dist/deps/html-stream-client.d.ts.map +0 -1
  374. package/dist/deps/html-stream-client.js +0 -3
  375. package/dist/deps/html-stream-client.js.map +0 -1
  376. package/dist/deps/html-stream-server.d.ts +0 -2
  377. package/dist/deps/html-stream-server.d.ts.map +0 -1
  378. package/dist/deps/html-stream-server.js +0 -3
  379. package/dist/deps/html-stream-server.js.map +0 -1
  380. package/dist/deps/rsc.d.ts +0 -2
  381. package/dist/deps/rsc.d.ts.map +0 -1
  382. package/dist/deps/rsc.js +0 -4
  383. package/dist/deps/rsc.js.map +0 -1
  384. package/dist/deps/ssr.d.ts +0 -2
  385. package/dist/deps/ssr.d.ts.map +0 -1
  386. package/dist/deps/ssr.js +0 -3
  387. package/dist/deps/ssr.js.map +0 -1
  388. package/dist/errors.d.ts +0 -174
  389. package/dist/errors.d.ts.map +0 -1
  390. package/dist/errors.js +0 -241
  391. package/dist/errors.js.map +0 -1
  392. package/dist/handle.d.ts +0 -78
  393. package/dist/handle.d.ts.map +0 -1
  394. package/dist/handle.js +0 -82
  395. package/dist/handle.js.map +0 -1
  396. package/dist/handles/MetaTags.d.ts +0 -14
  397. package/dist/handles/MetaTags.d.ts.map +0 -1
  398. package/dist/handles/MetaTags.js +0 -136
  399. package/dist/handles/MetaTags.js.map +0 -1
  400. package/dist/handles/index.d.ts +0 -6
  401. package/dist/handles/index.d.ts.map +0 -1
  402. package/dist/handles/index.js +0 -6
  403. package/dist/handles/index.js.map +0 -1
  404. package/dist/handles/meta.d.ts +0 -39
  405. package/dist/handles/meta.d.ts.map +0 -1
  406. package/dist/handles/meta.js +0 -202
  407. package/dist/handles/meta.js.map +0 -1
  408. package/dist/host/__tests__/errors.test.d.ts +0 -2
  409. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  410. package/dist/host/__tests__/errors.test.js +0 -76
  411. package/dist/host/__tests__/errors.test.js.map +0 -1
  412. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  413. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  414. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  415. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  416. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  417. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  418. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  419. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  420. package/dist/host/__tests__/router.test.d.ts +0 -2
  421. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  422. package/dist/host/__tests__/router.test.js +0 -241
  423. package/dist/host/__tests__/router.test.js.map +0 -1
  424. package/dist/host/__tests__/testing.test.d.ts +0 -2
  425. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  426. package/dist/host/__tests__/testing.test.js +0 -64
  427. package/dist/host/__tests__/testing.test.js.map +0 -1
  428. package/dist/host/__tests__/utils.test.d.ts +0 -2
  429. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  430. package/dist/host/__tests__/utils.test.js +0 -29
  431. package/dist/host/__tests__/utils.test.js.map +0 -1
  432. package/dist/host/cookie-handler.d.ts +0 -34
  433. package/dist/host/cookie-handler.d.ts.map +0 -1
  434. package/dist/host/cookie-handler.js +0 -124
  435. package/dist/host/cookie-handler.js.map +0 -1
  436. package/dist/host/errors.d.ts +0 -56
  437. package/dist/host/errors.d.ts.map +0 -1
  438. package/dist/host/errors.js +0 -79
  439. package/dist/host/errors.js.map +0 -1
  440. package/dist/host/index.d.ts +0 -29
  441. package/dist/host/index.d.ts.map +0 -1
  442. package/dist/host/index.js +0 -32
  443. package/dist/host/index.js.map +0 -1
  444. package/dist/host/pattern-matcher.d.ts +0 -36
  445. package/dist/host/pattern-matcher.d.ts.map +0 -1
  446. package/dist/host/pattern-matcher.js +0 -172
  447. package/dist/host/pattern-matcher.js.map +0 -1
  448. package/dist/host/router.d.ts +0 -26
  449. package/dist/host/router.d.ts.map +0 -1
  450. package/dist/host/router.js +0 -218
  451. package/dist/host/router.js.map +0 -1
  452. package/dist/host/testing.d.ts +0 -36
  453. package/dist/host/testing.d.ts.map +0 -1
  454. package/dist/host/testing.js +0 -55
  455. package/dist/host/testing.js.map +0 -1
  456. package/dist/host/types.d.ts +0 -115
  457. package/dist/host/types.d.ts.map +0 -1
  458. package/dist/host/types.js +0 -7
  459. package/dist/host/types.js.map +0 -1
  460. package/dist/host/utils.d.ts +0 -21
  461. package/dist/host/utils.d.ts.map +0 -1
  462. package/dist/host/utils.js +0 -23
  463. package/dist/host/utils.js.map +0 -1
  464. package/dist/href-client.d.ts +0 -131
  465. package/dist/href-client.d.ts.map +0 -1
  466. package/dist/href-client.js +0 -64
  467. package/dist/href-client.js.map +0 -1
  468. package/dist/href-context.d.ts +0 -29
  469. package/dist/href-context.d.ts.map +0 -1
  470. package/dist/href-context.js +0 -21
  471. package/dist/href-context.js.map +0 -1
  472. package/dist/index.d.ts +0 -73
  473. package/dist/index.d.ts.map +0 -1
  474. package/dist/index.js +0 -91
  475. package/dist/index.js.map +0 -1
  476. package/dist/index.rsc.d.ts +0 -32
  477. package/dist/index.rsc.d.ts.map +0 -1
  478. package/dist/index.rsc.js +0 -40
  479. package/dist/index.rsc.js.map +0 -1
  480. package/dist/internal-debug.d.ts +0 -2
  481. package/dist/internal-debug.d.ts.map +0 -1
  482. package/dist/internal-debug.js +0 -5
  483. package/dist/internal-debug.js.map +0 -1
  484. package/dist/loader.d.ts +0 -14
  485. package/dist/loader.d.ts.map +0 -1
  486. package/dist/loader.js +0 -20
  487. package/dist/loader.js.map +0 -1
  488. package/dist/loader.rsc.d.ts +0 -19
  489. package/dist/loader.rsc.d.ts.map +0 -1
  490. package/dist/loader.rsc.js +0 -99
  491. package/dist/loader.rsc.js.map +0 -1
  492. package/dist/network-error-thrower.d.ts +0 -17
  493. package/dist/network-error-thrower.d.ts.map +0 -1
  494. package/dist/network-error-thrower.js +0 -14
  495. package/dist/network-error-thrower.js.map +0 -1
  496. package/dist/outlet-context.d.ts +0 -13
  497. package/dist/outlet-context.d.ts.map +0 -1
  498. package/dist/outlet-context.js +0 -3
  499. package/dist/outlet-context.js.map +0 -1
  500. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  501. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  502. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  503. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  504. package/dist/prerender/param-hash.d.ts +0 -16
  505. package/dist/prerender/param-hash.d.ts.map +0 -1
  506. package/dist/prerender/param-hash.js +0 -36
  507. package/dist/prerender/param-hash.js.map +0 -1
  508. package/dist/prerender/store.d.ts +0 -38
  509. package/dist/prerender/store.d.ts.map +0 -1
  510. package/dist/prerender/store.js +0 -61
  511. package/dist/prerender/store.js.map +0 -1
  512. package/dist/prerender.d.ts +0 -66
  513. package/dist/prerender.d.ts.map +0 -1
  514. package/dist/prerender.js +0 -57
  515. package/dist/prerender.js.map +0 -1
  516. package/dist/reverse.d.ts +0 -196
  517. package/dist/reverse.d.ts.map +0 -1
  518. package/dist/reverse.js +0 -78
  519. package/dist/reverse.js.map +0 -1
  520. package/dist/root-error-boundary.d.ts +0 -33
  521. package/dist/root-error-boundary.d.ts.map +0 -1
  522. package/dist/root-error-boundary.js +0 -165
  523. package/dist/root-error-boundary.js.map +0 -1
  524. package/dist/route-content-wrapper.d.ts +0 -46
  525. package/dist/route-content-wrapper.d.ts.map +0 -1
  526. package/dist/route-content-wrapper.js +0 -77
  527. package/dist/route-content-wrapper.js.map +0 -1
  528. package/dist/route-definition.d.ts +0 -421
  529. package/dist/route-definition.d.ts.map +0 -1
  530. package/dist/route-definition.js +0 -868
  531. package/dist/route-definition.js.map +0 -1
  532. package/dist/route-map-builder.d.ts +0 -155
  533. package/dist/route-map-builder.d.ts.map +0 -1
  534. package/dist/route-map-builder.js +0 -237
  535. package/dist/route-map-builder.js.map +0 -1
  536. package/dist/route-types.d.ts +0 -165
  537. package/dist/route-types.d.ts.map +0 -1
  538. package/dist/route-types.js +0 -7
  539. package/dist/route-types.js.map +0 -1
  540. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  541. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  542. package/dist/router/__tests__/handler-context.test.js +0 -65
  543. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  544. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  545. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  546. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  547. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  548. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  549. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  550. package/dist/router/__tests__/match-context.test.js +0 -92
  551. package/dist/router/__tests__/match-context.test.js.map +0 -1
  552. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  553. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  554. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  555. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  556. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  557. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  558. package/dist/router/__tests__/match-result.test.js +0 -457
  559. package/dist/router/__tests__/match-result.test.js.map +0 -1
  560. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  561. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  562. package/dist/router/__tests__/on-error.test.js +0 -678
  563. package/dist/router/__tests__/on-error.test.js.map +0 -1
  564. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  565. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  566. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  567. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  568. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  569. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  570. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  571. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  572. package/dist/router/error-handling.d.ts +0 -77
  573. package/dist/router/error-handling.d.ts.map +0 -1
  574. package/dist/router/error-handling.js +0 -202
  575. package/dist/router/error-handling.js.map +0 -1
  576. package/dist/router/handler-context.d.ts +0 -20
  577. package/dist/router/handler-context.d.ts.map +0 -1
  578. package/dist/router/handler-context.js +0 -198
  579. package/dist/router/handler-context.js.map +0 -1
  580. package/dist/router/intercept-resolution.d.ts +0 -66
  581. package/dist/router/intercept-resolution.d.ts.map +0 -1
  582. package/dist/router/intercept-resolution.js +0 -246
  583. package/dist/router/intercept-resolution.js.map +0 -1
  584. package/dist/router/loader-resolution.d.ts +0 -64
  585. package/dist/router/loader-resolution.d.ts.map +0 -1
  586. package/dist/router/loader-resolution.js +0 -284
  587. package/dist/router/loader-resolution.js.map +0 -1
  588. package/dist/router/logging.d.ts +0 -15
  589. package/dist/router/logging.d.ts.map +0 -1
  590. package/dist/router/logging.js +0 -99
  591. package/dist/router/logging.js.map +0 -1
  592. package/dist/router/manifest.d.ts +0 -22
  593. package/dist/router/manifest.d.ts.map +0 -1
  594. package/dist/router/manifest.js +0 -181
  595. package/dist/router/manifest.js.map +0 -1
  596. package/dist/router/match-api.d.ts +0 -35
  597. package/dist/router/match-api.d.ts.map +0 -1
  598. package/dist/router/match-api.js +0 -406
  599. package/dist/router/match-api.js.map +0 -1
  600. package/dist/router/match-context.d.ts +0 -206
  601. package/dist/router/match-context.d.ts.map +0 -1
  602. package/dist/router/match-context.js +0 -17
  603. package/dist/router/match-context.js.map +0 -1
  604. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  605. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  606. package/dist/router/match-middleware/background-revalidation.js +0 -75
  607. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  608. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  609. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  610. package/dist/router/match-middleware/cache-lookup.js +0 -257
  611. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  612. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  613. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  614. package/dist/router/match-middleware/cache-store.js +0 -108
  615. package/dist/router/match-middleware/cache-store.js.map +0 -1
  616. package/dist/router/match-middleware/index.d.ts +0 -81
  617. package/dist/router/match-middleware/index.d.ts.map +0 -1
  618. package/dist/router/match-middleware/index.js +0 -80
  619. package/dist/router/match-middleware/index.js.map +0 -1
  620. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  621. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  622. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  623. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  624. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  625. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  626. package/dist/router/match-middleware/segment-resolution.js +0 -53
  627. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  628. package/dist/router/match-pipelines.d.ts +0 -147
  629. package/dist/router/match-pipelines.d.ts.map +0 -1
  630. package/dist/router/match-pipelines.js +0 -82
  631. package/dist/router/match-pipelines.js.map +0 -1
  632. package/dist/router/match-result.d.ts +0 -126
  633. package/dist/router/match-result.d.ts.map +0 -1
  634. package/dist/router/match-result.js +0 -93
  635. package/dist/router/match-result.js.map +0 -1
  636. package/dist/router/metrics.d.ts +0 -20
  637. package/dist/router/metrics.d.ts.map +0 -1
  638. package/dist/router/metrics.js +0 -47
  639. package/dist/router/metrics.js.map +0 -1
  640. package/dist/router/middleware.d.ts +0 -249
  641. package/dist/router/middleware.d.ts.map +0 -1
  642. package/dist/router/middleware.js +0 -434
  643. package/dist/router/middleware.js.map +0 -1
  644. package/dist/router/middleware.test.d.ts +0 -2
  645. package/dist/router/middleware.test.d.ts.map +0 -1
  646. package/dist/router/middleware.test.js +0 -816
  647. package/dist/router/middleware.test.js.map +0 -1
  648. package/dist/router/pattern-matching.d.ts +0 -149
  649. package/dist/router/pattern-matching.d.ts.map +0 -1
  650. package/dist/router/pattern-matching.js +0 -349
  651. package/dist/router/pattern-matching.js.map +0 -1
  652. package/dist/router/revalidation.d.ts +0 -44
  653. package/dist/router/revalidation.d.ts.map +0 -1
  654. package/dist/router/revalidation.js +0 -147
  655. package/dist/router/revalidation.js.map +0 -1
  656. package/dist/router/router-context.d.ts +0 -135
  657. package/dist/router/router-context.d.ts.map +0 -1
  658. package/dist/router/router-context.js +0 -36
  659. package/dist/router/router-context.js.map +0 -1
  660. package/dist/router/segment-resolution.d.ts +0 -127
  661. package/dist/router/segment-resolution.d.ts.map +0 -1
  662. package/dist/router/segment-resolution.js +0 -919
  663. package/dist/router/segment-resolution.js.map +0 -1
  664. package/dist/router/trie-matching.d.ts +0 -40
  665. package/dist/router/trie-matching.d.ts.map +0 -1
  666. package/dist/router/trie-matching.js +0 -127
  667. package/dist/router/trie-matching.js.map +0 -1
  668. package/dist/router/types.d.ts +0 -136
  669. package/dist/router/types.d.ts.map +0 -1
  670. package/dist/router/types.js +0 -7
  671. package/dist/router/types.js.map +0 -1
  672. package/dist/router.d.ts +0 -753
  673. package/dist/router.d.ts.map +0 -1
  674. package/dist/router.gen.d.ts +0 -6
  675. package/dist/router.gen.d.ts.map +0 -1
  676. package/dist/router.gen.js +0 -6
  677. package/dist/router.gen.js.map +0 -1
  678. package/dist/router.js +0 -1304
  679. package/dist/router.js.map +0 -1
  680. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  681. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  682. package/dist/rsc/__tests__/helpers.test.js +0 -140
  683. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  684. package/dist/rsc/handler.d.ts +0 -45
  685. package/dist/rsc/handler.d.ts.map +0 -1
  686. package/dist/rsc/handler.js +0 -1172
  687. package/dist/rsc/handler.js.map +0 -1
  688. package/dist/rsc/helpers.d.ts +0 -16
  689. package/dist/rsc/helpers.d.ts.map +0 -1
  690. package/dist/rsc/helpers.js +0 -55
  691. package/dist/rsc/helpers.js.map +0 -1
  692. package/dist/rsc/index.d.ts +0 -22
  693. package/dist/rsc/index.d.ts.map +0 -1
  694. package/dist/rsc/index.js +0 -23
  695. package/dist/rsc/index.js.map +0 -1
  696. package/dist/rsc/nonce.d.ts +0 -9
  697. package/dist/rsc/nonce.d.ts.map +0 -1
  698. package/dist/rsc/nonce.js +0 -18
  699. package/dist/rsc/nonce.js.map +0 -1
  700. package/dist/rsc/types.d.ts +0 -206
  701. package/dist/rsc/types.d.ts.map +0 -1
  702. package/dist/rsc/types.js +0 -8
  703. package/dist/rsc/types.js.map +0 -1
  704. package/dist/search-params.d.ts +0 -103
  705. package/dist/search-params.d.ts.map +0 -1
  706. package/dist/search-params.js +0 -74
  707. package/dist/search-params.js.map +0 -1
  708. package/dist/segment-system.d.ts +0 -75
  709. package/dist/segment-system.d.ts.map +0 -1
  710. package/dist/segment-system.js +0 -336
  711. package/dist/segment-system.js.map +0 -1
  712. package/dist/server/context.d.ts +0 -245
  713. package/dist/server/context.d.ts.map +0 -1
  714. package/dist/server/context.js +0 -197
  715. package/dist/server/context.js.map +0 -1
  716. package/dist/server/fetchable-loader-store.d.ts +0 -18
  717. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  718. package/dist/server/fetchable-loader-store.js +0 -18
  719. package/dist/server/fetchable-loader-store.js.map +0 -1
  720. package/dist/server/handle-store.d.ts +0 -85
  721. package/dist/server/handle-store.d.ts.map +0 -1
  722. package/dist/server/handle-store.js +0 -142
  723. package/dist/server/handle-store.js.map +0 -1
  724. package/dist/server/loader-registry.d.ts +0 -55
  725. package/dist/server/loader-registry.d.ts.map +0 -1
  726. package/dist/server/loader-registry.js +0 -132
  727. package/dist/server/loader-registry.js.map +0 -1
  728. package/dist/server/request-context.d.ts +0 -226
  729. package/dist/server/request-context.d.ts.map +0 -1
  730. package/dist/server/request-context.js +0 -290
  731. package/dist/server/request-context.js.map +0 -1
  732. package/dist/server/root-layout.d.ts +0 -4
  733. package/dist/server/root-layout.d.ts.map +0 -1
  734. package/dist/server/root-layout.js +0 -5
  735. package/dist/server/root-layout.js.map +0 -1
  736. package/dist/server.d.ts +0 -15
  737. package/dist/server.d.ts.map +0 -1
  738. package/dist/server.js +0 -20
  739. package/dist/server.js.map +0 -1
  740. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  741. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  742. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  743. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  744. package/dist/ssr/index.d.ts +0 -98
  745. package/dist/ssr/index.d.ts.map +0 -1
  746. package/dist/ssr/index.js +0 -158
  747. package/dist/ssr/index.js.map +0 -1
  748. package/dist/static-handler.d.ts +0 -50
  749. package/dist/static-handler.d.ts.map +0 -1
  750. package/dist/static-handler.gen.d.ts +0 -5
  751. package/dist/static-handler.gen.d.ts.map +0 -1
  752. package/dist/static-handler.gen.js +0 -5
  753. package/dist/static-handler.gen.js.map +0 -1
  754. package/dist/static-handler.js +0 -29
  755. package/dist/static-handler.js.map +0 -1
  756. package/dist/theme/ThemeProvider.d.ts +0 -20
  757. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  758. package/dist/theme/ThemeProvider.js +0 -240
  759. package/dist/theme/ThemeProvider.js.map +0 -1
  760. package/dist/theme/ThemeScript.d.ts +0 -48
  761. package/dist/theme/ThemeScript.d.ts.map +0 -1
  762. package/dist/theme/ThemeScript.js +0 -13
  763. package/dist/theme/ThemeScript.js.map +0 -1
  764. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  765. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  766. package/dist/theme/__tests__/theme.test.js +0 -103
  767. package/dist/theme/__tests__/theme.test.js.map +0 -1
  768. package/dist/theme/constants.d.ts +0 -29
  769. package/dist/theme/constants.d.ts.map +0 -1
  770. package/dist/theme/constants.js +0 -48
  771. package/dist/theme/constants.js.map +0 -1
  772. package/dist/theme/index.d.ts +0 -31
  773. package/dist/theme/index.d.ts.map +0 -1
  774. package/dist/theme/index.js +0 -36
  775. package/dist/theme/index.js.map +0 -1
  776. package/dist/theme/theme-context.d.ts +0 -40
  777. package/dist/theme/theme-context.d.ts.map +0 -1
  778. package/dist/theme/theme-context.js +0 -60
  779. package/dist/theme/theme-context.js.map +0 -1
  780. package/dist/theme/theme-script.d.ts +0 -27
  781. package/dist/theme/theme-script.d.ts.map +0 -1
  782. package/dist/theme/theme-script.js +0 -147
  783. package/dist/theme/theme-script.js.map +0 -1
  784. package/dist/theme/types.d.ts +0 -163
  785. package/dist/theme/types.d.ts.map +0 -1
  786. package/dist/theme/types.js +0 -11
  787. package/dist/theme/types.js.map +0 -1
  788. package/dist/theme/use-theme.d.ts +0 -12
  789. package/dist/theme/use-theme.d.ts.map +0 -1
  790. package/dist/theme/use-theme.js +0 -40
  791. package/dist/theme/use-theme.js.map +0 -1
  792. package/dist/types.d.ts +0 -1479
  793. package/dist/types.d.ts.map +0 -1
  794. package/dist/types.js +0 -10
  795. package/dist/types.js.map +0 -1
  796. package/dist/urls.d.ts +0 -441
  797. package/dist/urls.d.ts.map +0 -1
  798. package/dist/urls.gen.d.ts +0 -8
  799. package/dist/urls.gen.d.ts.map +0 -1
  800. package/dist/urls.gen.js +0 -8
  801. package/dist/urls.gen.js.map +0 -1
  802. package/dist/urls.js +0 -443
  803. package/dist/urls.js.map +0 -1
  804. package/dist/use-loader.d.ts +0 -127
  805. package/dist/use-loader.d.ts.map +0 -1
  806. package/dist/use-loader.js +0 -237
  807. package/dist/use-loader.js.map +0 -1
  808. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  809. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  810. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  811. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  812. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  813. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  814. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  815. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  816. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  817. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  818. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  819. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  820. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  821. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  822. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  823. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  824. package/dist/vite/ast-handler-extract.d.ts +0 -49
  825. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  826. package/dist/vite/ast-handler-extract.js +0 -249
  827. package/dist/vite/ast-handler-extract.js.map +0 -1
  828. package/dist/vite/expose-action-id.d.ts +0 -19
  829. package/dist/vite/expose-action-id.d.ts.map +0 -1
  830. package/dist/vite/expose-action-id.js +0 -250
  831. package/dist/vite/expose-action-id.js.map +0 -1
  832. package/dist/vite/expose-id-utils.d.ts +0 -69
  833. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  834. package/dist/vite/expose-id-utils.js +0 -289
  835. package/dist/vite/expose-id-utils.js.map +0 -1
  836. package/dist/vite/expose-internal-ids.d.ts +0 -22
  837. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  838. package/dist/vite/expose-internal-ids.js +0 -886
  839. package/dist/vite/expose-internal-ids.js.map +0 -1
  840. package/dist/vite/index.d.ts +0 -149
  841. package/dist/vite/index.d.ts.map +0 -1
  842. package/dist/vite/index.js.bak +0 -5448
  843. package/dist/vite/index.js.map +0 -1
  844. package/dist/vite/index.named-routes.gen.ts +0 -103
  845. package/dist/vite/package-resolution.d.ts +0 -43
  846. package/dist/vite/package-resolution.d.ts.map +0 -1
  847. package/dist/vite/package-resolution.js +0 -112
  848. package/dist/vite/package-resolution.js.map +0 -1
  849. package/dist/vite/virtual-entries.d.ts +0 -25
  850. package/dist/vite/virtual-entries.d.ts.map +0 -1
  851. package/dist/vite/virtual-entries.js +0 -110
  852. package/dist/vite/virtual-entries.js.map +0 -1
package/dist/router.js DELETED
@@ -1,1304 +0,0 @@
1
- import { createCacheScope } from "./cache/cache-scope.js";
2
- import { assertClientComponent } from "./component-utils.js";
3
- import { DefaultDocument } from "./components/DefaultDocument.js";
4
- import { sanitizeError, } from "./errors";
5
- import { serializeManifest } from "./debug.js";
6
- import { createReverse, } from "./reverse.js";
7
- import { registerRouteMap, getGlobalRouteMap, getPrecomputedEntries, getRouteTrie, getRouterManifest, getRouterTrie, getRouterPrecomputedEntries, ensureRouterManifest, } from "./route-map-builder.js";
8
- import { tryTrieMatch } from "./router/trie-matching.js";
9
- import { createRouteHelpers, } from "./route-definition.js";
10
- import MapRootLayout from "./server/root-layout.js";
11
- import { getContext, RSCRouterContext, runWithPrefixes, } from "./server/context";
12
- import { createHandleStore } from "./server/handle-store.js";
13
- import { getRequestContext } from "./server/request-context.js";
14
- import { runWithRequestContext, } from "./server/request-context.js";
15
- // Extracted router utilities
16
- import { createErrorInfo, findNearestErrorBoundary as findErrorBoundary, findNearestNotFoundBoundary as findNotFoundBoundary, invokeOnError, } from "./router/error-handling.js";
17
- // Extracted segment resolution functions
18
- import { resolveAllSegments as _resolveAllSegments, resolveLoadersOnly as _resolveLoadersOnly, resolveLoadersOnlyWithRevalidation as _resolveLoadersOnlyWithRevalidation, buildEntryRevalidateMap as _buildEntryRevalidateMap, resolveAllSegmentsWithRevalidation as _resolveAllSegmentsWithRevalidation, } from "./router/segment-resolution.js";
19
- // Extracted intercept resolution functions
20
- import { findInterceptForRoute as _findInterceptForRoute, resolveInterceptEntry as _resolveInterceptEntry, resolveInterceptLoadersOnly as _resolveInterceptLoadersOnly, } from "./router/intercept-resolution.js";
21
- // Extracted match API functions
22
- import { createMatchContextForFull as _createMatchContextForFull, createMatchContextForPartial as _createMatchContextForPartial, matchError as _matchError, } from "./router/match-api.js";
23
- import { createHandlerContext } from "./router/handler-context.js";
24
- import { setupLoaderAccess, setupLoaderAccessSilent, setupBuildUse, wrapLoaderWithErrorHandling, } from "./router/loader-resolution.js";
25
- import { loadManifest } from "./router/manifest.js";
26
- import { createMetricsStore, } from "./router/metrics.js";
27
- import { collectRouteMiddleware, parsePattern, } from "./router/middleware.js";
28
- import { extractStaticPrefix, findMatch as findRouteMatch, isLazyEvaluationNeeded, traverseBack, } from "./router/pattern-matching.js";
29
- import { evaluateRevalidation } from "./router/revalidation.js";
30
- import { runWithRouterContext, } from "./router/router-context.js";
31
- import { createPipelineState, } from "./router/match-context.js";
32
- import { createMatchPartialPipeline } from "./router/match-pipelines.js";
33
- import { collectMatchResult } from "./router/match-result.js";
34
- import { runWithRouterLogContext, withRouterLogScope, } from "./router/logging.js";
35
- import { resolveThemeConfig } from "./theme/constants.js";
36
- // Response type -> MIME type used for Accept header matching
37
- const RESPONSE_TYPE_MIME = {
38
- json: "application/json",
39
- text: "text/plain",
40
- xml: "application/xml",
41
- html: "text/html",
42
- md: "text/markdown",
43
- };
44
- // Reverse lookup: MIME type -> response type tag (e.g. "text/html" -> "html")
45
- const MIME_RESPONSE_TYPE = Object.fromEntries(Object.entries(RESPONSE_TYPE_MIME).map(([tag, mime]) => [mime, tag]));
46
- /**
47
- * Parse an Accept header into a sorted array of MIME entries.
48
- * Respects q-values (default 1.0) and uses client order as tiebreaker
49
- * when q-values are equal (matching Express/Hono behavior).
50
- */
51
- function parseAcceptTypes(accept) {
52
- const entries = [];
53
- const parts = accept.split(",");
54
- for (let i = 0; i < parts.length; i++) {
55
- const part = parts[i];
56
- const segments = part.split(";");
57
- const mime = segments[0].trim();
58
- if (!mime)
59
- continue;
60
- let q = 1.0;
61
- for (let j = 1; j < segments.length; j++) {
62
- const param = segments[j].trim();
63
- if (param.startsWith("q=")) {
64
- q = Math.max(0, Math.min(1, Number(param.slice(2)) || 0));
65
- }
66
- }
67
- entries.push({ mime, q, order: i });
68
- }
69
- // Sort: highest q first, then lowest client order first (stable)
70
- entries.sort((a, b) => b.q - a.q || a.order - b.order);
71
- return entries;
72
- }
73
- // Sentinel response type for RSC routes in negotiation candidates
74
- const RSC_RESPONSE_TYPE = "__rsc__";
75
- /**
76
- * Pick the best negotiate variant by walking the client's sorted Accept list.
77
- * For each accepted MIME type (in q-value/order priority), check if any
78
- * candidate serves that type. Wildcards (*\/*) match the first candidate.
79
- * Falls back to the first candidate if nothing matches.
80
- */
81
- function pickNegotiateVariant(acceptEntries, candidates) {
82
- // Build a MIME -> candidate lookup for O(1) matching
83
- const byCandidateMime = new Map();
84
- for (const c of candidates) {
85
- const mime = c.responseType === RSC_RESPONSE_TYPE ? "text/html" : RESPONSE_TYPE_MIME[c.responseType];
86
- if (mime && !byCandidateMime.has(mime)) {
87
- byCandidateMime.set(mime, c);
88
- }
89
- }
90
- for (const entry of acceptEntries) {
91
- if (entry.q === 0)
92
- continue;
93
- // Wildcard matches first candidate
94
- if (entry.mime === "*/*")
95
- return candidates[0];
96
- // Type wildcard (e.g. "text/*") — match first candidate with that type
97
- if (entry.mime.endsWith("/*")) {
98
- const typePrefix = entry.mime.slice(0, entry.mime.indexOf("/"));
99
- for (const [mime, candidate] of byCandidateMime) {
100
- if (mime.startsWith(typePrefix + "/"))
101
- return candidate;
102
- }
103
- continue;
104
- }
105
- const match = byCandidateMime.get(entry.mime);
106
- if (match)
107
- return match;
108
- }
109
- // No match — use first candidate as default
110
- return candidates[0];
111
- }
112
- /**
113
- * Router configuration options
114
- */
115
- /**
116
- * Brand marker for identifying router instances at build time.
117
- * Used by the Vite plugin to auto-discover routers from module exports.
118
- */
119
- export const RSC_ROUTER_BRAND = "__rsc_router__";
120
- /**
121
- * Global registry of all router instances created via createRouter().
122
- * Each router is keyed by its id (auto-generated or user-provided).
123
- * Used by the Vite plugin at build time to discover routers and extract
124
- * manifests, prefix trees, and pre-render candidates.
125
- */
126
- export const RouterRegistry = new Map();
127
- let routerAutoId = 0;
128
- /**
129
- * Create an RSC router with generic context type
130
- * Route types are accumulated automatically through the builder chain
131
- *
132
- * @example
133
- * ```typescript
134
- * interface AppContext {
135
- * db: Database;
136
- * user?: User;
137
- * }
138
- *
139
- * const router = createRouter<AppContext>({
140
- * debugPerformance: true // Enable metrics
141
- * });
142
- *
143
- * // Route types accumulate through the chain - no module augmentation needed!
144
- * // Keys stay unchanged, only URL patterns get the prefix
145
- * router
146
- * .routes(homeRoutes) // accumulates homeRoutes
147
- * .map(() => import('./home'))
148
- * .routes('/shop', shopRoutes) // accumulates shopRoutes with prefixed URLs
149
- * .map(() => import('./shop'));
150
- *
151
- * // router.reverse now has type-safe autocomplete for all registered routes
152
- * // Given shopRoutes = { cart: "/cart" }, reverse uses original key:
153
- * router.reverse("cart"); // "/shop/cart"
154
- * ```
155
- */
156
- export function createRouter(options = {}) {
157
- const { id: userProvidedId, $$id: injectedId, debugPerformance = false, document: documentOption, defaultErrorBoundary, defaultNotFoundBoundary, notFound, onError, cache, theme: themeOption, urls: urlsOption, $$routeNames: staticRouteNames, nonce, version, warmup: warmupOption, allowDebugManifest: allowDebugManifestOption = true, } = options;
158
- // Capture the source file that called createRouter() via stack trace parsing.
159
- // Used by the Vite plugin to write per-router named-routes.gen.ts files.
160
- let __sourceFile;
161
- try {
162
- const stack = new Error().stack;
163
- if (stack) {
164
- const lines = stack.split("\n");
165
- for (const line of lines) {
166
- const match = line.match(/\((.+?\.(ts|tsx|js|jsx)):\d+:\d+\)/);
167
- if (match && !match[1].endsWith("/router.ts") && !match[1].includes("@rangojs/router") && !match[1].includes("node_modules")) {
168
- // Strip file: URL protocol prefix from Vite module runner stack traces
169
- __sourceFile = match[1].startsWith("file:") ? match[1].slice(5) : match[1];
170
- break;
171
- }
172
- }
173
- }
174
- }
175
- catch { }
176
- // Router ID priority: explicit id > Vite-injected $$id > counter fallback.
177
- // $$id is a hash of filename+line injected by the Vite transform at compile
178
- // time, so it's stable across build/runtime regardless of module evaluation
179
- // order (unlike the counter which depends on import order).
180
- const routerId = userProvidedId ?? injectedId ?? `router_${routerAutoId++}`;
181
- // Resolve warmup enabled flag (default: true)
182
- const warmupEnabled = warmupOption !== false;
183
- // Resolve theme config (null if theme not enabled)
184
- const resolvedThemeConfig = themeOption
185
- ? resolveThemeConfig(themeOption)
186
- : null;
187
- /**
188
- * Wrapper for invokeOnError that binds the router's onError callback.
189
- * Uses the shared utility from router/error-handling.ts for consistent behavior.
190
- */
191
- function callOnError(error, phase, context) {
192
- invokeOnError(onError, error, phase, context, "Router");
193
- }
194
- // Validate document is a client component
195
- if (documentOption !== undefined) {
196
- assertClientComponent(documentOption, "document");
197
- }
198
- // Use default document if none provided (keeps internal name as rootLayout)
199
- const rootLayout = documentOption ?? DefaultDocument;
200
- const routesEntries = [];
201
- let mountIndex = 0;
202
- // Store reference to urlpatterns for runtime manifest generation
203
- let storedUrlPatterns = null;
204
- // Global middleware storage
205
- const globalMiddleware = [];
206
- // Helper to add middleware entry
207
- function addMiddleware(patternOrMiddleware, middleware, mountPrefix = null) {
208
- let pattern = null;
209
- let handler;
210
- if (typeof patternOrMiddleware === "string") {
211
- // Pattern + middleware
212
- pattern = patternOrMiddleware;
213
- if (!middleware) {
214
- throw new Error("Middleware function required when pattern is provided");
215
- }
216
- handler = middleware;
217
- }
218
- else {
219
- // Just middleware (no pattern)
220
- handler = patternOrMiddleware;
221
- }
222
- // If mount-scoped, prepend mount prefix to pattern
223
- let fullPattern = pattern;
224
- if (mountPrefix && pattern) {
225
- // e.g., mountPrefix="/blog", pattern="/admin/*" → "/blog/admin/*"
226
- fullPattern =
227
- pattern === "*" ? `${mountPrefix}/*` : `${mountPrefix}${pattern}`;
228
- }
229
- else if (mountPrefix && !pattern) {
230
- // Mount-scoped middleware without pattern applies to all of mount
231
- fullPattern = `${mountPrefix}/*`;
232
- }
233
- // Parse pattern into regex
234
- let regex = null;
235
- let paramNames = [];
236
- if (fullPattern) {
237
- const parsed = parsePattern(fullPattern);
238
- regex = parsed.regex;
239
- paramNames = parsed.paramNames;
240
- }
241
- globalMiddleware.push({
242
- pattern: fullPattern,
243
- regex,
244
- paramNames,
245
- handler,
246
- mountPrefix,
247
- });
248
- }
249
- // Track all registered routes with their prefixes for reverse()
250
- const mergedRouteMap = {};
251
- // Lazy precomputed entries lookup: rebuilt when per-router data arrives.
252
- // In production multi-router setups, per-router data is loaded lazily via
253
- // ensureRouterManifest(). At createRouter() time the data isn't available yet,
254
- // so we defer building the Map until first use and invalidate when the
255
- // per-router source changes.
256
- let precomputedByPrefix = null;
257
- let precomputedSource;
258
- function getPrecomputedByPrefix() {
259
- const current = getRouterPrecomputedEntries(routerId) ?? getPrecomputedEntries();
260
- if (current !== precomputedSource) {
261
- precomputedSource = current;
262
- precomputedByPrefix = current
263
- ? new Map(current.map((e) => [e.staticPrefix, e.routes]))
264
- : null;
265
- }
266
- return precomputedByPrefix;
267
- }
268
- // Wrapper to pass debugPerformance to external createMetricsStore
269
- const getMetricsStore = () => createMetricsStore(debugPerformance);
270
- // Wrapper to pass defaults to error/notFound boundary finders
271
- const findNearestErrorBoundary = (entry) => findErrorBoundary(entry, defaultErrorBoundary);
272
- const findNearestNotFoundBoundary = (entry) => findNotFoundBoundary(entry, defaultNotFoundBoundary);
273
- // Helper to get handleStore from request context
274
- const getHandleStore = () => {
275
- return getRequestContext()?._handleStore;
276
- };
277
- // Track a pending handler promise (non-blocking)
278
- const trackHandler = (promise) => {
279
- const store = getHandleStore();
280
- return store ? store.track(promise) : promise;
281
- };
282
- // Wrapper for wrapLoaderWithErrorHandling that uses router's error boundary finder
283
- // Includes onError callback for loader error notification
284
- function wrapLoaderPromise(promise, entry, segmentId, pathname, errorContext) {
285
- return wrapLoaderWithErrorHandling(promise, entry, segmentId, pathname, findNearestErrorBoundary, createErrorInfo,
286
- // Invoke onError when loader fails
287
- errorContext
288
- ? (error, ctx) => {
289
- callOnError(error, "loader", {
290
- request: errorContext.request,
291
- url: errorContext.url,
292
- routeKey: errorContext.routeKey,
293
- params: errorContext.params,
294
- segmentId: ctx.segmentId,
295
- segmentType: "loader",
296
- loaderName: ctx.loaderName,
297
- env: errorContext.env,
298
- isPartial: errorContext.isPartial,
299
- handledByBoundary: ctx.handledByBoundary,
300
- requestStartTime: errorContext.requestStartTime,
301
- });
302
- }
303
- : undefined);
304
- }
305
- // Dependencies object for extracted segment resolution functions.
306
- // Captures closure-bound helpers from createRouter.
307
- const segmentDeps = {
308
- wrapLoaderPromise,
309
- trackHandler,
310
- findNearestErrorBoundary,
311
- findNearestNotFoundBoundary,
312
- callOnError,
313
- };
314
- // Match API dependencies
315
- const matchApiDeps = {
316
- findMatch: (pathname, ms) => findMatch(pathname, ms),
317
- getMetricsStore,
318
- findInterceptForRoute: (routeKey, parentEntry, selectorContext, isAction) => findInterceptForRoute(routeKey, parentEntry, selectorContext, isAction),
319
- callOnError,
320
- findNearestErrorBoundary,
321
- getRouteMap: () => getRouterManifest(routerId) ?? getGlobalRouteMap(),
322
- };
323
- // Thin wrappers that bind the deps to extracted functions.
324
- // These maintain the same signatures as the original inline functions
325
- // so that RouterContext and call sites don't need to change.
326
- function resolveAllSegments(entries, routeKey, params, context, loaderPromises, options) {
327
- return _resolveAllSegments(entries, routeKey, params, context, loaderPromises, segmentDeps, options);
328
- }
329
- function resolveLoadersOnly(entries, context) {
330
- return _resolveLoadersOnly(entries, context, segmentDeps);
331
- }
332
- function resolveLoadersOnlyWithRevalidation(entries, context, clientSegmentIds, prevParams, request, prevUrl, nextUrl, routeKey, actionContext) {
333
- return _resolveLoadersOnlyWithRevalidation(entries, context, clientSegmentIds, prevParams, request, prevUrl, nextUrl, routeKey, segmentDeps, actionContext);
334
- }
335
- function buildEntryRevalidateMap(entries) {
336
- return _buildEntryRevalidateMap(entries);
337
- }
338
- function resolveAllSegmentsWithRevalidation(entries, routeKey, params, context, clientSegmentSet, prevParams, request, prevUrl, nextUrl, loaderPromises, actionContext, interceptResult, localRouteName, pathname) {
339
- return _resolveAllSegmentsWithRevalidation(entries, routeKey, params, context, clientSegmentSet, prevParams, request, prevUrl, nextUrl, loaderPromises, actionContext, interceptResult, localRouteName, pathname, segmentDeps);
340
- }
341
- function findInterceptForRoute(targetRouteKey, fromEntry, selectorContext = null, isAction = false) {
342
- return _findInterceptForRoute(targetRouteKey, fromEntry, selectorContext, isAction);
343
- }
344
- function resolveInterceptEntry(interceptEntry, parentEntry, params, context, belongsToRoute = true, revalidationContext) {
345
- return _resolveInterceptEntry(interceptEntry, parentEntry, params, context, belongsToRoute, segmentDeps, revalidationContext);
346
- }
347
- function resolveInterceptLoadersOnly(interceptEntry, parentEntry, params, context, belongsToRoute = true, revalidationContext) {
348
- return _resolveInterceptLoadersOnly(interceptEntry, parentEntry, params, context, belongsToRoute, segmentDeps, revalidationContext);
349
- }
350
- // Detect lazy includes in handler result and create placeholder entries
351
- // Lazy includes are IncludeItem with lazy: true and _lazyContext
352
- // Moved to outer scope so it can be reused by evaluateLazyEntry for nested includes
353
- function findLazyIncludes(items) {
354
- const lazyItems = [];
355
- for (const item of items) {
356
- if (!item)
357
- continue;
358
- if (item.type === "include") {
359
- const includeItem = item;
360
- if (includeItem.lazy === true && includeItem._lazyContext) {
361
- lazyItems.push({
362
- prefix: includeItem.prefix,
363
- patterns: includeItem.patterns,
364
- context: includeItem._lazyContext,
365
- });
366
- }
367
- }
368
- // Recursively check nested items (in layouts, etc.)
369
- if (item.uses && Array.isArray(item.uses)) {
370
- lazyItems.push(...findLazyIncludes(item.uses));
371
- }
372
- }
373
- return lazyItems;
374
- }
375
- /**
376
- * Evaluate a lazy entry's patterns and populate its routes
377
- * This runs the lazy patterns handler and updates the entry in-place
378
- * Also detects nested lazy includes and registers them as new entries
379
- */
380
- function evaluateLazyEntry(entry) {
381
- if (!entry.lazy || entry.lazyEvaluated || !entry.lazyPatterns) {
382
- return;
383
- }
384
- // Check for pre-computed routes from build-time data.
385
- // Only leaf nodes (no nested includes) are precomputed, so entries with
386
- // nested lazy includes fall through to the handler below.
387
- // When multiple entries share the same staticPrefix (e.g., several
388
- // include("/", ...) calls), the precomputed data merges all their routes
389
- // into one entry. Assigning that merged set to the first matching entry
390
- // causes findMatch to pick the wrong handler for routes belonging to a
391
- // different include. Skip the shortcut when the prefix is shared.
392
- const currentPrecomputed = getPrecomputedByPrefix();
393
- if (currentPrecomputed) {
394
- const routes = currentPrecomputed.get(entry.staticPrefix);
395
- if (routes) {
396
- const prefixIsShared = routesEntries.filter((e) => e.staticPrefix === entry.staticPrefix).length > 1;
397
- if (!prefixIsShared) {
398
- entry.lazyEvaluated = true;
399
- entry.routes = routes;
400
- for (const [name, pattern] of Object.entries(routes)) {
401
- mergedRouteMap[name] = pattern;
402
- }
403
- registerRouteMap(mergedRouteMap);
404
- return;
405
- }
406
- }
407
- }
408
- // Mark as evaluated immediately to prevent concurrent evaluation.
409
- // JS is single-threaded but handlers.handler() could theoretically yield,
410
- // and the while-loop in findMatch retries after evaluation.
411
- entry.lazyEvaluated = true;
412
- const lazyPatterns = entry.lazyPatterns;
413
- const lazyContext = entry.lazyContext;
414
- // Create a new context for evaluating the lazy patterns
415
- const manifest = new Map();
416
- const patterns = new Map();
417
- const patternsByPrefix = new Map();
418
- const trailingSlashMap = new Map();
419
- // Capture the handler result to detect nested lazy includes
420
- let handlerResult = [];
421
- // Merge captured counters from include() to maintain consistent
422
- // shortCode indices with sibling entries from pattern extraction
423
- const lazyCounters = {};
424
- if (lazyContext && lazyContext.counters) {
425
- const captured = lazyContext.counters;
426
- for (const [key, value] of Object.entries(captured)) {
427
- lazyCounters[key] = value;
428
- }
429
- }
430
- RSCRouterContext.run({
431
- manifest,
432
- patterns,
433
- patternsByPrefix,
434
- trailingSlash: trailingSlashMap,
435
- namespace: "lazy",
436
- parent: lazyContext?.parent ?? null,
437
- counters: lazyCounters,
438
- }, () => {
439
- // Run the lazy patterns handler with the original context prefixes
440
- // The prefix comes from the IncludeItem stored in lazyPatterns
441
- const includePrefix = entry._lazyPrefix || "";
442
- const fullPrefix = (lazyContext?.urlPrefix || "") + includePrefix;
443
- if (fullPrefix || lazyContext?.namePrefix) {
444
- runWithPrefixes(fullPrefix, lazyContext?.namePrefix, () => {
445
- handlerResult = lazyPatterns.handler();
446
- });
447
- }
448
- else {
449
- handlerResult = lazyPatterns.handler();
450
- }
451
- });
452
- // Populate the entry's routes from the patterns
453
- const routesObject = {};
454
- for (const [name, pattern] of patterns.entries()) {
455
- routesObject[name] = pattern;
456
- // Also add to merged route map for reverse() support
457
- const existingPattern = mergedRouteMap[name];
458
- if (existingPattern !== undefined && existingPattern !== pattern) {
459
- console.warn(`[@rangojs/router] Route name conflict: "${name}" already maps to "${existingPattern}", ` +
460
- `overwriting with "${pattern}" (from lazy include). Use unique route names to avoid this.`);
461
- }
462
- mergedRouteMap[name] = pattern;
463
- }
464
- // Update the entry in-place
465
- entry.routes = routesObject;
466
- // Note: Do NOT clear lazyPatterns/lazyContext here.
467
- // loadManifest() needs them on every request to re-run the handler
468
- // in the correct AsyncLocalStorage context (Store.manifest).
469
- // Update trailing slash config if available
470
- if (trailingSlashMap.size > 0) {
471
- entry.trailingSlash = Object.fromEntries(trailingSlashMap);
472
- }
473
- // Detect nested lazy includes and register them as new entries
474
- const nestedLazyIncludes = findLazyIncludes(handlerResult);
475
- for (const lazyInclude of nestedLazyIncludes) {
476
- // Compute the full URL prefix (combining parent prefix if any)
477
- const fullPrefix = lazyInclude.context.urlPrefix
478
- ? lazyInclude.context.urlPrefix + lazyInclude.prefix
479
- : lazyInclude.prefix;
480
- const nestedEntry = {
481
- prefix: "",
482
- staticPrefix: extractStaticPrefix(fullPrefix),
483
- routes: {}, // Empty until first match
484
- trailingSlash: entry.trailingSlash,
485
- handler: lazyInclude.patterns.handler,
486
- mountIndex: mountIndex++,
487
- // Lazy evaluation fields
488
- lazy: true,
489
- lazyPatterns: lazyInclude.patterns,
490
- lazyContext: lazyInclude.context,
491
- lazyEvaluated: false,
492
- // Store the include prefix for evaluation
493
- _lazyPrefix: lazyInclude.prefix,
494
- };
495
- // Insert nested lazy entry before any entry whose staticPrefix is a
496
- // prefix of (but shorter than) this lazy entry's staticPrefix.
497
- // This ensures more specific lazy includes are matched before
498
- // less specific eager entries (e.g., "/href/nested" before "/href/:id").
499
- const nestedPrefix = nestedEntry.staticPrefix;
500
- let insertIndex = routesEntries.length;
501
- if (nestedPrefix) {
502
- for (let i = 0; i < routesEntries.length; i++) {
503
- const existing = routesEntries[i];
504
- if (nestedPrefix.startsWith(existing.staticPrefix) &&
505
- nestedPrefix.length > existing.staticPrefix.length) {
506
- insertIndex = i;
507
- break;
508
- }
509
- }
510
- }
511
- routesEntries.splice(insertIndex, 0, nestedEntry);
512
- }
513
- // Re-register route map for runtime reverse() usage
514
- registerRouteMap(mergedRouteMap);
515
- }
516
- // Single-entry cache for findMatch to avoid redundant matching within the same request.
517
- // previewMatch and match both call findMatch with the same pathname — this ensures
518
- // the route matching work (which may check thousands of routes) only happens once.
519
- let lastFindMatchPathname = null;
520
- let lastFindMatchResult = null;
521
- // Wrapper for findMatch that uses routesEntries
522
- // Handles lazy evaluation by evaluating lazy entries on first match.
523
- // Phase 1: try O(path_length) trie match.
524
- // Phase 2: fall back to regex iteration.
525
- function findMatch(pathname, ms) {
526
- // Return cached result if same pathname (avoids double-match per request)
527
- if (lastFindMatchPathname === pathname) {
528
- return lastFindMatchResult;
529
- }
530
- // Helper to push sub-metrics
531
- const pushMetric = ms
532
- ? (label, start) => {
533
- ms.metrics.push({
534
- label,
535
- duration: performance.now() - start,
536
- startTime: start - ms.requestStart,
537
- });
538
- }
539
- : undefined;
540
- // Phase 1: Try trie match (O(path_length))
541
- // Prefer per-router trie (isolated) over global trie (merged).
542
- const routeTrie = getRouterTrie(routerId) ?? getRouteTrie();
543
- if (routeTrie) {
544
- const trieStart = performance.now();
545
- const trieResult = tryTrieMatch(routeTrie, pathname);
546
- pushMetric?.("match:trie", trieStart);
547
- if (trieResult) {
548
- // Find the RouteEntry that contains this route.
549
- // Multiple entries can share the same staticPrefix (e.g., several
550
- // include("/", patterns) calls all produce staticPrefix=""). Evaluate
551
- // each candidate and pick the one whose routes include the matched key.
552
- const entryStart = performance.now();
553
- let entry;
554
- let fallbackEntry;
555
- for (const e of routesEntries) {
556
- if (e.staticPrefix !== trieResult.sp)
557
- continue;
558
- if (!fallbackEntry)
559
- fallbackEntry = e;
560
- evaluateLazyEntry(e);
561
- if (e.routes &&
562
- trieResult.routeKey in e.routes) {
563
- entry = e;
564
- break;
565
- }
566
- }
567
- // If no entry had the route in its routes map, use the first matching
568
- // entry as fallback (handles main entry with inline routes not yet
569
- // reflected in its routes object).
570
- if (!entry)
571
- entry = fallbackEntry;
572
- // If entry not found (nested include not yet discovered), evaluate parent
573
- if (!entry) {
574
- const parent = routesEntries.find((e) => trieResult.sp.startsWith(e.staticPrefix) &&
575
- e.staticPrefix !== trieResult.sp);
576
- if (parent) {
577
- const lazyStart = performance.now();
578
- evaluateLazyEntry(parent);
579
- pushMetric?.("match:lazy-eval", lazyStart);
580
- }
581
- entry = routesEntries.find((e) => e.staticPrefix === trieResult.sp);
582
- }
583
- pushMetric?.("match:entry-resolve", entryStart);
584
- if (entry) {
585
- lastFindMatchPathname = pathname;
586
- lastFindMatchResult = {
587
- entry,
588
- routeKey: trieResult.routeKey,
589
- params: trieResult.params,
590
- optionalParams: new Set(trieResult.optionalParams || []),
591
- redirectTo: trieResult.redirectTo,
592
- ancestry: trieResult.ancestry,
593
- ...(trieResult.pr ? { pr: true } : {}),
594
- ...(trieResult.pt ? { pt: true } : {}),
595
- ...(trieResult.responseType ? { responseType: trieResult.responseType } : {}),
596
- ...(trieResult.negotiateVariants ? { negotiateVariants: trieResult.negotiateVariants } : {}),
597
- ...(trieResult.rscFirst ? { rscFirst: true } : {}),
598
- };
599
- return lastFindMatchResult;
600
- }
601
- }
602
- }
603
- // Phase 2: Fall back to existing matching (regex iteration)
604
- const regexStart = performance.now();
605
- let result = findRouteMatch(pathname, routesEntries);
606
- // If we hit a lazy entry that needs evaluation, evaluate and retry.
607
- // Cap iterations to prevent infinite loops from pathological nesting.
608
- const MAX_LAZY_ITERATIONS = 100;
609
- let iterations = 0;
610
- while (isLazyEvaluationNeeded(result)) {
611
- if (++iterations > MAX_LAZY_ITERATIONS) {
612
- console.error(`[@rangojs/router] Exceeded ${MAX_LAZY_ITERATIONS} lazy evaluation iterations ` +
613
- `for pathname "${pathname}". This likely indicates circular lazy includes.`);
614
- lastFindMatchPathname = pathname;
615
- lastFindMatchResult = null;
616
- return null;
617
- }
618
- evaluateLazyEntry(result.lazyEntry);
619
- result = findRouteMatch(pathname, routesEntries);
620
- }
621
- pushMetric?.("match:regex-fallback", regexStart);
622
- lastFindMatchPathname = pathname;
623
- lastFindMatchResult = result;
624
- return result;
625
- }
626
- /**
627
- * Build-time pre-render match. Resolves segments with a BuildContext
628
- * (no request/env/headers/cookies), skipping middleware and loaders.
629
- */
630
- async function matchForPrerender(pathname, params) {
631
- // 1. Find the matching route entry
632
- const matched = findMatch(pathname);
633
- if (!matched)
634
- return null;
635
- // Use params from trie match if available, fall back to provided params
636
- const matchedParams = matched.params ?? params;
637
- // Build a minimal RouterContext for loadManifest/traverseBack
638
- const routerCtx = {
639
- findMatch,
640
- loadManifest,
641
- traverseBack,
642
- createHandlerContext,
643
- setupLoaderAccess,
644
- setupLoaderAccessSilent,
645
- getContext,
646
- getMetricsStore,
647
- createCacheScope,
648
- findInterceptForRoute,
649
- resolveAllSegmentsWithRevalidation,
650
- resolveInterceptEntry,
651
- evaluateRevalidation,
652
- getRequestContext,
653
- resolveAllSegments,
654
- createHandleStore,
655
- buildEntryRevalidateMap,
656
- resolveLoadersOnlyWithRevalidation,
657
- resolveInterceptLoadersOnly,
658
- resolveLoadersOnly,
659
- };
660
- return runWithRouterContext(routerCtx, async () => {
661
- // 2. Load the manifest entry tree
662
- const manifestEntry = await loadManifest(matched.entry, matched.routeKey, pathname, undefined, false);
663
- // 3. Build ancestor chain [root, ..., route]
664
- const entries = [];
665
- for (const entry of traverseBack(manifestEntry)) {
666
- entries.push(entry);
667
- }
668
- // 4. Create handle store for collecting handle data
669
- const handleStore = createHandleStore();
670
- // 5. Create a minimal request context with the handle store
671
- const stubRes = new Response(null, { status: 200 });
672
- const minimalRequestContext = {
673
- env: {},
674
- request: new Request("http://prerender" + pathname),
675
- url: new URL("http://prerender" + pathname),
676
- pathname,
677
- searchParams: new URLSearchParams(),
678
- var: {},
679
- get: () => undefined,
680
- set: () => { },
681
- params: matchedParams,
682
- res: stubRes,
683
- cookie: () => undefined,
684
- cookies: () => ({}),
685
- setCookie: () => { },
686
- deleteCookie: () => { },
687
- header: () => { },
688
- use: (() => {
689
- throw new Error("use() not available during pre-rendering");
690
- }),
691
- method: "GET",
692
- _handleStore: handleStore,
693
- waitUntil: () => { },
694
- onResponse: () => { },
695
- _onResponseCallbacks: [],
696
- };
697
- return runWithRequestContext(minimalRequestContext, async () => {
698
- // 6. Create handler context with synthetic request for pre-rendering.
699
- // The synthetic request and route map are available at build time,
700
- // so reverse() and other context properties work normally.
701
- const buildCtx = createHandlerContext(matchedParams, minimalRequestContext.request, minimalRequestContext.url.searchParams, pathname, minimalRequestContext.url, {}, mergedRouteMap, matched.routeKey);
702
- // 7. Wire use() for handles only (loaders throw)
703
- setupBuildUse(buildCtx);
704
- // 8. Resolve all segments with skipLoaders
705
- const loaderPromises = new Map();
706
- const allSegments = await resolveAllSegments(entries, matched.routeKey, matchedParams, buildCtx, loaderPromises, { skipLoaders: true });
707
- // 9. Filter out any loader segments (belt-and-suspenders)
708
- const nonLoaderSegments = allSegments.filter((s) => s.type !== "loader");
709
- // 10. Wait for handles to settle
710
- await handleStore.settled;
711
- // 11. Serialize segments using the cache serializer
712
- const { serializeSegments } = await import("./cache/cache-scope.js");
713
- const serializedSegments = await serializeSegments(nonLoaderSegments);
714
- // 12. Collect handle data per segment (skip segments with no handle data)
715
- const handles = {};
716
- for (const seg of nonLoaderSegments) {
717
- const segHandles = handleStore.getDataForSegment(seg.id);
718
- if (Object.keys(segHandles).length > 0) {
719
- handles[seg.id] = segHandles;
720
- }
721
- }
722
- // Use the trie-level route key (e.g., "docs", "docs.article")
723
- const routeName = matched.routeKey;
724
- return {
725
- segments: serializedSegments,
726
- handles,
727
- routeName,
728
- params: matchedParams,
729
- };
730
- });
731
- });
732
- }
733
- /**
734
- * Match request and return segments (document/SSR requests)
735
- *
736
- * Uses generator middleware pipeline for clean separation of concerns:
737
- * - cache-lookup: Check cache first
738
- * - segment-resolution: Resolve segments on cache miss
739
- * - cache-store: Store results in cache
740
- * - background-revalidation: SWR revalidation
741
- */
742
- async function match(request, env) {
743
- // Build RouterContext with all closure functions needed by middleware
744
- const routerCtx = {
745
- findMatch,
746
- loadManifest,
747
- traverseBack,
748
- createHandlerContext,
749
- setupLoaderAccess,
750
- setupLoaderAccessSilent,
751
- getContext,
752
- getMetricsStore,
753
- createCacheScope,
754
- findInterceptForRoute,
755
- resolveAllSegmentsWithRevalidation,
756
- resolveInterceptEntry,
757
- evaluateRevalidation,
758
- getRequestContext,
759
- resolveAllSegments,
760
- createHandleStore,
761
- buildEntryRevalidateMap,
762
- resolveLoadersOnlyWithRevalidation,
763
- resolveInterceptLoadersOnly,
764
- resolveLoadersOnly,
765
- };
766
- return runWithRouterLogContext({ request, transaction: "match" }, () => runWithRouterContext(routerCtx, async () => withRouterLogScope("match", async () => {
767
- const result = await createMatchContextForFull(request, env);
768
- // Handle redirect case
769
- if ("type" in result && result.type === "redirect") {
770
- return {
771
- segments: [],
772
- matched: [],
773
- diff: [],
774
- params: {},
775
- redirect: result.redirectUrl,
776
- };
777
- }
778
- const ctx = result;
779
- try {
780
- const state = createPipelineState();
781
- const pipeline = createMatchPartialPipeline(ctx, state);
782
- return await collectMatchResult(pipeline, ctx, state);
783
- }
784
- catch (error) {
785
- if (error instanceof Response)
786
- throw error;
787
- // Report unhandled errors during full match pipeline
788
- callOnError(error, "routing", {
789
- request,
790
- url: ctx.url,
791
- env,
792
- isPartial: false,
793
- handledByBoundary: false,
794
- });
795
- throw sanitizeError(error);
796
- }
797
- })));
798
- }
799
- async function matchError(request, _context, error, segmentType = "route") {
800
- return runWithRouterLogContext({ request, transaction: "matchError" }, () => withRouterLogScope("matchError", () => _matchError(request, _context, error, matchApiDeps, defaultErrorBoundary, segmentType)));
801
- }
802
- async function createMatchContextForFull(request, env) {
803
- return _createMatchContextForFull(request, env, matchApiDeps, findInterceptForRoute);
804
- }
805
- async function createMatchContextForPartial(request, env, actionContext) {
806
- return _createMatchContextForPartial(request, env, matchApiDeps, findInterceptForRoute, actionContext);
807
- }
808
- /**
809
- * Match partial request with revalidation
810
- *
811
- * Uses generator middleware pipeline for clean separation of concerns:
812
- * - cache-lookup: Check cache first
813
- * - segment-resolution: Resolve segments on cache miss
814
- * - intercept-resolution: Handle intercept routes
815
- * - cache-store: Store results in cache
816
- * - background-revalidation: SWR revalidation
817
- */
818
- async function matchPartial(request, context, actionContext) {
819
- // Build RouterContext with all closure functions needed by middleware
820
- const routerCtx = {
821
- findMatch,
822
- loadManifest,
823
- traverseBack,
824
- createHandlerContext,
825
- setupLoaderAccess,
826
- setupLoaderAccessSilent,
827
- getContext,
828
- getMetricsStore,
829
- createCacheScope,
830
- findInterceptForRoute,
831
- resolveAllSegmentsWithRevalidation,
832
- resolveInterceptEntry,
833
- evaluateRevalidation,
834
- getRequestContext,
835
- resolveAllSegments,
836
- createHandleStore,
837
- buildEntryRevalidateMap,
838
- resolveLoadersOnlyWithRevalidation,
839
- resolveInterceptLoadersOnly,
840
- };
841
- return runWithRouterLogContext({ request, transaction: "matchPartial" }, () => runWithRouterContext(routerCtx, async () => withRouterLogScope("matchPartial", async () => {
842
- const ctx = await createMatchContextForPartial(request, context, actionContext);
843
- if (!ctx)
844
- return null;
845
- try {
846
- const state = createPipelineState();
847
- const pipeline = createMatchPartialPipeline(ctx, state);
848
- return await collectMatchResult(pipeline, ctx, state);
849
- }
850
- catch (error) {
851
- if (error instanceof Response)
852
- throw error;
853
- // Report unhandled errors during partial match pipeline
854
- callOnError(error, actionContext ? "action" : "revalidation", {
855
- request,
856
- url: ctx.url,
857
- env: context,
858
- actionId: actionContext?.actionId,
859
- isPartial: true,
860
- handledByBoundary: false,
861
- });
862
- throw sanitizeError(error);
863
- }
864
- })));
865
- }
866
- /**
867
- * Preview match - returns route middleware without segment resolution.
868
- * Also returns responseType and handler for response routes (non-RSC short-circuit).
869
- */
870
- async function previewMatch(request, _context) {
871
- return runWithRouterLogContext({ request, transaction: "previewMatch" }, async () => withRouterLogScope("previewMatch", async () => {
872
- const url = new URL(request.url);
873
- const pathname = url.pathname;
874
- // Quick route matching
875
- const matched = findMatch(pathname);
876
- if (!matched) {
877
- return null;
878
- }
879
- // Skip redirect check - will be handled in full match
880
- if (matched.redirectTo) {
881
- return { routeMiddleware: undefined };
882
- }
883
- // Load manifest (without segment resolution)
884
- const manifestEntry = await loadManifest(matched.entry, matched.routeKey, pathname, undefined, // No metrics store for preview
885
- false);
886
- // Collect route-level middleware from entry tree
887
- // Includes middleware from orphan layouts (inline layouts within routes)
888
- const routeMiddleware = collectRouteMiddleware(traverseBack(manifestEntry), matched.params);
889
- // Check for response type (from trie match or manifest entry)
890
- const responseType = matched.responseType ||
891
- (manifestEntry.type === "route" ? manifestEntry.responseType : undefined);
892
- // Content negotiation: when negotiate variants exist, pick the best
893
- // handler based on the Accept header. Uses q-values and client order
894
- // as tiebreaker (matching Express/Hono behavior). RSC routes participate
895
- // as text/html candidates so browsers naturally get HTML without
896
- // special-casing.
897
- if (matched.negotiateVariants && matched.negotiateVariants.length > 0) {
898
- const acceptEntries = parseAcceptTypes(request.headers.get("accept") || "");
899
- // Build candidate list preserving definition order.
900
- // For wildcard (*/*) and no-Accept fallback, the first candidate wins.
901
- const variants = matched.negotiateVariants;
902
- let candidates;
903
- if (responseType) {
904
- // Primary is response-type — include it as a candidate
905
- candidates = [...variants, { routeKey: matched.routeKey, responseType }];
906
- }
907
- else {
908
- // Primary is RSC — insert as text/html candidate in definition order
909
- const rscCandidate = { routeKey: matched.routeKey, responseType: RSC_RESPONSE_TYPE };
910
- candidates = matched.rscFirst
911
- ? [rscCandidate, ...variants]
912
- : [...variants, rscCandidate];
913
- }
914
- const variant = pickNegotiateVariant(acceptEntries, candidates);
915
- // If the winner is RSC, fall through to default RSC handling
916
- if (variant.responseType === RSC_RESPONSE_TYPE) {
917
- // Fall through — RSC won negotiation
918
- }
919
- else if (responseType && variant.routeKey === matched.routeKey) {
920
- // Fall through — response-type primary won, already set
921
- }
922
- else {
923
- const negotiateEntry = await loadManifest(matched.entry, variant.routeKey, pathname, undefined, false);
924
- return {
925
- routeMiddleware: routeMiddleware.length > 0 ? routeMiddleware : undefined,
926
- responseType: variant.responseType,
927
- handler: negotiateEntry.type === "route" ? negotiateEntry.handler : undefined,
928
- params: matched.params,
929
- negotiated: true,
930
- };
931
- }
932
- }
933
- // If we passed through the negotiation block (variants exist), mark as
934
- // negotiated so the handler sets Vary: Accept on the response.
935
- const hasVariants = matched.negotiateVariants && matched.negotiateVariants.length > 0;
936
- return {
937
- routeMiddleware: routeMiddleware.length > 0 ? routeMiddleware : undefined,
938
- ...(responseType ? {
939
- responseType,
940
- handler: manifestEntry.type === "route" ? manifestEntry.handler : undefined,
941
- params: matched.params,
942
- } : {}),
943
- ...(hasVariants ? { negotiated: true } : {}),
944
- };
945
- }));
946
- }
947
- /**
948
- * Create route builder with accumulated route types
949
- * The TNewRoutes type parameter captures the new routes being added
950
- */
951
- function createRouteBuilder(prefix, routes) {
952
- const currentMountIndex = mountIndex++;
953
- // Merge routes into the reverse map
954
- // Keys stay unchanged for composability - only URL patterns get prefixed
955
- const routeEntries = routes;
956
- for (const [key, pattern] of Object.entries(routeEntries)) {
957
- // Build prefixed pattern: "/shop" + "/cart" -> "/shop/cart"
958
- // Root prefix "/" is a no-op — don't double the leading slash.
959
- const effectivePrefix = prefix === "/" ? "" : prefix;
960
- const prefixedPattern = effectivePrefix && pattern !== "/"
961
- ? `${effectivePrefix}${pattern}`
962
- : effectivePrefix && pattern === "/"
963
- ? effectivePrefix
964
- : pattern;
965
- // Runtime validation: warn if key already exists with different pattern
966
- const existingPattern = mergedRouteMap[key];
967
- if (existingPattern !== undefined &&
968
- existingPattern !== prefixedPattern) {
969
- console.warn(`[rsc-router] Route key conflict: "${key}" already maps to "${existingPattern}", ` +
970
- `overwriting with "${prefixedPattern}". Use unique key names to avoid this.`);
971
- }
972
- // Use original key - enables reusable route modules
973
- mergedRouteMap[key] = prefixedPattern;
974
- }
975
- // Auto-register route map for runtime reverse() usage
976
- registerRouteMap(mergedRouteMap);
977
- // Extract trailing slash config if present (attached by route())
978
- const trailingSlashConfig = routes.__trailingSlash;
979
- // Create builder object so .use() can return it
980
- const builder = {
981
- use(patternOrMiddleware, middleware) {
982
- // Mount-scoped middleware - prefix is the mount prefix
983
- addMiddleware(patternOrMiddleware, middleware, prefix || null);
984
- return builder;
985
- },
986
- map(handler) {
987
- // Store handler as-is - detection happens at call time based on return type
988
- // Both patterns use the same signature:
989
- // - Inline: ({ route }) => [...] - receives helpers, returns Array
990
- // - Lazy: () => import(...) - ignores helpers, returns Promise
991
- routesEntries.push({
992
- prefix,
993
- staticPrefix: extractStaticPrefix(prefix),
994
- routes: routes,
995
- trailingSlash: trailingSlashConfig,
996
- handler: handler,
997
- mountIndex: currentMountIndex,
998
- });
999
- // Return router with accumulated types
1000
- // At runtime this is the same object, but TypeScript tracks the accumulated route types
1001
- return router;
1002
- },
1003
- // Expose accumulated route map for typeof extraction
1004
- get routeMap() {
1005
- return mergedRouteMap;
1006
- },
1007
- };
1008
- return builder;
1009
- }
1010
- /**
1011
- * Router instance
1012
- * The type system tracks accumulated routes through the builder chain
1013
- * Initial TRoutes is {} (empty) to avoid poisoning accumulated types with Record<string, string>
1014
- */
1015
- const router = {
1016
- __brand: RSC_ROUTER_BRAND,
1017
- id: routerId,
1018
- routes(prefixOrRoutes, maybeRoutes) {
1019
- // Note: Multiple .routes() calls are allowed for backwards compatibility
1020
- // with the old map() pattern. For new code, prefer urls() with include().
1021
- // Check if argument is UrlPatterns (new Django-style API)
1022
- // Detect by checking for handler and definitions properties
1023
- if (typeof prefixOrRoutes === "object" &&
1024
- prefixOrRoutes !== null &&
1025
- "handler" in prefixOrRoutes &&
1026
- "definitions" in prefixOrRoutes &&
1027
- typeof prefixOrRoutes.handler === "function") {
1028
- const urlPatterns = prefixOrRoutes;
1029
- // Store reference for runtime manifest generation
1030
- storedUrlPatterns = urlPatterns;
1031
- const currentMountIndex = mountIndex++;
1032
- // Create manifest and patterns maps for route registration
1033
- const manifest = new Map();
1034
- const patterns = new Map();
1035
- const patternsByPrefix = new Map();
1036
- const trailingSlashMap = new Map();
1037
- // Run the handler once to extract patterns for route matching.
1038
- // Note: loadManifest will re-run the handler to register entries in its context.
1039
- // Lazy includes are detected in the return value and handled separately.
1040
- //
1041
- // Pattern extraction must use the same mountIndex and MapRootLayout root
1042
- // parent as loadManifest so that shortCodes produced here match those at
1043
- // runtime. include() captures the current parent and counters; if those
1044
- // shortCodes diverge from the runtime tree the segment reconciliation on
1045
- // the client will see a full mismatch and remount the entire page.
1046
- const syntheticMapRoot = {
1047
- type: "layout",
1048
- id: `#synthetic-maproot-M${currentMountIndex}`,
1049
- shortCode: `M${currentMountIndex}L0`,
1050
- parent: null,
1051
- handler: MapRootLayout,
1052
- middleware: [],
1053
- revalidate: [],
1054
- errorBoundary: [],
1055
- notFoundBoundary: [],
1056
- layout: [],
1057
- parallel: [],
1058
- intercept: [],
1059
- loader: [],
1060
- };
1061
- let handlerResult = [];
1062
- RSCRouterContext.run({
1063
- manifest,
1064
- patterns,
1065
- patternsByPrefix,
1066
- trailingSlash: trailingSlashMap,
1067
- namespace: "root",
1068
- parent: syntheticMapRoot,
1069
- counters: {},
1070
- mountIndex: currentMountIndex,
1071
- }, () => {
1072
- handlerResult = urlPatterns.handler();
1073
- });
1074
- // Store the ORIGINAL handler - loadManifest will re-run it to register manifest entries
1075
- // Convert trailingSlash map to object for the router
1076
- const trailingSlashConfig = trailingSlashMap.size > 0
1077
- ? Object.fromEntries(trailingSlashMap)
1078
- : undefined;
1079
- // Collect route keys that have prerender handlers (for non-trie match path)
1080
- let prerenderRouteKeys;
1081
- for (const [name, entry] of manifest.entries()) {
1082
- if (entry.type === "route" && entry.isPrerender) {
1083
- if (!prerenderRouteKeys)
1084
- prerenderRouteKeys = new Set();
1085
- prerenderRouteKeys.add(name);
1086
- }
1087
- }
1088
- // Create separate RouteEntry for each URL prefix group
1089
- // This enables prefix-based short-circuit optimization
1090
- if (patternsByPrefix.size > 0) {
1091
- for (const [prefix, prefixPatterns] of patternsByPrefix.entries()) {
1092
- const routesObject = {};
1093
- for (const [name, pattern] of prefixPatterns.entries()) {
1094
- routesObject[name] = pattern;
1095
- }
1096
- routesEntries.push({
1097
- // prefix is "" because patterns already include the URL prefix
1098
- // (e.g., "/site/:locale/user1/:id" not just "/user1/:id")
1099
- prefix: "",
1100
- // staticPrefix is the actual prefix for short-circuit optimization
1101
- staticPrefix: extractStaticPrefix(prefix),
1102
- routes: routesObject,
1103
- trailingSlash: trailingSlashConfig,
1104
- handler: urlPatterns.handler,
1105
- mountIndex: currentMountIndex,
1106
- ...(prerenderRouteKeys ? { prerenderRouteKeys } : {}),
1107
- });
1108
- }
1109
- }
1110
- else {
1111
- // Fallback: no prefix grouping, use flat patterns map
1112
- const routesObject = {};
1113
- for (const [name, pattern] of patterns.entries()) {
1114
- routesObject[name] = pattern;
1115
- }
1116
- routesEntries.push({
1117
- prefix: "",
1118
- staticPrefix: "",
1119
- routes: routesObject,
1120
- trailingSlash: trailingSlashConfig,
1121
- handler: urlPatterns.handler,
1122
- mountIndex: currentMountIndex,
1123
- ...(prerenderRouteKeys ? { prerenderRouteKeys } : {}),
1124
- });
1125
- }
1126
- // Build route map from registered patterns
1127
- for (const [name, pattern] of patterns.entries()) {
1128
- // Runtime validation: warn if key already exists with different pattern
1129
- const existingPattern = mergedRouteMap[name];
1130
- if (existingPattern !== undefined && existingPattern !== pattern) {
1131
- console.warn(`[@rangojs/router] Route name conflict: "${name}" already maps to "${existingPattern}", ` +
1132
- `overwriting with "${pattern}". Use unique route names to avoid this.`);
1133
- }
1134
- mergedRouteMap[name] = pattern;
1135
- }
1136
- // Detect lazy includes in handler result and create placeholder entries
1137
- // Uses findLazyIncludes from outer scope (shared with evaluateLazyEntry)
1138
- const lazyIncludes = findLazyIncludes(handlerResult);
1139
- // Create placeholder RouteEntry for each lazy include
1140
- for (const lazyInclude of lazyIncludes) {
1141
- // Compute the full URL prefix (combining parent prefix if any)
1142
- const fullPrefix = lazyInclude.context.urlPrefix
1143
- ? lazyInclude.context.urlPrefix + lazyInclude.prefix
1144
- : lazyInclude.prefix;
1145
- const lazyEntry = {
1146
- prefix: "",
1147
- staticPrefix: extractStaticPrefix(fullPrefix),
1148
- routes: {}, // Empty until first match
1149
- trailingSlash: trailingSlashConfig,
1150
- handler: urlPatterns.handler,
1151
- mountIndex: mountIndex++,
1152
- // Lazy evaluation fields
1153
- lazy: true,
1154
- lazyPatterns: lazyInclude.patterns,
1155
- lazyContext: lazyInclude.context,
1156
- lazyEvaluated: false,
1157
- // Store the include prefix for evaluation
1158
- _lazyPrefix: lazyInclude.prefix,
1159
- };
1160
- // Insert lazy entry before any entry whose staticPrefix is a
1161
- // prefix of (but shorter than) this lazy entry's staticPrefix.
1162
- // This ensures more specific lazy includes are matched before
1163
- // less specific eager entries (e.g., "/href/nested" before "/href/:id").
1164
- const lazyPrefix = lazyEntry.staticPrefix;
1165
- let insertIndex = routesEntries.length;
1166
- if (lazyPrefix) {
1167
- for (let i = 0; i < routesEntries.length; i++) {
1168
- const existing = routesEntries[i];
1169
- if (lazyPrefix.startsWith(existing.staticPrefix) &&
1170
- lazyPrefix.length > existing.staticPrefix.length) {
1171
- insertIndex = i;
1172
- break;
1173
- }
1174
- }
1175
- }
1176
- routesEntries.splice(insertIndex, 0, lazyEntry);
1177
- }
1178
- // Auto-register route map for runtime reverse() usage
1179
- registerRouteMap(mergedRouteMap);
1180
- // Return the router (no .map() needed for UrlPatterns)
1181
- return router;
1182
- }
1183
- // Legacy API: route() + map() pattern
1184
- // If second argument exists, first is prefix
1185
- if (maybeRoutes !== undefined) {
1186
- return createRouteBuilder(prefixOrRoutes, maybeRoutes);
1187
- }
1188
- // Otherwise, first argument is routes with empty prefix
1189
- return createRouteBuilder("", prefixOrRoutes);
1190
- },
1191
- use(patternOrMiddleware, middleware) {
1192
- // Global middleware - no mount prefix
1193
- addMiddleware(patternOrMiddleware, middleware, null);
1194
- return router;
1195
- },
1196
- // Type-safe URL builder using merged route map
1197
- // Types are tracked through the builder chain via TRoutes parameter
1198
- // Falls back to static route names from the generated file (injected by Vite)
1199
- reverse: createReverse(mergedRouteMap, () => staticRouteNames),
1200
- // Expose accumulated route map for typeof extraction
1201
- // Returns {} initially, but builder chain accumulates specific route types
1202
- get routeMap() {
1203
- return mergedRouteMap;
1204
- },
1205
- // Expose rootLayout for renderSegments
1206
- rootLayout,
1207
- // Expose onError callback for error handling
1208
- onError,
1209
- // Expose cache configuration for RSC handler
1210
- cache,
1211
- // Expose notFound component for RSC handler
1212
- notFound,
1213
- // Expose resolved theme configuration for NavigationProvider and MetaTags
1214
- themeConfig: resolvedThemeConfig,
1215
- // Expose warmup enabled flag for handler and client
1216
- warmupEnabled,
1217
- // Expose debug manifest flag for handler
1218
- allowDebugManifest: allowDebugManifestOption,
1219
- // Expose global middleware for RSC handler
1220
- middleware: globalMiddleware,
1221
- match,
1222
- matchForPrerender,
1223
- matchPartial,
1224
- matchError,
1225
- previewMatch,
1226
- // Expose nonce provider for fetch
1227
- nonce,
1228
- // Expose version for fetch
1229
- version,
1230
- // Expose urlpatterns for runtime manifest generation
1231
- get urlpatterns() {
1232
- return storedUrlPatterns ?? undefined;
1233
- },
1234
- // Expose source file for per-router type generation
1235
- __sourceFile,
1236
- // RSC request handler (lazily created on first call)
1237
- fetch: (() => {
1238
- // Handler is created on first call and reused
1239
- let handler = null;
1240
- return async (request, env) => {
1241
- // Trigger lazy import of per-router manifest data before route matching.
1242
- // No-op if data is already loaded or no loader is registered.
1243
- await ensureRouterManifest(routerId);
1244
- if (!handler) {
1245
- // Lazy import deferred to first request to avoid dev mode issues
1246
- const { createRSCHandler } = await import("./rsc/handler.js");
1247
- handler = createRSCHandler({
1248
- router: router,
1249
- cache,
1250
- nonce,
1251
- version,
1252
- });
1253
- }
1254
- return handler(request, env);
1255
- };
1256
- })(),
1257
- // Debug utility for manifest inspection
1258
- async debugManifest() {
1259
- const manifest = new Map();
1260
- for (const entry of routesEntries) {
1261
- const Store = {
1262
- manifest,
1263
- namespace: `debug.M${entry.mountIndex}`,
1264
- parent: null,
1265
- counters: {},
1266
- mountIndex: entry.mountIndex,
1267
- patterns: new Map(),
1268
- trailingSlash: new Map(),
1269
- };
1270
- await getContext().runWithStore(Store, `debug.M${entry.mountIndex}`, null, async () => {
1271
- const helpers = createRouteHelpers();
1272
- // Wrap handler execution in root layout (same as loadManifest)
1273
- let promiseResult = null;
1274
- helpers.layout(MapRootLayout, () => {
1275
- const result = entry.handler();
1276
- if (result instanceof Promise) {
1277
- promiseResult = result;
1278
- return [];
1279
- }
1280
- return result;
1281
- });
1282
- if (promiseResult !== null) {
1283
- const load = await promiseResult;
1284
- if (load && typeof load === "object" && "default" in load) {
1285
- const useItems = load.default;
1286
- if (typeof useItems === "function") {
1287
- useItems(helpers);
1288
- }
1289
- }
1290
- }
1291
- });
1292
- }
1293
- return serializeManifest(manifest);
1294
- },
1295
- };
1296
- // Register router in the global registry for build-time discovery
1297
- RouterRegistry.set(routerId, router);
1298
- // If urls option was provided, auto-register them
1299
- if (urlsOption) {
1300
- return router.routes(urlsOption);
1301
- }
1302
- return router;
1303
- }
1304
- //# sourceMappingURL=router.js.map