@rangojs/router 0.0.0-experimental.19 → 0.0.0-experimental.1c0bdfad

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 (406) hide show
  1. package/AGENTS.md +17 -0
  2. package/README.md +291 -61
  3. package/dist/bin/rango.js +544 -143
  4. package/dist/testing/vitest.js +82 -0
  5. package/dist/vite/index.js +3744 -1329
  6. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  7. package/package.json +67 -13
  8. package/skills/api-client/SKILL.md +211 -0
  9. package/skills/breadcrumbs/SKILL.md +312 -0
  10. package/skills/bundle-analysis/SKILL.md +159 -0
  11. package/skills/cache-guide/SKILL.md +247 -23
  12. package/skills/caching/SKILL.md +322 -19
  13. package/skills/composability/SKILL.md +27 -2
  14. package/skills/css/SKILL.md +76 -0
  15. package/skills/debug-manifest/SKILL.md +4 -2
  16. package/skills/document-cache/SKILL.md +78 -55
  17. package/skills/handler-use/SKILL.md +364 -0
  18. package/skills/hooks/SKILL.md +282 -60
  19. package/skills/host-router/SKILL.md +278 -0
  20. package/skills/i18n/SKILL.md +276 -0
  21. package/skills/intercept/SKILL.md +50 -6
  22. package/skills/layout/SKILL.md +35 -9
  23. package/skills/links/SKILL.md +249 -17
  24. package/skills/loader/SKILL.md +297 -31
  25. package/skills/middleware/SKILL.md +52 -13
  26. package/skills/migrate-nextjs/SKILL.md +584 -0
  27. package/skills/migrate-react-router/SKILL.md +771 -0
  28. package/skills/mime-routes/SKILL.md +28 -1
  29. package/skills/observability/SKILL.md +172 -0
  30. package/skills/parallel/SKILL.md +203 -7
  31. package/skills/prerender/SKILL.md +155 -111
  32. package/skills/rango/SKILL.md +251 -23
  33. package/skills/react-compiler/SKILL.md +168 -0
  34. package/skills/response-routes/SKILL.md +123 -48
  35. package/skills/route/SKILL.md +104 -9
  36. package/skills/router-setup/SKILL.md +124 -11
  37. package/skills/scripts/SKILL.md +179 -0
  38. package/skills/server-actions/SKILL.md +775 -0
  39. package/skills/streams-and-websockets/SKILL.md +283 -0
  40. package/skills/tailwind/SKILL.md +27 -3
  41. package/skills/testing/SKILL.md +125 -222
  42. package/skills/testing/bindings.md +103 -0
  43. package/skills/testing/cache-prerender.md +127 -0
  44. package/skills/testing/client-components.md +124 -0
  45. package/skills/testing/e2e-parity.md +125 -0
  46. package/skills/testing/flight.md +91 -0
  47. package/skills/testing/handles.md +129 -0
  48. package/skills/testing/loader.md +128 -0
  49. package/skills/testing/middleware.md +99 -0
  50. package/skills/testing/render-handler.md +121 -0
  51. package/skills/testing/response-routes.md +95 -0
  52. package/skills/testing/reverse-and-types.md +84 -0
  53. package/skills/testing/server-actions.md +107 -0
  54. package/skills/testing/server-tree.md +128 -0
  55. package/skills/testing/setup.md +123 -0
  56. package/skills/typesafety/SKILL.md +357 -52
  57. package/skills/use-cache/SKILL.md +46 -14
  58. package/skills/view-transitions/SKILL.md +294 -0
  59. package/src/__augment-tests__/augment.ts +81 -0
  60. package/src/__augment-tests__/augmented.check.ts +116 -0
  61. package/src/__internal.ts +67 -40
  62. package/src/bin/rango.ts +18 -0
  63. package/src/browser/action-coordinator.ts +53 -36
  64. package/src/browser/action-fence.ts +47 -0
  65. package/src/browser/app-shell.ts +39 -0
  66. package/src/browser/app-version.ts +14 -0
  67. package/src/browser/connection-warmup.ts +134 -0
  68. package/src/browser/cookie-name.ts +140 -0
  69. package/src/browser/event-controller.ts +197 -150
  70. package/src/browser/history-state.ts +21 -0
  71. package/src/browser/index.ts +3 -3
  72. package/src/browser/invalidate-client-cache.ts +52 -0
  73. package/src/browser/link-interceptor.ts +4 -0
  74. package/src/browser/navigation-bridge.ts +200 -30
  75. package/src/browser/navigation-client.ts +217 -58
  76. package/src/browser/navigation-store-handle.ts +38 -0
  77. package/src/browser/navigation-store.ts +76 -67
  78. package/src/browser/navigation-transaction.ts +18 -66
  79. package/src/browser/network-error-handler.ts +34 -7
  80. package/src/browser/partial-update.ts +187 -112
  81. package/src/browser/prefetch/cache.ts +312 -30
  82. package/src/browser/prefetch/fetch.ts +344 -47
  83. package/src/browser/prefetch/policy.ts +6 -0
  84. package/src/browser/prefetch/queue.ts +126 -20
  85. package/src/browser/prefetch/resource-ready.ts +77 -0
  86. package/src/browser/rango-state.ts +158 -76
  87. package/src/browser/react/Link.tsx +125 -18
  88. package/src/browser/react/NavigationProvider.tsx +135 -120
  89. package/src/browser/react/ScrollRestoration.tsx +10 -6
  90. package/src/browser/react/context.ts +7 -2
  91. package/src/browser/react/filter-segment-order.ts +66 -7
  92. package/src/browser/react/index.ts +0 -48
  93. package/src/browser/react/location-state-shared.ts +178 -8
  94. package/src/browser/react/location-state.ts +39 -14
  95. package/src/browser/react/use-action.ts +6 -15
  96. package/src/browser/react/use-handle.ts +23 -69
  97. package/src/browser/react/use-href.tsx +8 -1
  98. package/src/browser/react/use-link-status.ts +33 -8
  99. package/src/browser/react/use-navigation.ts +32 -7
  100. package/src/browser/react/use-params.ts +20 -10
  101. package/src/browser/react/use-reverse.ts +106 -0
  102. package/src/browser/react/use-router.ts +46 -11
  103. package/src/browser/react/use-search-params.ts +0 -5
  104. package/src/browser/react/use-segments.ts +11 -21
  105. package/src/browser/response-adapter.ts +80 -5
  106. package/src/browser/rsc-router.tsx +226 -75
  107. package/src/browser/scroll-restoration.ts +54 -42
  108. package/src/browser/segment-reconciler.ts +36 -9
  109. package/src/browser/segment-structure-assert.ts +2 -2
  110. package/src/browser/server-action-bridge.ts +619 -442
  111. package/src/browser/types.ts +115 -11
  112. package/src/browser/validate-redirect-origin.ts +43 -16
  113. package/src/build/collect-fallback-refs.ts +107 -0
  114. package/src/build/generate-manifest.ts +65 -40
  115. package/src/build/generate-route-types.ts +7 -1
  116. package/src/build/index.ts +8 -2
  117. package/src/build/prefix-tree-utils.ts +123 -0
  118. package/src/build/route-trie.ts +182 -37
  119. package/src/build/route-types/ast-route-extraction.ts +15 -8
  120. package/src/build/route-types/codegen.ts +16 -5
  121. package/src/build/route-types/include-resolution.ts +125 -24
  122. package/src/build/route-types/param-extraction.ts +6 -3
  123. package/src/build/route-types/per-module-writer.ts +22 -6
  124. package/src/build/route-types/router-processing.ts +392 -106
  125. package/src/build/route-types/scan-filter.ts +9 -2
  126. package/src/build/route-types/source-scan.ts +216 -0
  127. package/src/build/runtime-discovery.ts +9 -20
  128. package/src/cache/cache-error.ts +104 -0
  129. package/src/cache/cache-key-utils.ts +29 -13
  130. package/src/cache/cache-policy.ts +108 -34
  131. package/src/cache/cache-runtime.ts +214 -48
  132. package/src/cache/cache-scope.ts +236 -89
  133. package/src/cache/cache-tag.ts +103 -0
  134. package/src/cache/cf/cf-base64.ts +33 -0
  135. package/src/cache/cf/cf-cache-constants.ts +127 -0
  136. package/src/cache/cf/cf-cache-store.ts +2224 -171
  137. package/src/cache/cf/cf-cache-types.ts +349 -0
  138. package/src/cache/cf/cf-kv-utils.ts +46 -0
  139. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  140. package/src/cache/cf/index.ts +11 -17
  141. package/src/cache/document-cache.ts +89 -27
  142. package/src/cache/handle-snapshot.ts +70 -0
  143. package/src/cache/index.ts +11 -20
  144. package/src/cache/memory-segment-store.ts +136 -37
  145. package/src/cache/profile-registry.ts +31 -31
  146. package/src/cache/read-through-swr.ts +41 -11
  147. package/src/cache/segment-codec.ts +9 -17
  148. package/src/cache/tag-invalidation.ts +230 -0
  149. package/src/cache/taint.ts +55 -0
  150. package/src/cache/types.ts +37 -100
  151. package/src/client.rsc.tsx +45 -21
  152. package/src/client.tsx +120 -336
  153. package/src/cloudflare/index.ts +11 -0
  154. package/src/cloudflare/tracing.ts +109 -0
  155. package/src/component-utils.ts +19 -0
  156. package/src/components/DefaultDocument.tsx +8 -2
  157. package/src/context-var.ts +84 -2
  158. package/src/debug.ts +2 -2
  159. package/src/decode-loader-results.ts +52 -0
  160. package/src/defer.ts +196 -0
  161. package/src/deps/ssr.ts +0 -1
  162. package/src/encode-kv.ts +49 -0
  163. package/src/errors.ts +30 -4
  164. package/src/escape-script.ts +52 -0
  165. package/src/handle.ts +70 -22
  166. package/src/handles/MetaTags.tsx +56 -19
  167. package/src/handles/Scripts.tsx +183 -0
  168. package/src/handles/breadcrumbs.ts +95 -0
  169. package/src/handles/is-thenable.ts +19 -0
  170. package/src/handles/meta.ts +51 -40
  171. package/src/handles/script.ts +244 -0
  172. package/src/host/cookie-handler.ts +9 -60
  173. package/src/host/errors.ts +0 -24
  174. package/src/host/index.ts +8 -5
  175. package/src/host/pattern-matcher.ts +23 -52
  176. package/src/host/router.ts +107 -99
  177. package/src/host/testing.ts +40 -27
  178. package/src/host/types.ts +37 -4
  179. package/src/host/utils.ts +1 -1
  180. package/src/href-client.ts +137 -22
  181. package/src/index.rsc.ts +79 -29
  182. package/src/index.ts +149 -65
  183. package/src/internal-debug.ts +11 -10
  184. package/src/loader-store.ts +500 -0
  185. package/src/loader.rsc.ts +20 -13
  186. package/src/loader.ts +12 -11
  187. package/src/missing-id-error.ts +68 -0
  188. package/src/outlet-context.ts +1 -1
  189. package/src/outlet-provider.tsx +1 -5
  190. package/src/prerender/param-hash.ts +16 -16
  191. package/src/prerender/store.ts +63 -26
  192. package/src/prerender.ts +198 -82
  193. package/src/redirect-origin.ts +100 -0
  194. package/src/regex-escape.ts +8 -0
  195. package/src/render-error-thrower.tsx +20 -0
  196. package/src/response-utils.ts +62 -0
  197. package/src/reverse.ts +65 -15
  198. package/src/root-error-boundary.tsx +1 -19
  199. package/src/route-content-wrapper.tsx +7 -72
  200. package/src/route-definition/dsl-helpers.ts +469 -276
  201. package/src/route-definition/helper-factories.ts +29 -139
  202. package/src/route-definition/helpers-types.ts +113 -37
  203. package/src/route-definition/index.ts +3 -3
  204. package/src/route-definition/redirect.ts +53 -12
  205. package/src/route-definition/resolve-handler-use.ts +161 -0
  206. package/src/route-definition/use-item-types.ts +32 -0
  207. package/src/route-map-builder.ts +7 -17
  208. package/src/route-types.ts +37 -41
  209. package/src/router/basename.ts +14 -0
  210. package/src/router/content-negotiation.ts +164 -17
  211. package/src/router/error-handling.ts +45 -18
  212. package/src/router/find-match.ts +45 -22
  213. package/src/router/handler-context.ts +110 -39
  214. package/src/router/instrument.ts +350 -0
  215. package/src/router/intercept-resolution.ts +50 -24
  216. package/src/router/lazy-includes.ts +19 -53
  217. package/src/router/loader-resolution.ts +274 -56
  218. package/src/router/logging.ts +5 -8
  219. package/src/router/manifest.ts +49 -45
  220. package/src/router/match-api.ts +121 -205
  221. package/src/router/match-context.ts +0 -22
  222. package/src/router/match-handlers.ts +58 -58
  223. package/src/router/match-middleware/background-revalidation.ts +33 -6
  224. package/src/router/match-middleware/cache-lookup.ts +214 -263
  225. package/src/router/match-middleware/cache-store.ts +73 -33
  226. package/src/router/match-middleware/intercept-resolution.ts +8 -28
  227. package/src/router/match-middleware/segment-resolution.ts +52 -18
  228. package/src/router/match-pipelines.ts +1 -42
  229. package/src/router/match-result.ts +104 -49
  230. package/src/router/metrics.ts +217 -26
  231. package/src/router/middleware-types.ts +24 -110
  232. package/src/router/middleware.ts +384 -197
  233. package/src/router/navigation-snapshot.ts +131 -0
  234. package/src/router/params-util.ts +23 -0
  235. package/src/router/pattern-matching.ts +148 -91
  236. package/src/router/prefetch-cache-ttl.ts +51 -0
  237. package/src/router/prerender-match.ts +199 -56
  238. package/src/router/preview-match.ts +32 -102
  239. package/src/router/request-classification.ts +276 -0
  240. package/src/router/revalidation.ts +144 -74
  241. package/src/router/route-snapshot.ts +244 -0
  242. package/src/router/router-context.ts +8 -28
  243. package/src/router/router-interfaces.ts +129 -36
  244. package/src/router/router-options.ts +185 -23
  245. package/src/router/router-registry.ts +2 -5
  246. package/src/router/segment-resolution/fresh.ts +281 -76
  247. package/src/router/segment-resolution/helpers.ts +116 -31
  248. package/src/router/segment-resolution/loader-cache.ts +63 -37
  249. package/src/router/segment-resolution/revalidation.ts +493 -391
  250. package/src/router/segment-resolution/static-store.ts +19 -5
  251. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  252. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  253. package/src/router/segment-resolution.ts +5 -1
  254. package/src/router/segment-wrappers.ts +8 -5
  255. package/src/router/state-cookie-name.ts +33 -0
  256. package/src/router/substitute-pattern-params.ts +56 -0
  257. package/src/router/telemetry-otel.ts +161 -199
  258. package/src/router/telemetry.ts +96 -19
  259. package/src/router/timeout.ts +0 -20
  260. package/src/router/tracing.ts +206 -0
  261. package/src/router/trie-matching.ts +180 -58
  262. package/src/router/types.ts +10 -63
  263. package/src/router/url-params.ts +44 -0
  264. package/src/router.ts +182 -54
  265. package/src/rsc/handler-context.ts +3 -2
  266. package/src/rsc/handler.ts +702 -460
  267. package/src/rsc/helpers.ts +168 -46
  268. package/src/rsc/index.ts +2 -25
  269. package/src/rsc/json-route-result.ts +38 -0
  270. package/src/rsc/loader-fetch.ts +127 -31
  271. package/src/rsc/manifest-init.ts +33 -42
  272. package/src/rsc/origin-guard.ts +39 -25
  273. package/src/rsc/progressive-enhancement.ts +98 -19
  274. package/src/rsc/redirect-guard.ts +99 -0
  275. package/src/rsc/response-cache-serve.ts +238 -0
  276. package/src/rsc/response-error.ts +79 -12
  277. package/src/rsc/response-route-handler.ts +99 -189
  278. package/src/rsc/rsc-rendering.ts +126 -106
  279. package/src/rsc/runtime-warnings.ts +23 -10
  280. package/src/rsc/server-action.ts +269 -114
  281. package/src/rsc/ssr-setup.ts +144 -0
  282. package/src/rsc/types.ts +34 -6
  283. package/src/runtime-env.ts +18 -0
  284. package/src/search-params.ts +49 -41
  285. package/src/segment-content-promise.ts +67 -0
  286. package/src/segment-loader-promise.ts +149 -0
  287. package/src/segment-system.tsx +281 -129
  288. package/src/serialize.ts +243 -0
  289. package/src/server/context.ts +317 -63
  290. package/src/server/cookie-parse.ts +32 -0
  291. package/src/server/cookie-store.ts +80 -5
  292. package/src/server/handle-store.ts +40 -38
  293. package/src/server/loader-registry.ts +26 -46
  294. package/src/server/request-context.ts +425 -177
  295. package/src/server.ts +6 -0
  296. package/src/ssr/index.tsx +25 -16
  297. package/src/static-handler.ts +27 -18
  298. package/src/testing/cache-status.ts +162 -0
  299. package/src/testing/collect-handle.ts +40 -0
  300. package/src/testing/dispatch.ts +701 -0
  301. package/src/testing/dom.entry.ts +22 -0
  302. package/src/testing/e2e/fixture.ts +188 -0
  303. package/src/testing/e2e/index.ts +128 -0
  304. package/src/testing/e2e/matchers.ts +35 -0
  305. package/src/testing/e2e/page-helpers.ts +272 -0
  306. package/src/testing/e2e/parity.ts +387 -0
  307. package/src/testing/e2e/server.ts +195 -0
  308. package/src/testing/flight-matchers.ts +97 -0
  309. package/src/testing/flight-normalize.ts +11 -0
  310. package/src/testing/flight-runtime.d.ts +57 -0
  311. package/src/testing/flight-tree.ts +682 -0
  312. package/src/testing/flight.entry.ts +52 -0
  313. package/src/testing/flight.ts +257 -0
  314. package/src/testing/generated-routes.ts +183 -0
  315. package/src/testing/index.ts +99 -0
  316. package/src/testing/internal/context.ts +371 -0
  317. package/src/testing/internal/flight-client-globals.ts +30 -0
  318. package/src/testing/internal/seed-vars.ts +54 -0
  319. package/src/testing/render-handler.ts +343 -0
  320. package/src/testing/render-route.tsx +581 -0
  321. package/src/testing/run-loader.ts +385 -0
  322. package/src/testing/run-middleware.ts +205 -0
  323. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  324. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  325. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  326. package/src/testing/vitest-stubs/version.ts +5 -0
  327. package/src/testing/vitest.ts +305 -0
  328. package/src/theme/ThemeProvider.tsx +20 -58
  329. package/src/theme/ThemeScript.tsx +7 -9
  330. package/src/theme/constants.ts +52 -13
  331. package/src/theme/index.ts +3 -19
  332. package/src/theme/theme-context.ts +1 -5
  333. package/src/theme/theme-script.ts +22 -21
  334. package/src/theme/use-theme.ts +0 -3
  335. package/src/types/boundaries.ts +0 -35
  336. package/src/types/cache-types.ts +17 -8
  337. package/src/types/error-types.ts +30 -90
  338. package/src/types/global-namespace.ts +54 -41
  339. package/src/types/handler-context.ts +236 -88
  340. package/src/types/index.ts +1 -10
  341. package/src/types/loader-types.ts +44 -15
  342. package/src/types/request-scope.ts +112 -0
  343. package/src/types/route-config.ts +10 -45
  344. package/src/types/route-entry.ts +19 -7
  345. package/src/types/segments.ts +37 -19
  346. package/src/urls/include-helper.ts +33 -70
  347. package/src/urls/index.ts +1 -11
  348. package/src/urls/path-helper-types.ts +58 -11
  349. package/src/urls/path-helper.ts +57 -111
  350. package/src/urls/pattern-types.ts +48 -19
  351. package/src/urls/response-types.ts +25 -22
  352. package/src/urls/type-extraction.ts +58 -139
  353. package/src/urls/urls-function.ts +1 -18
  354. package/src/use-loader.tsx +346 -89
  355. package/src/vite/debug.ts +185 -0
  356. package/src/vite/discovery/bundle-postprocess.ts +64 -91
  357. package/src/vite/discovery/discover-routers.ts +147 -88
  358. package/src/vite/discovery/discovery-errors.ts +194 -0
  359. package/src/vite/discovery/gate-state.ts +171 -0
  360. package/src/vite/discovery/prerender-collection.ts +247 -145
  361. package/src/vite/discovery/route-types-writer.ts +40 -84
  362. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  363. package/src/vite/discovery/state.ts +61 -13
  364. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  365. package/src/vite/index.ts +10 -3
  366. package/src/vite/inject-client-debug.ts +36 -0
  367. package/src/vite/plugin-types.ts +155 -65
  368. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  369. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  370. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  371. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  372. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  373. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  374. package/src/vite/plugins/expose-action-id.ts +49 -98
  375. package/src/vite/plugins/expose-id-utils.ts +96 -51
  376. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  377. package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
  378. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  379. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  380. package/src/vite/plugins/expose-internal-ids.ts +553 -317
  381. package/src/vite/plugins/performance-tracks.ts +89 -0
  382. package/src/vite/plugins/refresh-cmd.ts +127 -0
  383. package/src/vite/plugins/use-cache-transform.ts +73 -83
  384. package/src/vite/plugins/version-injector.ts +21 -25
  385. package/src/vite/plugins/version-plugin.ts +46 -37
  386. package/src/vite/plugins/virtual-entries.ts +13 -18
  387. package/src/vite/rango.ts +241 -287
  388. package/src/vite/router-discovery.ts +956 -149
  389. package/src/vite/utils/ast-handler-extract.ts +26 -35
  390. package/src/vite/utils/banner.ts +4 -4
  391. package/src/vite/utils/bundle-analysis.ts +10 -15
  392. package/src/vite/utils/client-chunks.ts +184 -0
  393. package/src/vite/utils/directive-prologue.ts +40 -0
  394. package/src/vite/utils/forward-user-plugins.ts +171 -0
  395. package/src/vite/utils/manifest-utils.ts +4 -59
  396. package/src/vite/utils/package-resolution.ts +20 -52
  397. package/src/vite/utils/prerender-utils.ts +141 -34
  398. package/src/vite/utils/shared-utils.ts +92 -42
  399. package/CLAUDE.md +0 -5
  400. package/src/browser/action-response-classifier.ts +0 -99
  401. package/src/browser/react/use-client-cache.ts +0 -58
  402. package/src/browser/shallow.ts +0 -40
  403. package/src/handles/index.ts +0 -6
  404. package/src/network-error-thrower.tsx +0 -23
  405. package/src/route-definition/route-function.ts +0 -119
  406. package/src/router/middleware-cookies.ts +0 -55
