@rangojs/router 0.0.0-experimental.136 → 0.0.0-experimental.138

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 (862) hide show
  1. package/dist/bin/rango.js +237 -42
  2. package/dist/vite/index.js +239 -43
  3. package/package.json +19 -18
  4. package/skills/breadcrumbs/SKILL.md +29 -12
  5. package/skills/composability/SKILL.md +50 -0
  6. package/skills/migrate-nextjs/SKILL.md +12 -0
  7. package/skills/rango/SKILL.md +5 -1
  8. package/skills/response-routes/SKILL.md +14 -0
  9. package/skills/router-setup/SKILL.md +12 -0
  10. package/skills/testing/handles.md +4 -2
  11. package/skills/testing/reverse-and-types.md +8 -7
  12. package/src/browser/event-controller.ts +21 -0
  13. package/src/browser/react/NavigationProvider.tsx +68 -157
  14. package/src/browser/server-action-bridge.ts +22 -10
  15. package/src/build/generate-manifest.ts +155 -131
  16. package/src/build/index.ts +3 -1
  17. package/src/build/route-types/include-resolution.ts +347 -47
  18. package/src/build/runtime-discovery.ts +4 -1
  19. package/src/cache/cf/cf-cache-store.ts +22 -0
  20. package/src/client.rsc.tsx +0 -3
  21. package/src/client.tsx +0 -3
  22. package/src/defer.ts +11 -22
  23. package/src/handle.ts +37 -15
  24. package/src/handles/MetaTags.tsx +16 -88
  25. package/src/handles/breadcrumbs.ts +12 -14
  26. package/src/handles/deferred-resolution.ts +127 -0
  27. package/src/handles/is-thenable.ts +7 -8
  28. package/src/handles/meta.ts +7 -44
  29. package/src/index.rsc.ts +0 -1
  30. package/src/index.ts +0 -1
  31. package/src/prerender.ts +17 -4
  32. package/src/router/find-match.ts +71 -7
  33. package/src/router/lazy-includes.ts +64 -10
  34. package/src/router/manifest.ts +43 -6
  35. package/src/router/match-api.ts +2 -2
  36. package/src/router/navigation-snapshot.ts +7 -5
  37. package/src/router/prerender-match.ts +11 -5
  38. package/src/router/preview-match.ts +3 -1
  39. package/src/router/request-classification.ts +3 -1
  40. package/src/router/route-snapshot.ts +4 -2
  41. package/src/router/router-context.ts +3 -1
  42. package/src/router/router-interfaces.ts +9 -1
  43. package/src/router.ts +9 -2
  44. package/src/rsc/handler.ts +3 -1
  45. package/src/rsc/manifest-init.ts +1 -1
  46. package/src/rsc/progressive-enhancement.ts +5 -2
  47. package/src/rsc/rsc-rendering.ts +5 -1
  48. package/src/ssr/index.tsx +1 -0
  49. package/src/testing/collect-handle.ts +14 -8
  50. package/src/testing/dispatch.ts +3 -3
  51. package/src/testing/generated-routes.ts +27 -11
  52. package/src/testing/render-route.tsx +6 -1
  53. package/src/urls/include-helper.ts +10 -8
  54. package/src/urls/include-provider.ts +71 -0
  55. package/src/urls/path-helper-types.ts +25 -1
  56. package/src/vite/discovery/discover-routers.ts +1 -1
  57. package/src/vite/router-discovery.ts +8 -0
  58. package/dist/__internal.d.ts +0 -83
  59. package/dist/__internal.d.ts.map +0 -1
  60. package/dist/__internal.js +0 -19
  61. package/dist/__internal.js.map +0 -1
  62. package/dist/__mocks__/version.d.ts +0 -7
  63. package/dist/__mocks__/version.d.ts.map +0 -1
  64. package/dist/__mocks__/version.js +0 -7
  65. package/dist/__mocks__/version.js.map +0 -1
  66. package/dist/__tests__/client-href.test.d.ts +0 -2
  67. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  68. package/dist/__tests__/client-href.test.js +0 -74
  69. package/dist/__tests__/client-href.test.js.map +0 -1
  70. package/dist/__tests__/component-utils.test.d.ts +0 -2
  71. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  72. package/dist/__tests__/component-utils.test.js +0 -51
  73. package/dist/__tests__/component-utils.test.js.map +0 -1
  74. package/dist/__tests__/event-controller.test.d.ts +0 -2
  75. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  76. package/dist/__tests__/event-controller.test.js +0 -538
  77. package/dist/__tests__/event-controller.test.js.map +0 -1
  78. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  79. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  80. package/dist/__tests__/helpers/route-tree.js +0 -374
  81. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  82. package/dist/__tests__/match-result.test.d.ts +0 -2
  83. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  84. package/dist/__tests__/match-result.test.js +0 -154
  85. package/dist/__tests__/match-result.test.js.map +0 -1
  86. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  87. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  88. package/dist/__tests__/navigation-store.test.js +0 -440
  89. package/dist/__tests__/navigation-store.test.js.map +0 -1
  90. package/dist/__tests__/partial-update.test.d.ts +0 -2
  91. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  92. package/dist/__tests__/partial-update.test.js +0 -1009
  93. package/dist/__tests__/partial-update.test.js.map +0 -1
  94. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  95. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  96. package/dist/__tests__/reverse-types.test.js +0 -656
  97. package/dist/__tests__/reverse-types.test.js.map +0 -1
  98. package/dist/__tests__/route-definition.test.d.ts +0 -2
  99. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  100. package/dist/__tests__/route-definition.test.js +0 -55
  101. package/dist/__tests__/route-definition.test.js.map +0 -1
  102. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  103. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  104. package/dist/__tests__/router-helpers.test.js +0 -377
  105. package/dist/__tests__/router-helpers.test.js.map +0 -1
  106. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  107. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  108. package/dist/__tests__/router-integration-2.test.js +0 -426
  109. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  110. package/dist/__tests__/router-integration.test.d.ts +0 -2
  111. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  112. package/dist/__tests__/router-integration.test.js +0 -1051
  113. package/dist/__tests__/router-integration.test.js.map +0 -1
  114. package/dist/__tests__/search-params.test.d.ts +0 -5
  115. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  116. package/dist/__tests__/search-params.test.js +0 -306
  117. package/dist/__tests__/search-params.test.js.map +0 -1
  118. package/dist/__tests__/segment-system.test.d.ts +0 -2
  119. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  120. package/dist/__tests__/segment-system.test.js +0 -627
  121. package/dist/__tests__/segment-system.test.js.map +0 -1
  122. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  123. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  124. package/dist/__tests__/static-handler-types.test.js +0 -63
  125. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  126. package/dist/__tests__/urls.test.d.ts +0 -2
  127. package/dist/__tests__/urls.test.d.ts.map +0 -1
  128. package/dist/__tests__/urls.test.js +0 -421
  129. package/dist/__tests__/urls.test.js.map +0 -1
  130. package/dist/__tests__/use-mount.test.d.ts +0 -2
  131. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  132. package/dist/__tests__/use-mount.test.js +0 -35
  133. package/dist/__tests__/use-mount.test.js.map +0 -1
  134. package/dist/bin/rango.d.ts +0 -2
  135. package/dist/bin/rango.d.ts.map +0 -1
  136. package/dist/bin/rango.js.map +0 -1
  137. package/dist/browser/event-controller.d.ts +0 -191
  138. package/dist/browser/event-controller.d.ts.map +0 -1
  139. package/dist/browser/event-controller.js +0 -559
  140. package/dist/browser/event-controller.js.map +0 -1
  141. package/dist/browser/index.d.ts +0 -2
  142. package/dist/browser/index.d.ts.map +0 -1
  143. package/dist/browser/index.js +0 -14
  144. package/dist/browser/index.js.map +0 -1
  145. package/dist/browser/link-interceptor.d.ts +0 -38
  146. package/dist/browser/link-interceptor.d.ts.map +0 -1
  147. package/dist/browser/link-interceptor.js +0 -99
  148. package/dist/browser/link-interceptor.js.map +0 -1
  149. package/dist/browser/logging.d.ts +0 -10
  150. package/dist/browser/logging.d.ts.map +0 -1
  151. package/dist/browser/logging.js +0 -29
  152. package/dist/browser/logging.js.map +0 -1
  153. package/dist/browser/lru-cache.d.ts +0 -17
  154. package/dist/browser/lru-cache.d.ts.map +0 -1
  155. package/dist/browser/lru-cache.js +0 -50
  156. package/dist/browser/lru-cache.js.map +0 -1
  157. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  158. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  159. package/dist/browser/merge-segment-loaders.js +0 -102
  160. package/dist/browser/merge-segment-loaders.js.map +0 -1
  161. package/dist/browser/navigation-bridge.d.ts +0 -102
  162. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  163. package/dist/browser/navigation-bridge.js +0 -708
  164. package/dist/browser/navigation-bridge.js.map +0 -1
  165. package/dist/browser/navigation-client.d.ts +0 -25
  166. package/dist/browser/navigation-client.d.ts.map +0 -1
  167. package/dist/browser/navigation-client.js +0 -157
  168. package/dist/browser/navigation-client.js.map +0 -1
  169. package/dist/browser/navigation-store.d.ts +0 -101
  170. package/dist/browser/navigation-store.d.ts.map +0 -1
  171. package/dist/browser/navigation-store.js +0 -625
  172. package/dist/browser/navigation-store.js.map +0 -1
  173. package/dist/browser/partial-update.d.ts +0 -75
  174. package/dist/browser/partial-update.d.ts.map +0 -1
  175. package/dist/browser/partial-update.js +0 -426
  176. package/dist/browser/partial-update.js.map +0 -1
  177. package/dist/browser/react/Link.d.ts +0 -86
  178. package/dist/browser/react/Link.d.ts.map +0 -1
  179. package/dist/browser/react/Link.js +0 -128
  180. package/dist/browser/react/Link.js.map +0 -1
  181. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  182. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  183. package/dist/browser/react/NavigationProvider.js +0 -216
  184. package/dist/browser/react/NavigationProvider.js.map +0 -1
  185. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  186. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  187. package/dist/browser/react/ScrollRestoration.js +0 -57
  188. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  189. package/dist/browser/react/context.d.ts +0 -46
  190. package/dist/browser/react/context.d.ts.map +0 -1
  191. package/dist/browser/react/context.js +0 -10
  192. package/dist/browser/react/context.js.map +0 -1
  193. package/dist/browser/react/index.d.ts +0 -11
  194. package/dist/browser/react/index.d.ts.map +0 -1
  195. package/dist/browser/react/index.js +0 -22
  196. package/dist/browser/react/index.js.map +0 -1
  197. package/dist/browser/react/location-state-shared.d.ts +0 -63
  198. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  199. package/dist/browser/react/location-state-shared.js +0 -81
  200. package/dist/browser/react/location-state-shared.js.map +0 -1
  201. package/dist/browser/react/location-state.d.ts +0 -23
  202. package/dist/browser/react/location-state.d.ts.map +0 -1
  203. package/dist/browser/react/location-state.js +0 -29
  204. package/dist/browser/react/location-state.js.map +0 -1
  205. package/dist/browser/react/mount-context.d.ts +0 -24
  206. package/dist/browser/react/mount-context.d.ts.map +0 -1
  207. package/dist/browser/react/mount-context.js +0 -24
  208. package/dist/browser/react/mount-context.js.map +0 -1
  209. package/dist/browser/react/use-action.d.ts +0 -64
  210. package/dist/browser/react/use-action.d.ts.map +0 -1
  211. package/dist/browser/react/use-action.js +0 -134
  212. package/dist/browser/react/use-action.js.map +0 -1
  213. package/dist/browser/react/use-client-cache.d.ts +0 -41
  214. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  215. package/dist/browser/react/use-client-cache.js +0 -39
  216. package/dist/browser/react/use-client-cache.js.map +0 -1
  217. package/dist/browser/react/use-handle.d.ts +0 -31
  218. package/dist/browser/react/use-handle.d.ts.map +0 -1
  219. package/dist/browser/react/use-handle.js +0 -144
  220. package/dist/browser/react/use-handle.js.map +0 -1
  221. package/dist/browser/react/use-href.d.ts +0 -33
  222. package/dist/browser/react/use-href.d.ts.map +0 -1
  223. package/dist/browser/react/use-href.js +0 -39
  224. package/dist/browser/react/use-href.js.map +0 -1
  225. package/dist/browser/react/use-link-status.d.ts +0 -37
  226. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  227. package/dist/browser/react/use-link-status.js +0 -99
  228. package/dist/browser/react/use-link-status.js.map +0 -1
  229. package/dist/browser/react/use-mount.d.ts +0 -25
  230. package/dist/browser/react/use-mount.d.ts.map +0 -1
  231. package/dist/browser/react/use-mount.js +0 -30
  232. package/dist/browser/react/use-mount.js.map +0 -1
  233. package/dist/browser/react/use-navigation.d.ts +0 -27
  234. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  235. package/dist/browser/react/use-navigation.js +0 -87
  236. package/dist/browser/react/use-navigation.js.map +0 -1
  237. package/dist/browser/react/use-segments.d.ts +0 -38
  238. package/dist/browser/react/use-segments.d.ts.map +0 -1
  239. package/dist/browser/react/use-segments.js +0 -130
  240. package/dist/browser/react/use-segments.js.map +0 -1
  241. package/dist/browser/request-controller.d.ts +0 -26
  242. package/dist/browser/request-controller.d.ts.map +0 -1
  243. package/dist/browser/request-controller.js +0 -147
  244. package/dist/browser/request-controller.js.map +0 -1
  245. package/dist/browser/rsc-router.d.ts +0 -129
  246. package/dist/browser/rsc-router.d.ts.map +0 -1
  247. package/dist/browser/rsc-router.js +0 -195
  248. package/dist/browser/rsc-router.js.map +0 -1
  249. package/dist/browser/scroll-restoration.d.ts +0 -93
  250. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  251. package/dist/browser/scroll-restoration.js +0 -321
  252. package/dist/browser/scroll-restoration.js.map +0 -1
  253. package/dist/browser/segment-structure-assert.d.ts +0 -17
  254. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  255. package/dist/browser/segment-structure-assert.js +0 -59
  256. package/dist/browser/segment-structure-assert.js.map +0 -1
  257. package/dist/browser/server-action-bridge.d.ts +0 -26
  258. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  259. package/dist/browser/server-action-bridge.js +0 -668
  260. package/dist/browser/server-action-bridge.js.map +0 -1
  261. package/dist/browser/shallow.d.ts +0 -12
  262. package/dist/browser/shallow.d.ts.map +0 -1
  263. package/dist/browser/shallow.js +0 -34
  264. package/dist/browser/shallow.js.map +0 -1
  265. package/dist/browser/types.d.ts +0 -369
  266. package/dist/browser/types.d.ts.map +0 -1
  267. package/dist/browser/types.js +0 -2
  268. package/dist/browser/types.js.map +0 -1
  269. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  270. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  271. package/dist/build/__tests__/generate-cli.test.js +0 -237
  272. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  273. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  274. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  275. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  276. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  277. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  278. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  279. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  280. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  281. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  282. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  283. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  284. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  285. package/dist/build/generate-manifest.d.ts +0 -81
  286. package/dist/build/generate-manifest.d.ts.map +0 -1
  287. package/dist/build/generate-manifest.js +0 -276
  288. package/dist/build/generate-manifest.js.map +0 -1
  289. package/dist/build/generate-route-types.d.ts +0 -115
  290. package/dist/build/generate-route-types.d.ts.map +0 -1
  291. package/dist/build/generate-route-types.js +0 -740
  292. package/dist/build/generate-route-types.js.map +0 -1
  293. package/dist/build/index.d.ts +0 -21
  294. package/dist/build/index.d.ts.map +0 -1
  295. package/dist/build/index.js +0 -21
  296. package/dist/build/index.js.map +0 -1
  297. package/dist/build/route-trie.d.ts +0 -71
  298. package/dist/build/route-trie.d.ts.map +0 -1
  299. package/dist/build/route-trie.js +0 -175
  300. package/dist/build/route-trie.js.map +0 -1
  301. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  302. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  303. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  304. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  305. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  306. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  307. package/dist/cache/__tests__/document-cache.test.js +0 -345
  308. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  309. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  310. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  311. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  312. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  313. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  314. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  315. package/dist/cache/__tests__/memory-store.test.js +0 -367
  316. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  317. package/dist/cache/cache-scope.d.ts +0 -102
  318. package/dist/cache/cache-scope.d.ts.map +0 -1
  319. package/dist/cache/cache-scope.js +0 -440
  320. package/dist/cache/cache-scope.js.map +0 -1
  321. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  322. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  323. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  324. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  325. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  326. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  327. package/dist/cache/cf/cf-cache-store.js +0 -242
  328. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  329. package/dist/cache/cf/index.d.ts +0 -14
  330. package/dist/cache/cf/index.d.ts.map +0 -1
  331. package/dist/cache/cf/index.js +0 -17
  332. package/dist/cache/cf/index.js.map +0 -1
  333. package/dist/cache/document-cache.d.ts +0 -64
  334. package/dist/cache/document-cache.d.ts.map +0 -1
  335. package/dist/cache/document-cache.js +0 -228
  336. package/dist/cache/document-cache.js.map +0 -1
  337. package/dist/cache/index.d.ts +0 -19
  338. package/dist/cache/index.d.ts.map +0 -1
  339. package/dist/cache/index.js +0 -21
  340. package/dist/cache/index.js.map +0 -1
  341. package/dist/cache/memory-segment-store.d.ts +0 -110
  342. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  343. package/dist/cache/memory-segment-store.js +0 -117
  344. package/dist/cache/memory-segment-store.js.map +0 -1
  345. package/dist/cache/memory-store.d.ts +0 -41
  346. package/dist/cache/memory-store.d.ts.map +0 -1
  347. package/dist/cache/memory-store.js +0 -191
  348. package/dist/cache/memory-store.js.map +0 -1
  349. package/dist/cache/types.d.ts +0 -317
  350. package/dist/cache/types.d.ts.map +0 -1
  351. package/dist/cache/types.js +0 -12
  352. package/dist/cache/types.js.map +0 -1
  353. package/dist/client.d.ts +0 -248
  354. package/dist/client.d.ts.map +0 -1
  355. package/dist/client.js +0 -367
  356. package/dist/client.js.map +0 -1
  357. package/dist/client.rsc.d.ts +0 -26
  358. package/dist/client.rsc.d.ts.map +0 -1
  359. package/dist/client.rsc.js +0 -46
  360. package/dist/client.rsc.js.map +0 -1
  361. package/dist/component-utils.d.ts +0 -36
  362. package/dist/component-utils.d.ts.map +0 -1
  363. package/dist/component-utils.js +0 -61
  364. package/dist/component-utils.js.map +0 -1
  365. package/dist/components/DefaultDocument.d.ts +0 -13
  366. package/dist/components/DefaultDocument.d.ts.map +0 -1
  367. package/dist/components/DefaultDocument.js +0 -15
  368. package/dist/components/DefaultDocument.js.map +0 -1
  369. package/dist/debug.d.ts +0 -58
  370. package/dist/debug.d.ts.map +0 -1
  371. package/dist/debug.js +0 -157
  372. package/dist/debug.js.map +0 -1
  373. package/dist/default-error-boundary.d.ts +0 -11
  374. package/dist/default-error-boundary.d.ts.map +0 -1
  375. package/dist/default-error-boundary.js +0 -45
  376. package/dist/default-error-boundary.js.map +0 -1
  377. package/dist/deps/browser.d.ts +0 -2
  378. package/dist/deps/browser.d.ts.map +0 -1
  379. package/dist/deps/browser.js +0 -3
  380. package/dist/deps/browser.js.map +0 -1
  381. package/dist/deps/html-stream-client.d.ts +0 -2
  382. package/dist/deps/html-stream-client.d.ts.map +0 -1
  383. package/dist/deps/html-stream-client.js +0 -3
  384. package/dist/deps/html-stream-client.js.map +0 -1
  385. package/dist/deps/html-stream-server.d.ts +0 -2
  386. package/dist/deps/html-stream-server.d.ts.map +0 -1
  387. package/dist/deps/html-stream-server.js +0 -3
  388. package/dist/deps/html-stream-server.js.map +0 -1
  389. package/dist/deps/rsc.d.ts +0 -2
  390. package/dist/deps/rsc.d.ts.map +0 -1
  391. package/dist/deps/rsc.js +0 -4
  392. package/dist/deps/rsc.js.map +0 -1
  393. package/dist/deps/ssr.d.ts +0 -2
  394. package/dist/deps/ssr.d.ts.map +0 -1
  395. package/dist/deps/ssr.js +0 -3
  396. package/dist/deps/ssr.js.map +0 -1
  397. package/dist/errors.d.ts +0 -174
  398. package/dist/errors.d.ts.map +0 -1
  399. package/dist/errors.js +0 -241
  400. package/dist/errors.js.map +0 -1
  401. package/dist/handle.d.ts +0 -78
  402. package/dist/handle.d.ts.map +0 -1
  403. package/dist/handle.js +0 -82
  404. package/dist/handle.js.map +0 -1
  405. package/dist/handles/MetaTags.d.ts +0 -14
  406. package/dist/handles/MetaTags.d.ts.map +0 -1
  407. package/dist/handles/MetaTags.js +0 -136
  408. package/dist/handles/MetaTags.js.map +0 -1
  409. package/dist/handles/index.d.ts +0 -6
  410. package/dist/handles/index.d.ts.map +0 -1
  411. package/dist/handles/index.js +0 -6
  412. package/dist/handles/index.js.map +0 -1
  413. package/dist/handles/meta.d.ts +0 -39
  414. package/dist/handles/meta.d.ts.map +0 -1
  415. package/dist/handles/meta.js +0 -202
  416. package/dist/handles/meta.js.map +0 -1
  417. package/dist/host/__tests__/errors.test.d.ts +0 -2
  418. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  419. package/dist/host/__tests__/errors.test.js +0 -76
  420. package/dist/host/__tests__/errors.test.js.map +0 -1
  421. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  422. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  423. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  424. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  425. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  426. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  427. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  428. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  429. package/dist/host/__tests__/router.test.d.ts +0 -2
  430. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  431. package/dist/host/__tests__/router.test.js +0 -241
  432. package/dist/host/__tests__/router.test.js.map +0 -1
  433. package/dist/host/__tests__/testing.test.d.ts +0 -2
  434. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  435. package/dist/host/__tests__/testing.test.js +0 -64
  436. package/dist/host/__tests__/testing.test.js.map +0 -1
  437. package/dist/host/__tests__/utils.test.d.ts +0 -2
  438. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  439. package/dist/host/__tests__/utils.test.js +0 -29
  440. package/dist/host/__tests__/utils.test.js.map +0 -1
  441. package/dist/host/cookie-handler.d.ts +0 -34
  442. package/dist/host/cookie-handler.d.ts.map +0 -1
  443. package/dist/host/cookie-handler.js +0 -124
  444. package/dist/host/cookie-handler.js.map +0 -1
  445. package/dist/host/errors.d.ts +0 -56
  446. package/dist/host/errors.d.ts.map +0 -1
  447. package/dist/host/errors.js +0 -79
  448. package/dist/host/errors.js.map +0 -1
  449. package/dist/host/index.d.ts +0 -29
  450. package/dist/host/index.d.ts.map +0 -1
  451. package/dist/host/index.js +0 -32
  452. package/dist/host/index.js.map +0 -1
  453. package/dist/host/pattern-matcher.d.ts +0 -36
  454. package/dist/host/pattern-matcher.d.ts.map +0 -1
  455. package/dist/host/pattern-matcher.js +0 -172
  456. package/dist/host/pattern-matcher.js.map +0 -1
  457. package/dist/host/router.d.ts +0 -26
  458. package/dist/host/router.d.ts.map +0 -1
  459. package/dist/host/router.js +0 -218
  460. package/dist/host/router.js.map +0 -1
  461. package/dist/host/testing.d.ts +0 -36
  462. package/dist/host/testing.d.ts.map +0 -1
  463. package/dist/host/testing.js +0 -55
  464. package/dist/host/testing.js.map +0 -1
  465. package/dist/host/types.d.ts +0 -115
  466. package/dist/host/types.d.ts.map +0 -1
  467. package/dist/host/types.js +0 -7
  468. package/dist/host/types.js.map +0 -1
  469. package/dist/host/utils.d.ts +0 -21
  470. package/dist/host/utils.d.ts.map +0 -1
  471. package/dist/host/utils.js +0 -23
  472. package/dist/host/utils.js.map +0 -1
  473. package/dist/href-client.d.ts +0 -131
  474. package/dist/href-client.d.ts.map +0 -1
  475. package/dist/href-client.js +0 -64
  476. package/dist/href-client.js.map +0 -1
  477. package/dist/href-context.d.ts +0 -29
  478. package/dist/href-context.d.ts.map +0 -1
  479. package/dist/href-context.js +0 -21
  480. package/dist/href-context.js.map +0 -1
  481. package/dist/index.d.ts +0 -73
  482. package/dist/index.d.ts.map +0 -1
  483. package/dist/index.js +0 -91
  484. package/dist/index.js.map +0 -1
  485. package/dist/index.rsc.d.ts +0 -32
  486. package/dist/index.rsc.d.ts.map +0 -1
  487. package/dist/index.rsc.js +0 -40
  488. package/dist/index.rsc.js.map +0 -1
  489. package/dist/internal-debug.d.ts +0 -2
  490. package/dist/internal-debug.d.ts.map +0 -1
  491. package/dist/internal-debug.js +0 -5
  492. package/dist/internal-debug.js.map +0 -1
  493. package/dist/loader.d.ts +0 -14
  494. package/dist/loader.d.ts.map +0 -1
  495. package/dist/loader.js +0 -20
  496. package/dist/loader.js.map +0 -1
  497. package/dist/loader.rsc.d.ts +0 -19
  498. package/dist/loader.rsc.d.ts.map +0 -1
  499. package/dist/loader.rsc.js +0 -99
  500. package/dist/loader.rsc.js.map +0 -1
  501. package/dist/network-error-thrower.d.ts +0 -17
  502. package/dist/network-error-thrower.d.ts.map +0 -1
  503. package/dist/network-error-thrower.js +0 -14
  504. package/dist/network-error-thrower.js.map +0 -1
  505. package/dist/outlet-context.d.ts +0 -13
  506. package/dist/outlet-context.d.ts.map +0 -1
  507. package/dist/outlet-context.js +0 -3
  508. package/dist/outlet-context.js.map +0 -1
  509. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  510. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  511. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  512. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  513. package/dist/prerender/param-hash.d.ts +0 -16
  514. package/dist/prerender/param-hash.d.ts.map +0 -1
  515. package/dist/prerender/param-hash.js +0 -36
  516. package/dist/prerender/param-hash.js.map +0 -1
  517. package/dist/prerender/store.d.ts +0 -38
  518. package/dist/prerender/store.d.ts.map +0 -1
  519. package/dist/prerender/store.js +0 -61
  520. package/dist/prerender/store.js.map +0 -1
  521. package/dist/prerender.d.ts +0 -66
  522. package/dist/prerender.d.ts.map +0 -1
  523. package/dist/prerender.js +0 -57
  524. package/dist/prerender.js.map +0 -1
  525. package/dist/reverse.d.ts +0 -196
  526. package/dist/reverse.d.ts.map +0 -1
  527. package/dist/reverse.js +0 -78
  528. package/dist/reverse.js.map +0 -1
  529. package/dist/root-error-boundary.d.ts +0 -33
  530. package/dist/root-error-boundary.d.ts.map +0 -1
  531. package/dist/root-error-boundary.js +0 -165
  532. package/dist/root-error-boundary.js.map +0 -1
  533. package/dist/route-content-wrapper.d.ts +0 -46
  534. package/dist/route-content-wrapper.d.ts.map +0 -1
  535. package/dist/route-content-wrapper.js +0 -77
  536. package/dist/route-content-wrapper.js.map +0 -1
  537. package/dist/route-definition.d.ts +0 -421
  538. package/dist/route-definition.d.ts.map +0 -1
  539. package/dist/route-definition.js +0 -868
  540. package/dist/route-definition.js.map +0 -1
  541. package/dist/route-map-builder.d.ts +0 -155
  542. package/dist/route-map-builder.d.ts.map +0 -1
  543. package/dist/route-map-builder.js +0 -237
  544. package/dist/route-map-builder.js.map +0 -1
  545. package/dist/route-types.d.ts +0 -165
  546. package/dist/route-types.d.ts.map +0 -1
  547. package/dist/route-types.js +0 -7
  548. package/dist/route-types.js.map +0 -1
  549. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  550. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  551. package/dist/router/__tests__/handler-context.test.js +0 -65
  552. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  553. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  554. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  555. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  556. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  557. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  558. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  559. package/dist/router/__tests__/match-context.test.js +0 -92
  560. package/dist/router/__tests__/match-context.test.js.map +0 -1
  561. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  562. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  563. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  564. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  565. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  566. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  567. package/dist/router/__tests__/match-result.test.js +0 -457
  568. package/dist/router/__tests__/match-result.test.js.map +0 -1
  569. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  570. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  571. package/dist/router/__tests__/on-error.test.js +0 -678
  572. package/dist/router/__tests__/on-error.test.js.map +0 -1
  573. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  574. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  575. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  576. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  577. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  578. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  579. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  580. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  581. package/dist/router/error-handling.d.ts +0 -77
  582. package/dist/router/error-handling.d.ts.map +0 -1
  583. package/dist/router/error-handling.js +0 -202
  584. package/dist/router/error-handling.js.map +0 -1
  585. package/dist/router/handler-context.d.ts +0 -20
  586. package/dist/router/handler-context.d.ts.map +0 -1
  587. package/dist/router/handler-context.js +0 -198
  588. package/dist/router/handler-context.js.map +0 -1
  589. package/dist/router/intercept-resolution.d.ts +0 -66
  590. package/dist/router/intercept-resolution.d.ts.map +0 -1
  591. package/dist/router/intercept-resolution.js +0 -246
  592. package/dist/router/intercept-resolution.js.map +0 -1
  593. package/dist/router/loader-resolution.d.ts +0 -64
  594. package/dist/router/loader-resolution.d.ts.map +0 -1
  595. package/dist/router/loader-resolution.js +0 -284
  596. package/dist/router/loader-resolution.js.map +0 -1
  597. package/dist/router/logging.d.ts +0 -15
  598. package/dist/router/logging.d.ts.map +0 -1
  599. package/dist/router/logging.js +0 -99
  600. package/dist/router/logging.js.map +0 -1
  601. package/dist/router/manifest.d.ts +0 -22
  602. package/dist/router/manifest.d.ts.map +0 -1
  603. package/dist/router/manifest.js +0 -181
  604. package/dist/router/manifest.js.map +0 -1
  605. package/dist/router/match-api.d.ts +0 -35
  606. package/dist/router/match-api.d.ts.map +0 -1
  607. package/dist/router/match-api.js +0 -406
  608. package/dist/router/match-api.js.map +0 -1
  609. package/dist/router/match-context.d.ts +0 -206
  610. package/dist/router/match-context.d.ts.map +0 -1
  611. package/dist/router/match-context.js +0 -17
  612. package/dist/router/match-context.js.map +0 -1
  613. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  614. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  615. package/dist/router/match-middleware/background-revalidation.js +0 -75
  616. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  617. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  618. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  619. package/dist/router/match-middleware/cache-lookup.js +0 -257
  620. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  621. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  622. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  623. package/dist/router/match-middleware/cache-store.js +0 -108
  624. package/dist/router/match-middleware/cache-store.js.map +0 -1
  625. package/dist/router/match-middleware/index.d.ts +0 -81
  626. package/dist/router/match-middleware/index.d.ts.map +0 -1
  627. package/dist/router/match-middleware/index.js +0 -80
  628. package/dist/router/match-middleware/index.js.map +0 -1
  629. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  630. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  631. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  632. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  633. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  634. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  635. package/dist/router/match-middleware/segment-resolution.js +0 -53
  636. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  637. package/dist/router/match-pipelines.d.ts +0 -147
  638. package/dist/router/match-pipelines.d.ts.map +0 -1
  639. package/dist/router/match-pipelines.js +0 -82
  640. package/dist/router/match-pipelines.js.map +0 -1
  641. package/dist/router/match-result.d.ts +0 -126
  642. package/dist/router/match-result.d.ts.map +0 -1
  643. package/dist/router/match-result.js +0 -93
  644. package/dist/router/match-result.js.map +0 -1
  645. package/dist/router/metrics.d.ts +0 -20
  646. package/dist/router/metrics.d.ts.map +0 -1
  647. package/dist/router/metrics.js +0 -47
  648. package/dist/router/metrics.js.map +0 -1
  649. package/dist/router/middleware.d.ts +0 -249
  650. package/dist/router/middleware.d.ts.map +0 -1
  651. package/dist/router/middleware.js +0 -434
  652. package/dist/router/middleware.js.map +0 -1
  653. package/dist/router/middleware.test.d.ts +0 -2
  654. package/dist/router/middleware.test.d.ts.map +0 -1
  655. package/dist/router/middleware.test.js +0 -816
  656. package/dist/router/middleware.test.js.map +0 -1
  657. package/dist/router/pattern-matching.d.ts +0 -149
  658. package/dist/router/pattern-matching.d.ts.map +0 -1
  659. package/dist/router/pattern-matching.js +0 -349
  660. package/dist/router/pattern-matching.js.map +0 -1
  661. package/dist/router/revalidation.d.ts +0 -44
  662. package/dist/router/revalidation.d.ts.map +0 -1
  663. package/dist/router/revalidation.js +0 -147
  664. package/dist/router/revalidation.js.map +0 -1
  665. package/dist/router/router-context.d.ts +0 -135
  666. package/dist/router/router-context.d.ts.map +0 -1
  667. package/dist/router/router-context.js +0 -36
  668. package/dist/router/router-context.js.map +0 -1
  669. package/dist/router/segment-resolution.d.ts +0 -127
  670. package/dist/router/segment-resolution.d.ts.map +0 -1
  671. package/dist/router/segment-resolution.js +0 -919
  672. package/dist/router/segment-resolution.js.map +0 -1
  673. package/dist/router/trie-matching.d.ts +0 -40
  674. package/dist/router/trie-matching.d.ts.map +0 -1
  675. package/dist/router/trie-matching.js +0 -127
  676. package/dist/router/trie-matching.js.map +0 -1
  677. package/dist/router/types.d.ts +0 -136
  678. package/dist/router/types.d.ts.map +0 -1
  679. package/dist/router/types.js +0 -7
  680. package/dist/router/types.js.map +0 -1
  681. package/dist/router.d.ts +0 -753
  682. package/dist/router.d.ts.map +0 -1
  683. package/dist/router.gen.d.ts +0 -6
  684. package/dist/router.gen.d.ts.map +0 -1
  685. package/dist/router.gen.js +0 -6
  686. package/dist/router.gen.js.map +0 -1
  687. package/dist/router.js +0 -1304
  688. package/dist/router.js.map +0 -1
  689. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  690. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  691. package/dist/rsc/__tests__/helpers.test.js +0 -140
  692. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  693. package/dist/rsc/handler.d.ts +0 -45
  694. package/dist/rsc/handler.d.ts.map +0 -1
  695. package/dist/rsc/handler.js +0 -1172
  696. package/dist/rsc/handler.js.map +0 -1
  697. package/dist/rsc/helpers.d.ts +0 -16
  698. package/dist/rsc/helpers.d.ts.map +0 -1
  699. package/dist/rsc/helpers.js +0 -55
  700. package/dist/rsc/helpers.js.map +0 -1
  701. package/dist/rsc/index.d.ts +0 -22
  702. package/dist/rsc/index.d.ts.map +0 -1
  703. package/dist/rsc/index.js +0 -23
  704. package/dist/rsc/index.js.map +0 -1
  705. package/dist/rsc/nonce.d.ts +0 -9
  706. package/dist/rsc/nonce.d.ts.map +0 -1
  707. package/dist/rsc/nonce.js +0 -18
  708. package/dist/rsc/nonce.js.map +0 -1
  709. package/dist/rsc/types.d.ts +0 -206
  710. package/dist/rsc/types.d.ts.map +0 -1
  711. package/dist/rsc/types.js +0 -8
  712. package/dist/rsc/types.js.map +0 -1
  713. package/dist/search-params.d.ts +0 -103
  714. package/dist/search-params.d.ts.map +0 -1
  715. package/dist/search-params.js +0 -74
  716. package/dist/search-params.js.map +0 -1
  717. package/dist/segment-system.d.ts +0 -75
  718. package/dist/segment-system.d.ts.map +0 -1
  719. package/dist/segment-system.js +0 -336
  720. package/dist/segment-system.js.map +0 -1
  721. package/dist/server/context.d.ts +0 -245
  722. package/dist/server/context.d.ts.map +0 -1
  723. package/dist/server/context.js +0 -197
  724. package/dist/server/context.js.map +0 -1
  725. package/dist/server/fetchable-loader-store.d.ts +0 -18
  726. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  727. package/dist/server/fetchable-loader-store.js +0 -18
  728. package/dist/server/fetchable-loader-store.js.map +0 -1
  729. package/dist/server/handle-store.d.ts +0 -85
  730. package/dist/server/handle-store.d.ts.map +0 -1
  731. package/dist/server/handle-store.js +0 -142
  732. package/dist/server/handle-store.js.map +0 -1
  733. package/dist/server/loader-registry.d.ts +0 -55
  734. package/dist/server/loader-registry.d.ts.map +0 -1
  735. package/dist/server/loader-registry.js +0 -132
  736. package/dist/server/loader-registry.js.map +0 -1
  737. package/dist/server/request-context.d.ts +0 -226
  738. package/dist/server/request-context.d.ts.map +0 -1
  739. package/dist/server/request-context.js +0 -290
  740. package/dist/server/request-context.js.map +0 -1
  741. package/dist/server/root-layout.d.ts +0 -4
  742. package/dist/server/root-layout.d.ts.map +0 -1
  743. package/dist/server/root-layout.js +0 -5
  744. package/dist/server/root-layout.js.map +0 -1
  745. package/dist/server.d.ts +0 -15
  746. package/dist/server.d.ts.map +0 -1
  747. package/dist/server.js +0 -20
  748. package/dist/server.js.map +0 -1
  749. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  750. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  751. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  752. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  753. package/dist/ssr/index.d.ts +0 -98
  754. package/dist/ssr/index.d.ts.map +0 -1
  755. package/dist/ssr/index.js +0 -158
  756. package/dist/ssr/index.js.map +0 -1
  757. package/dist/static-handler.d.ts +0 -50
  758. package/dist/static-handler.d.ts.map +0 -1
  759. package/dist/static-handler.gen.d.ts +0 -5
  760. package/dist/static-handler.gen.d.ts.map +0 -1
  761. package/dist/static-handler.gen.js +0 -5
  762. package/dist/static-handler.gen.js.map +0 -1
  763. package/dist/static-handler.js +0 -29
  764. package/dist/static-handler.js.map +0 -1
  765. package/dist/theme/ThemeProvider.d.ts +0 -20
  766. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  767. package/dist/theme/ThemeProvider.js +0 -240
  768. package/dist/theme/ThemeProvider.js.map +0 -1
  769. package/dist/theme/ThemeScript.d.ts +0 -48
  770. package/dist/theme/ThemeScript.d.ts.map +0 -1
  771. package/dist/theme/ThemeScript.js +0 -13
  772. package/dist/theme/ThemeScript.js.map +0 -1
  773. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  774. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  775. package/dist/theme/__tests__/theme.test.js +0 -103
  776. package/dist/theme/__tests__/theme.test.js.map +0 -1
  777. package/dist/theme/constants.d.ts +0 -29
  778. package/dist/theme/constants.d.ts.map +0 -1
  779. package/dist/theme/constants.js +0 -48
  780. package/dist/theme/constants.js.map +0 -1
  781. package/dist/theme/index.d.ts +0 -31
  782. package/dist/theme/index.d.ts.map +0 -1
  783. package/dist/theme/index.js +0 -36
  784. package/dist/theme/index.js.map +0 -1
  785. package/dist/theme/theme-context.d.ts +0 -40
  786. package/dist/theme/theme-context.d.ts.map +0 -1
  787. package/dist/theme/theme-context.js +0 -60
  788. package/dist/theme/theme-context.js.map +0 -1
  789. package/dist/theme/theme-script.d.ts +0 -27
  790. package/dist/theme/theme-script.d.ts.map +0 -1
  791. package/dist/theme/theme-script.js +0 -147
  792. package/dist/theme/theme-script.js.map +0 -1
  793. package/dist/theme/types.d.ts +0 -163
  794. package/dist/theme/types.d.ts.map +0 -1
  795. package/dist/theme/types.js +0 -11
  796. package/dist/theme/types.js.map +0 -1
  797. package/dist/theme/use-theme.d.ts +0 -12
  798. package/dist/theme/use-theme.d.ts.map +0 -1
  799. package/dist/theme/use-theme.js +0 -40
  800. package/dist/theme/use-theme.js.map +0 -1
  801. package/dist/types.d.ts +0 -1479
  802. package/dist/types.d.ts.map +0 -1
  803. package/dist/types.js +0 -10
  804. package/dist/types.js.map +0 -1
  805. package/dist/urls.d.ts +0 -441
  806. package/dist/urls.d.ts.map +0 -1
  807. package/dist/urls.gen.d.ts +0 -8
  808. package/dist/urls.gen.d.ts.map +0 -1
  809. package/dist/urls.gen.js +0 -8
  810. package/dist/urls.gen.js.map +0 -1
  811. package/dist/urls.js +0 -443
  812. package/dist/urls.js.map +0 -1
  813. package/dist/use-loader.d.ts +0 -127
  814. package/dist/use-loader.d.ts.map +0 -1
  815. package/dist/use-loader.js +0 -237
  816. package/dist/use-loader.js.map +0 -1
  817. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  818. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  819. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  820. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  821. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  822. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  823. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  824. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  825. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  826. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  827. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  828. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  829. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  830. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  831. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  832. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  833. package/dist/vite/ast-handler-extract.d.ts +0 -49
  834. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  835. package/dist/vite/ast-handler-extract.js +0 -249
  836. package/dist/vite/ast-handler-extract.js.map +0 -1
  837. package/dist/vite/expose-action-id.d.ts +0 -19
  838. package/dist/vite/expose-action-id.d.ts.map +0 -1
  839. package/dist/vite/expose-action-id.js +0 -250
  840. package/dist/vite/expose-action-id.js.map +0 -1
  841. package/dist/vite/expose-id-utils.d.ts +0 -69
  842. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  843. package/dist/vite/expose-id-utils.js +0 -289
  844. package/dist/vite/expose-id-utils.js.map +0 -1
  845. package/dist/vite/expose-internal-ids.d.ts +0 -22
  846. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  847. package/dist/vite/expose-internal-ids.js +0 -886
  848. package/dist/vite/expose-internal-ids.js.map +0 -1
  849. package/dist/vite/index.d.ts +0 -149
  850. package/dist/vite/index.d.ts.map +0 -1
  851. package/dist/vite/index.js.bak +0 -5448
  852. package/dist/vite/index.js.map +0 -1
  853. package/dist/vite/index.named-routes.gen.ts +0 -103
  854. package/dist/vite/package-resolution.d.ts +0 -43
  855. package/dist/vite/package-resolution.d.ts.map +0 -1
  856. package/dist/vite/package-resolution.js +0 -112
  857. package/dist/vite/package-resolution.js.map +0 -1
  858. package/dist/vite/virtual-entries.d.ts +0 -25
  859. package/dist/vite/virtual-entries.d.ts.map +0 -1
  860. package/dist/vite/virtual-entries.js +0 -110
  861. package/dist/vite/virtual-entries.js.map +0 -1
  862. package/src/browser/react/deferred-handle-resolution.ts +0 -75
