@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,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NavigationRoot — Wrapper component for transition-based rendering.
|
|
3
|
+
*
|
|
4
|
+
* Solves the "new boundary has no old content" problem for client-side
|
|
5
|
+
* navigation. When React renders a completely new Suspense boundary via
|
|
6
|
+
* root.render(), it shows the fallback immediately — root.render() is
|
|
7
|
+
* always an urgent update regardless of startTransition.
|
|
8
|
+
*
|
|
9
|
+
* NavigationRoot holds the current element in React state. Navigation
|
|
10
|
+
* updates call startTransition(() => setState(newElement)), which IS
|
|
11
|
+
* a transition update. React keeps the old committed tree visible while
|
|
12
|
+
* the new tree resolves, instead of hiding it behind a Suspense fallback.
|
|
13
|
+
*
|
|
14
|
+
* The navigation's async work runs OUTSIDE the transition scope and every
|
|
15
|
+
* state update it schedules gets its own synchronous `startTransition` — a
|
|
16
|
+
* transition scope does not survive an `await`, and an async callback that
|
|
17
|
+
* returns a thenable defers the commit past the promise callers await. See
|
|
18
|
+
* the long comment on `_navigateTransition` (TIM-1306).
|
|
19
|
+
*
|
|
20
|
+
* This component holds no pending state. The `TopLoader` it renders and the
|
|
21
|
+
* public `usePendingNavigation()` both subscribe to the router's external
|
|
22
|
+
* pending store; NavigationRoot's own `pendingUrl` was a second, unread
|
|
23
|
+
* representation of the same fact and is gone (TIM-1307).
|
|
24
|
+
*
|
|
25
|
+
* Hard navigation guard: When a hard navigation is triggered (500 error,
|
|
26
|
+
* version skew), the component throws an unresolved thenable AFTER all
|
|
27
|
+
* hooks to suspend forever — preventing React from rendering children
|
|
28
|
+
* during page teardown. The throw must come after hooks to satisfy
|
|
29
|
+
* React's rules (same hook count every render) while still preventing
|
|
30
|
+
* child renders that could hit hook count mismatches in components
|
|
31
|
+
* whose positions shift during teardown. This pattern is borrowed from
|
|
32
|
+
* Next.js (app-router.tsx pushRef.mpaNavigation — also after hooks).
|
|
33
|
+
*
|
|
34
|
+
* See design/05-streaming.md §"deferSuspenseFor"
|
|
35
|
+
* See design/19-client-navigation.md §"NavigationContext"
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import {
|
|
39
|
+
createElement,
|
|
40
|
+
Fragment,
|
|
41
|
+
startTransition,
|
|
42
|
+
useLayoutEffect,
|
|
43
|
+
useRef,
|
|
44
|
+
useState,
|
|
45
|
+
type ReactNode,
|
|
46
|
+
} from 'react';
|
|
47
|
+
import { TopLoader, type TopLoaderConfig } from './top-loader.js';
|
|
48
|
+
|
|
49
|
+
// ─── Transition Result ──────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* What a navigation's `perform()` hands back to the transition.
|
|
53
|
+
*
|
|
54
|
+
* Declared once and shared by every layer that passes it along — the router's
|
|
55
|
+
* `RouterDeps.navigateTransition` imports it too — so a field cannot be added
|
|
56
|
+
* to the producer and dropped by the adapter in between. `E` is the element
|
|
57
|
+
* type: `ReactNode` here, `unknown` in the router, which never touches it.
|
|
58
|
+
*/
|
|
59
|
+
export interface TransitionResult<E = ReactNode> {
|
|
60
|
+
/** The wrapped tree to render. */
|
|
61
|
+
element: E;
|
|
62
|
+
/** Resolves when the Flight stream finishes decoding, or null. */
|
|
63
|
+
decodePromise: Promise<void> | null;
|
|
64
|
+
/**
|
|
65
|
+
* Publishes the navigation's state — segment cache, pathname, address bar,
|
|
66
|
+
* history stack, and the client's record of the mounted tree — and
|
|
67
|
+
* announces it to listeners outside React.
|
|
68
|
+
*
|
|
69
|
+
* Run when React commits this tree, not when the tree is handed over: a
|
|
70
|
+
* tree React is still waiting on, or one a later navigation replaces first,
|
|
71
|
+
* has been given to React without being on screen. A superseded navigation
|
|
72
|
+
* never runs it and leaves every one of those consumers describing the
|
|
73
|
+
* route still on screen (TIM-1301).
|
|
74
|
+
*/
|
|
75
|
+
commit: () => void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The tree NavigationRoot holds in state, and the state publish that belongs
|
|
80
|
+
* to it. They travel as one object so React's commit of the tree is the event
|
|
81
|
+
* that publishes — see the effect in NavigationRoot.
|
|
82
|
+
*/
|
|
83
|
+
interface RenderedTree {
|
|
84
|
+
element: ReactNode;
|
|
85
|
+
publish: (() => void) | null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ─── Navigation Transition Counter ──────────────────────────────
|
|
89
|
+
// Monotonically increasing counter that increments each time
|
|
90
|
+
// navigateTransition() is called. Used to detect stale transitions:
|
|
91
|
+
// if a newer transition started while the current one's perform()
|
|
92
|
+
// was in flight, the current transition is stale and should reject.
|
|
93
|
+
//
|
|
94
|
+
// Separate from the link-pending navId (which only increments on
|
|
95
|
+
// link clicks). This counter covers all navigation types: link clicks,
|
|
96
|
+
// programmatic navigate(), refresh(), and handlePopState().
|
|
97
|
+
//
|
|
98
|
+
// Uses globalThis for singleton guarantee across chunks — same pattern
|
|
99
|
+
// as NavigationContext and the link pending store.
|
|
100
|
+
|
|
101
|
+
const NAV_TRANSITION_KEY = Symbol.for('__timber_nav_transition_counter');
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* `waiters` are woken on every bump so an in-flight navigation can stop
|
|
105
|
+
* waiting on its own payload the moment it is superseded — see
|
|
106
|
+
* `settleOnDecodeOrSupersession`.
|
|
107
|
+
*/
|
|
108
|
+
interface TransitionCounter {
|
|
109
|
+
id: number;
|
|
110
|
+
waiters: Set<() => void>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function getTransitionCounter(): TransitionCounter {
|
|
114
|
+
const g = globalThis as Record<symbol, unknown>;
|
|
115
|
+
const existing = g[NAV_TRANSITION_KEY] as Partial<TransitionCounter> | undefined;
|
|
116
|
+
if (!existing) {
|
|
117
|
+
const created: TransitionCounter = { id: 0, waiters: new Set() };
|
|
118
|
+
g[NAV_TRANSITION_KEY] = created;
|
|
119
|
+
return created;
|
|
120
|
+
}
|
|
121
|
+
// A duplicated copy of this module may have created the singleton before
|
|
122
|
+
// `waiters` existed. The object is shared across chunks, so fill it in
|
|
123
|
+
// rather than replacing it — replacing would strand the other copy's id.
|
|
124
|
+
existing.waiters ??= new Set();
|
|
125
|
+
return existing as TransitionCounter;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Bump the counter and wake everything waiting on an older transition. */
|
|
129
|
+
function bumpTransitionCounter(): number {
|
|
130
|
+
const counter = getTransitionCounter();
|
|
131
|
+
counter.id += 1;
|
|
132
|
+
for (const wake of [...counter.waiters]) wake();
|
|
133
|
+
return counter.id;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Invalidate all in-flight navigation transitions. Any navigateTransition()
|
|
138
|
+
* call whose perform() has not yet committed will reject with AbortError
|
|
139
|
+
* instead of committing its element.
|
|
140
|
+
*
|
|
141
|
+
* Called by the router when a render supersedes in-flight navigations
|
|
142
|
+
* WITHOUT going through navigateTransition() — the cached popstate replay
|
|
143
|
+
* renders via transitionRender(), which doesn't bump the counter, so a
|
|
144
|
+
* stale forward navigation's setElement would otherwise pass the
|
|
145
|
+
* `counter.id !== transId` guard and commit the forward page over the
|
|
146
|
+
* replayed back page (TIM-1022).
|
|
147
|
+
*/
|
|
148
|
+
export function supersedeNavigationTransitions(): void {
|
|
149
|
+
bumpTransitionCounter();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Wait for the payload to finish decoding, OR for this transition to be
|
|
154
|
+
* superseded — whichever happens first.
|
|
155
|
+
*
|
|
156
|
+
* A superseded navigation must stop waiting on its own stream. The stream is
|
|
157
|
+
* deliberately NOT aborted once its tree has been handed to React (the tree
|
|
158
|
+
* may be on screen with boundaries still feeding from it — see
|
|
159
|
+
* `handedOffNavAbort` in `client/router.ts`), so there is nothing left to make
|
|
160
|
+
* `decodePromise` settle promptly. Awaiting it bare would keep the loser's
|
|
161
|
+
* `router.navigate()` promise pending for the rest of the stream — and
|
|
162
|
+
* forever if it stalls — which is what `<Link>`'s `isPending` is timed
|
|
163
|
+
* against, so the losing link would sit spinning while the winner loaded
|
|
164
|
+
* (codex on #1004).
|
|
165
|
+
*
|
|
166
|
+
* A decode *failure* still propagates: it is a real error for this
|
|
167
|
+
* navigation, and the caller's recovery is timed against it.
|
|
168
|
+
*/
|
|
169
|
+
function settleOnDecodeOrSupersession(
|
|
170
|
+
decodePromise: Promise<void>,
|
|
171
|
+
counter: TransitionCounter,
|
|
172
|
+
transId: number
|
|
173
|
+
): Promise<void> {
|
|
174
|
+
if (counter.id !== transId) return Promise.resolve();
|
|
175
|
+
return new Promise<void>((resolve, reject) => {
|
|
176
|
+
const stopWaiting = (): void => {
|
|
177
|
+
counter.waiters.delete(wake);
|
|
178
|
+
};
|
|
179
|
+
const wake = (): void => {
|
|
180
|
+
if (counter.id !== transId) {
|
|
181
|
+
stopWaiting();
|
|
182
|
+
resolve();
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
counter.waiters.add(wake);
|
|
186
|
+
decodePromise.then(
|
|
187
|
+
() => {
|
|
188
|
+
stopWaiting();
|
|
189
|
+
resolve();
|
|
190
|
+
},
|
|
191
|
+
(error: unknown) => {
|
|
192
|
+
stopWaiting();
|
|
193
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
194
|
+
}
|
|
195
|
+
);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ─── Hard Navigation Guard ──────────────────────────────────────
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Module-level flag indicating a hard (MPA) navigation is in progress.
|
|
203
|
+
*
|
|
204
|
+
* When true:
|
|
205
|
+
* - NavigationRoot throws an unresolved thenable to suspend forever,
|
|
206
|
+
* preventing React from rendering children during page teardown
|
|
207
|
+
* (avoids "Rendered more hooks" crashes).
|
|
208
|
+
* - The Navigation API handler skips interception, letting the browser
|
|
209
|
+
* perform a full page load (prevents infinite loops where
|
|
210
|
+
* window.location.href → navigate event → router.navigate → 500 →
|
|
211
|
+
* window.location.href → ...).
|
|
212
|
+
*
|
|
213
|
+
* Uses globalThis for singleton guarantee across chunks (same pattern
|
|
214
|
+
* as NavigationContext). See design/19-client-navigation.md §"Singleton
|
|
215
|
+
* Guarantee via globalThis".
|
|
216
|
+
*/
|
|
217
|
+
const HARD_NAV_KEY = Symbol.for('__timber_hard_navigating');
|
|
218
|
+
|
|
219
|
+
function getHardNavStore(): { value: boolean } {
|
|
220
|
+
const g = globalThis as Record<symbol, unknown>;
|
|
221
|
+
if (!g[HARD_NAV_KEY]) {
|
|
222
|
+
g[HARD_NAV_KEY] = { value: false };
|
|
223
|
+
}
|
|
224
|
+
return g[HARD_NAV_KEY] as { value: boolean };
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Set the hard-navigating flag. Call this BEFORE setting
|
|
229
|
+
* window.location.href or window.location.reload() to prevent:
|
|
230
|
+
* 1. React from rendering children during page teardown
|
|
231
|
+
* 2. Navigation API from intercepting the hard navigation
|
|
232
|
+
*/
|
|
233
|
+
export function setHardNavigating(value: boolean): void {
|
|
234
|
+
getHardNavStore().value = value;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Check if a hard navigation is in progress.
|
|
239
|
+
* Used by NavigationRoot (throw unresolvedThenable) and by the
|
|
240
|
+
* Navigation API handler (skip interception).
|
|
241
|
+
*/
|
|
242
|
+
export function isHardNavigating(): boolean {
|
|
243
|
+
return getHardNavStore().value;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* A thenable that never resolves. When thrown during React render,
|
|
248
|
+
* it causes the component to suspend forever — React keeps the
|
|
249
|
+
* old committed tree visible and never attempts to render children.
|
|
250
|
+
*
|
|
251
|
+
* This is the same pattern Next.js uses in app-router.tsx for MPA
|
|
252
|
+
* navigations (pushRef.mpaNavigation → throw unresolvedThenable).
|
|
253
|
+
*/
|
|
254
|
+
// for React's Suspense mechanism. Same pattern as Next.js's unresolvedThenable.
|
|
255
|
+
// eslint-disable-next-line unicorn/no-thenable -- Intentionally a never-resolving thenable
|
|
256
|
+
const unresolvedThenable = { then() {} } as PromiseLike<never>;
|
|
257
|
+
|
|
258
|
+
// ─── Module-level functions ──────────────────────────────────────
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Module-level reference to the state setter wrapped in startTransition.
|
|
262
|
+
* Used for non-navigation renders (applyRevalidation, popstate replay).
|
|
263
|
+
*/
|
|
264
|
+
let _transitionRender: ((element: ReactNode) => void) | null = null;
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Module-level reference to the navigation transition function.
|
|
268
|
+
*
|
|
269
|
+
* Runs the fetch OUTSIDE any transition scope and wraps only the state update
|
|
270
|
+
* that hands the resulting tree to React — describing this as "a full
|
|
271
|
+
* navigation in a single startTransition" is the shape TIM-1306 removed.
|
|
272
|
+
*/
|
|
273
|
+
let _navigateTransition:
|
|
274
|
+
| ((url: string, perform: () => Promise<TransitionResult>) => Promise<void>)
|
|
275
|
+
| null = null;
|
|
276
|
+
|
|
277
|
+
// ─── Component ───────────────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Root wrapper component that enables transition-based rendering.
|
|
281
|
+
*
|
|
282
|
+
* Renders the TopLoader alongside the tree it holds in state. Neither adds a
|
|
283
|
+
* DOM element on the hydration path, so the tree matches the server HTML.
|
|
284
|
+
*
|
|
285
|
+
* Usage in browser-entry.ts:
|
|
286
|
+
* const rootEl = createElement(NavigationRoot, { initial: wrapped });
|
|
287
|
+
* reactRoot = hydrateRoot(document, rootEl);
|
|
288
|
+
*
|
|
289
|
+
* Subsequent navigations:
|
|
290
|
+
* navigateTransition(url, async () => { fetch; return wrappedElement; });
|
|
291
|
+
*
|
|
292
|
+
* Non-navigation renders:
|
|
293
|
+
* transitionRender(newWrappedElement);
|
|
294
|
+
*/
|
|
295
|
+
export function NavigationRoot({
|
|
296
|
+
initial,
|
|
297
|
+
topLoaderConfig,
|
|
298
|
+
}: {
|
|
299
|
+
initial: ReactNode;
|
|
300
|
+
topLoaderConfig?: TopLoaderConfig;
|
|
301
|
+
}): ReactNode {
|
|
302
|
+
const [rendered, setRendered] = useState<RenderedTree>({ element: initial, publish: null });
|
|
303
|
+
|
|
304
|
+
// Publish the navigation's state when React commits its tree — not when the
|
|
305
|
+
// tree is handed over. A tree React is still waiting on, or one a later
|
|
306
|
+
// navigation replaces before React renders it, has been *given* to React
|
|
307
|
+
// without being on screen; publishing then describes a route the user never
|
|
308
|
+
// saw, which is the defect this ordering exists to prevent (TIM-1301).
|
|
309
|
+
//
|
|
310
|
+
// A **layout** effect, so the publish lands before the browser paints and,
|
|
311
|
+
// more importantly, before every descendant's passive effect. A destination
|
|
312
|
+
// component that navigates from a mount effect — a redirect guard, a
|
|
313
|
+
// `refresh()` on mount — would otherwise start its navigation while the
|
|
314
|
+
// segment cache, address bar and pathname still described the departing
|
|
315
|
+
// route, and send an X-Timber-State-Tree for a tree that is no longer
|
|
316
|
+
// mounted (codex on #998).
|
|
317
|
+
//
|
|
318
|
+
// Descendant *layout* effects still run first: React runs layout effects
|
|
319
|
+
// child-before-parent, and the only way to precede them would be a fiber
|
|
320
|
+
// rendered as an earlier sibling of the payload. That is not free here —
|
|
321
|
+
// `server/ssr-wrappers.tsx` mirrors this component's fiber shape so `useId`
|
|
322
|
+
// agrees across hydration, and an extra sibling shifts every id in the
|
|
323
|
+
// payload subtree. A layout effect that navigates on mount is the price.
|
|
324
|
+
//
|
|
325
|
+
// Keyed on the tree object rather than on the effect run. A publish moves
|
|
326
|
+
// the address bar, which is not idempotent, so any second invocation for the
|
|
327
|
+
// same tree — an effect re-run React is entitled to perform — must be a
|
|
328
|
+
// no-op rather than a second history entry.
|
|
329
|
+
const publishedRef = useRef<RenderedTree | null>(null);
|
|
330
|
+
useLayoutEffect(() => {
|
|
331
|
+
if (publishedRef.current === rendered) return;
|
|
332
|
+
publishedRef.current = rendered;
|
|
333
|
+
rendered.publish?.();
|
|
334
|
+
}, [rendered]);
|
|
335
|
+
|
|
336
|
+
// NOTE: We use standalone `startTransition` (imported from 'react'),
|
|
337
|
+
// NOT `useTransition`. The `useTransition` hook's `startTransition`
|
|
338
|
+
// is tied to a single fiber and tracks one async callback at a time.
|
|
339
|
+
// When two navigations overlap (click slow-page, then click dashboard),
|
|
340
|
+
// calling useTransition's startTransition twice with concurrent async
|
|
341
|
+
// callbacks corrupts React's internal hook tracking — causing
|
|
342
|
+
// "Rendered more hooks than during the previous render."
|
|
343
|
+
//
|
|
344
|
+
// Standalone `startTransition` creates independent transition lanes
|
|
345
|
+
// for each call, so concurrent navigations don't interfere. We don't
|
|
346
|
+
// need useTransition's `isPending` — pending state lives in the router's
|
|
347
|
+
// external store, which TopLoader and usePendingNavigation() subscribe to.
|
|
348
|
+
//
|
|
349
|
+
// This matches the Next.js pattern (TIM-625): "No useTransition in
|
|
350
|
+
// the router at all — only standalone startTransition."
|
|
351
|
+
|
|
352
|
+
// Non-navigation render (revalidation, popstate cached replay).
|
|
353
|
+
// Non-navigation render (revalidation, popstate cached replay). Both publish
|
|
354
|
+
// synchronously in the router before calling this — neither has an in-flight
|
|
355
|
+
// window in which it could be superseded — so there is nothing to publish
|
|
356
|
+
// on commit.
|
|
357
|
+
_transitionRender = (newElement: ReactNode) => {
|
|
358
|
+
startTransition(() => {
|
|
359
|
+
setRendered({ element: newElement, publish: null });
|
|
360
|
+
});
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
// Full navigation transition.
|
|
364
|
+
//
|
|
365
|
+
// The async work runs OUTSIDE any transition scope, and each state update is
|
|
366
|
+
// its own synchronous `startTransition`. Two React behaviours force that
|
|
367
|
+
// shape; both were measured on React 19.2.7 (tests/navigation-transition-
|
|
368
|
+
// suspense.test.ts pins the observable half).
|
|
369
|
+
//
|
|
370
|
+
// 1. A transition scope does not survive an `await`. `startTransition`
|
|
371
|
+
// restores the previous scope in its `finally`, which for an async
|
|
372
|
+
// callback runs when that callback RETURNS — i.e. at its first `await`.
|
|
373
|
+
// So an update scheduled past an await inside `startTransition(async …)`
|
|
374
|
+
// is an ordinary urgent update:
|
|
375
|
+
//
|
|
376
|
+
// startTransition(() => setEl(x)) -> 'HOME' held
|
|
377
|
+
// startTransition(async () => { await p; setEl(x) }) -> fallback shown
|
|
378
|
+
//
|
|
379
|
+
// Left uncorrected, every navigation whose new tree suspends replaces the
|
|
380
|
+
// visible page with a Suspense fallback — the exact thing this component
|
|
381
|
+
// exists to prevent (TIM-1306). React documents the caveat under
|
|
382
|
+
// `startTransition`: updates after an await need their own transition.
|
|
383
|
+
//
|
|
384
|
+
// 2. Re-wrapping *inside* the async callback is not enough. Returning a
|
|
385
|
+
// thenable from `startTransition` hands it to `ReactSharedInternals.S`,
|
|
386
|
+
// which calls react-dom's `entangleAsyncAction`. That opens an action
|
|
387
|
+
// scope: `currentEntangledLane` collects EVERY transition update
|
|
388
|
+
// scheduled while the scope is open — including one from a nested,
|
|
389
|
+
// fully synchronous `startTransition` — and rendering that lane throws
|
|
390
|
+
// `currentEntangledActionThenable`, suspending until the action settles.
|
|
391
|
+
// Which is after the promise `navigateTransition` hands back, so a caller
|
|
392
|
+
// that awaits a navigation and then reads the DOM sees the departing
|
|
393
|
+
// page, and the TIM-1301 publish (a layout effect on the commit) is just
|
|
394
|
+
// as late. (Not `ReactSharedInternals.asyncTransitions` — that counter is
|
|
395
|
+
// write-only in 19.2.7.)
|
|
396
|
+
//
|
|
397
|
+
// No async action is created here, so every navigation commits as soon as
|
|
398
|
+
// React can render its destination — where TIM-1301 put it. That
|
|
399
|
+
// now holds for ALL of them. It used not to hold for `<Link>`, which wrapped
|
|
400
|
+
// `router.navigate()` in its own `useTransition`: that action scope
|
|
401
|
+
// entangled this component's updates just the same, so a Link navigation
|
|
402
|
+
// committed only once the payload had finished decoding, and with it
|
|
403
|
+
// `pushState`, the segment cache and `timber:navigation-end`. Link now calls
|
|
404
|
+
// `router.navigate()` outside any transition and tracks its own `isPending`
|
|
405
|
+
// with a plain `useState` (TIM-1307).
|
|
406
|
+
//
|
|
407
|
+
// Nothing here may reopen an action scope: no `startTransition` callback in
|
|
408
|
+
// this path may return a thenable, and no caller may invoke this from inside
|
|
409
|
+
// a React action scope. That is a rule about `startTransition`, not about
|
|
410
|
+
// `perform` — `perform` is async by contract and is awaited OUTSIDE any
|
|
411
|
+
// transition scope, which is exactly why it is safe.
|
|
412
|
+
//
|
|
413
|
+
// Standalone `startTransition` rather than `useTransition`'s is still
|
|
414
|
+
// deliberate — see the TIM-625 note above; each navigation needs an
|
|
415
|
+
// independent lane.
|
|
416
|
+
//
|
|
417
|
+
// `url` is unused: it named the pending state this component used to hold,
|
|
418
|
+
// and the router already publishes the same URL to its own pending store
|
|
419
|
+
// before calling here. It stays in the signature because the router's
|
|
420
|
+
// `RouterDeps.navigateTransition` adapter passes it and the argument reads
|
|
421
|
+
// at the call site.
|
|
422
|
+
_navigateTransition = (_url: string, perform: () => Promise<TransitionResult>) => {
|
|
423
|
+
// Increment the transition counter SYNCHRONOUSLY (before any await). Each
|
|
424
|
+
// call gets a unique transId; the counter is the same globalThis
|
|
425
|
+
// singleton, so a newer call always has a higher id.
|
|
426
|
+
const counter = getTransitionCounter();
|
|
427
|
+
const transId = bumpTransitionCounter();
|
|
428
|
+
|
|
429
|
+
const superseded = () => new DOMException('Navigation superseded', 'AbortError');
|
|
430
|
+
|
|
431
|
+
return (async () => {
|
|
432
|
+
const { element, decodePromise, commit } = await perform();
|
|
433
|
+
if (counter.id !== transId) {
|
|
434
|
+
decodePromise?.catch(() => {});
|
|
435
|
+
throw superseded();
|
|
436
|
+
}
|
|
437
|
+
// Hand the tree over with its commit attached. The effect above runs
|
|
438
|
+
// it if and when React commits this tree, so a navigation that is
|
|
439
|
+
// superseded while its payload streams publishes nothing (TIM-1301).
|
|
440
|
+
//
|
|
441
|
+
// This is THE update that must not hide the departing page (TIM-1306).
|
|
442
|
+
startTransition(() => {
|
|
443
|
+
setRendered({ element, publish: commit });
|
|
444
|
+
});
|
|
445
|
+
// React may commit the tree before this settles — that is the point:
|
|
446
|
+
// the destination reveals as React is able to render it
|
|
447
|
+
// rather than waiting for the whole Flight stream. The await is here so
|
|
448
|
+
// the promise this function hands back still means "the payload is
|
|
449
|
+
// decoded", which is what the router's scroll restoration, the
|
|
450
|
+
// Navigation API deferred and `<Link>`'s `isPending` are timed against.
|
|
451
|
+
//
|
|
452
|
+
// ...unless this navigation loses first, in which case it stops waiting
|
|
453
|
+
// on a stream that is no longer its business. See
|
|
454
|
+
// `settleOnDecodeOrSupersession`.
|
|
455
|
+
if (decodePromise) await settleOnDecodeOrSupersession(decodePromise, counter, transId);
|
|
456
|
+
if (counter.id !== transId) throw superseded();
|
|
457
|
+
})();
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
// ─── Hard navigation guard ─────────────────────────────────
|
|
461
|
+
// When a hard navigation is in progress (500 error, version skew),
|
|
462
|
+
// suspend forever to prevent React from rendering children during
|
|
463
|
+
// page teardown. This avoids "Rendered more hooks" crashes in
|
|
464
|
+
// CHILD components whose hook counts may shift during teardown.
|
|
465
|
+
//
|
|
466
|
+
// CRITICAL: This throw MUST come AFTER all hooks (the useState,
|
|
467
|
+
// useRef and useLayoutEffect above). React requires the same hooks
|
|
468
|
+
// to run on every render. If we threw before hooks, React would see
|
|
469
|
+
// 0 hooks on the re-render vs 3 on the initial render — triggering
|
|
470
|
+
// the exact "Rendered more hooks" error we're trying to prevent.
|
|
471
|
+
//
|
|
472
|
+
// By placing it after hooks but before the return, all hooks
|
|
473
|
+
// satisfy React's rules, but the thrown thenable prevents any
|
|
474
|
+
// children from rendering. Same pattern as Next.js app-router.tsx
|
|
475
|
+
// (pushRef.mpaNavigation — also placed after all hooks).
|
|
476
|
+
if (isHardNavigating()) {
|
|
477
|
+
throw unresolvedThenable;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// Inject TopLoader alongside the element tree. It subscribes to the router's
|
|
481
|
+
// pending store itself, so it takes no props from here beyond its config,
|
|
482
|
+
// and only it re-renders when a navigation starts or ends. Rendered only
|
|
483
|
+
// when not explicitly disabled via config.
|
|
484
|
+
//
|
|
485
|
+
// This Fragment is a FORK — two children — so it advances React's tree
|
|
486
|
+
// context and shifts every `useId` below it. `server/ssr-wrappers.tsx`
|
|
487
|
+
// mirrors it for exactly that reason; a single-child wrapper would not need
|
|
488
|
+
// a mirror. See tests/ssr-wrapper-parity.test.ts.
|
|
489
|
+
const showTopLoader = topLoaderConfig?.enabled !== false;
|
|
490
|
+
if (!showTopLoader) return rendered.element;
|
|
491
|
+
return createElement(
|
|
492
|
+
Fragment,
|
|
493
|
+
null,
|
|
494
|
+
createElement(TopLoader, { config: topLoaderConfig }),
|
|
495
|
+
rendered.element
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// ─── Public API ──────────────────────────────────────────────────
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Trigger a transition render for non-navigation updates.
|
|
503
|
+
* React keeps the old committed tree visible while any new Suspense
|
|
504
|
+
* boundaries in the update resolve.
|
|
505
|
+
*
|
|
506
|
+
* Used for: applyRevalidation, popstate replay with cached payload.
|
|
507
|
+
*/
|
|
508
|
+
export function transitionRender(element: ReactNode): void {
|
|
509
|
+
if (_transitionRender) {
|
|
510
|
+
_transitionRender(element);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Run a full navigation, handing its tree to React in a transition.
|
|
516
|
+
*
|
|
517
|
+
* The `perform` callback fetches the RSC payload, updates router state, and
|
|
518
|
+
* returns the wrapped React element. `perform` is async by contract and runs
|
|
519
|
+
* OUTSIDE any transition scope — only the `setRendered` that hands its result
|
|
520
|
+
* over is wrapped, in a synchronous `startTransition`.
|
|
521
|
+
*
|
|
522
|
+
* Do not call this from inside a React action scope, and never let a
|
|
523
|
+
* `startTransition` callback in this path return a thenable: either opens an
|
|
524
|
+
* action scope that entangles the update and defers the commit until the
|
|
525
|
+
* action settles (TIM-1306, TIM-1307).
|
|
526
|
+
*
|
|
527
|
+
* Returns a Promise that resolves when the async work completes — the payload
|
|
528
|
+
* is fetched, decoded, and handed to React. It does **not** wait for React to
|
|
529
|
+
* commit the tree, so the state that publishes on that commit (address bar,
|
|
530
|
+
* segment cache, history entry, pathname) may still be a beat behind when it
|
|
531
|
+
* resolves. Anything that needs the destination to be current should listen
|
|
532
|
+
* for `timber:navigation-end`, which is dispatched by the publish itself.
|
|
533
|
+
*
|
|
534
|
+
* Awaiting the publish here was tried and rejected: it makes the promise
|
|
535
|
+
* depend on a React commit, which never arrives if the root unmounts
|
|
536
|
+
* mid-navigation, and deadlocks any caller that awaits a navigation inside
|
|
537
|
+
* `act()`.
|
|
538
|
+
*
|
|
539
|
+
* Used for: navigate(), refresh(), popstate with fetch.
|
|
540
|
+
*/
|
|
541
|
+
export function navigateTransition(
|
|
542
|
+
url: string,
|
|
543
|
+
perform: () => Promise<TransitionResult>
|
|
544
|
+
): Promise<void> {
|
|
545
|
+
if (_navigateTransition) {
|
|
546
|
+
return _navigateTransition(url, perform);
|
|
547
|
+
}
|
|
548
|
+
// Fallback: no NavigationRoot mounted (shouldn't happen in production).
|
|
549
|
+
// Nothing can supersede a transition that does not exist, so the commit
|
|
550
|
+
// runs unconditionally.
|
|
551
|
+
return perform().then((result) => result.commit());
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Install one-shot deferred callbacks for the no-RSC bootstrap path (TIM-600).
|
|
556
|
+
*
|
|
557
|
+
* When there's no RSC payload, we can't create a React root immediately —
|
|
558
|
+
* `createRoot(document).render(...)` would blank the SSR HTML. Instead,
|
|
559
|
+
* this sets up `_transitionRender` and `_navigateTransition` so that the
|
|
560
|
+
* first client navigation triggers root creation via `createAndMount`.
|
|
561
|
+
*
|
|
562
|
+
* After `createAndMount` runs, NavigationRoot renders and overwrites these
|
|
563
|
+
* callbacks with its real `startTransition`-based implementations.
|
|
564
|
+
*/
|
|
565
|
+
export function installDeferredNavigation(createAndMount: (initial: ReactNode) => void): void {
|
|
566
|
+
let mounted = false;
|
|
567
|
+
const mountOnce = (element: ReactNode) => {
|
|
568
|
+
if (mounted) return;
|
|
569
|
+
mounted = true;
|
|
570
|
+
createAndMount(element);
|
|
571
|
+
};
|
|
572
|
+
_transitionRender = (element: ReactNode) => {
|
|
573
|
+
mountOnce(element);
|
|
574
|
+
};
|
|
575
|
+
_navigateTransition = async (_url: string, perform: () => Promise<TransitionResult>) => {
|
|
576
|
+
const { element, commit } = await perform();
|
|
577
|
+
commit();
|
|
578
|
+
mountOnce(element);
|
|
579
|
+
};
|
|
580
|
+
}
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
type unstable_AdapterOptions as AdapterOptions,
|
|
21
21
|
} from 'nuqs/adapters/custom';
|
|
22
22
|
import { getRouter } from './router-ref.js';
|
|
23
|
+
import { getNavigationApi } from './navigation-api.js';
|
|
23
24
|
|
|
24
25
|
// ─── Adapter Hook ─────────────────────────────────────────────────
|
|
25
26
|
|
|
@@ -59,9 +60,21 @@ function useTimberAdapter(_watchKeys: string[]): AdapterInterface {
|
|
|
59
60
|
|
|
60
61
|
if (options.shallow) {
|
|
61
62
|
// Shallow: update URL only, no server roundtrip.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
// When Navigation API is available, use navigation.navigate() with
|
|
64
|
+
// info: { shallow: true } so the navigate event handler knows to
|
|
65
|
+
// skip interception. Without this, the navigate event fired by
|
|
66
|
+
// history.pushState/replaceState would trigger a full RSC fetch.
|
|
67
|
+
const nav = getNavigationApi();
|
|
68
|
+
if (nav) {
|
|
69
|
+
nav.navigate(url.toString(), {
|
|
70
|
+
history: options.history === 'push' ? 'push' : 'replace',
|
|
71
|
+
info: { shallow: true },
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
const method =
|
|
75
|
+
options.history === 'push' ? window.history.pushState : window.history.replaceState;
|
|
76
|
+
method.call(window.history, window.history.state, '', url.toString());
|
|
77
|
+
}
|
|
65
78
|
|
|
66
79
|
// Update local state to reflect the new URL
|
|
67
80
|
setSearchParams(new URLSearchParams(url.search));
|