@timber-js/app 0.2.0-alpha.19 → 0.2.0-alpha.191
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.
- package/LICENSE +8 -0
- package/agent-skill.md +344 -0
- package/dist/_chunks/actions-BjbbNRFN.js +318 -0
- package/dist/_chunks/actions-BjbbNRFN.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
- package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
- package/dist/_chunks/cache-api-DllJ-Lyw.js +1196 -0
- package/dist/_chunks/cache-api-DllJ-Lyw.js.map +1 -0
- package/dist/_chunks/cli-check-DJZDc22E.js +256 -0
- package/dist/_chunks/cli-check-DJZDc22E.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D4_AZVUb.js +298 -0
- package/dist/_chunks/cli-schema-sync-D4_AZVUb.js.map +1 -0
- package/dist/_chunks/cloudflare-CGP6BZKO.js +1284 -0
- package/dist/_chunks/cloudflare-CGP6BZKO.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/convention-lint-CpteIpTm.js +784 -0
- package/dist/_chunks/convention-lint-CpteIpTm.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/error-boundary-D-ODYX41.js +353 -0
- package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/file-cache-DmX7OqZP.js +454 -0
- package/dist/_chunks/file-cache-DmX7OqZP.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/logger-CH7IcMmg.js +1436 -0
- package/dist/_chunks/logger-CH7IcMmg.js.map +1 -0
- package/dist/_chunks/mdx-file-C005ay-P.js +25 -0
- package/dist/_chunks/mdx-file-C005ay-P.js.map +1 -0
- package/dist/_chunks/plugin-context-rCinWLiE.js +321 -0
- package/dist/_chunks/plugin-context-rCinWLiE.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/router-ref-DuYuV_0Q.js +28 -0
- package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
- package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
- package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
- package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
- package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DRqE_lD_.js +46 -0
- package/dist/_chunks/rsc-media-type-DRqE_lD_.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/scanner-CAietmj4.js +1564 -0
- package/dist/_chunks/scanner-CAietmj4.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-CjOlyB8Y.js +97 -0
- package/dist/_chunks/segment-context-CjOlyB8Y.js.map +1 -0
- package/dist/_chunks/segment-keys-BawYuNFO.js +307 -0
- package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
- package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-14MXm7Pj.js} +17 -2
- package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js +226 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -0
- package/dist/_chunks/use-segment-params-C4r4BD9T.js +398 -0
- package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -0
- package/dist/_chunks/walkers-BsVLmD1S.js +141 -0
- package/dist/_chunks/walkers-BsVLmD1S.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +124 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +199 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +17 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +55 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +287 -171
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +62 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +28 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +5 -0
- package/dist/cache/fast-hash.d.ts.map +1 -1
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +31 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +140 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/cloudflare-purge.js +30 -0
- package/dist/cdn/cloudflare-purge.js.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.js +33 -0
- package/dist/cdn/fastly-purge.js.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/index.js +94 -0
- package/dist/cdn/index.js.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.js +35 -0
- package/dist/cdn/workers-cache-purge.js.map +1 -0
- package/dist/cli-check.d.ts +153 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +66 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +151 -47
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +57 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +29 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +30 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +19 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +1 -125
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +29 -7
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +11 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +186 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +1624 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +63 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +87 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +38 -20
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +159 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +82 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +129 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +55 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +84 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +207 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +113 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +107 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +57 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +21 -5
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +14 -4
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +2 -2
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +12 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +29 -16
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +284 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +257 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +50 -181
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9805 -14134
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +276 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +47 -10
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +218 -21
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +26 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +61 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen-write.d.ts +51 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/convention-lint.d.ts +55 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +72 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception.d.ts +234 -10
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +105 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +26 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +114 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/segment-keys.d.ts +118 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/types.d.ts +74 -26
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +57 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +145 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +262 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +3 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +179 -360
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +81 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/serialize-equal.d.ts +9 -0
- package/dist/search-params/serialize-equal.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +76 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/server/access-gate.d.ts +26 -10
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +12 -33
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +115 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +25 -30
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/compress.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +247 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +16 -5
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +86 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/html-injector-core.d.ts +242 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +183 -2906
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +51 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4154 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +74 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata.d.ts +8 -0
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +119 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +71 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +77 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +59 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +59 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +152 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +63 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +23 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +79 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +100 -44
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +110 -106
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +74 -27
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +38 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +38 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +59 -42
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +39 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +40 -3
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +36 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +130 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/skippable-prefix.d.ts +26 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +139 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +140 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +1 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +61 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +44 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +112 -0
- package/dist/server/static-generator.d.ts.map +1 -0
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +26 -15
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +66 -42
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +77 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +40 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +109 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +25 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +40 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +10 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +163 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +325 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +170 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +132 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +252 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +173 -0
- package/docs/learn/12-client-navigation.mdx +176 -0
- package/docs/learn/13-configuration.mdx +166 -0
- package/docs/learn/14-deploying.mdx +287 -0
- package/docs/more/01-advanced-routing.mdx +343 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +171 -0
- package/llms.txt +55 -0
- package/package.json +108 -26
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +204 -0
- package/src/adapters/cloudflare.ts +740 -129
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro.ts +320 -120
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +274 -0
- package/src/adapters/types.ts +28 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +5 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +114 -21
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +197 -19
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +161 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-check.ts +458 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +221 -53
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +130 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +198 -0
- package/src/client/browser-entry/index.ts +121 -0
- package/src/client/browser-entry/post-hydration.ts +122 -0
- package/src/client/browser-entry/router-init.ts +342 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +210 -36
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +29 -7
- package/src/client/index.ts +78 -45
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +397 -150
- package/src/client/navigation-api.ts +345 -0
- package/src/client/navigation-commit.ts +197 -0
- package/src/client/navigation-context.ts +43 -62
- package/src/client/navigation-root.tsx +580 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/params-context.ts +192 -0
- package/src/client/router-effects.ts +231 -0
- package/src/client/router-lifecycle.ts +288 -0
- package/src/client/router-pipeline.ts +393 -0
- package/src/client/router-ref.ts +2 -2
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +230 -0
- package/src/client/router.ts +339 -410
- package/src/client/rsc-fetch.ts +530 -73
- package/src/client/segment-cache.ts +224 -38
- package/src/client/segment-outlet.tsx +141 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +21 -6
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +19 -5
- package/src/client/top-loader.tsx +13 -10
- package/src/client/unload-guard.ts +34 -2
- package/src/client/use-cookie.ts +69 -17
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +5 -2
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +52 -25
- package/src/codec.ts +149 -0
- package/src/config-types.ts +282 -0
- package/src/config-validation.ts +330 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +100 -18
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +468 -353
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +503 -0
- package/src/plugins/adapter-build.ts +229 -7
- package/src/plugins/build-manifest.ts +201 -26
- package/src/plugins/build-report.ts +259 -47
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +284 -94
- package/src/plugins/entries.ts +138 -16
- package/src/plugins/fonts.ts +228 -660
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +328 -0
- package/src/plugins/request-dep/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +268 -277
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +240 -64
- package/src/plugins/static-build.ts +704 -66
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +139 -0
- package/src/routing/codegen.ts +339 -231
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +493 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +894 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +368 -218
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +75 -26
- package/src/routing/walkers.ts +98 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +380 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +121 -51
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +230 -43
- package/src/server/actions.ts +54 -57
- package/src/server/als-registry.ts +159 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +33 -57
- package/src/server/canonicalize.ts +6 -3
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +115 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +127 -0
- package/src/server/deny-boundary.ts +516 -0
- package/src/server/deny-renderer.ts +181 -101
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +170 -44
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +32 -184
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-collector.ts +189 -0
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata.ts +21 -0
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +336 -0
- package/src/server/param-coercion.ts +189 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +196 -0
- package/src/server/pipeline-phases.ts +599 -0
- package/src/server/pipeline.ts +322 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +299 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +53 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +202 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +122 -0
- package/src/server/prebuilt-builder.ts +804 -0
- package/src/server/prebuilt-runtime.ts +817 -0
- package/src/server/primitives.ts +174 -90
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +243 -333
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +666 -308
- package/src/server/route-handler.ts +39 -12
- package/src/server/route-matcher.ts +162 -269
- package/src/server/rsc-cache-key-guard.ts +164 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +67 -32
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +370 -94
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +357 -330
- package/src/server/rsc-entry/render-route.ts +308 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +188 -55
- package/src/server/rsc-entry/rsc-stream.ts +122 -18
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +299 -80
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +74 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +678 -294
- package/src/server/ssr-bridge-types.ts +145 -0
- package/src/server/ssr-entry.ts +216 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +142 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +715 -0
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +107 -148
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +99 -168
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +84 -9
- package/src/server/utils/element-type.ts +72 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/als-slots.ts +74 -0
- package/src/shared/base-path.ts +80 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/param-value.ts +281 -0
- package/src/shared/payload-root.ts +152 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +31 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +43 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +110 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +36 -32
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js +0 -109
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/error-boundary.js.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/search-params/registry.ts +0 -31
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
package/src/client/router.ts
CHANGED
|
@@ -1,128 +1,29 @@
|
|
|
1
|
-
// Segment Router —
|
|
1
|
+
// Segment Router — the operations a client-side navigation can be.
|
|
2
|
+
//
|
|
3
|
+
// `navigate`, `refresh`, `handlePopState`, `prefetch` and `applyRevalidation`
|
|
4
|
+
// live here; each is wiring over modules that own one concern apiece:
|
|
5
|
+
//
|
|
6
|
+
// router-types.ts — RouterDeps / RouterInstance / the option shapes
|
|
7
|
+
// router-lifecycle.ts — ownership, supersede, pending store, handoff set
|
|
8
|
+
// router-pipeline.ts — URL in, tree in React's hands
|
|
9
|
+
// router-effects.ts — SPA exits, error recovery, post-paint scroll
|
|
10
|
+
// navigation-commit.ts — every write that makes a page "current"
|
|
11
|
+
//
|
|
2
12
|
// See design/19-client-navigation.md for the full architecture.
|
|
3
13
|
|
|
4
|
-
import { SegmentCache, PrefetchCache
|
|
5
|
-
import type { SegmentInfo } from '
|
|
14
|
+
import { SegmentCache, PrefetchCache } from './segment-cache';
|
|
15
|
+
import type { SegmentInfo } from '../shared/segment-info.js';
|
|
6
16
|
import { HistoryStack } from './history';
|
|
7
|
-
import
|
|
8
|
-
import { setCurrentParams } from './use-params.js';
|
|
9
|
-
import { setNavigationState } from './navigation-context.js';
|
|
10
|
-
import { SegmentElementCache, cacheSegmentElements, mergeSegmentTree } from './segment-merger.js';
|
|
11
|
-
import { fetchRscPayload, RedirectError } from './rsc-fetch.js';
|
|
12
|
-
import type { FetchResult } from './rsc-fetch.js';
|
|
13
|
-
|
|
14
|
-
// ─── Types ───────────────────────────────────────────────────────
|
|
15
|
-
|
|
16
|
-
export interface NavigationOptions {
|
|
17
|
-
/** Set to false to prevent scroll-to-top on forward navigation */
|
|
18
|
-
scroll?: boolean;
|
|
19
|
-
/** Use replaceState instead of pushState (replaces current history entry) */
|
|
20
|
-
replace?: boolean;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Function that decodes an RSC Flight stream into a React element tree.
|
|
25
|
-
* In production: createFromFetch from @vitejs/plugin-rsc/browser.
|
|
26
|
-
* In tests: a mock that returns the raw payload.
|
|
27
|
-
*/
|
|
28
|
-
export type RscDecoder = (fetchPromise: Promise<Response>) => unknown;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Function that renders a decoded RSC element tree into the DOM.
|
|
32
|
-
* In production: reactRoot.render(element).
|
|
33
|
-
* In tests: a no-op or mock.
|
|
34
|
-
*/
|
|
35
|
-
export type RootRenderer = (element: unknown) => void;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Platform dependencies injected for testability. In production these
|
|
39
|
-
* map to browser APIs; in tests they're replaced with mocks.
|
|
40
|
-
*/
|
|
41
|
-
export interface RouterDeps {
|
|
42
|
-
fetch: (url: string, init: RequestInit) => Promise<Response>;
|
|
43
|
-
pushState: (data: unknown, unused: string, url: string) => void;
|
|
44
|
-
replaceState: (data: unknown, unused: string, url: string) => void;
|
|
45
|
-
scrollTo: (x: number, y: number) => void;
|
|
46
|
-
getCurrentUrl: () => string;
|
|
47
|
-
getScrollY: () => number;
|
|
48
|
-
/** Decode RSC Flight stream into React elements. If not provided, raw response text is stored. */
|
|
49
|
-
decodeRsc?: RscDecoder;
|
|
50
|
-
/** Render decoded RSC tree into the DOM. If not provided, rendering is a no-op. */
|
|
51
|
-
renderRoot?: RootRenderer;
|
|
52
|
-
/**
|
|
53
|
-
* Schedule a callback after the next paint. In the browser, this is
|
|
54
|
-
* requestAnimationFrame + setTimeout(0) to run after React commits.
|
|
55
|
-
* In tests, this runs the callback synchronously.
|
|
56
|
-
*/
|
|
57
|
-
afterPaint?: (callback: () => void) => void;
|
|
58
|
-
/** Apply resolved head elements (title, meta tags) to the DOM after navigation. */
|
|
59
|
-
applyHead?: (elements: HeadElement[]) => void;
|
|
60
|
-
/**
|
|
61
|
-
* Run a navigation inside a React transition with optimistic pending URL.
|
|
62
|
-
* The pending URL shows immediately (useOptimistic urgent update) and
|
|
63
|
-
* reverts when the transition commits (atomic with the new tree).
|
|
64
|
-
*
|
|
65
|
-
* The `perform` callback receives a `wrapPayload` function to wrap the
|
|
66
|
-
* decoded RSC payload with NavigationProvider + NuqsAdapter before
|
|
67
|
-
* TransitionRoot sets it as the new element.
|
|
68
|
-
*
|
|
69
|
-
* If not provided (tests), the router falls back to renderRoot.
|
|
70
|
-
*/
|
|
71
|
-
navigateTransition?: (
|
|
72
|
-
pendingUrl: string,
|
|
73
|
-
perform: (wrapPayload: (payload: unknown) => unknown) => Promise<unknown>
|
|
74
|
-
) => Promise<void>;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface RouterInstance {
|
|
78
|
-
/** Navigate to a new URL (forward navigation) */
|
|
79
|
-
navigate(url: string, options?: NavigationOptions): Promise<void>;
|
|
80
|
-
/** Full re-render of the current URL — no state tree sent */
|
|
81
|
-
refresh(): Promise<void>;
|
|
82
|
-
/** Handle a popstate event (back/forward button). scrollY is read from history.state. */
|
|
83
|
-
handlePopState(url: string, scrollY?: number): Promise<void>;
|
|
84
|
-
/** Whether a navigation is currently in flight */
|
|
85
|
-
isPending(): boolean;
|
|
86
|
-
/** The URL currently being navigated to, or null if idle */
|
|
87
|
-
getPendingUrl(): string | null;
|
|
88
|
-
/** Subscribe to pending state changes */
|
|
89
|
-
onPendingChange(listener: (pending: boolean) => void): () => void;
|
|
90
|
-
/** Prefetch an RSC payload for a URL (used by Link hover) */
|
|
91
|
-
prefetch(url: string): void;
|
|
92
|
-
/**
|
|
93
|
-
* Apply a piggybacked revalidation payload from a server action response.
|
|
94
|
-
* Renders the element tree and updates head elements without a server fetch.
|
|
95
|
-
* See design/08-forms-and-actions.md §"Single-Roundtrip Revalidation".
|
|
96
|
-
*/
|
|
97
|
-
applyRevalidation(element: unknown, headElements: HeadElement[] | null): void;
|
|
98
|
-
/**
|
|
99
|
-
* Populate the segment cache from server-provided segment metadata.
|
|
100
|
-
* Called on initial hydration with segment info embedded in the HTML.
|
|
101
|
-
*/
|
|
102
|
-
initSegmentCache(segments: SegmentInfo[]): void;
|
|
103
|
-
/**
|
|
104
|
-
* Cache segment elements from a decoded RSC element tree.
|
|
105
|
-
* Called on initial hydration to populate the element cache so the
|
|
106
|
-
* first client navigation can use partial payloads.
|
|
107
|
-
*/
|
|
108
|
-
cacheElementTree(element: unknown): void;
|
|
109
|
-
/** The segment cache (exposed for tests and <Link> prefetch) */
|
|
110
|
-
segmentCache: SegmentCache;
|
|
111
|
-
/** The prefetch cache (exposed for tests and <Link> prefetch) */
|
|
112
|
-
prefetchCache: PrefetchCache;
|
|
113
|
-
/** The history stack (exposed for tests) */
|
|
114
|
-
historyStack: HistoryStack;
|
|
115
|
-
}
|
|
17
|
+
import { createNavigationCommitter } from './navigation-commit.js';
|
|
116
18
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
19
|
+
import { fetchRscPayload, NonRscResponse } from './rsc-fetch.js';
|
|
20
|
+
import { readPayloadTree, readPublishedParams } from '../shared/payload-root.js';
|
|
21
|
+
import { isClientStale } from './stale-client.js';
|
|
22
|
+
import { createScrollEffects, createSpaExits, createNavigationRecovery } from './router-effects.js';
|
|
23
|
+
import { createNavigationLifecycle } from './router-lifecycle.js';
|
|
24
|
+
import { createNavigationPipeline, prefetchKeyFor } from './router-pipeline.js';
|
|
25
|
+
import { recordSkew } from './router-skew.js';
|
|
26
|
+
import type { NavigationOptions, RouterDeps, RouterInstance } from './router-types.js';
|
|
126
27
|
|
|
127
28
|
// ─── Router Factory ──────────────────────────────────────────────
|
|
128
29
|
|
|
@@ -134,307 +35,291 @@ export function createRouter(deps: RouterDeps): RouterInstance {
|
|
|
134
35
|
const segmentCache = new SegmentCache();
|
|
135
36
|
const prefetchCache = new PrefetchCache();
|
|
136
37
|
const historyStack = new HistoryStack();
|
|
137
|
-
const segmentElementCache = new SegmentElementCache();
|
|
138
|
-
|
|
139
|
-
let pending = false;
|
|
140
|
-
let pendingUrl: string | null = null;
|
|
141
|
-
const pendingListeners = new Set<(pending: boolean) => void>();
|
|
142
|
-
|
|
143
|
-
function setPending(value: boolean, url?: string): void {
|
|
144
|
-
const newPendingUrl = value && url ? url : null;
|
|
145
|
-
if (pending === value && pendingUrl === newPendingUrl) return;
|
|
146
|
-
pending = value;
|
|
147
|
-
pendingUrl = newPendingUrl;
|
|
148
|
-
// Notify external store listeners (non-React consumers).
|
|
149
|
-
// React-facing pending state is handled by useOptimistic in
|
|
150
|
-
// TransitionRoot via navigateTransition — not this function.
|
|
151
|
-
for (const listener of pendingListeners) {
|
|
152
|
-
listener(value);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** Update the segment cache from server-provided segment metadata. */
|
|
157
|
-
function updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void {
|
|
158
|
-
if (!segmentInfo || segmentInfo.length === 0) return;
|
|
159
|
-
const tree = buildSegmentTree(segmentInfo);
|
|
160
|
-
if (tree) {
|
|
161
|
-
segmentCache.set('/', tree);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/** Render a decoded RSC payload into the DOM if a renderer is available. */
|
|
166
|
-
function renderPayload(payload: unknown): void {
|
|
167
|
-
if (deps.renderRoot) {
|
|
168
|
-
deps.renderRoot(payload);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
38
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
function updateNavigationState(
|
|
203
|
-
params: Record<string, string | string[]> | null | undefined,
|
|
204
|
-
url: string
|
|
205
|
-
): void {
|
|
206
|
-
const resolvedParams = params ?? {};
|
|
207
|
-
// Module-level fallback for tests (no NavigationProvider) and SSR
|
|
208
|
-
setCurrentParams(resolvedParams);
|
|
209
|
-
// Navigation context — read by renderRoot to wrap the RSC element
|
|
210
|
-
const pathname = url.startsWith('http') ? new URL(url).pathname : url.split('?')[0] || '/';
|
|
211
|
-
setNavigationState({ params: resolvedParams, pathname });
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Render a payload via navigateTransition (production) or renderRoot (tests).
|
|
216
|
-
* The perform callback should fetch data, update state, and return the payload.
|
|
217
|
-
* In production, the entire callback runs inside a React transition with
|
|
218
|
-
* useOptimistic for the pending URL. In tests, the payload is rendered directly.
|
|
219
|
-
*/
|
|
220
|
-
async function renderViaTransition(
|
|
221
|
-
url: string,
|
|
222
|
-
perform: () => Promise<FetchResult>
|
|
223
|
-
): Promise<HeadElement[] | null> {
|
|
224
|
-
if (deps.navigateTransition) {
|
|
225
|
-
let headElements: HeadElement[] | null = null;
|
|
226
|
-
await deps.navigateTransition(url, async (wrapPayload) => {
|
|
227
|
-
const result = await perform();
|
|
228
|
-
headElements = result.headElements;
|
|
229
|
-
// Merge partial payload with cached segments before wrapping
|
|
230
|
-
const merged = mergeAndCachePayload(result.payload, result.skippedSegments);
|
|
231
|
-
// Store the MERGED payload in history — not the partial pre-merge tree.
|
|
232
|
-
// This ensures handlePopState replays the complete tree on back/forward.
|
|
233
|
-
historyStack.push(url, {
|
|
234
|
-
payload: merged,
|
|
235
|
-
headElements: result.headElements,
|
|
236
|
-
params: result.params,
|
|
237
|
-
});
|
|
238
|
-
return wrapPayload(merged);
|
|
239
|
-
});
|
|
240
|
-
return headElements;
|
|
241
|
-
}
|
|
242
|
-
// Fallback: no transition (tests, no React tree)
|
|
243
|
-
const result = await perform();
|
|
244
|
-
// Merge partial payload with cached segments before rendering
|
|
245
|
-
const merged = mergeAndCachePayload(result.payload, result.skippedSegments);
|
|
246
|
-
// Store merged payload in history
|
|
247
|
-
historyStack.push(url, {
|
|
248
|
-
payload: merged,
|
|
249
|
-
headElements: result.headElements,
|
|
250
|
-
params: result.params,
|
|
39
|
+
// Every write that makes a page "current", and the read that reports the
|
|
40
|
+
// current page back to the server. See navigation-commit.ts.
|
|
41
|
+
const { prepareNavigation, currentStateTree, updateSegmentCache } = createNavigationCommitter({
|
|
42
|
+
segmentCache,
|
|
43
|
+
historyStack,
|
|
44
|
+
clientSegmentCache: () => deps.clientSegmentCache,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Ownership of the router: who is navigating, whose fetch may be cut, and
|
|
48
|
+
// the pending store TopLoader subscribes to. See router-lifecycle.ts.
|
|
49
|
+
const {
|
|
50
|
+
currentNavAbort,
|
|
51
|
+
createNavAbort,
|
|
52
|
+
runNavigation,
|
|
53
|
+
markHandedOff,
|
|
54
|
+
forgetOlderHandoffs,
|
|
55
|
+
isPending,
|
|
56
|
+
getPendingUrl,
|
|
57
|
+
onPendingChange,
|
|
58
|
+
} = createNavigationLifecycle(deps);
|
|
59
|
+
|
|
60
|
+
// Fetch → commit → hand to React. See router-pipeline.ts.
|
|
61
|
+
const { performNavigationFetch, renderViaTransition, renderPayload, resolveForFallback } =
|
|
62
|
+
createNavigationPipeline({
|
|
63
|
+
deps,
|
|
64
|
+
prefetchCache,
|
|
65
|
+
currentStateTree,
|
|
66
|
+
prepareNavigation,
|
|
67
|
+
markHandedOff,
|
|
68
|
+
forgetOlderHandoffs,
|
|
251
69
|
});
|
|
252
|
-
renderPayload(merged);
|
|
253
|
-
return result.headElements;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/** Apply head elements (title, meta tags) to the DOM if available. */
|
|
257
|
-
function applyHead(elements: HeadElement[] | null | undefined): void {
|
|
258
|
-
if (elements && deps.applyHead) {
|
|
259
|
-
deps.applyHead(elements);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/** Run a callback after the next paint (after React commit). */
|
|
264
|
-
function afterPaint(callback: () => void): void {
|
|
265
|
-
if (deps.afterPaint) {
|
|
266
|
-
deps.afterPaint(callback);
|
|
267
|
-
} else {
|
|
268
|
-
callback();
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
70
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
if (result === undefined) {
|
|
294
|
-
// Fetch RSC payload with state tree for partial rendering.
|
|
295
|
-
// Send current URL for intercepting route resolution (modal pattern).
|
|
296
|
-
const stateTree = segmentCache.serializeStateTree(segmentElementCache.getMergeablePaths());
|
|
297
|
-
const rawCurrentUrl = deps.getCurrentUrl();
|
|
298
|
-
const currentUrl = rawCurrentUrl.startsWith('http')
|
|
299
|
-
? new URL(rawCurrentUrl).pathname
|
|
300
|
-
: new URL(rawCurrentUrl, 'http://localhost').pathname;
|
|
301
|
-
result = await fetchRscPayload(url, deps, stateTree, currentUrl);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// Update the browser history — replace mode overwrites the current entry
|
|
305
|
-
if (options.replace) {
|
|
306
|
-
deps.replaceState({ timber: true, scrollY: 0 }, '', url);
|
|
307
|
-
} else {
|
|
308
|
-
deps.pushState({ timber: true, scrollY: 0 }, '', url);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// NOTE: History push is deferred — the merged payload (after segment
|
|
312
|
-
// merging in renderViaTransition) is stored by the caller, not here.
|
|
313
|
-
// Storing result.payload here would record the partial (pre-merge)
|
|
314
|
-
// RSC tree, causing handlePopState to replay an incomplete tree.
|
|
315
|
-
|
|
316
|
-
// Update the segment cache with the new route's segment tree.
|
|
317
|
-
updateSegmentCache(result.segmentInfo);
|
|
318
|
-
|
|
319
|
-
// Update navigation state (params + pathname) before rendering.
|
|
320
|
-
updateNavigationState(result.params, url);
|
|
321
|
-
|
|
322
|
-
return result;
|
|
323
|
-
}
|
|
71
|
+
// Post-paint scroll effects.
|
|
72
|
+
const { restoreScrollAfterPaint, scrollToHashAfterPaint } = createScrollEffects(deps);
|
|
73
|
+
|
|
74
|
+
// The only ways out of the SPA. Every failure branch that gives up on
|
|
75
|
+
// client-side navigation goes through one of these, so the "does this
|
|
76
|
+
// navigation still own the router?" question is asked once rather than
|
|
77
|
+
// per branch (TIM-1275, TIM-1276).
|
|
78
|
+
const { leaveSpaIfOwned, leaveSpaSuperseding } = createSpaExits({
|
|
79
|
+
currentNavAbort,
|
|
80
|
+
supersede: () => void createNavAbort(),
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Every way an RSC fetch can fail that the router answers rather than
|
|
84
|
+
// rethrows. Shared by navigate(), refresh(), and traversals so a path that
|
|
85
|
+
// grows a new branch grows it for all of them (TIM-1277).
|
|
86
|
+
const recoverFromNavigationError = createNavigationRecovery({
|
|
87
|
+
currentNavAbort,
|
|
88
|
+
leaveSpaIfOwned,
|
|
89
|
+
// Hoisted — `navigate` is a function declaration below.
|
|
90
|
+
navigate: (url) => navigate(url, { replace: true }),
|
|
91
|
+
});
|
|
324
92
|
|
|
325
93
|
async function navigate(url: string, options: NavigationOptions = {}): Promise<void> {
|
|
326
94
|
const scroll = options.scroll !== false;
|
|
327
95
|
const replace = options.replace === true;
|
|
96
|
+
const externalSignal = options._signal as AbortSignal | undefined;
|
|
97
|
+
const skipHistory = options._skipHistory === true;
|
|
98
|
+
|
|
99
|
+
// Split the #fragment off the navigation URL (TIM-1035). The full URL
|
|
100
|
+
// (with hash) is committed to the address bar; the hash-less URL is used
|
|
101
|
+
// for the RSC fetch (fragments are client-only — keeping it would also
|
|
102
|
+
// swallow the ?_rsc cache-bust param into the fragment) and for
|
|
103
|
+
// history-stack/prefetch keys (popstate lookups use pathname + search).
|
|
104
|
+
const hashIndex = url.indexOf('#');
|
|
105
|
+
const hash = hashIndex === -1 ? '' : url.slice(hashIndex);
|
|
106
|
+
const fetchUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
107
|
+
|
|
108
|
+
// Use the pre-intercept departing URL when the Navigation API has already
|
|
109
|
+
// committed the destination (_departingUrl from navigation-api.ts). Otherwise
|
|
110
|
+
// capture it now — getCurrentUrl() is still the departing URL at this point
|
|
111
|
+
// for non-Navigation-API navigations (TIM-1232).
|
|
112
|
+
const departingUrl = options._departingUrl ?? deps.getCurrentUrl();
|
|
328
113
|
|
|
329
114
|
// Capture the departing page's scroll position for scroll={false} preservation.
|
|
330
115
|
const currentScrollY = deps.getScrollY();
|
|
331
116
|
|
|
332
|
-
// Save the departing page's scroll position
|
|
333
|
-
//
|
|
334
|
-
|
|
335
|
-
|
|
117
|
+
// Save the departing page's scroll position — use Navigation API entry
|
|
118
|
+
// state when available, otherwise fall back to history.state.
|
|
119
|
+
if (deps.saveNavigationEntryScroll) {
|
|
120
|
+
deps.saveNavigationEntryScroll(currentScrollY);
|
|
121
|
+
} else {
|
|
122
|
+
deps.replaceState({ timber: true, scrollY: currentScrollY }, '', deps.getCurrentUrl());
|
|
123
|
+
}
|
|
336
124
|
|
|
337
|
-
|
|
125
|
+
// This bundle has been superseded. Every subsequent navigation is a full
|
|
126
|
+
// document load — it is the only way to get code that matches the server,
|
|
127
|
+
// and it is the recovery for a skew detected on an earlier navigation.
|
|
128
|
+
// Deliberately *not* a reload: recovery rides on navigations the user
|
|
129
|
+
// asked for, so a rollout that keeps serving mismatched builds costs one
|
|
130
|
+
// document load per click instead of a self-issued reload loop (TIM-1275).
|
|
131
|
+
// Scroll is saved above, so back-navigation still restores correctly.
|
|
132
|
+
if (isClientStale()) {
|
|
133
|
+
await leaveSpaSuperseding(url, departingUrl);
|
|
134
|
+
}
|
|
338
135
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
136
|
+
let effectiveSkipHistory = skipHistory;
|
|
137
|
+
|
|
138
|
+
await runNavigation(
|
|
139
|
+
url,
|
|
140
|
+
async (navAbort) => {
|
|
141
|
+
// When Navigation API is active, initiate the navigation via
|
|
142
|
+
// navigation.navigate() BEFORE the fetch. Must happen after
|
|
143
|
+
// createNavAbort supersedes the previous navigation (done by
|
|
144
|
+
// runNavigation) so the old deferred is resolved first.
|
|
145
|
+
if (!effectiveSkipHistory && deps.navigationNavigate) {
|
|
146
|
+
deps.setRouterNavigating?.(true);
|
|
147
|
+
deps.navigationNavigate(url, replace);
|
|
148
|
+
deps.setRouterNavigating?.(false);
|
|
149
|
+
effectiveSkipHistory = true;
|
|
150
|
+
}
|
|
343
151
|
|
|
344
|
-
|
|
345
|
-
|
|
152
|
+
try {
|
|
153
|
+
await renderViaTransition(fetchUrl, navAbort, () =>
|
|
154
|
+
performNavigationFetch(fetchUrl, {
|
|
155
|
+
replace,
|
|
156
|
+
commitUrl: url,
|
|
157
|
+
signal: navAbort.signal,
|
|
158
|
+
skipHistory: effectiveSkipHistory,
|
|
159
|
+
departingUrl,
|
|
160
|
+
})
|
|
161
|
+
);
|
|
346
162
|
|
|
347
|
-
|
|
348
|
-
|
|
163
|
+
// Scroll-to-top on forward navigation, scroll to the #fragment target
|
|
164
|
+
// when the URL has one, or restore captured position for scroll={false}.
|
|
165
|
+
if (scroll && hash) {
|
|
166
|
+
scrollToHashAfterPaint(hash);
|
|
167
|
+
} else {
|
|
168
|
+
restoreScrollAfterPaint(scroll ? 0 : currentScrollY);
|
|
169
|
+
}
|
|
170
|
+
} catch (error) {
|
|
171
|
+
// `url` is where the user asked to go and `departingUrl` is where
|
|
172
|
+
// they were: a failure here finishes the click as a full document
|
|
173
|
+
// load of the destination, fragment included (TIM-1234). Reloading
|
|
174
|
+
// instead would rebuild the page they were *leaving* and discard
|
|
175
|
+
// the click (TIM-1275).
|
|
176
|
+
if (await recoverFromNavigationError(error, navAbort, url, departingUrl)) return;
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
externalSignal
|
|
181
|
+
);
|
|
182
|
+
}
|
|
349
183
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Fetch a URL's RSC payload, commit it, and render — the pipeline shared by
|
|
186
|
+
* refresh() and an uncached back/forward traversal. Both can be the path
|
|
187
|
+
* that discovers a version skew, and both recover the same way (TIM-1275).
|
|
188
|
+
*
|
|
189
|
+
* Not `performNavigationFetch`: neither caller consults the prefetch cache
|
|
190
|
+
* (there is no link to have hovered) and neither moves the address bar (the
|
|
191
|
+
* browser is already where it is going), so the fetch is a plain one.
|
|
192
|
+
*/
|
|
193
|
+
async function fetchCommitAndRender(
|
|
194
|
+
url: string,
|
|
195
|
+
opts: {
|
|
196
|
+
/** Omitted by refresh(): the server renders the complete payload. */
|
|
197
|
+
stateTree?: { segments: string[] };
|
|
198
|
+
/** Restored after paint when present — traversals only. */
|
|
199
|
+
scrollY?: number;
|
|
200
|
+
externalSignal?: AbortSignal;
|
|
201
|
+
} = {}
|
|
202
|
+
): Promise<void> {
|
|
203
|
+
await runNavigation(
|
|
204
|
+
url,
|
|
205
|
+
async (navAbort) => {
|
|
206
|
+
try {
|
|
207
|
+
await renderViaTransition(url, navAbort, async () => {
|
|
208
|
+
const result = await fetchRscPayload(
|
|
209
|
+
url,
|
|
210
|
+
deps,
|
|
211
|
+
opts.stateTree,
|
|
212
|
+
undefined,
|
|
213
|
+
navAbort.signal
|
|
214
|
+
);
|
|
215
|
+
const payload = await resolveForFallback(result.payload);
|
|
216
|
+
const params = await result.params;
|
|
217
|
+
const { navState, commit } = prepareNavigation(url, {
|
|
218
|
+
payload,
|
|
219
|
+
params,
|
|
220
|
+
segmentInfo: result.segmentInfo,
|
|
221
|
+
status: result.status,
|
|
222
|
+
});
|
|
223
|
+
return { ...result, payload, params, navState, commit };
|
|
224
|
+
});
|
|
225
|
+
} catch (error) {
|
|
226
|
+
// Neither path is a navigate(), and neither has a caller that
|
|
227
|
+
// handles a rejection — `refresh()` is `void`-called everywhere it
|
|
228
|
+
// is used, and nobody awaits a traversal at all. Without the same
|
|
229
|
+
// recovery `navigate()` gets, a 500 on Back left the user on the
|
|
230
|
+
// old document with an unhandled rejection in the console
|
|
231
|
+
// (TIM-1277).
|
|
232
|
+
//
|
|
233
|
+
// `url` is both the destination and the departure point: the
|
|
234
|
+
// browser has already traversed, and `refresh()` is by definition
|
|
235
|
+
// where it already is. So `hardNavigate()` takes its same-document
|
|
236
|
+
// branch and reloads rather than pushing an entry.
|
|
237
|
+
if (await recoverFromNavigationError(error, navAbort, url, url)) return;
|
|
238
|
+
throw error;
|
|
358
239
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
setPending(false);
|
|
365
|
-
await navigate(error.redirectUrl, { replace: true });
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
// Abort errors are not application errors — swallow silently.
|
|
369
|
-
if (isAbortError(error)) return;
|
|
370
|
-
throw error;
|
|
371
|
-
} finally {
|
|
372
|
-
setPending(false);
|
|
373
|
-
}
|
|
240
|
+
|
|
241
|
+
if (opts.scrollY !== undefined) restoreScrollAfterPaint(opts.scrollY);
|
|
242
|
+
},
|
|
243
|
+
opts.externalSignal
|
|
244
|
+
);
|
|
374
245
|
}
|
|
375
246
|
|
|
376
247
|
async function refresh(): Promise<void> {
|
|
377
248
|
const currentUrl = deps.getCurrentUrl();
|
|
378
249
|
|
|
379
|
-
|
|
250
|
+
// A refresh on a stale client is a full document load of the current URL.
|
|
251
|
+
// Same rule as navigate(): the RSC fetch would only be answered with
|
|
252
|
+
// another reload signal, and this is caller-initiated, not spontaneous
|
|
253
|
+
// (TIM-1275).
|
|
254
|
+
if (isClientStale()) {
|
|
255
|
+
await leaveSpaSuperseding(currentUrl, currentUrl);
|
|
256
|
+
}
|
|
380
257
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
// No state tree sent — server renders the complete RSC payload
|
|
384
|
-
const result = await fetchRscPayload(currentUrl, deps);
|
|
385
|
-
// History push handled by renderViaTransition (stores merged payload)
|
|
386
|
-
updateSegmentCache(result.segmentInfo);
|
|
387
|
-
updateNavigationState(result.params, currentUrl);
|
|
388
|
-
return result;
|
|
389
|
-
});
|
|
258
|
+
await fetchCommitAndRender(currentUrl);
|
|
259
|
+
}
|
|
390
260
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
261
|
+
async function handlePopState(
|
|
262
|
+
url: string,
|
|
263
|
+
scrollY: number = 0,
|
|
264
|
+
externalSignal?: AbortSignal
|
|
265
|
+
): Promise<void> {
|
|
266
|
+
// A stale client hard-navigates on back/forward too — this path never
|
|
267
|
+
// reaches navigate(), so it needs the same check. `url` is where the
|
|
268
|
+
// browser has *already* traversed to, so leaveSpa's same-document
|
|
269
|
+
// branch reloads there rather than pushing a new entry (TIM-1275).
|
|
270
|
+
//
|
|
271
|
+
// This overrides the cached-payload replay below on purpose. Replaying
|
|
272
|
+
// would work — the payload was decoded by this bundle — but it would keep
|
|
273
|
+
// the user on superseded code for as long as they browse within history.
|
|
274
|
+
if (isClientStale()) {
|
|
275
|
+
await leaveSpaSuperseding(url, url);
|
|
394
276
|
}
|
|
395
|
-
}
|
|
396
277
|
|
|
397
|
-
async function handlePopState(url: string, scrollY: number = 0): Promise<void> {
|
|
398
278
|
// Scroll position is read from history.state by the caller (browser-entry.ts)
|
|
399
279
|
// and passed in. This is more reliable than tracking scroll per-URL in memory
|
|
400
280
|
// because the browser maintains per-entry state even with duplicate URLs.
|
|
401
281
|
const entry = historyStack.get(url);
|
|
402
282
|
|
|
403
283
|
if (entry && entry.payload !== null) {
|
|
404
|
-
// Replay cached payload — no server roundtrip
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
284
|
+
// Replay cached payload — no server roundtrip.
|
|
285
|
+
//
|
|
286
|
+
// runNavigation supersedes any in-flight forward navigation (TIM-1022):
|
|
287
|
+
// aborts its fetch and invalidates its render transition so the stale
|
|
288
|
+
// forward payload can't commit over this replay. The replay itself is
|
|
289
|
+
// synchronous — the fn resolves immediately.
|
|
290
|
+
await runNavigation(
|
|
291
|
+
url,
|
|
292
|
+
async () => {
|
|
293
|
+
// clearSegmentCacheOnEmpty: popstate to an entry without layout
|
|
294
|
+
// metadata (e.g., initial SSR page) clears the cache so the next
|
|
295
|
+
// forward navigation gets a full render.
|
|
296
|
+
//
|
|
297
|
+
// Committed immediately: the replay is synchronous and its render
|
|
298
|
+
// goes out through `transitionRender`, so there is no in-flight
|
|
299
|
+
// window for a successor to supersede. `runNavigation` has already
|
|
300
|
+
// superseded whatever was in flight before it (TIM-1022).
|
|
301
|
+
const { navState, commit } = prepareNavigation(url, {
|
|
302
|
+
payload: entry.payload,
|
|
303
|
+
params: entry.params,
|
|
304
|
+
segmentInfo: entry.segmentInfo,
|
|
305
|
+
clearSegmentCacheOnEmpty: true,
|
|
306
|
+
});
|
|
307
|
+
commit();
|
|
308
|
+
renderPayload(entry.payload, navState, entry.params);
|
|
309
|
+
restoreScrollAfterPaint(scrollY);
|
|
310
|
+
},
|
|
311
|
+
externalSignal
|
|
312
|
+
);
|
|
412
313
|
} else {
|
|
413
314
|
// No cached payload — fetch from server.
|
|
414
315
|
// This happens when navigating back to the initial SSR'd page
|
|
415
316
|
// (its payload is null since it was rendered via SSR, not RSC fetch)
|
|
416
317
|
// or when the entry doesn't exist at all.
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
);
|
|
423
|
-
const result = await fetchRscPayload(url, deps, stateTree);
|
|
424
|
-
updateSegmentCache(result.segmentInfo);
|
|
425
|
-
updateNavigationState(result.params, url);
|
|
426
|
-
// History push handled by renderViaTransition (stores merged payload)
|
|
427
|
-
return result;
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
applyHead(headElements);
|
|
431
|
-
afterPaint(() => {
|
|
432
|
-
deps.scrollTo(0, scrollY);
|
|
433
|
-
window.dispatchEvent(new Event('timber:scroll-restored'));
|
|
434
|
-
});
|
|
435
|
-
} finally {
|
|
436
|
-
setPending(false);
|
|
437
|
-
}
|
|
318
|
+
await fetchCommitAndRender(url, {
|
|
319
|
+
stateTree: currentStateTree(),
|
|
320
|
+
scrollY,
|
|
321
|
+
externalSignal,
|
|
322
|
+
});
|
|
438
323
|
}
|
|
439
324
|
}
|
|
440
325
|
|
|
@@ -443,18 +328,53 @@ export function createRouter(deps: RouterDeps): RouterInstance {
|
|
|
443
328
|
* Called on hover of <Link prefetch> elements.
|
|
444
329
|
*/
|
|
445
330
|
function prefetch(url: string): void {
|
|
331
|
+
// A stale client hard-navigates on every navigation, so a prefetched RSC
|
|
332
|
+
// payload could never be consumed — and the fetch would be answered with
|
|
333
|
+
// another reload signal anyway (TIM-1275).
|
|
334
|
+
if (isClientStale()) return;
|
|
335
|
+
|
|
336
|
+
// Strip fragment — it's client-only and would swallow the _rsc cache-bust
|
|
337
|
+
// param into the hash. The hash-less key also matches navigate()'s fetchUrl.
|
|
338
|
+
const hashIndex = url.indexOf('#');
|
|
339
|
+
const fetchUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
340
|
+
|
|
341
|
+
// The page the link is on. Sent as X-Timber-URL so the prefetched payload
|
|
342
|
+
// is the one the click would have produced — an intercepting link hovered
|
|
343
|
+
// from /gallery must prefetch the modal, not the full page — and stored
|
|
344
|
+
// under the same source so only a click departing from here consumes it
|
|
345
|
+
// (TIM-1265). The key is built by the pipeline, which is also what builds
|
|
346
|
+
// the one the click looks up with, so the two cannot disagree.
|
|
347
|
+
const stateTree = currentStateTree();
|
|
348
|
+
const cacheKey = prefetchKeyFor(fetchUrl, deps.getCurrentUrl(), stateTree);
|
|
349
|
+
const from = cacheKey.from;
|
|
350
|
+
|
|
446
351
|
// Don't prefetch if already cached
|
|
447
|
-
if (prefetchCache.get(
|
|
448
|
-
if (historyStack.has(
|
|
352
|
+
if (prefetchCache.get(cacheKey) !== undefined) return;
|
|
353
|
+
if (historyStack.has(fetchUrl)) return;
|
|
449
354
|
|
|
450
355
|
// Fire-and-forget fetch
|
|
451
|
-
|
|
452
|
-
void fetchRscPayload(url, deps, stateTree).then(
|
|
356
|
+
void fetchRscPayload(fetchUrl, deps, stateTree, from).then(
|
|
453
357
|
(result) => {
|
|
454
|
-
|
|
358
|
+
// The decode rejects separately from the fetch, so the stale shapes
|
|
359
|
+
// reach us here rather than in the rejection handler below — swallowing
|
|
360
|
+
// it wholesale threw away the same evidence (TIM-1275).
|
|
361
|
+
result.decodePromise?.catch((error: unknown) => void recordSkew(error));
|
|
362
|
+
prefetchCache.set(cacheKey, result);
|
|
455
363
|
},
|
|
456
|
-
() => {
|
|
457
|
-
|
|
364
|
+
(error) => {
|
|
365
|
+
if (error instanceof NonRscResponse) {
|
|
366
|
+
prefetchCache.setNegative(cacheKey);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
// A prefetch can be the first thing to learn we are stale — during a
|
|
370
|
+
// rollout it may reach the new deployment while the click that
|
|
371
|
+
// follows reaches the old one and completes as an ordinary SPA
|
|
372
|
+
// navigation, throwing the evidence away. Record it, but never
|
|
373
|
+
// recover from here: nobody navigated, and a page load triggered by
|
|
374
|
+
// a hover is exactly the unasked-for reload this design removed. The
|
|
375
|
+
// next click takes the document-load path (TIM-1275).
|
|
376
|
+
recordSkew(error);
|
|
377
|
+
// Any other prefetch failure is non-fatal — navigation fetches fresh.
|
|
458
378
|
}
|
|
459
379
|
);
|
|
460
380
|
}
|
|
@@ -463,29 +383,38 @@ export function createRouter(deps: RouterDeps): RouterInstance {
|
|
|
463
383
|
navigate,
|
|
464
384
|
refresh,
|
|
465
385
|
handlePopState,
|
|
466
|
-
isPending
|
|
467
|
-
getPendingUrl
|
|
468
|
-
onPendingChange
|
|
469
|
-
pendingListeners.add(listener);
|
|
470
|
-
return () => pendingListeners.delete(listener);
|
|
471
|
-
},
|
|
386
|
+
isPending,
|
|
387
|
+
getPendingUrl,
|
|
388
|
+
onPendingChange,
|
|
472
389
|
prefetch,
|
|
473
|
-
applyRevalidation(
|
|
474
|
-
// Render the piggybacked
|
|
475
|
-
//
|
|
476
|
-
//
|
|
477
|
-
//
|
|
390
|
+
applyRevalidation(payloadRoot: unknown): void {
|
|
391
|
+
// Render the piggybacked payload from a server action response. Updates
|
|
392
|
+
// the current history entry with the fresh payload — same as refresh()
|
|
393
|
+
// but without a server fetch.
|
|
394
|
+
//
|
|
395
|
+
// The revalidation renderer builds its tree through the same
|
|
396
|
+
// `withPublishedParams` every route payload goes through, so it is a
|
|
397
|
+
// payload root and carries its own params. It is already decoded by the
|
|
398
|
+
// time it reaches here (action-dispatch awaits the Flight response), so
|
|
399
|
+
// the split is synchronous.
|
|
478
400
|
const currentUrl = deps.getCurrentUrl();
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
401
|
+
const tree = readPayloadTree(payloadRoot);
|
|
402
|
+
const params = readPublishedParams(payloadRoot);
|
|
403
|
+
|
|
404
|
+
// Preserve existing segmentInfo so away-and-back navigation replays
|
|
405
|
+
// with a correct segment cache (TIM-1037).
|
|
406
|
+
const existingEntry = historyStack.get(currentUrl);
|
|
407
|
+
// Synchronous, like the popstate replay: there is no fetch to be
|
|
408
|
+
// superseded, and the payload is already decoded.
|
|
409
|
+
const { navState, commit } = prepareNavigation(currentUrl, {
|
|
410
|
+
payload: tree,
|
|
411
|
+
params,
|
|
412
|
+
segmentInfo: existingEntry?.segmentInfo,
|
|
483
413
|
});
|
|
484
|
-
|
|
485
|
-
|
|
414
|
+
commit();
|
|
415
|
+
renderPayload(tree, navState, params);
|
|
486
416
|
},
|
|
487
417
|
initSegmentCache: (segments: SegmentInfo[]) => updateSegmentCache(segments),
|
|
488
|
-
cacheElementTree: (element: unknown) => cacheSegmentElements(element, segmentElementCache),
|
|
489
418
|
segmentCache,
|
|
490
419
|
prefetchCache,
|
|
491
420
|
historyStack,
|