@@ -3,8 +3,9 @@
3
3
  /**
4
4
  * Component to render collected meta descriptors in the document head.
5
5
  *
6
- * Supports both sync and async meta descriptors. Async descriptors
7
- * (Promise<MetaDescriptorBase>) are resolved using React's use() hook.
6
+ * Deferred (Promise) meta descriptors are resolved before MetaTags renders
7
+ * (server-side on the full render, client-side before apply on navigation), so
8
+ * it only ever receives resolved descriptors and never suspends.
8
9
  *
9
10
  * When theme is enabled in the router config, MetaTags also renders
10
11
  * the theme initialization script to prevent FOUC (flash of unstyled content).
@@ -28,11 +29,9 @@
28
29
  * ```
29
30
  */
30
31
 
31
- import { use } from "react";
32
32
  import { useHandle } from "../browser/react/use-handle.js";
33
33
  import { Meta } from "./meta.js";
34
- import { isThenable } from "./is-thenable.js";
35
- import type { MetaDescriptor, MetaDescriptorBase } from "../router/types.js";
34
+ import type { MetaDescriptorBase } from "../router/types.js";
36
35
  import { useThemeContext } from "../theme/theme-context.js";
37
36
  import { generateThemeScript } from "../theme/theme-script.js";
38
37
  import { useNonce } from "../browser/react/nonce-context.js";