@@ -12,10 +12,6 @@
12
12
  import type { ResolvedSegment } from "../types.js";
13
13
  import type { RequestContext } from "../server/request-context.js";
14
14
 
15
- // ============================================================================
16
- // Segment Cache Store (low-level storage interface)
17
- // ============================================================================
18
-
19
15
  /**
20
16
  * Result from cache get() including data and revalidation status
21
17
  */
@@ -116,12 +112,6 @@ export interface SegmentCacheStore<TEnv = unknown> {
116
112
  */
117
113
  clear?(): Promise<void>;
118
114
 
119
- // ============================================================================
120
- // Document Cache Methods (optional)
121
- // ============================================================================
122
- // These methods are for caching full HTTP responses (document-level caching).
123
- // Stores that support response caching should implement these methods.
124
-
125
115
  /**
126
116
  * Get a cached Response by key.
127
117
  * Returns the response and whether it should be revalidated (SWR).
@@ -136,20 +126,16 @@ export interface SegmentCacheStore<TEnv = unknown> {
136
126
  * @param response - Response to cache (will be cloned)
137
127
  * @param ttl - Time-to-live in seconds
138
128
  * @param swr - Optional stale-while-revalidate window in seconds
129
+ * @param tags - Optional cache tags for invalidation
139
130
  */
140
131
  putResponse?(
141
132
  key: string,
142
133
  response: Response,
143
134
  ttl: number,
144
135
  swr?: number,
136
+ tags?: string[],
145
137
  ): Promise<void>;
146
138
 
147
- // ============================================================================
148
- // Function Cache Methods (optional, for "use cache" directive)
149
- // ============================================================================
150
- // These methods cache individual function/component return values.
151
- // Stores that support "use cache" should implement these methods.
152
-
153
139
  /**
154
140
  * Get a cached function result by key.
155
141
  * Returns the serialized value, optional handle data, and staleness flag.
@@ -167,6 +153,16 @@ export interface SegmentCacheStore<TEnv = unknown> {
167
153
  value: string,
168
154
  options?: CacheItemOptions,
169
155
  ): Promise<void>;
156
+
157
+ /**
158
+ * Invalidate every cache entry (segment, response, item) tagged with any of
159
+ * `tags`. Store-level primitive that the public updateTag()/revalidateTag()
160
+ * APIs delegate to. Receives ALL of one invalidation call's tags at once so
161
+ * stores can batch their work (e.g. a single CDN purge request rather than
162
+ * one per tag). Stores that do not support tags simply omit this method.
163
+ * @param tags - The cache tags to invalidate
164
+ */
165
+ invalidateTags?(tags: string[]): Promise<void>;
170
166
  }
