@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
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigation Lifecycle — who owns the router, and when a fetch may be cut.
|
|
3
|
+
*
|
|
4
|
+
* One navigation at a time owns the router. This module holds that ownership
|
|
5
|
+
* (`currentNavAbort`), the rule for taking it (`createNavAbort` supersedes),
|
|
6
|
+
* the wrapper every navigation runs inside (`runNavigation`), the set of
|
|
7
|
+
* navigations whose trees are on screen and therefore unabortable
|
|
8
|
+
* (`handedOffNavAborts`), and the pending store that `TopLoader` and
|
|
9
|
+
* `usePendingNavigation()` subscribe to.
|
|
10
|
+
*
|
|
11
|
+
* These belong together because every one of them is a read or a write of
|
|
12
|
+
* "which navigation is the user waiting for?" — the question `router.ts` used
|
|
13
|
+
* to answer in four places. Split out of `router.ts` for the same reason
|
|
14
|
+
* `router-effects.ts` was (design/18-build-system.md §"No file >500 lines").
|
|
15
|
+
*
|
|
16
|
+
* See design/19-client-navigation.md §"How Pending State Works".
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { supersedeNavigationTransitions } from './navigation-root.js';
|
|
20
|
+
import type { RouterPhase } from './router-types.js';
|
|
21
|
+
|
|
22
|
+
/** The subset of `RouterDeps` the navigation lifecycle needs. */
|
|
23
|
+
export interface NavigationLifecycleDeps {
|
|
24
|
+
/**
|
|
25
|
+
* Signal that a router-initiated navigation has completed. Resolves the
|
|
26
|
+
* deferred promise that ties the browser's native loading state to the
|
|
27
|
+
* navigation lifecycle.
|
|
28
|
+
*/
|
|
29
|
+
completeRouterNavigation?: () => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface NavigationLifecycle {
|
|
33
|
+
/** The controller that owns the router right now, or null when idle. */
|
|
34
|
+
currentNavAbort: () => AbortController | null;
|
|
35
|
+
/**
|
|
36
|
+
* Take ownership of the router, superseding whatever held it. See the
|
|
37
|
+
* implementation for the three parts of superseding.
|
|
38
|
+
*/
|
|
39
|
+
createNavAbort: (externalSignal?: AbortSignal) => AbortController;
|
|
40
|
+
/**
|
|
41
|
+
* Run `fn` inside the abort/pending/cleanup lifecycle. AbortErrors are
|
|
42
|
+
* swallowed (not application errors); all other errors propagate.
|
|
43
|
+
*/
|
|
44
|
+
runNavigation: (
|
|
45
|
+
url: string,
|
|
46
|
+
fn: (navAbort: AbortController) => Promise<void>,
|
|
47
|
+
externalSignal?: AbortSignal
|
|
48
|
+
) => Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Record that `owner`'s payload has reached React, so its stream is no
|
|
51
|
+
* longer cuttable. No-op when `owner` no longer owns the router.
|
|
52
|
+
*/
|
|
53
|
+
markHandedOff: (owner: AbortController) => void;
|
|
54
|
+
/** React has committed `owner`'s tree — every earlier handoff is off screen. */
|
|
55
|
+
forgetOlderHandoffs: (owner: AbortController) => void;
|
|
56
|
+
|
|
57
|
+
/** Whether a navigation is currently in flight. */
|
|
58
|
+
isPending: () => boolean;
|
|
59
|
+
/** The URL currently being navigated to, or null if idle. */
|
|
60
|
+
getPendingUrl: () => string | null;
|
|
61
|
+
/** Subscribe to pending state changes. */
|
|
62
|
+
onPendingChange: (listener: (pending: boolean) => void) => () => void;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Check if an error is an abort error (connection closed / fetch aborted).
|
|
67
|
+
* Browsers throw DOMException with name 'AbortError' when a fetch is aborted.
|
|
68
|
+
*/
|
|
69
|
+
function isAbortError(error: unknown): boolean {
|
|
70
|
+
if (error instanceof DOMException && error.name === 'AbortError') return true;
|
|
71
|
+
if (error instanceof Error && error.name === 'AbortError') return true;
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function createNavigationLifecycle(deps: NavigationLifecycleDeps): NavigationLifecycle {
|
|
76
|
+
// AbortController for the current in-flight navigation.
|
|
77
|
+
// When a new navigation starts, the previous controller is aborted,
|
|
78
|
+
// cancelling any in-progress RSC fetch. This provides automatic
|
|
79
|
+
// cancellation of stale fetches regardless of Navigation API support.
|
|
80
|
+
let currentNavAbort: AbortController | null = null;
|
|
81
|
+
|
|
82
|
+
let routerPhase: RouterPhase = { phase: 'idle' };
|
|
83
|
+
const pendingListeners = new Set<(pending: boolean) => void>();
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The controllers of navigations whose trees have been HANDED TO REACT.
|
|
87
|
+
*
|
|
88
|
+
* Its response may still be streaming: a destination reveals as soon as
|
|
89
|
+
* React can render it, so the tree on screen routinely has Suspense
|
|
90
|
+
* boundaries still waiting on later Flight rows. Aborting that response
|
|
91
|
+
* rejects those rows, and the rejection surfaces through the tree into
|
|
92
|
+
* whatever error boundary the app has — replacing the page the user is
|
|
93
|
+
* looking at with an error state, while the successor navigation is still
|
|
94
|
+
* in flight (codex on #1004).
|
|
95
|
+
*
|
|
96
|
+
* So such a navigation's stream is allowed to finish. It is finite and
|
|
97
|
+
* already in flight; the alternative is a visible error on the page being
|
|
98
|
+
* departed from. Cancelling is still correct for a navigation whose payload
|
|
99
|
+
* never reached React at all, which is the case the abort was written for.
|
|
100
|
+
*
|
|
101
|
+
* **Handed over, not committed.** This is set when the tree is given to
|
|
102
|
+
* React, not when React commits it. Marking on commit is a whole React
|
|
103
|
+
* commit phase too late: the notification would be `NavigationRoot`'s
|
|
104
|
+
* layout effect, and React runs *descendant* layout effects first — so a
|
|
105
|
+
* destination that navigates from its own mount layout effect (a redirect
|
|
106
|
+
* guard) runs before the mark and its just-committed stream gets torn out
|
|
107
|
+
* from under it. `tests/navigation-supersede.test.ts` already pins that
|
|
108
|
+
* ordering, and there is no earlier hook short of an extra sibling fiber,
|
|
109
|
+
* which would shift every `useId` in the payload (see `server/ssr-wrappers`).
|
|
110
|
+
*
|
|
111
|
+
* Handing over is the right moment on its own terms, not merely a safe
|
|
112
|
+
* over-approximation: from the instant React holds the tree it may commit
|
|
113
|
+
* it without asking, so there is no later point at which "not on screen"
|
|
114
|
+
* is still knowable from out here. The residue is that a navigation
|
|
115
|
+
* superseded in the window between handover and commit keeps streaming a
|
|
116
|
+
* payload nobody sees — bandwidth on a finite response, against a visible
|
|
117
|
+
* error page the other way (codex on #1004, second round).
|
|
118
|
+
*
|
|
119
|
+
* A SET, not a single slot. Between a successor's handover and its commit
|
|
120
|
+
* React is still showing the previous tree — that is what the transition
|
|
121
|
+
* buys — so the previous navigation's stream is still feeding the screen and
|
|
122
|
+
* must stay unabortable. Entries are dropped when a later tree actually
|
|
123
|
+
* commits (`forgetOlderHandoffs`), which is the moment the trees they fed
|
|
124
|
+
* are gone. A single slot made a legitimate handover steal protection from
|
|
125
|
+
* a stream still on screen, and let a superseded navigation overwrite the
|
|
126
|
+
* winner's entry outright.
|
|
127
|
+
*/
|
|
128
|
+
const handedOffNavAborts = new Set<AbortController>();
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Cancel a navigation's RSC fetch — unless its tree is the one on screen.
|
|
132
|
+
*
|
|
133
|
+
* THE only place a navigation controller is aborted. Every path that gives
|
|
134
|
+
* up on a navigation calls this, so the "is this tree displayed?" question
|
|
135
|
+
* is asked once rather than at each site (the same reason `createSpaExits`
|
|
136
|
+
* exists for the SPA exits). A new abort path is a call to this, not a copy
|
|
137
|
+
* of `controller.abort()`.
|
|
138
|
+
*
|
|
139
|
+
* See `handedOffNavAborts` for why such a navigation keeps its stream.
|
|
140
|
+
*/
|
|
141
|
+
function abortUnlessHandedOff(controller: AbortController): void {
|
|
142
|
+
if (handedOffNavAborts.has(controller)) return;
|
|
143
|
+
controller.abort();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Create a new AbortController for a navigation, superseding any
|
|
148
|
+
* previous in-flight navigation. Optionally links to an external
|
|
149
|
+
* signal (e.g., from the Navigation API's NavigateEvent.signal).
|
|
150
|
+
*
|
|
151
|
+
* Superseding is one operation with three parts:
|
|
152
|
+
* 1. Abort the previous navigation's fetch — UNLESS its tree is the one on
|
|
153
|
+
* screen, in which case tearing the stream down would error the page the
|
|
154
|
+
* user is currently looking at. See `handedOffNavAborts`.
|
|
155
|
+
* 2. Invalidate its render transition so a response that already
|
|
156
|
+
* arrived can't commit a stale tree (NavigationRoot's transId guard).
|
|
157
|
+
* This happens either way, so skipping the abort cannot let a stale tree
|
|
158
|
+
* displace the successor.
|
|
159
|
+
* 3. Resolve its Navigation API deferred — the superseded navigation's
|
|
160
|
+
* finally block is staleness-guarded (see TIM-1034) and no longer
|
|
161
|
+
* cleans up after itself, so the browser's native loading state for
|
|
162
|
+
* the dead navigation is cleared here.
|
|
163
|
+
*/
|
|
164
|
+
function createNavAbort(externalSignal?: AbortSignal): AbortController {
|
|
165
|
+
if (currentNavAbort) {
|
|
166
|
+
abortUnlessHandedOff(currentNavAbort);
|
|
167
|
+
supersedeNavigationTransitions();
|
|
168
|
+
deps.completeRouterNavigation?.();
|
|
169
|
+
}
|
|
170
|
+
const controller = new AbortController();
|
|
171
|
+
currentNavAbort = controller;
|
|
172
|
+
|
|
173
|
+
// If an external signal is provided (e.g., Navigation API),
|
|
174
|
+
// forward its abort to our controller.
|
|
175
|
+
//
|
|
176
|
+
// This is a second, independent way a navigation dies, and it fires for
|
|
177
|
+
// the same reason as the branch above: the browser aborts a
|
|
178
|
+
// NavigateEvent's signal when that navigation is superseded. So it needs
|
|
179
|
+
// the same guard — without it, an intercepted push/replace or traversal
|
|
180
|
+
// whose tree is already on screen still loses its stream, and the guard
|
|
181
|
+
// above only appears to work because plain `router.navigate()` carries no
|
|
182
|
+
// external signal (codex on #1004).
|
|
183
|
+
if (externalSignal) {
|
|
184
|
+
if (externalSignal.aborted) {
|
|
185
|
+
abortUnlessHandedOff(controller);
|
|
186
|
+
} else {
|
|
187
|
+
externalSignal.addEventListener('abort', () => abortUnlessHandedOff(controller), {
|
|
188
|
+
once: true,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return controller;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function setPending(value: boolean, url?: string): void {
|
|
197
|
+
const next: RouterPhase =
|
|
198
|
+
value && url ? { phase: 'navigating', targetUrl: url } : { phase: 'idle' };
|
|
199
|
+
// Skip no-op updates
|
|
200
|
+
if (
|
|
201
|
+
routerPhase.phase === next.phase &&
|
|
202
|
+
(routerPhase.phase === 'idle' ||
|
|
203
|
+
(routerPhase.phase === 'navigating' &&
|
|
204
|
+
next.phase === 'navigating' &&
|
|
205
|
+
routerPhase.targetUrl === next.targetUrl))
|
|
206
|
+
) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
routerPhase = next;
|
|
210
|
+
// Notify subscribers. This is the ONLY pending representation — React and
|
|
211
|
+
// non-React consumers alike read it, React ones through
|
|
212
|
+
// `usePendingNavigation()`'s `useSyncExternalStore` (TIM-1307).
|
|
213
|
+
for (const listener of pendingListeners) {
|
|
214
|
+
listener(value);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Wrap a navigation in the standard abort/pending/cleanup lifecycle.
|
|
220
|
+
* Consolidates the createNavAbort + setPending + staleness-guarded
|
|
221
|
+
* finally that was duplicated across navigate, refresh, and both
|
|
222
|
+
* handlePopState paths. AbortErrors are swallowed (not application
|
|
223
|
+
* errors); all other errors propagate to the caller.
|
|
224
|
+
*/
|
|
225
|
+
async function runNavigation(
|
|
226
|
+
url: string,
|
|
227
|
+
fn: (navAbort: AbortController) => Promise<void>,
|
|
228
|
+
externalSignal?: AbortSignal
|
|
229
|
+
): Promise<void> {
|
|
230
|
+
const navAbort = createNavAbort(externalSignal);
|
|
231
|
+
setPending(true, url);
|
|
232
|
+
try {
|
|
233
|
+
await fn(navAbort);
|
|
234
|
+
} catch (error) {
|
|
235
|
+
if (isAbortError(error)) return;
|
|
236
|
+
throw error;
|
|
237
|
+
} finally {
|
|
238
|
+
if (currentNavAbort === navAbort) {
|
|
239
|
+
currentNavAbort = null;
|
|
240
|
+
setPending(false);
|
|
241
|
+
deps.completeRouterNavigation?.();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return {
|
|
247
|
+
currentNavAbort: () => currentNavAbort,
|
|
248
|
+
createNavAbort,
|
|
249
|
+
runNavigation,
|
|
250
|
+
|
|
251
|
+
// Guarded on still owning the router. A superseded navigation can still
|
|
252
|
+
// reach here: a prefetch hit answers from `prefetchCache`, whose payload
|
|
253
|
+
// was fetched under the PREFETCH's controller, so aborting this
|
|
254
|
+
// navigation's controller does not stop it and `perform()` runs to
|
|
255
|
+
// completion. `navigateTransition`'s stale-transition check happens after
|
|
256
|
+
// `perform()` returns, so without this the loser would claim ownership
|
|
257
|
+
// moments before being discarded — and the next navigation would then
|
|
258
|
+
// abort the winner's still-streaming response, erroring the visible tree
|
|
259
|
+
// (codex on #1004).
|
|
260
|
+
markHandedOff(owner: AbortController): void {
|
|
261
|
+
if (currentNavAbort !== owner) return;
|
|
262
|
+
handedOffNavAborts.add(owner);
|
|
263
|
+
},
|
|
264
|
+
|
|
265
|
+
// React has committed THIS tree, so every earlier one is unmounted and
|
|
266
|
+
// their streams no longer feed anything on screen. Forget them — they are
|
|
267
|
+
// left to finish on their own rather than aborted, since by here they are
|
|
268
|
+
// nearly done anyway and the point of the set is never to cut a stream
|
|
269
|
+
// that might still be feeding the screen.
|
|
270
|
+
//
|
|
271
|
+
// Pruning on commit rather than at handover is deliberate: between a
|
|
272
|
+
// successor's handover and its commit, React is still showing the
|
|
273
|
+
// PREVIOUS tree (that is what the transition buys), so the previous
|
|
274
|
+
// navigation's stream is still live on screen and must stay unabortable.
|
|
275
|
+
forgetOlderHandoffs(owner: AbortController): void {
|
|
276
|
+
for (const controller of handedOffNavAborts) {
|
|
277
|
+
if (controller !== owner) handedOffNavAborts.delete(controller);
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
isPending: () => routerPhase.phase === 'navigating',
|
|
282
|
+
getPendingUrl: () => (routerPhase.phase === 'navigating' ? routerPhase.targetUrl : null),
|
|
283
|
+
onPendingChange(listener) {
|
|
284
|
+
pendingListeners.add(listener);
|
|
285
|
+
return () => pendingListeners.delete(listener);
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigation Pipeline — URL in, tree in React's hands.
|
|
3
|
+
*
|
|
4
|
+
* Everything between "the user asked for this URL" and "React is holding the
|
|
5
|
+
* destination's tree": consult the prefetch cache or fetch, prepare the commit
|
|
6
|
+
* that makes the page current, and hand the result over inside a transition.
|
|
7
|
+
*
|
|
8
|
+
* `router.ts` keeps the *operations* — `navigate`, `refresh`, `handlePopState`,
|
|
9
|
+
* `prefetch`, `applyRevalidation` — and each of them is a call into here. The
|
|
10
|
+
* split is the same one `router-effects.ts` and `router-lifecycle.ts` made
|
|
11
|
+
* (design/18-build-system.md §"No file >500 lines").
|
|
12
|
+
*
|
|
13
|
+
* See design/19-client-navigation.md §"Partial Rendering" and §"Prefetching".
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { fetchRscPayload, NonRscResponse } from './rsc-fetch.js';
|
|
17
|
+
import type { FetchResult } from './rsc-fetch.js';
|
|
18
|
+
import { readPublishedParams, type ParamsSource } from '../shared/payload-root.js';
|
|
19
|
+
import type { PrefetchCache, PrefetchKey } from './segment-cache.js';
|
|
20
|
+
import { prefetchScopeOf } from './segment-cache.js';
|
|
21
|
+
import type { StateTree } from '../shared/segment-info.js';
|
|
22
|
+
import type { NavigationState } from './navigation-context.js';
|
|
23
|
+
import type { NavigationCommitter } from './navigation-commit.js';
|
|
24
|
+
import type { RouterDeps } from './router-types.js';
|
|
25
|
+
import { recordSkew } from './router-skew.js';
|
|
26
|
+
|
|
27
|
+
/** A fetched payload plus the state update that makes it the current page. */
|
|
28
|
+
export type NavigationPayload = FetchResult & {
|
|
29
|
+
navState: NavigationState;
|
|
30
|
+
commit: () => void;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/** Options for a single `performNavigationFetch` call. */
|
|
34
|
+
export interface NavigationFetchOptions {
|
|
35
|
+
replace: boolean;
|
|
36
|
+
commitUrl?: string;
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
skipHistory?: boolean;
|
|
39
|
+
departingUrl?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface NavigationPipelineDeps extends Pick<
|
|
43
|
+
NavigationCommitter,
|
|
44
|
+
'prepareNavigation' | 'currentStateTree'
|
|
45
|
+
> {
|
|
46
|
+
deps: RouterDeps;
|
|
47
|
+
prefetchCache: PrefetchCache;
|
|
48
|
+
/** Record that this navigation's tree reached React (router-lifecycle.ts). */
|
|
49
|
+
markHandedOff: (owner: AbortController) => void;
|
|
50
|
+
/** React committed this navigation's tree (router-lifecycle.ts). */
|
|
51
|
+
forgetOlderHandoffs: (owner: AbortController) => void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface NavigationPipeline {
|
|
55
|
+
/** Fetch (or replay a prefetch), then stage the commit. */
|
|
56
|
+
performNavigationFetch: (
|
|
57
|
+
url: string,
|
|
58
|
+
options: NavigationFetchOptions
|
|
59
|
+
) => Promise<NavigationPayload>;
|
|
60
|
+
/** Hand a payload to React inside a transition, or render it directly in tests. */
|
|
61
|
+
renderViaTransition: (
|
|
62
|
+
url: string,
|
|
63
|
+
owner: AbortController,
|
|
64
|
+
perform: () => Promise<NavigationPayload>
|
|
65
|
+
) => Promise<void>;
|
|
66
|
+
/** Render a decoded payload into the DOM if a renderer is available. */
|
|
67
|
+
renderPayload: (payload: unknown, navState: NavigationState, params: ParamsSource) => void;
|
|
68
|
+
/** Resolve thenable payloads on the fallback (test) path. */
|
|
69
|
+
resolveForFallback: (payload: unknown) => Promise<unknown>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Normalize a departing URL to the pathname the server is told about.
|
|
74
|
+
*
|
|
75
|
+
* This is the value sent as `X-Timber-URL` *and* the source half of the
|
|
76
|
+
* prefetch cache key — one function so a prefetch and the click that consumes
|
|
77
|
+
* it can never disagree about what "where we came from" means (TIM-1265). The
|
|
78
|
+
* query is dropped deliberately: it would land in the `_rsc` digest, which is
|
|
79
|
+
* logged (TIM-1268), and nothing downstream reads it — slot-skip resolution
|
|
80
|
+
* and interception scope both compare pathnames.
|
|
81
|
+
*
|
|
82
|
+
* Absolute inputs parse against the base and ignore it, so one call handles
|
|
83
|
+
* both `location.href` and a bare pathname.
|
|
84
|
+
*/
|
|
85
|
+
export function departingPathname(raw: string): string {
|
|
86
|
+
return new URL(raw, 'http://localhost').pathname;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The prefetch cache key for a destination.
|
|
91
|
+
*
|
|
92
|
+
* Both halves of the cache are keyed through here — the hover that writes an
|
|
93
|
+
* entry (`router.ts`'s `prefetch()`) and the click that consumes it
|
|
94
|
+
* (`performNavigationFetch` below) — so the two cannot disagree about what
|
|
95
|
+
* identifies a payload. That is the whole point of the key: `from` scopes it
|
|
96
|
+
* to the page the link was on (TIM-1265) and `scope` to the tree that was
|
|
97
|
+
* mounted (TIM-1282), and an entry written under one reading of either would
|
|
98
|
+
* simply never be found under the other, silently costing every prefetch.
|
|
99
|
+
*
|
|
100
|
+
* `departingPathname` is applied here rather than by callers for the same
|
|
101
|
+
* reason: it is also what goes out as `X-Timber-URL`, so the key and the
|
|
102
|
+
* request describe the same departure point.
|
|
103
|
+
*/
|
|
104
|
+
export function prefetchKeyFor(
|
|
105
|
+
url: string,
|
|
106
|
+
departingUrl: string,
|
|
107
|
+
stateTree: StateTree | undefined
|
|
108
|
+
): PrefetchKey {
|
|
109
|
+
return { url, from: departingPathname(departingUrl), scope: prefetchScopeOf(stateTree) };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function isPartialNavigation(skippedSegments: string[] | null | undefined): boolean {
|
|
113
|
+
return skippedSegments != null && skippedSegments.length > 0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Build a segment updates map for partial navigation. Identifies the
|
|
118
|
+
* first non-skipped segment and maps it to the payload content.
|
|
119
|
+
*/
|
|
120
|
+
function buildSegmentUpdates(result: FetchResult): Map<string, unknown> {
|
|
121
|
+
const skipped = new Set(result.skippedSegments!);
|
|
122
|
+
const segmentInfo = result.segmentInfo;
|
|
123
|
+
const updates = new Map<string, unknown>();
|
|
124
|
+
if (segmentInfo) {
|
|
125
|
+
for (const info of segmentInfo) {
|
|
126
|
+
if (!skipped.has(info.segmentId ?? info.path)) {
|
|
127
|
+
updates.set(info.segmentId ?? info.path, result.payload);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return updates;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Inspect a decode rejection for version skew before handing the promise on,
|
|
137
|
+
* without changing what the consumer sees.
|
|
138
|
+
*
|
|
139
|
+
* The decode rejects independently of the fetch, and not every consumer
|
|
140
|
+
* awaits it — NavigationRoot drops it outright when the transition has been
|
|
141
|
+
* superseded. A stale client reference arriving that way is still evidence
|
|
142
|
+
* the bundle is superseded, so record it here where every consumer is fed
|
|
143
|
+
* from, rather than at each place that might drop it (TIM-1275).
|
|
144
|
+
*/
|
|
145
|
+
function observeSkew(decodePromise: Promise<void> | null): Promise<void> | null {
|
|
146
|
+
decodePromise?.catch((error: unknown) => void recordSkew(error));
|
|
147
|
+
return decodePromise;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function createNavigationPipeline({
|
|
151
|
+
deps,
|
|
152
|
+
prefetchCache,
|
|
153
|
+
currentStateTree,
|
|
154
|
+
prepareNavigation,
|
|
155
|
+
markHandedOff,
|
|
156
|
+
forgetOlderHandoffs,
|
|
157
|
+
}: NavigationPipelineDeps): NavigationPipeline {
|
|
158
|
+
/** Render a decoded RSC payload into the DOM if a renderer is available. */
|
|
159
|
+
function renderPayload(payload: unknown, navState: NavigationState, params: ParamsSource): void {
|
|
160
|
+
if (deps.renderRoot) {
|
|
161
|
+
deps.renderRoot(payload, navState, params);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Resolve thenable payloads in the test/fallback path (no navigateTransition).
|
|
167
|
+
* In production, React handles thenables from createFromFetch directly via
|
|
168
|
+
* Suspense. In tests, renderRoot is a plain mock that expects resolved values.
|
|
169
|
+
*/
|
|
170
|
+
async function resolveForFallback(payload: unknown): Promise<unknown> {
|
|
171
|
+
if (
|
|
172
|
+
!deps.navigateTransition &&
|
|
173
|
+
payload != null &&
|
|
174
|
+
typeof payload === 'object' &&
|
|
175
|
+
'then' in payload
|
|
176
|
+
) {
|
|
177
|
+
return await (payload as PromiseLike<unknown>);
|
|
178
|
+
}
|
|
179
|
+
return payload;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Render a payload via navigateTransition (production) or renderRoot (tests).
|
|
184
|
+
* The perform callback should fetch data, prepare the commit, and return the
|
|
185
|
+
* FetchResult plus the NavigationState and the commit thunk.
|
|
186
|
+
*
|
|
187
|
+
* The thunk is handed *through* to NavigationRoot rather than called here:
|
|
188
|
+
* state management (segmentCache, navState, historyStack) has to happen on
|
|
189
|
+
* the far side of the supersession check, which only NavigationRoot can
|
|
190
|
+
* make (TIM-1301). The fallback path below has no transition to be
|
|
191
|
+
* superseded by, so it commits directly.
|
|
192
|
+
*/
|
|
193
|
+
async function renderViaTransition(
|
|
194
|
+
url: string,
|
|
195
|
+
owner: AbortController,
|
|
196
|
+
perform: () => Promise<NavigationPayload>
|
|
197
|
+
): Promise<void> {
|
|
198
|
+
// Record that THIS navigation's payload has reached React, at the moment
|
|
199
|
+
// the tree is built and handed back for `navigateTransition` to give to
|
|
200
|
+
// React — NOT on commit, which is a whole commit phase too late. See
|
|
201
|
+
// `handedOffNavAborts` in router-lifecycle.ts.
|
|
202
|
+
const handOff = (): void => markHandedOff(owner);
|
|
203
|
+
|
|
204
|
+
// Drop the earlier handoffs once React has committed this tree — the
|
|
205
|
+
// trees they were feeding are gone. Wrapped around the commit thunk so it
|
|
206
|
+
// runs on React's commit and not at handover; see `forgetOlderHandoffs`.
|
|
207
|
+
const commitAndForget = (commit: () => void) => (): void => {
|
|
208
|
+
forgetOlderHandoffs(owner);
|
|
209
|
+
commit();
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
if (deps.navigateTransition) {
|
|
213
|
+
await deps.navigateTransition(url, async (wrapPayload) => {
|
|
214
|
+
const result = await perform();
|
|
215
|
+
// Await the payload's *root row* — the same thing React would suspend
|
|
216
|
+
// on to render the tree, and the first thing Flight emits. The
|
|
217
|
+
// previous UI stays on screen while this resolves: nothing has been
|
|
218
|
+
// handed to React yet, and when it is, NavigationRoot hands it over
|
|
219
|
+
// inside a transition so a tree that is still streaming does not
|
|
220
|
+
// displace the departing page (TIM-1306).
|
|
221
|
+
//
|
|
222
|
+
// Reading them here rather than with `use()` above the tree is what
|
|
223
|
+
// keeps a decode failure contained: `result.params` never rejects, so
|
|
224
|
+
// the rejection reaches React only through the tree, inside whatever
|
|
225
|
+
// error boundary the app put around it (TIM-1297).
|
|
226
|
+
const params = await result.params;
|
|
227
|
+
|
|
228
|
+
if (isPartialNavigation(result.skippedSegments)) {
|
|
229
|
+
const segmentUpdates = buildSegmentUpdates(result);
|
|
230
|
+
|
|
231
|
+
// Re-wrap the CURRENT element with new context values.
|
|
232
|
+
// SegmentOutlets read updates from SegmentUpdateContext;
|
|
233
|
+
// NavigationProvider gets the new pathname; the params published
|
|
234
|
+
// above the retained tree are the *incoming* route's.
|
|
235
|
+
const element = wrapPayload(
|
|
236
|
+
deps._getCurrentPayload?.() ?? result.payload,
|
|
237
|
+
result.navState,
|
|
238
|
+
params,
|
|
239
|
+
segmentUpdates
|
|
240
|
+
);
|
|
241
|
+
handOff();
|
|
242
|
+
return {
|
|
243
|
+
element,
|
|
244
|
+
decodePromise: observeSkew(result.decodePromise),
|
|
245
|
+
commit: commitAndForget(result.commit),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Full navigation — empty updates, render the new tree.
|
|
250
|
+
const element = wrapPayload(result.payload, result.navState, params);
|
|
251
|
+
handOff();
|
|
252
|
+
return {
|
|
253
|
+
element,
|
|
254
|
+
decodePromise: observeSkew(result.decodePromise),
|
|
255
|
+
commit: commitAndForget(result.commit),
|
|
256
|
+
};
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
// Fallback: no transition (tests, no React tree)
|
|
261
|
+
const result = await perform();
|
|
262
|
+
handOff();
|
|
263
|
+
commitAndForget(result.commit)();
|
|
264
|
+
if (!isPartialNavigation(result.skippedSegments)) {
|
|
265
|
+
renderPayload(result.payload, result.navState, await result.params);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Core navigation logic shared between the transition and fallback paths.
|
|
271
|
+
* Fetches the RSC payload, updates all state, and returns the result.
|
|
272
|
+
*/
|
|
273
|
+
async function performNavigationFetch(
|
|
274
|
+
url: string,
|
|
275
|
+
options: NavigationFetchOptions
|
|
276
|
+
): Promise<NavigationPayload> {
|
|
277
|
+
// Both halves of the key are sampled here, before the prefetch cache is
|
|
278
|
+
// consulted, and both are reused for the request itself:
|
|
279
|
+
//
|
|
280
|
+
// - the departing page, because an entry fetched from somewhere else
|
|
281
|
+
// answers a different question (TIM-1265). `getCurrentUrl()` can't be
|
|
282
|
+
// read any later either — the Navigation API may have already committed
|
|
283
|
+
// the destination URL (TIM-1232).
|
|
284
|
+
// - the mounted tree, so the entry this navigation looks up is keyed by
|
|
285
|
+
// the same scope the fetch would have been issued with (TIM-1282).
|
|
286
|
+
//
|
|
287
|
+
// `currentUrl` is read back off the key rather than computed beside it, so
|
|
288
|
+
// the pathname sent as X-Timber-URL is the one the lookup used.
|
|
289
|
+
const stateTree = currentStateTree();
|
|
290
|
+
const cacheKey = prefetchKeyFor(url, options.departingUrl ?? deps.getCurrentUrl(), stateTree);
|
|
291
|
+
const currentUrl = cacheKey.from;
|
|
292
|
+
|
|
293
|
+
// Check prefetch cache first. A negative entry means a prior prefetch
|
|
294
|
+
// determined this URL is not a route (non-RSC Content-Type). Hard-navigate
|
|
295
|
+
// immediately without a second fetch. See TIM-1231.
|
|
296
|
+
if (prefetchCache.isNegative(cacheKey)) {
|
|
297
|
+
prefetchCache.consume(cacheKey);
|
|
298
|
+
throw new NonRscResponse(url);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// PrefetchResult has optional segmentInfo/params fields — normalize
|
|
302
|
+
// to null for FetchResult compatibility.
|
|
303
|
+
const prefetched = prefetchCache.consume(cacheKey);
|
|
304
|
+
let result: FetchResult | undefined = prefetched
|
|
305
|
+
? {
|
|
306
|
+
payload: prefetched.payload,
|
|
307
|
+
// A prefetch that predates this field (or the negative-entry
|
|
308
|
+
// sentinel) publishes nothing rather than the previous route's.
|
|
309
|
+
params: prefetched.params ?? readPublishedParams(undefined),
|
|
310
|
+
// Carry the prefetch's stream completion through. It may still be
|
|
311
|
+
// decoding, and a stale client reference arriving after the click
|
|
312
|
+
// must reach *this* navigation's recovery rather than dying with
|
|
313
|
+
// the prefetch that started it (TIM-1275).
|
|
314
|
+
decodePromise: prefetched.decodePromise ?? null,
|
|
315
|
+
segmentInfo: prefetched.segmentInfo ?? null,
|
|
316
|
+
skippedSegments: prefetched.skippedSegments ?? null,
|
|
317
|
+
// Entries written before this field carried it are treated as
|
|
318
|
+
// cacheable, which is what they were before a deny could be one.
|
|
319
|
+
status: prefetched.status ?? 200,
|
|
320
|
+
}
|
|
321
|
+
: undefined;
|
|
322
|
+
|
|
323
|
+
if (result === undefined) {
|
|
324
|
+
// Fetch RSC payload with state tree for partial rendering.
|
|
325
|
+
// Send departing URL (pre-navigation) for slot skip comparison.
|
|
326
|
+
result = await fetchRscPayload(url, deps, stateTree, currentUrl, options.signal);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Update the browser history — skip when the Navigation API has already
|
|
330
|
+
// updated the URL via event.intercept() (external navigations).
|
|
331
|
+
// The committed URL keeps the #fragment (commitUrl) even though the
|
|
332
|
+
// fetch/history-stack URL is hash-less (TIM-1035).
|
|
333
|
+
//
|
|
334
|
+
// Deferred with the rest of the commit: the address bar is navigation
|
|
335
|
+
// state like the segment cache and the history stack, and a superseded
|
|
336
|
+
// navigation must not move it either. That guarantee used to hold only
|
|
337
|
+
// because the superseded fetch was aborted before it got here — a
|
|
338
|
+
// response that won the race anyway re-pushed the abandoned URL
|
|
339
|
+
// (TIM-1022's failure mode, made unconditional by TIM-1301).
|
|
340
|
+
const commitHistoryUrl = (): void => {
|
|
341
|
+
if (options.skipHistory) return;
|
|
342
|
+
const commitUrl = options.commitUrl ?? url;
|
|
343
|
+
// Set the router-navigating flag so the Navigation API's navigate
|
|
344
|
+
// listener doesn't double-intercept this pushState/replaceState.
|
|
345
|
+
deps.setRouterNavigating?.(true);
|
|
346
|
+
if (options.replace) {
|
|
347
|
+
deps.replaceState({ timber: true, scrollY: 0 }, '', commitUrl);
|
|
348
|
+
} else {
|
|
349
|
+
deps.pushState({ timber: true, scrollY: 0 }, '', commitUrl);
|
|
350
|
+
}
|
|
351
|
+
deps.setRouterNavigating?.(false);
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// Resolve thenable payloads in the test path so popstate replay
|
|
355
|
+
// and renderPayload receive plain values (see resolveForFallback).
|
|
356
|
+
const payload = await resolveForFallback(result.payload);
|
|
357
|
+
const params = await result.params;
|
|
358
|
+
|
|
359
|
+
// Prepare the atomic navigation-state update. It is published by the
|
|
360
|
+
// caller once this navigation is known to have won (TIM-1301).
|
|
361
|
+
// Partial navigations and slot-skip navigations store null payload —
|
|
362
|
+
// the RSC tree contains skip holes that can't be replayed standalone;
|
|
363
|
+
// popstate will fetch fresh.
|
|
364
|
+
const isPartial = isPartialNavigation(result.skippedSegments);
|
|
365
|
+
const hasSkippedSlots = result.segmentInfo?.some((s) => s.slot && s.skipped) ?? false;
|
|
366
|
+
const { navState, commit } = prepareNavigation(url, {
|
|
367
|
+
payload: isPartial || hasSkippedSlots ? null : payload,
|
|
368
|
+
params,
|
|
369
|
+
segmentInfo: result.segmentInfo,
|
|
370
|
+
status: result.status,
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
return {
|
|
374
|
+
...result,
|
|
375
|
+
payload,
|
|
376
|
+
params,
|
|
377
|
+
navState,
|
|
378
|
+
commit: () => {
|
|
379
|
+
commitHistoryUrl();
|
|
380
|
+
commit();
|
|
381
|
+
// Notify nuqs (and any other listener) that the URL is now the
|
|
382
|
+
// destination's. It travels *inside* the commit rather than after
|
|
383
|
+
// the navigation resolves because the listener answers it by reading
|
|
384
|
+
// `window.location.search`, and the commit is what moves it — the
|
|
385
|
+
// publish happens on React's commit of the tree, which can land after
|
|
386
|
+
// the navigation promise settles (TIM-1301, codex on #998).
|
|
387
|
+
window.dispatchEvent(new Event('timber:navigation-end'));
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return { performNavigationFetch, renderViaTransition, renderPayload, resolveForFallback };
|
|
393
|
+
}
|