@@ -96,17 +95,7 @@ function hasTagName(
96
95
  );
97
96
  }
98
97
 
99
- /**
100
- * Check if a value is a Promise. Uses the shared thenable predicate (callable
101
- * `then`) so collect (meta.ts) and render never disagree: an object carrying a
102
- * non-callable `then` (e.g. `{ then: 5 }`) is a SYNC descriptor on both sides,
103
- * not a Promise that would crash React's `use()`.
104
- */
105
- function isPromise(value: unknown): value is Promise<unknown> {
106
- return isThenable(value);
107
- }
108
-
109
- function renderMetaDescriptor(
98
+ export function renderMetaDescriptor(
110
99
  descriptor: MetaDescriptorBase,
111
100
  index: number,
112
101
  ): React.ReactNode {
@@ -189,57 +178,6 @@ function renderMetaDescriptor(
189
178
  );
190
179
  }
191
180
 
192
- // Sentinel a rejected async descriptor resolves to: renderMetaDescriptor sees
193
- // no recognized fields and returns nothing renderable (see renderRejected).
194
- const REJECTED_META: unique symbol = Symbol("rango.rejectedMeta");
195
-
196
- // Cache the rejection-swallowing wrapper per source promise so use() gets a
197
- // stable reference across re-renders (a fresh .then() each render would make
198
- // React treat it as a new pending promise and never settle). WeakMap keys on
199
- // the original promise so entries are collected with it.
200
- const safeMetaPromises = new WeakMap<
201
- Promise<MetaDescriptorBase>,
202
- Promise<MetaDescriptorBase | typeof REJECTED_META>
203
- >();
204
-
205
- function toSafeMetaPromise(
206
- promise: Promise<MetaDescriptorBase>,
207
- ): Promise<MetaDescriptorBase | typeof REJECTED_META> {
208
- let safe = safeMetaPromises.get(promise);
209
- if (!safe) {
210
- // Swallow the rejection at the promise boundary, not via an error boundary:
211
- // an error boundary above a suspended use() makes React abandon the whole
212
- // Suspense subtree (and on the server switch it to client rendering). A
213
- // settled-to-sentinel promise degrades the single bad descriptor to nothing
214
- // while every sibling descriptor still renders.
215
- //
216
- // Normalize via Promise.resolve first: a collected async descriptor may be a
217
- // non-native thenable (a React wakeable in SSR/RSC) whose .then() returns
218
- // void rather than a Promise. Calling .then directly would leave `safe`
219
- // undefined and use(undefined) would throw ("unsupported type passed to
220
- // use()"), 500-ing the page. Promise.resolve adopts the thenable into a
221
- // native Promise whose .then always returns one.
222
- safe = Promise.resolve(promise).then(
223
- (value) => value,
224
- () => REJECTED_META,
225
- );
226
- safeMetaPromises.set(promise, safe);
227
- }
228
- return safe;
229
- }
230
-
231
- export function AsyncMetaTag({
232
- promise,
233
- index,
234
- }: {
235
- promise: Promise<MetaDescriptorBase>;
236
- index: number;
237
- }): React.ReactNode {
238
- const resolved = use(toSafeMetaPromise(promise));
239
- if (resolved === REJECTED_META) return null;
240
- return renderMetaDescriptor(resolved, index);
241
- }
242
-
243
181
  /**
244
182
  * Renders all collected meta descriptors from route handlers.
245
183
  *
@@ -249,11 +187,16 @@ export function AsyncMetaTag({
249
187
  * When theme is enabled in router config, also renders the theme initialization
250
188
  * script to prevent FOUC (flash of unstyled content).
251
189
  *
252
- * Async meta descriptors (Promise<MetaDescriptorBase>) are resolved using
253
- * React's use() hook. RSC streaming handles the Promise resolution.
190
+ * Deferred (Promise) meta descriptors are resolved BEFORE MetaTags renders —
191
+ * server-side on the full/SSR render, client-side before apply on navigation
192
+ * (resolve-by-default) — so MetaTags only ever receives resolved descriptors and
193
+ * never suspends.
254
194
  */
255
195
  export function MetaTags(): React.ReactNode {
256
- const descriptors = useHandle(Meta) as MetaDescriptor[];
196
+ // Deferred descriptors are resolved BEFORE collect runs (resolve-by-default),
197
+ // and collectMeta strips unset markers, so the collected output is always
198
+ // resolved base descriptors (never a Promise).
199
+ const descriptors = useHandle(Meta) as MetaDescriptorBase[];
257
200
  const themeConfig = useThemeContext()?.config ?? null;
258
201
  const nonce = useNonce();
259
202
 
@@ -266,24 +209,9 @@ export function MetaTags(): React.ReactNode {
266
209
  dangerouslySetInnerHTML={{ __html: generateThemeScript(themeConfig) }}
267
210
  />
268
211
  )}
269
- {descriptors.map((descriptor, index) => {
270
- // A descriptor is only a Promise on the SSR/hydration path, where it is
271
- // use()d to stream the tag into the document. On client navigation the
272
- // store resolves deferred handle values before applying them (see
273
- // processHandles), so MetaTags only ever receives resolved descriptors
274
- // there and never suspends — which would otherwise revert the committed
275
- // route (MetaTags lives in <head>, above the route's <Suspense>).
276
- if (isPromise(descriptor)) {
277
- return (
278
- <AsyncMetaTag
279
- key={`async-${index}`}
280
- promise={descriptor}
281
- index={index}
282
- />
283
- );
284
- }
285
- return renderMetaDescriptor(descriptor, index);
286
- })}
212
+ {descriptors.map((descriptor, index) =>
213
+ renderMetaDescriptor(descriptor, index),
214
+ )}
287
215
  </>
288
216
  );