171
167
 
172
168
  /**
@@ -175,18 +171,27 @@ export interface SegmentCacheStore<TEnv = unknown> {
175
171
  export interface CacheItemResult {
176
172
  /** RSC-serialized return value */
177
173
  value: string;
178
- /** Handle data captured during execution (breadcrumbs, metadata, etc.) */
179
- handles?: Record<string, SegmentHandleData>;
174
+ /** RSC-encoded handle data captured during execution (breadcrumbs, metadata,
175
+ * etc.). Encoded via the Flight codec so Promise/ReactNode handle values
176
+ * survive JSON-serializing stores — see handle-snapshot.ts encodeHandles. */
177
+ handles?: string;
180
178
  /** Whether the entry is stale and should be revalidated */
181
179
  shouldRevalidate: boolean;
180
+ /**
181
+ * The entry's cache tags (including runtime cacheTag() tags), surfaced on read
182
+ * so a "use cache" HIT can still contribute its tags to the request-scoped tag
183
+ * set used by document-level caching. On a hit the cached function is not
184
+ * re-run, so its runtime tags are only available here, not from re-execution.
185
+ */
186
+ tags?: string[];
182
187
  }
183
188
 
184
189
  /**
185
190
  * Options for setItem() for function-level caching ("use cache").
186
191
  */