289
217
  }
@@ -23,7 +23,6 @@
23
23
 
24
24
  import type { ReactNode } from "react";
25
25
  import { createHandle, type Handle } from "../handle.js";
26
- import { isThenable } from "./is-thenable.js";
27
26
 
28
27
  /**
29
28
  * A single breadcrumb item.
@@ -42,34 +41,33 @@ export interface BreadcrumbItem {
42
41
  * Collect function for Breadcrumbs handle.
43
42
  * Flattens segments in parent-to-child order with deduplication by href: each
44
43
  * href keeps its FIRST position but takes the LAST value (re-pushing a parent
45
- * href refreshes the label in place without reordering the trail).
46
- * Deferred slots (`ctx.use(Breadcrumbs).defer()`)
47
- * arrive as pending Promise entries with no href yet; they are passed through by
48
- * identity and excluded from the href dedup so concurrent deferred crumbs do not
49
- * all collapse under a single `undefined` href.
44
+ * href refreshes the label in place without reordering the trail). Deferred
45
+ * crumbs (a pushed Promise or `ctx.use(Breadcrumbs).defer()`) are resolved
46
+ * BEFORE collect runs (resolve-by-default), so collect only ever sees resolved
47
+ * items. An item without a string `href` is passed through by identity and
48
+ * excluded from the href dedup.
50
49
  */
51
50
  function collectBreadcrumbs(segments: BreadcrumbItem[][]): BreadcrumbItem[] {
52
51
  const all = segments.flat();
53
52
 
54
- const isResolvedItem = (item: unknown): item is BreadcrumbItem =>
53
+ const hasHref = (item: unknown): item is BreadcrumbItem =>
55
54
  item != null &&
56
55
  typeof item === "object" &&
57
- !isThenable(item) &&
58
56
  typeof (item as { href?: unknown }).href === "string";
59
57
 
60
- // Dedup resolved crumbs by href: keep the FIRST position (preserving
61
- // parent->child order) but the LAST value (a child re-pushing a parent's href
62
- // can refresh its label). Deferred items bypass dedup entirely (they have no
63
- // href yet) and are passed through by identity at their original position.
58
+ // Dedup crumbs by href: keep the FIRST position (preserving parent->child
59
+ // order) but the LAST value (a child re-pushing a parent's href can refresh
60
+ // its label). Items without an href pass through by identity at their original
61
+ // position.
64
62
  const valueByHref = new Map<string, BreadcrumbItem>();
65
63
  for (const item of all) {
66
- if (isResolvedItem(item)) valueByHref.set(item.href, item);
64
+ if (hasHref(item)) valueByHref.set(item.href, item);
67
65
  }
68
66
 
69
67
  const result: BreadcrumbItem[] = [];
70
68
  const emitted = new Set<string>();
71
69
  for (const item of all) {
72
- if (!isResolvedItem(item)) {
70
+ if (!hasHref(item)) {
73
71
  result.push(item);
74
72
  continue;
75
73
  }
@@ -0,0 +1,127 @@
1
+ import type { HandleData, HandleStore } from "../server/handle-store.js";
2
+ import { isThenable } from "./is-thenable.js";
3
+
4
+ /**
5
+ * Runtime-neutral resolution of deferred (Promise) handle values. Shared by the
6
+ * server full-render path (resolve before the payload is finalized so SSR sees
7
+ * resolved values) and the client soft-nav path (NavigationProvider resolves
8
+ * each yield before applying it). Pure — imports only `isThenable` — so it is
9
+ * safe in both the RSC server environment AND the browser.
10
+ *
11
+ * Resolution is SHALLOW: only an entry that is ITSELF a thenable is awaited. A
12
+ * value that merely contains a promise (e.g. `{ data: somePromise }`) is a
13
+ * non-thenable, so the `isThenable` check skips it and it passes through verbatim
14
+ * — the nested promise is the consumer's responsibility. Resolution runs each
15
+ * entry through `Promise.all` with a per-entry `try/catch` (NOT `allSettled`), so
16
+ * one rejecting entry is dropped without rejecting the batch or aborting siblings.
17
+ */
18
+
19
+ /**
20
+ * Handle names ($$id) whose snapshot carries a deferred (top-level Promise)
21
+ * value. Used by the client to decide which buckets to hold-and-resolve, and
22
+ * `.size > 0` answers "does this snapshot have any deferred value".
23
+ */
24
+ export function deferredHandleNames(data: HandleData): Set<string> {
25
+ const names = new Set<string>();
26
+ for (const [handleName, segments] of Object.entries(data)) {
27
+ for (const values of Object.values(segments)) {
28
+ if (values.some(isThenable)) {
29
+ names.add(handleName);
30
+ break;
31
+ }
32
+ }
33
+ }
34
+ return names;
35
+ }
36
+
37
+ /**
38
+ * Snapshot with deferred (Promise) values awaited (shallow — only top-level
39
+ * thenables). A rejected deferred is dropped, and a deferred that resolves to
40
+ * `null`/`undefined` is dropped (the `.defer({ else })` skip semantics), so a
41
+ * nullish deferred slot never reaches a collector. Sync (non-thenable) values —
42
+ * including a legitimate sync `null` push — pass through unchanged.
43
+ */
44
+ export async function resolveDeferredHandleValues(
45
+ data: HandleData,
46
+ ): Promise<HandleData> {
47
+ const out: HandleData = {};
48
+ await Promise.all(
49
+ Object.entries(data).flatMap(([handleName, segments]) => {
50
+ out[handleName] = {};
51
+ return Object.entries(segments).map(async ([segmentId, values]) => {
52
+ out[handleName][segmentId] = await resolveValues(values);
53
+ });
54
+ }),
55
+ );
56
+ return out;
57
+ }
58
+
59
+ // Resolve each entry IN ORDER. A non-thenable passes through verbatim (including
60
+ // a legitimate sync `null`/`undefined` push — the "await iff thenable" contract).
61
+ // A thenable is awaited and dropped when it rejects OR resolves to null/undefined
62
+ // (the `.defer({ else })` skip semantics: a forgotten resolver times out to
63
+ // `else ?? undefined`), so a nullish deferred slot never reaches a collector.
64
+ async function resolveValues(values: unknown[]): Promise<unknown[]> {
65
+ const resolved = await Promise.all(
66
+ values.map(async (v) => {
67
+ if (!isThenable(v)) return { keep: true, value: v };
68
+ try {
69
+ const value = await v;
70
+ return { keep: value != null, value };
71
+ } catch {
72
+ return { keep: false, value: undefined };
73
+ }
74
+ }),
75
+ );
76
+ return resolved.filter((r) => r.keep).map((r) => r.value);
77
+ }
78
+
79
+ /**
80
+ * Full-render handle stream: a one-shot async generator that yields the FINAL
81
+ * handle snapshot with every top-level deferred value resolved. Drop-in for
82
+ * `handleStore.stream()` on full / HTML renders (initial load, 404, progressive
83
+ * enhancement), where the consumer drains the generator to completion before
84
+ * rendering anyway — so the single final yield is equivalent to the streamed
85
+ * yields' converged state, and the SSR markup plus the first sync `useHandle`
86
+ * read see resolved values. `getData()` seals the store and awaits the handler
87
+ * barrier; `resolveDeferredHandleValues` then awaits the pushed-value promises.
88
+ * A hung handle promise blocks the full render like any unresolved await (no
89
+ * handle-specific timeout). Partial / action payloads keep streaming via
90
+ * `handleStore.stream()`.
91
+ */
92
+ export async function* resolvedHandleStream(
93
+ handleStore: HandleStore,
94
+ ): AsyncGenerator<HandleData, void, unknown> {
95
+ // Drain stream() (NOT getData()) for the converged snapshot: stream() sets the
96
+ // store's `completed` flag on seal+settle, and that flag is what makes a LATE
97
+ // push throw LateHandlePushError — an async JSX subtree that suspended and later
98
+ // calls ctx.use(Handle)(...) after collection. getData() never sets `completed`,
99
+ // so the late push would silently land. Both wait for the same settle barrier, so
100
+ // the final yielded value is identical; we just keep the late-push guard.
101
+ let snapshot: HandleData = {};
102
+ for await (const data of handleStore.stream()) {
103
+ snapshot = data;
104
+ }
105
+ yield await resolveDeferredHandleValues(snapshot);
106
+ }
107
+
108
+ /**
109
+ * Resolve the deferred (Promise) values in ONE segment's handle bucket
110
+ * (`handleName -> entries[]`). Same shallow + drop-rejections rule as
111
+ * {@link resolveDeferredHandleValues}, but for the segment-keyed shape the
112
+ * prerender/static collection paths use (`getDataForSegment`). Prerender is a
113
+ * build-time cache, so the baked artifact must hold resolved values — a hit
114
+ * replays them into the segment system, where collect/useHandle expect resolved
115
+ * data.
116
+ */
117
+ export async function resolveSegmentHandleValues(
118
+ segHandles: Record<string, unknown[]>,
119
+ ): Promise<Record<string, unknown[]>> {
120
+ const out: Record<string, unknown[]> = {};
121
+ await Promise.all(
122
+ Object.entries(segHandles).map(async ([handleName, values]) => {
123
+ out[handleName] = await resolveValues(values);
124
+ }),
125
+ );
126
+ return out;
127
+ }
@@ -1,14 +1,13 @@
1
1
  /**
2
- * Single thenable predicate shared by the built-in handles that distinguish a
3
- * synchronous descriptor/item from a deferred `Promise` one (Meta collect, the
4
- * MetaTags render side, and Breadcrumbs).
2
+ * Single thenable predicate for the resolve-by-default handle machinery
3
+ * (`handles/deferred-resolution.ts`, its sole owner) it decides which top-level
4
+ * handle entries are deferred (`Promise`) values to await before any consumer
5
+ * sees them, and which pass through verbatim.
5
6
  *
6
7
  * Requires a CALLABLE `then` (`typeof obj.then === "function"`), not merely a
7
- * `"then" in obj` membership check. The two had drifted: a descriptor carrying a
8
- * non-callable `then` (e.g. a serialized shape `{ then: 5 }`) was classified as
9
- * synchronous by collect but as a Promise by render — so render would call
10
- * React's `use()` on a non-thenable and throw. One owner keeps the collect and
11
- * render sides from ever disagreeing.
8
+ * `"then" in obj` membership check, so a non-promise carrying a `then` field
9
+ * (e.g. a serialized shape `{ then: 5 }`) is treated as a plain sync value rather
10
+ * than awaited. A single predicate keeps that classification consistent.
12
11
  */
13
12
  export function isThenable(value: unknown): value is PromiseLike<unknown> {
14
13
  return (
@@ -29,7 +29,6 @@
29
29
  */
30
30
 
31
31
  import { createHandle, type Handle } from "../handle.js";
32
- import { isThenable } from "./is-thenable.js";
33
32
  import type {
34
33
  MetaDescriptor,
35
34
  MetaDescriptorBase,
@@ -37,12 +36,6 @@ import type {
37
36
  UnsetDescriptor,
38
37
  } from "../router/types.js";
39
38
 
40
- function isPromiseDescriptor(
41
- descriptor: MetaDescriptor,
42
- ): descriptor is Promise<MetaDescriptorBase> {
43
- return isThenable(descriptor);
44
- }
45
-
46
39
  function isUnsetDescriptor(
47
40
  descriptor: MetaDescriptor,
48
41
  ): descriptor is UnsetDescriptor {
@@ -166,37 +159,9 @@ function collectMeta(segments: MetaDescriptor[][]): MetaDescriptor[] {
166
159
 
167
160
  for (const descriptors of segments) {
168
161
  for (const descriptor of descriptors) {
169
- // Promise descriptors cannot be inspected synchronously (their content is
170
- // unknown until resolved in <MetaTags> via React's use()), so they bypass
171
- // key-based dedup and title-templating: they are appended verbatim. Warn in
172
- // dev when a title template is active so the author knows an async
173
- // descriptor will NOT participate in the template/dedup.
174
- //
175
- // The warning is deliberately a GENERAL note, not a duplicate-<title>
176
- // prediction: collectMeta cannot tell whether this Promise resolves to a
177
- // title (which would indeed yield a 2nd <title>) or to an ordinary
178
- // descriptor like an async og:image (which would not). Asserting a
179
- // duplicate <title> here is a false positive for the common og:image case,
180
- // so the message states only that async descriptors bypass templating —
181
- // not that a duplicate <title> WILL occur.
182
- if (isPromiseDescriptor(descriptor)) {
183
- if (
184
- titleTemplate !== undefined &&
185
- process.env.NODE_ENV !== "production"
186
- ) {
187
- console.warn(
188
- `[Meta] A Promise meta descriptor was pushed while a title template is active. ` +
189
- `Async descriptors bypass deduplication and title-templating: the template is ` +
190
- `not applied to them. If this Promise resolves to a title, resolve the value ` +
191
- `before pushing (or push a synchronous descriptor) so it participates in the ` +
192
- `template; if it resolves to a non-title descriptor (e.g. og:image), this ` +
193
- `note does not apply.`,
194
- );
195
- }
196
- result.push(descriptor);
197
- continue;
198
- }
199
-
162
+ // Deferred (Promise) descriptors are resolved BEFORE collectMeta runs
163
+ // (resolve-by-default), so every descriptor here is synchronous and
164
+ // participates in key-based dedup + title-templating like any other.
200
165
  if (isUnsetDescriptor(descriptor)) {
201
166
  const keyToRemove = descriptor.unset;
202
167
  if (keyToIndex.has(keyToRemove)) {
@@ -262,12 +227,10 @@ function collectMeta(segments: MetaDescriptor[][]): MetaDescriptor[] {
262
227
  * Use `ctx.use(Meta)` in route handlers to push meta descriptors.
263
228
  * Use `<MetaTags />` component to render them in the document head.
264
229
  *
265
- * Deduplication and title-templating apply only to SYNCHRONOUS descriptors.
266
- * A Promise descriptor (`Promise<MetaDescriptorBase>`) is appended verbatim
267
- * its content is not known until it resolves in `<MetaTags>`, so it cannot be
268
- * keyed for dedup nor receive a parent title template. If you need a child title
269
- * to participate in a layout's `%s` template, push the resolved string title
270
- * synchronously rather than a `Promise<{ title }>`.
230
+ * Deferred (Promise) descriptors are resolved before collectMeta runs
231
+ * (resolve-by-default), so they participate in deduplication and `%s`
232
+ * title-templating identically to synchronous descriptors. A descriptor that
233
+ * resolves to `null`/`undefined` (or rejects) is dropped.
271
234
  */
272
235
  export const Meta: Handle<MetaDescriptor, MetaDescriptor[]> = createHandle<
273
236
  MetaDescriptor,
package/src/index.rsc.ts CHANGED
@@ -122,7 +122,6 @@ export { createHandle, isHandle, type Handle } from "./handle.js";
122
122
  export {
123
123
  DEFAULT_DEFER_TIMEOUT_MS,
124
124
  type DeferOptions,
125
- type DeferredHandleEntry,
126
125
  type HandlePush,
127
126
  type HandlePushFn,
128
127
  } from "./defer.js";
package/src/index.ts CHANGED
@@ -148,7 +148,6 @@ export { createHandle, isHandle, type Handle } from "./handle.js";
148
148
  export {
149
149
  DEFAULT_DEFER_TIMEOUT_MS,
150
150
  type DeferOptions,
151
- type DeferredHandleEntry,
152
151
  type HandlePush,
153
152
  type HandlePushFn,
154
153
  } from "./defer.js";
package/src/prerender.ts CHANGED
@@ -33,6 +33,7 @@ import type {
33
33
  ExtractParams,
34
34
  } from "./types.js";
35
35
  import type { Handle } from "./handle.js";
36
+ import type { HandlePush } from "./defer.js";
36
37
  import type { ContextVar } from "./context-var.js";
37
38
  import type { ReverseFunction } from "./reverse.js";
38
39
  import type { DefaultReverseRouteMap } from "./types/global-namespace.js";
@@ -165,8 +166,14 @@ export interface BuildContext<TParams> {
165
166
  (key: string, value: any): void;
166
167
  };
167
168
 
168
- /** Push handle data (frozen into pre-rendered output at build time). */
169
- use: <T>(handle: Handle<T>) => (data: T) => void;
169
+ /**
170
+ * Push handle data (frozen into pre-rendered output at build time). Returns
171
+ * the full push function, including `.defer()` — a deferred slot resolved by
172
+ * a deep async component during the prerender render is awaited before the
173
+ * artifact is baked (resolve-by-default), so the baked output holds the
174
+ * resolved value.
175
+ */
176
+ use: <T>(handle: Handle<T>) => HandlePush<T>;
170
177
 
171
178
  /** Synthetic URL built from pattern + params (no real request). */
172
179
  url: URL;
@@ -222,8 +229,14 @@ export interface StaticBuildContext {
222
229
  (key: string, value: any): void;
223
230
  };
224
231
 
225
- /** Push handle data (frozen into pre-rendered output at build time). */
226
- use: <T>(handle: Handle<T>) => (data: T) => void;
232
+ /**
233
+ * Push handle data (frozen into pre-rendered output at build time). Returns
234
+ * the full push function, including `.defer()` — a deferred slot resolved by
235
+ * a deep async component during the prerender render is awaited before the
236
+ * artifact is baked (resolve-by-default), so the baked output holds the
237
+ * resolved value.
238
+ */
239
+ use: <T>(handle: Handle<T>) => HandlePush<T>;
227
240
 
228
241
  /** URL generation by route name. */
229
242
  reverse: BuildReverseFunction;
@@ -20,27 +20,39 @@ function cloneMatchResult<TEnv>(
20
20
 
21
21
  export interface FindMatchDeps<TEnv = any> {
22
22
  routesEntries: RouteEntry<TEnv>[];
23
- evaluateLazyEntry: (entry: RouteEntry<TEnv>) => void;
23
+ // Returns a Promise only when it had to resolve an async include provider
24
+ // (`() => import()`); void for eager/precomputed includes, so the per-entry
25
+ // match loop pays no microtask in the common case.
26
+ evaluateLazyEntry: (entry: RouteEntry<TEnv>) => void | Promise<void>;
24
27
  routerId: string;
25
28
  }
26
29
 
27
30
  /**
28
31
  * Create a findMatch function bound to router state.
29
32
  * Includes single-entry cache to avoid redundant matching within the same request.
33
+ *
34
+ * Async because a lazy include may be backed by an async provider
35
+ * (`() => import("./routes")`) that must be resolved before its routes can be
36
+ * matched. The hot path is unaffected: `await` only suspends on the first
37
+ * request to a not-yet-loaded dynamic include; eager routes resolve in the same
38
+ * microtask. Every caller already runs inside an async match pipeline.
30
39
  */
31
40
  export function createFindMatch<TEnv = any>(
32
41
  deps: FindMatchDeps<TEnv>,
33
- ): (pathname: string, ms?: MetricsStore) => RouteMatchResult<TEnv> | null {
42
+ ): (
43
+ pathname: string,
44
+ ms?: MetricsStore,
45
+ ) => Promise<RouteMatchResult<TEnv> | null> {
34
46
  // Single-entry cache for findMatch to avoid redundant matching within the same request.
35
47
  // previewMatch and match both call findMatch with the same pathname — this ensures
36
48
  // the route matching work (which may check thousands of routes) only happens once.
37
49
  let lastFindMatchPathname: string | null = null;
38
50
  let lastFindMatchResult: RouteMatchResult<TEnv> | null = null;
39
51
 
40
- return function findMatch(
52
+ return async function findMatch(
41
53
  pathname: string,
42
54
  ms?: MetricsStore,
43
- ): RouteMatchResult<TEnv> | null {
55
+ ): Promise<RouteMatchResult<TEnv> | null> {
44
56
  if (lastFindMatchPathname === pathname) {
45
57
  return cloneMatchResult(lastFindMatchResult);
46
58
  }
@@ -71,11 +83,33 @@ export function createFindMatch<TEnv = any>(
71
83
  const entryStart = performance.now();
72
84
  let entry: RouteEntry<TEnv> | undefined;
73
85
  let fallbackEntry: RouteEntry<TEnv> | undefined;
86
+ let candidateError: unknown;
87
+ let candidateFailed = false;
74
88
 
75
89
  for (const e of deps.routesEntries) {
76
90
  if (e.staticPrefix !== trieResult.sp) continue;
77
91
  if (!fallbackEntry) fallbackEntry = e;
78
- deps.evaluateLazyEntry(e);
92
+ try {
93
+ const ev = deps.evaluateLazyEntry(e);
94
+ if (ev) await ev;
95
+ } catch (err) {
96
+ // Multiple async includes can share one collapsed static prefix, so
97
+ // this loop may evaluate a candidate that is NOT the route's owner.
98
+ // Remember the failure and keep scanning: if another candidate owns
99
+ // the route, this sibling's failure is correctly isolated (its
100
+ // _lazyInflight was cleared, so a later request retries). But if NO
101
+ // candidate ends up owning it, the failing one WAS the owner — a
102
+ // real, trie-matched route whose module failed to import — and we
103
+ // rethrow below as a 5xx rather than silently 404ing (see finding 3:
104
+ // owner failure must stay loud).
105
+ candidateError = err;
106
+ candidateFailed = true;
107
+ console.error(
108
+ `[@rangojs/router] include at "${e.staticPrefix}" failed to load: ` +
109
+ `${(err as Error)?.message ?? String(err)}`,
110
+ );
111
+ continue;
112
+ }
79
113
  if (
80
114
  e.routes &&
81
115
  trieResult.routeKey in (e.routes as Record<string, unknown>)
@@ -85,6 +119,14 @@ export function createFindMatch<TEnv = any>(
85
119
  }
86
120
  }
87
121
 
122
+ // The trie matched this route, so it EXISTS. If no same-prefix candidate
123
+ // could own it AND one failed to load, the owning module is the one that
124
+ // threw — surface the module failure as a 5xx, not the misleading 404 a
125
+ // fallthrough would give.
126
+ if (!entry && candidateFailed) {
127
+ throw candidateError;
128
+ }
129
+
88
130
  if (!entry) entry = fallbackEntry;
89
131
 
90
132
  if (!entry) {
@@ -95,7 +137,8 @@ export function createFindMatch<TEnv = any>(
95
137
  );
96
138
  if (parent) {
97
139
  const lazyStart = performance.now();
98
- deps.evaluateLazyEntry(parent);
140
+ const ev = deps.evaluateLazyEntry(parent);
141
+ if (ev) await ev;
99
142
  pushMetric?.("match:lazy-eval", lazyStart);
100
143
  }
101
144
  entry = deps.routesEntries.find(
@@ -141,7 +184,28 @@ export function createFindMatch<TEnv = any>(
141
184
  lastFindMatchResult = null;
142
185
  return null;
143
186
  }
144
- deps.evaluateLazyEntry(result.lazyEntry);
187
+ try {
188
+ const ev = deps.evaluateLazyEntry(result.lazyEntry);
189
+ if (ev) await ev;
190
+ } catch (err) {
191
+ // If the trie matched this pathname, the route is REAL and this lazy
192
+ // entry owns (part of) it — a module-load failure is a genuine error, so
193
+ // propagate it as a 5xx. If the trie did NOT match, this is a
194
+ // genuinely-unmatched pathname (a typo, a bot probe): its 404 must not be
195
+ // upgraded to a 500 just because some lazy include — e.g. a failing root
196
+ // `include("/")` — happened to need evaluating while we probed. Isolate
197
+ // and fall through to the 404 (finding 4: the two match phases agree —
198
+ // owner failure is loud, unmatched stays 404).
199
+ if (trieMatched) throw err;
200
+ console.error(
201
+ `[@rangojs/router] include at "${result.lazyEntry.staticPrefix}" ` +
202
+ `failed to load while resolving unmatched path "${pathname}": ` +
203
+ `${(err as Error)?.message ?? String(err)}`,
204
+ );
205
+ lastFindMatchPathname = pathname;
206
+ lastFindMatchResult = null;
207
+ return null;
208
+ }
145
209
  result = findRouteMatch(pathname, deps.routesEntries);
146
210
  }
147
211
  pushMetric?.("match:regex-fallback", regexStart);