187
192
  export interface CacheItemOptions {
188
- /** Handle data to store alongside the value */
189
- handles?: Record<string, SegmentHandleData>;
193
+ /** RSC-encoded handle data to store alongside the value (see encodeHandles). */
194
+ handles?: string;
190
195
  /** Time-to-live in seconds */
191
196
  ttl?: number;
192
197
  /** Stale-while-revalidate window in seconds */
@@ -227,16 +232,18 @@ export interface SerializedSegmentData {
227
232
  export interface CachedEntryData {
228
233
  /** Serialized segments for this entry */
229
234
  segments: SerializedSegmentData[];
230
- /** Handle data keyed by segment ID */
231
- handles: Record<string, SegmentHandleData>;
235
+ /** RSC-encoded handle data keyed by segment ID. Encoded via the Flight codec
236
+ * (see handle-snapshot.ts encodeHandles) so Promise/ReactNode handle values
237
+ * round-trip through JSON-serializing stores instead of being flattened. */
238
+ handles: string;
232
239
  /** Expiration timestamp (ms since epoch) */
233
240
  expiresAt: number;
241
+ /** Cache tags for invalidation */
242
+ tags?: string[];
243
+ /** Timestamp (ms since epoch) when tags were attached, for distributed invalidation */
244
+ taggedAt?: number;
234
245
  }
235
246
 
236
- // ============================================================================
237
- // Cache Configuration
238
- // ============================================================================
239
-
240
247
  /**
241
248
  * Default cache options applied to all cache() boundaries.
242
249
  * Individual cache() calls can override any of these values.
@@ -252,91 +259,21 @@ export interface CacheDefaults {
252
259
  /**
253
260
  * Default time-to-live in seconds.
254
261
  * After TTL expires, cached entry is considered stale.
262
+ * Must be a finite, non-negative number; an invalid value (NaN/Infinity/
263
+ * negative) falls back to the default at read time.
255
264
  */
256
265
  ttl?: number;
257
266
  /**
258
267
  * Default stale-while-revalidate window in seconds.
259
268
  * During SWR window, stale content is served while revalidating in background.
269
+ * Must be a finite, non-negative number; an invalid value (NaN/Infinity/
270
+ * negative) falls back to the default at read time.
260
271
  */
261
272
  swr?: number;
262
273
  }
263
274
 
264
- /**
265
- * Cache configuration for RSC handler
266
- */
267
- export interface CacheConfig {
268
- /** Cache store implementation (includes defaults) */
269
- store: SegmentCacheStore;
270
- /** Enable/disable caching (default: true) */
271
- enabled?: boolean;
272
- }
273
-
274
- /**
275
- * Cache configuration - can be static or a function receiving env
276
- */
277
- export type CacheConfigOrFactory<TEnv> =
278
- | CacheConfig
279
- | ((env: TEnv) => CacheConfig);
280
-
281
- // ============================================================================
282
- // Segment Cache Provider (request-level interface)
283
- // ============================================================================
284
-
285
275
  /**
286
276
  * Handle data for a single segment
287
277
  * Structure: { handleName: [values...] }
288
278
  */
289
279
  export type SegmentHandleData = Record<string, unknown[]>;
290
-
291
- /**
292
- * Result from cache get() including segments and their handle data
293
- * Each entry can produce multiple segments (main + parallels)
294
- */
295
- export interface CachedEntryResult {
296
- /** All segments for this entry (main segment + parallels) */
297
- segments: ResolvedSegment[];
298
- /** Handle data keyed by segment ID */
299
- handles: Record<string, SegmentHandleData>;
300
- }
301
-
302
- /**
303
- * Segment cache provider interface
304
- *
305
- * Used by router to check/store segment cache during matching.
306
- * Accessed via request context - if not present, caching is disabled.
307
- *
308
- * @internal Not currently implemented - CacheScope is used directly.
309
- * Reserved for future extensibility.
310
- */
311
- export interface SegmentCacheProvider {
312
- /** Whether caching is enabled for this request */
313
- readonly enabled: boolean;
314
-
315
- /**
316
- * Get cached segments and restore handles/loaders.
317
- *
318
- * Combines cache get with handle replay and loader data restoration.
319
- * Returns tuple of [segments, segmentIds] if cache hit, null if miss or disabled.
320
- *
321
- * @param cacheKey - Cache key to look up
322
- * @param params - Route params for cache key generation
323
- * @param loaderPromises - Map to restore loader data into
324
- * @returns Tuple of [segments, segmentIds] or null if miss
325
- */
326
- restore(
327
- cacheKey: string,
328
- params: Record<string, string>,
329
- loaderPromises: Map<string, Promise<any>>,
330
- ): Promise<[ResolvedSegment[], string[]] | null>;
331
-
332
- /**
333
- * Cache entry with automatic handle collection (non-blocking).
334
- *
335
- * Schedules caching via waitUntil - handles are collected after they settle.
336
- * Validates segments have actual components before caching.
337
- *
338
- * @param cacheKey - The cache key to store under
339
- * @param segments - All resolved segments for this entry
340
- */
341
- cacheEntry(cacheKey: string, segments: ResolvedSegment[]): void;
342
- }
@@ -14,59 +14,81 @@
14
14
  export {
15
15
  Outlet,
16
16
  ParallelOutlet,
17
- OutletProvider,
18
17
  useOutlet,
19
18
  useLoader,
20
- useLoaderData,
21
19
  ErrorBoundary,
22
20
  type ErrorBoundaryProps,
23
21
  } from "./client.js";
24
22
 
25
- // Re-export the server's createLoader for RSC context
26
- // This version includes the actual loader function
23
+ export {
24
+ useFetchLoader,
25
+ useRefreshLoaders,
26
+ type LoadFunction,
27
+ type UseLoaderResult,
28
+ type UseFetchLoaderResult,
29
+ type UseLoaderOptions,
30
+ } from "./use-loader.js";
31
+
27
32
  export { createLoader } from "./route-definition.js";
28
33
 
29
- // Re-export Link component (can be used in server components)
34
+ // "use client" hooks the default ./client entry exports. They are client
35
+ // references in the RSC graph, identical in kind to useHref/useReverse/
36
+ // useHandle already forwarded below; forward them so the RSC client entry's
37
+ // hook surface matches the default entry. useNavigation/useAction stay omitted
38
+ // (they drive client-only navigation/action state — see note below).
39
+ export { useRouter } from "./browser/react/use-router.js";
40
+ export { usePathname } from "./browser/react/use-pathname.js";
41
+ export { useSearchParams } from "./browser/react/use-search-params.js";
42
+ export { useParams } from "./browser/react/use-params.js";
43
+ // CSP nonce for userland head-script components (analytics/GTM/inline init);
44
+ // forwarded so the RSC client entry's hook surface matches the default entry.
45
+ export { useNonce } from "./browser/react/nonce-context.js";
46
+ export { useMount } from "./browser/react/use-mount.js";
47
+ export {
48
+ useSegments,
49
+ type SegmentsState,
50
+ } from "./browser/react/use-segments.js";
51
+ export {
52
+ useLinkStatus,
53
+ type LinkStatus,
54
+ } from "./browser/react/use-link-status.js";
55
+ export { useScrollRestoration } from "./browser/react/ScrollRestoration.js";
56
+
30
57
  export {
31
58
  Link,
32
59
  type LinkProps,
33
60
  type PrefetchStrategy,
34
61
  } from "./browser/react/Link.js";
35
62
 
36
- // Re-export ScrollRestoration (can be used in server components)
37
63
  export {
38
64
  ScrollRestoration,
39
65
  type ScrollRestorationProps,
40
66
  } from "./browser/react/ScrollRestoration.js";
41
67
 
42
- // Re-export NavigationProvider (needed for setup)
43
68
  export {
44
69
  NavigationProvider,
45
70
  type NavigationProviderProps,
46
71
  } from "./browser/react/NavigationProvider.js";
47
72
 
48
- // Re-export href function (can be used in server components)
49
73
  export { href } from "./href-client.js";
50
74
 
51
- // Mount context re-exports (useMount is client-only, but MountContext can be referenced)
52
75
  export { MountContext } from "./browser/react/mount-context.js";
53
76
 
54
- // Note: useNavigation, useAction, useClientCache are NOT re-exported here
55
- // because they use client-side state and should only be used in client components
77
+ // useNavigation and useAction are NOT re-exported here because they use client-side state
56
78
 
57
- // Handle API - for accumulating data across route segments
58
- // Works in both RSC and client contexts
59
79
  export { createHandle, isHandle, type Handle } from "./handle.js";
60
80
 
61
- // Built-in handles
62
- // Meta handle works in RSC context
63
81
  export { Meta } from "./handles/meta.js";
64
- // MetaTags is a "use client" component that can be imported from RSC
65
82
  export { MetaTags } from "./handles/MetaTags.js";
66
83
  export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
84
+ export {
85
+ Script,
86
+ type ScriptConfig,
87
+ type ScriptAttributes,
88
+ } from "./handles/script.js";
89
+ export { Scripts } from "./handles/Scripts.js";
90
+ export { Breadcrumbs, type BreadcrumbItem } from "./handles/breadcrumbs.js";
67
91
 
68
- // Location state - createLocationState works in RSC (just creates definition)
69
- // useLocationState is NOT exported here as it uses client hooks
70
92
  export {
71
93
  createLocationState,
72
94
  type LocationStateDefinition,
@@ -74,11 +96,13 @@ export {
74
96
  type LocationStateOptions,
75
97
  } from "./browser/react/location-state-shared.js";
76
98
 
77
- // Re-export useHref - it's a "use client" hook
78
99
  export { useHref } from "./browser/react/use-href.js";
79
100
 
80
- // Re-export useHandle - it's a "use client" hook
101
+ export { useReverse } from "./browser/react/use-reverse.js";
102
+
81
103
  export { useHandle } from "./browser/react/use-handle.js";
104
+ // Type a deferred-aware consumer narrows: an accumulated entry may be a Promise
105
+ // (a `ctx.use(Handle).defer()` slot) until it resolves.
106
+ export type { DeferredHandleEntry } from "./defer.js";
82
107
 
83
- // Re-export useLocationState - it's a "use client" hook
84
108
  export { useLocationState } from "./browser/react/location-state.js";