@timber-js/app 0.2.0-alpha.2 → 0.2.0-alpha.200
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 +346 -0
- package/dist/_chunks/actions-d1hCqnU3.js +345 -0
- package/dist/_chunks/actions-d1hCqnU3.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-DTmSGLRz.js +135 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +1 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js +370 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/cache-api-ByagcC-J.js +1149 -0
- package/dist/_chunks/cache-api-ByagcC-J.js.map +1 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
- package/dist/_chunks/chains-Bpb0W4ax.js +412 -0
- package/dist/_chunks/chains-Bpb0W4ax.js.map +1 -0
- package/dist/_chunks/cli-check-D6VolrDV.js +293 -0
- package/dist/_chunks/cli-check-D6VolrDV.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js +299 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js.map +1 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js +1290 -0
- package/dist/_chunks/cloudflare-BFb__LYG.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-fRkwVwEH.js +893 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js +1050 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.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-Dw6BJPG7.js +458 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.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/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.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/live-graph-D_2D32Ad.js +150 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js.map +1 -0
- package/dist/_chunks/logger-uLBuGKDI.js +1484 -0
- package/dist/_chunks/logger-uLBuGKDI.js.map +1 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js +135 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js +321 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js +101 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.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/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.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/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-AiazgH_f.js +1771 -0
- package/dist/_chunks/scanner-AiazgH_f.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-D9_89u34.js +34 -0
- package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
- package/dist/_chunks/segment-keys-lqtdookO.js +256 -0
- package/dist/_chunks/segment-keys-lqtdookO.js.map +1 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-D6T6Y3ef.js} +3 -31
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
- package/dist/_chunks/state-FippDgxN.js +52 -0
- package/dist/_chunks/state-FippDgxN.js.map +1 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.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/walkers-B6XUtmqK.js +144 -0
- package/dist/_chunks/walkers-B6XUtmqK.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 +74 -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 +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +200 -22
- 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-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +82 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +457 -288
- 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/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +150 -0
- package/dist/analyze/classify.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.d.ts +17 -0
- package/dist/analyze/crawl-entry.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.js +313 -0
- package/dist/analyze/crawl-entry.js.map +1 -0
- package/dist/analyze/crawl.d.ts +134 -0
- package/dist/analyze/crawl.d.ts.map +1 -0
- package/dist/analyze/graph-cache.d.ts +104 -0
- package/dist/analyze/graph-cache.d.ts.map +1 -0
- package/dist/analyze/graph-command.d.ts +43 -0
- package/dist/analyze/graph-command.d.ts.map +1 -0
- package/dist/analyze/graph-command.js +472 -0
- package/dist/analyze/graph-command.js.map +1 -0
- package/dist/analyze/live-graph.d.ts +81 -0
- package/dist/analyze/live-graph.d.ts.map +1 -0
- package/dist/analyze/poison-rules.d.ts +72 -0
- package/dist/analyze/poison-rules.d.ts.map +1 -0
- package/dist/analyze/poison-scan.d.ts +48 -0
- package/dist/analyze/poison-scan.d.ts.map +1 -0
- package/dist/analyze/scan.d.ts +73 -0
- package/dist/analyze/scan.d.ts.map +1 -0
- 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 +27 -0
- package/dist/cache/fast-hash.d.ts.map +1 -0
- 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 +32 -9
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -284
- 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 +141 -9
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +21 -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 +21 -11
- 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 +20 -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 +163 -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 +75 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +175 -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 +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +44 -0
- package/dist/client/browser-entry/action-queue.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 +63 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -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 +46 -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/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +66 -6
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- 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/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +323 -1148
- 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 +818 -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/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- 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 +98 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +51 -31
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +98 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +187 -0
- package/dist/client/navigation-transition.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 +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +44 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +130 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +87 -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 +272 -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 +104 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +161 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -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-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.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 +29 -7
- 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 +19 -8
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- 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 +13 -11
- 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 +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- 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 +322 -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/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -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 +46 -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 +112 -8
- 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/css.d.ts +2 -1
- package/dist/fonts/css.d.ts.map +1 -1
- 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 +5 -3
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +6 -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 +35 -153
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10488 -13975
- 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 +54 -7
- 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-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- 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 +32 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -65
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/graph-endpoint.d.ts +112 -0
- package/dist/plugins/graph-endpoint.d.ts.map +1 -0
- package/dist/plugins/mdx.d.ts +24 -5
- 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 +39 -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 +8 -3
- 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 +13 -7
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception-overlap.d.ts +35 -0
- package/dist/routing/interception-overlap.d.ts.map +1 -0
- 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 +14 -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 +14 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- 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 +98 -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 +39 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +29 -35
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +117 -13
- 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/csp-nonce.d.ts +45 -0
- package/dist/server/csp-nonce.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/debug.d.ts +82 -0
- package/dist/server/debug.d.ts.map +1 -0
- 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 +253 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +20 -9
- 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 +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +101 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- 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 +45 -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/form-flash.d.ts +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 +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +18 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +212 -2930
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4034 -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 +71 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +78 -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 +7 -1
- 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 +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +160 -24
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -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 +52 -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 +129 -45
- 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 +26 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +111 -107
- 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/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +40 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- 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 +40 -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 +26 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +39 -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 +37 -5
- 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/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
- 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 +29 -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 +137 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts +54 -0
- package/dist/server/slot-subtree-contain.d.ts.map +1 -0
- package/dist/server/ssr-bridge-types.d.ts +160 -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 +69 -22
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +93 -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 +56 -11
- package/dist/server/tracing.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 +88 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -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 +17 -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/waituntil-bridge.d.ts.map +1 -1
- 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 +16 -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 +52 -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/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.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-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- 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 +236 -0
- package/docs/api/31-api-client.mdx +167 -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 +329 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +192 -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/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +252 -0
- package/docs/learn/11-middleware.mdx +158 -0
- package/docs/learn/12-error-handling.mdx +188 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +117 -29
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +747 -130
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +279 -418
- 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/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +258 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +332 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +162 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +39 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +115 -22
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +69 -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 +180 -48
- 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 +23 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +34 -0
- package/src/cli-check.ts +507 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +262 -55
- package/src/client/browser-dev.ts +157 -2
- package/src/client/browser-entry/action-dispatch.ts +197 -0
- package/src/client/browser-entry/action-queue.ts +90 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +148 -0
- package/src/client/browser-entry/index.ts +131 -0
- package/src/client/browser-entry/post-hydration.ts +123 -0
- package/src/client/browser-entry/router-init.ts +418 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/deny-last-resort.tsx +54 -0
- package/src/client/error-boundary.tsx +316 -40
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +81 -10
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +452 -159
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +347 -0
- package/src/client/navigation-commit.ts +295 -0
- package/src/client/navigation-context.ts +67 -98
- package/src/client/navigation-root.tsx +224 -0
- package/src/client/navigation-transition.ts +327 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +72 -0
- package/src/client/router-effects.ts +228 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +490 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +294 -0
- package/src/client/router.ts +436 -424
- package/src/client/rsc-fetch.ts +512 -73
- package/src/client/segment-cache.ts +327 -40
- package/src/client/segment-context.ts +13 -5
- package/src/client/segment-outlet.tsx +96 -0
- package/src/client/segment-update-context.ts +23 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-content-cache-context.ts +43 -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 +30 -9
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +29 -15
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +36 -29
- package/src/client/unload-guard.ts +35 -3
- package/src/client/use-cookie.ts +70 -18
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +22 -31
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +6 -3
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +322 -0
- package/src/config-validation.ts +347 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- 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 +185 -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 +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +3 -2
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +101 -19
- package/src/fonts/local.ts +13 -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 +486 -344
- 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 +275 -43
- 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 +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +369 -96
- package/src/plugins/entries.ts +148 -18
- package/src/plugins/fonts.ts +251 -524
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +116 -40
- 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 +320 -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 +273 -277
- package/src/plugins/server-bundle.ts +103 -14
- package/src/plugins/shims.ts +259 -97
- package/src/plugins/static-build.ts +708 -66
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +141 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +623 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +393 -219
- 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 +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +19 -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 +196 -57
- package/src/server/action-client.ts +136 -35
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +256 -56
- package/src/server/actions.ts +112 -68
- package/src/server/als-registry.ts +160 -21
- 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/csp-nonce.ts +70 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/debug.ts +137 -0
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +533 -0
- package/src/server/deny-renderer.ts +214 -112
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +181 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +2 -2
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +272 -235
- package/src/server/index.ts +40 -192
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +173 -0
- package/src/server/logger.ts +73 -36
- package/src/server/metadata-collector.ts +174 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +23 -2
- package/src/server/middleware-runner.ts +32 -5
- package/src/server/node-stream-transforms.ts +323 -0
- package/src/server/nuqs-ssr-provider.tsx +8 -7
- package/src/server/param-coercion.ts +198 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +218 -0
- package/src/server/pipeline-phases.ts +606 -0
- package/src/server/pipeline.ts +343 -389
- package/src/server/port-resolution.ts +53 -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 +122 -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 +246 -97
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +35 -0
- package/src/server/request-context.ts +244 -333
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +508 -360
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +40 -13
- package/src/server/route-matcher.ts +165 -272
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +174 -0
- package/src/server/rsc-entry/api-handler.ts +78 -34
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +373 -95
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +405 -323
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +239 -50
- package/src/server/rsc-entry/rsc-stream.ts +160 -30
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +315 -57
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +3 -1
- 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/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +172 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +707 -300
- package/src/server/slot-subtree-contain.ts +255 -0
- package/src/server/ssr-bridge-types.ts +165 -0
- package/src/server/ssr-entry.ts +230 -85
- package/src/server/ssr-render.ts +357 -85
- package/src/server/ssr-wrappers.tsx +162 -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 +292 -0
- package/src/server/tracing.ts +151 -16
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +95 -10
- package/src/server/utils/element-type.ts +88 -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/waituntil-bridge.ts +5 -2
- 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 +16 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +59 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +109 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shared/status-reason-phrase.ts +61 -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-rsc.ts +47 -0
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
- package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
- package/dist/_chunks/format-DNt20Kt8.js +0 -163
- package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
- package/dist/_chunks/interception-DGDIjDbR.js +0 -676
- package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
- package/dist/_chunks/metadata-routes-CQCnF4VK.js +0 -153
- package/dist/_chunks/metadata-routes-CQCnF4VK.js.map +0 -1
- package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
- package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
- package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
- package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
- package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
- package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
- package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js +0 -109
- package/dist/_chunks/use-query-states-DAhgj8Gx.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 +0 -92
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/content/index.d.ts +0 -11
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -2
- 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/server/tree-builder.d.ts +0 -126
- package/dist/server/tree-builder.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 -99
- package/src/client/browser-entry.ts +0 -674
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -345
- package/src/client/stale-reload.ts +0 -89
- package/src/client/transition-root.tsx +0 -160
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/client/use-params.ts +0 -141
- package/src/content/index.ts +0 -13
- 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 -282
- 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/server/tree-builder.ts +0 -382
- package/src/shims/server-only-noop.js +0 -6
- package/src/utils/directive-parser.ts +0 -529
package/src/client/router.ts
CHANGED
|
@@ -1,132 +1,30 @@
|
|
|
1
|
-
// Segment Router —
|
|
1
|
+
// Segment Router — the operations a client-side navigation can be.
|
|
2
|
+
//
|
|
3
|
+
// `navigate`, `refresh`, `handlePopState`, `prefetch` and `applyActionResult`
|
|
4
|
+
// live here; each is wiring over modules that own one concern apiece:
|
|
5
|
+
//
|
|
6
|
+
// router-types.ts — RouterDeps / RouterInstance / the option shapes
|
|
7
|
+
// router-lifecycle.ts — ownership, supersede, pending store, handoff set
|
|
8
|
+
// router-pipeline.ts — URL in, tree in React's hands
|
|
9
|
+
// router-effects.ts — SPA exits, error recovery, post-paint scroll
|
|
10
|
+
// navigation-commit.ts — every write that makes a page "current"
|
|
11
|
+
//
|
|
2
12
|
// See design/19-client-navigation.md for the full architecture.
|
|
3
13
|
|
|
4
|
-
import { SegmentCache, PrefetchCache
|
|
5
|
-
import type { SegmentInfo } from '
|
|
6
|
-
import { HistoryStack } from './history';
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from './
|
|
15
|
-
import {
|
|
16
|
-
import type {
|
|
17
|
-
|
|
18
|
-
// ─── Types ───────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
export interface NavigationOptions {
|
|
21
|
-
/** Set to false to prevent scroll-to-top on forward navigation */
|
|
22
|
-
scroll?: boolean;
|
|
23
|
-
/** Use replaceState instead of pushState (replaces current history entry) */
|
|
24
|
-
replace?: boolean;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Function that decodes an RSC Flight stream into a React element tree.
|
|
29
|
-
* In production: createFromFetch from @vitejs/plugin-rsc/browser.
|
|
30
|
-
* In tests: a mock that returns the raw payload.
|
|
31
|
-
*/
|
|
32
|
-
export type RscDecoder = (fetchPromise: Promise<Response>) => unknown;
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Function that renders a decoded RSC element tree into the DOM.
|
|
36
|
-
* In production: reactRoot.render(element).
|
|
37
|
-
* In tests: a no-op or mock.
|
|
38
|
-
*/
|
|
39
|
-
export type RootRenderer = (element: unknown) => void;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Platform dependencies injected for testability. In production these
|
|
43
|
-
* map to browser APIs; in tests they're replaced with mocks.
|
|
44
|
-
*/
|
|
45
|
-
export interface RouterDeps {
|
|
46
|
-
fetch: (url: string, init: RequestInit) => Promise<Response>;
|
|
47
|
-
pushState: (data: unknown, unused: string, url: string) => void;
|
|
48
|
-
replaceState: (data: unknown, unused: string, url: string) => void;
|
|
49
|
-
scrollTo: (x: number, y: number) => void;
|
|
50
|
-
getCurrentUrl: () => string;
|
|
51
|
-
getScrollY: () => number;
|
|
52
|
-
/** Decode RSC Flight stream into React elements. If not provided, raw response text is stored. */
|
|
53
|
-
decodeRsc?: RscDecoder;
|
|
54
|
-
/** Render decoded RSC tree into the DOM. If not provided, rendering is a no-op. */
|
|
55
|
-
renderRoot?: RootRenderer;
|
|
56
|
-
/**
|
|
57
|
-
* Schedule a callback after the next paint. In the browser, this is
|
|
58
|
-
* requestAnimationFrame + setTimeout(0) to run after React commits.
|
|
59
|
-
* In tests, this runs the callback synchronously.
|
|
60
|
-
*/
|
|
61
|
-
afterPaint?: (callback: () => void) => void;
|
|
62
|
-
/** Apply resolved head elements (title, meta tags) to the DOM after navigation. */
|
|
63
|
-
applyHead?: (elements: HeadElement[]) => void;
|
|
64
|
-
/**
|
|
65
|
-
* Run a navigation inside a React transition with optimistic pending URL.
|
|
66
|
-
* The pending URL shows immediately (useOptimistic urgent update) and
|
|
67
|
-
* reverts when the transition commits (atomic with the new tree).
|
|
68
|
-
*
|
|
69
|
-
* The `perform` callback receives a `wrapPayload` function to wrap the
|
|
70
|
-
* decoded RSC payload with NavigationProvider + NuqsAdapter before
|
|
71
|
-
* TransitionRoot sets it as the new element.
|
|
72
|
-
*
|
|
73
|
-
* If not provided (tests), the router falls back to renderRoot.
|
|
74
|
-
*/
|
|
75
|
-
navigateTransition?: (
|
|
76
|
-
pendingUrl: string,
|
|
77
|
-
perform: (wrapPayload: (payload: unknown) => unknown) => Promise<unknown>
|
|
78
|
-
) => Promise<void>;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export interface RouterInstance {
|
|
82
|
-
/** Navigate to a new URL (forward navigation) */
|
|
83
|
-
navigate(url: string, options?: NavigationOptions): Promise<void>;
|
|
84
|
-
/** Full re-render of the current URL — no state tree sent */
|
|
85
|
-
refresh(): Promise<void>;
|
|
86
|
-
/** Handle a popstate event (back/forward button). scrollY is read from history.state. */
|
|
87
|
-
handlePopState(url: string, scrollY?: number): Promise<void>;
|
|
88
|
-
/** Whether a navigation is currently in flight */
|
|
89
|
-
isPending(): boolean;
|
|
90
|
-
/** The URL currently being navigated to, or null if idle */
|
|
91
|
-
getPendingUrl(): string | null;
|
|
92
|
-
/** Subscribe to pending state changes */
|
|
93
|
-
onPendingChange(listener: (pending: boolean) => void): () => void;
|
|
94
|
-
/** Prefetch an RSC payload for a URL (used by Link hover) */
|
|
95
|
-
prefetch(url: string): void;
|
|
96
|
-
/**
|
|
97
|
-
* Apply a piggybacked revalidation payload from a server action response.
|
|
98
|
-
* Renders the element tree and updates head elements without a server fetch.
|
|
99
|
-
* See design/08-forms-and-actions.md §"Single-Roundtrip Revalidation".
|
|
100
|
-
*/
|
|
101
|
-
applyRevalidation(element: unknown, headElements: HeadElement[] | null): void;
|
|
102
|
-
/**
|
|
103
|
-
* Populate the segment cache from server-provided segment metadata.
|
|
104
|
-
* Called on initial hydration with segment info embedded in the HTML.
|
|
105
|
-
*/
|
|
106
|
-
initSegmentCache(segments: SegmentInfo[]): void;
|
|
107
|
-
/**
|
|
108
|
-
* Cache segment elements from a decoded RSC element tree.
|
|
109
|
-
* Called on initial hydration to populate the element cache so the
|
|
110
|
-
* first client navigation can use partial payloads.
|
|
111
|
-
*/
|
|
112
|
-
cacheElementTree(element: unknown): void;
|
|
113
|
-
/** The segment cache (exposed for tests and <Link> prefetch) */
|
|
114
|
-
segmentCache: SegmentCache;
|
|
115
|
-
/** The prefetch cache (exposed for tests and <Link> prefetch) */
|
|
116
|
-
prefetchCache: PrefetchCache;
|
|
117
|
-
/** The history stack (exposed for tests) */
|
|
118
|
-
historyStack: HistoryStack;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Check if an error is an abort error (connection closed / fetch aborted).
|
|
123
|
-
* Browsers throw DOMException with name 'AbortError' when a fetch is aborted.
|
|
124
|
-
*/
|
|
125
|
-
function isAbortError(error: unknown): boolean {
|
|
126
|
-
if (error instanceof DOMException && error.name === 'AbortError') return true;
|
|
127
|
-
if (error instanceof Error && error.name === 'AbortError') return true;
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
14
|
+
import { SegmentCache, PrefetchCache } from './segment-cache.ts';
|
|
15
|
+
import type { SegmentInfo } from '../shared/segment-info.ts';
|
|
16
|
+
import { HistoryStack } from './history.ts';
|
|
17
|
+
import { createNavigationCommitter } from './navigation-commit.ts';
|
|
18
|
+
|
|
19
|
+
import { fetchRscPayload, NonRscResponse } from './rsc-fetch.ts';
|
|
20
|
+
import { readPayloadTree, readPublishedParams } from '../shared/payload-root.ts';
|
|
21
|
+
import { isClientStale } from './stale-client.ts';
|
|
22
|
+
import { createScrollEffects, createSpaExits, createNavigationRecovery } from './router-effects.ts';
|
|
23
|
+
import { createNavigationLifecycle } from './router-lifecycle.ts';
|
|
24
|
+
import { createNavigationPipeline, prefetchKeyFor } from './router-pipeline.ts';
|
|
25
|
+
import { recordSkew } from './router-skew.ts';
|
|
26
|
+
import type { NavigationOptions, RouterDeps, RouterInstance } from './router-types.ts';
|
|
27
|
+
import { createRenderOwner, type CommitOutcome } from './navigation-transition.ts';
|
|
130
28
|
|
|
131
29
|
// ─── Router Factory ──────────────────────────────────────────────
|
|
132
30
|
|
|
@@ -138,356 +36,470 @@ export function createRouter(deps: RouterDeps): RouterInstance {
|
|
|
138
36
|
const segmentCache = new SegmentCache();
|
|
139
37
|
const prefetchCache = new PrefetchCache();
|
|
140
38
|
const historyStack = new HistoryStack();
|
|
141
|
-
const segmentElementCache = new SegmentElementCache();
|
|
142
|
-
|
|
143
|
-
let pending = false;
|
|
144
|
-
let pendingUrl: string | null = null;
|
|
145
|
-
const pendingListeners = new Set<(pending: boolean) => void>();
|
|
146
|
-
|
|
147
|
-
function setPending(value: boolean, url?: string): void {
|
|
148
|
-
const newPendingUrl = value && url ? url : null;
|
|
149
|
-
if (pending === value && pendingUrl === newPendingUrl) return;
|
|
150
|
-
pending = value;
|
|
151
|
-
pendingUrl = newPendingUrl;
|
|
152
|
-
// Notify external store listeners (non-React consumers).
|
|
153
|
-
// React-facing pending state is handled by useOptimistic in
|
|
154
|
-
// TransitionRoot via navigateTransition — not this function.
|
|
155
|
-
for (const listener of pendingListeners) {
|
|
156
|
-
listener(value);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** Update the segment cache from server-provided segment metadata. */
|
|
161
|
-
function updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void {
|
|
162
|
-
if (!segmentInfo || segmentInfo.length === 0) return;
|
|
163
|
-
const tree = buildSegmentTree(segmentInfo);
|
|
164
|
-
if (tree) {
|
|
165
|
-
segmentCache.set('/', tree);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
39
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
*
|
|
201
|
-
* Sets both the module-level fallback (for tests and SSR) and the
|
|
202
|
-
* navigation context state (read by renderRoot to wrap the element
|
|
203
|
-
* in NavigationProvider). The context update is atomic with the tree
|
|
204
|
-
* render — both are passed to reactRoot.render() in the same call.
|
|
205
|
-
*/
|
|
206
|
-
function updateNavigationState(
|
|
207
|
-
params: Record<string, string | string[]> | null | undefined,
|
|
208
|
-
url: string
|
|
209
|
-
): void {
|
|
210
|
-
const resolvedParams = params ?? {};
|
|
211
|
-
// Module-level fallback for tests (no NavigationProvider) and SSR
|
|
212
|
-
setCurrentParams(resolvedParams);
|
|
213
|
-
// Navigation context — read by renderRoot to wrap the RSC element
|
|
214
|
-
const pathname = url.startsWith('http') ? new URL(url).pathname : url.split('?')[0] || '/';
|
|
215
|
-
setNavigationState({ params: resolvedParams, pathname });
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Render a payload via navigateTransition (production) or renderRoot (tests).
|
|
220
|
-
* The perform callback should fetch data, update state, and return the payload.
|
|
221
|
-
* In production, the entire callback runs inside a React transition with
|
|
222
|
-
* useOptimistic for the pending URL. In tests, the payload is rendered directly.
|
|
223
|
-
*/
|
|
224
|
-
async function renderViaTransition(
|
|
225
|
-
url: string,
|
|
226
|
-
perform: () => Promise<FetchResult>
|
|
227
|
-
): Promise<HeadElement[] | null> {
|
|
228
|
-
if (deps.navigateTransition) {
|
|
229
|
-
let headElements: HeadElement[] | null = null;
|
|
230
|
-
await deps.navigateTransition(url, async (wrapPayload) => {
|
|
231
|
-
const result = await perform();
|
|
232
|
-
headElements = result.headElements;
|
|
233
|
-
// Merge partial payload with cached segments before wrapping
|
|
234
|
-
const merged = mergeAndCachePayload(result.payload, result.skippedSegments);
|
|
235
|
-
// Store the MERGED payload in history — not the partial pre-merge tree.
|
|
236
|
-
// This ensures handlePopState replays the complete tree on back/forward.
|
|
237
|
-
historyStack.push(url, {
|
|
238
|
-
payload: merged,
|
|
239
|
-
headElements: result.headElements,
|
|
240
|
-
params: result.params,
|
|
241
|
-
});
|
|
242
|
-
return wrapPayload(merged);
|
|
243
|
-
});
|
|
244
|
-
return headElements;
|
|
245
|
-
}
|
|
246
|
-
// Fallback: no transition (tests, no React tree)
|
|
247
|
-
const result = await perform();
|
|
248
|
-
// Merge partial payload with cached segments before rendering
|
|
249
|
-
const merged = mergeAndCachePayload(result.payload, result.skippedSegments);
|
|
250
|
-
// Store merged payload in history
|
|
251
|
-
historyStack.push(url, {
|
|
252
|
-
payload: merged,
|
|
253
|
-
headElements: result.headElements,
|
|
254
|
-
params: result.params,
|
|
40
|
+
// Every write that makes a page "current", and the read that reports the
|
|
41
|
+
// current page back to the server. See navigation-commit.ts.
|
|
42
|
+
const { prepareNavigation, currentStateTree, updateSegmentCache } = createNavigationCommitter({
|
|
43
|
+
segmentCache,
|
|
44
|
+
historyStack,
|
|
45
|
+
clientSegmentCache: () => deps.clientSegmentCache,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Ownership of the router: who is navigating, whose fetch may be cut, and
|
|
49
|
+
// the pending store TopLoader subscribes to. See router-lifecycle.ts.
|
|
50
|
+
const lifecycle = createNavigationLifecycle(deps);
|
|
51
|
+
const {
|
|
52
|
+
currentOwner,
|
|
53
|
+
createNavOwner,
|
|
54
|
+
runNavigation,
|
|
55
|
+
markHandedOff,
|
|
56
|
+
forgetOlderHandoffs,
|
|
57
|
+
isPending,
|
|
58
|
+
getPendingUrl,
|
|
59
|
+
onPendingChange,
|
|
60
|
+
} = lifecycle;
|
|
61
|
+
|
|
62
|
+
// Fetch → commit → hand to React. See router-pipeline.ts.
|
|
63
|
+
const { performNavigationFetch, renderViaTransition, resolveForFallback } =
|
|
64
|
+
createNavigationPipeline({
|
|
65
|
+
deps,
|
|
66
|
+
prefetchCache,
|
|
67
|
+
currentStateTree,
|
|
68
|
+
prepareNavigation,
|
|
69
|
+
markHandedOff,
|
|
70
|
+
forgetOlderHandoffs,
|
|
255
71
|
});
|
|
256
|
-
renderPayload(merged);
|
|
257
|
-
return result.headElements;
|
|
258
|
-
}
|
|
259
72
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
url: string,
|
|
282
|
-
options: { replace: boolean }
|
|
283
|
-
): Promise<FetchResult> {
|
|
284
|
-
// Check prefetch cache first. PrefetchResult has optional segmentInfo/params
|
|
285
|
-
// fields — normalize to null for FetchResult compatibility.
|
|
286
|
-
const prefetched = prefetchCache.consume(url);
|
|
287
|
-
let result: FetchResult | undefined = prefetched
|
|
288
|
-
? {
|
|
289
|
-
payload: prefetched.payload,
|
|
290
|
-
headElements: prefetched.headElements,
|
|
291
|
-
segmentInfo: prefetched.segmentInfo ?? null,
|
|
292
|
-
params: prefetched.params ?? null,
|
|
293
|
-
skippedSegments: prefetched.skippedSegments ?? null,
|
|
294
|
-
}
|
|
295
|
-
: undefined;
|
|
296
|
-
|
|
297
|
-
if (result === undefined) {
|
|
298
|
-
// Fetch RSC payload with state tree for partial rendering.
|
|
299
|
-
// Send current URL for intercepting route resolution (modal pattern).
|
|
300
|
-
const stateTree = segmentCache.serializeStateTree(segmentElementCache.getMergeablePaths());
|
|
301
|
-
const rawCurrentUrl = deps.getCurrentUrl();
|
|
302
|
-
const currentUrl = rawCurrentUrl.startsWith('http')
|
|
303
|
-
? new URL(rawCurrentUrl).pathname
|
|
304
|
-
: new URL(rawCurrentUrl, 'http://localhost').pathname;
|
|
305
|
-
result = await fetchRscPayload(url, deps, stateTree, currentUrl);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// Update the browser history — replace mode overwrites the current entry
|
|
309
|
-
if (options.replace) {
|
|
310
|
-
deps.replaceState({ timber: true, scrollY: 0 }, '', url);
|
|
311
|
-
} else {
|
|
312
|
-
deps.pushState({ timber: true, scrollY: 0 }, '', url);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// NOTE: History push is deferred — the merged payload (after segment
|
|
316
|
-
// merging in renderViaTransition) is stored by the caller, not here.
|
|
317
|
-
// Storing result.payload here would record the partial (pre-merge)
|
|
318
|
-
// RSC tree, causing handlePopState to replay an incomplete tree.
|
|
319
|
-
|
|
320
|
-
// Update the segment cache with the new route's segment tree.
|
|
321
|
-
updateSegmentCache(result.segmentInfo);
|
|
322
|
-
|
|
323
|
-
// Update navigation state (params + pathname) before rendering.
|
|
324
|
-
updateNavigationState(result.params, url);
|
|
325
|
-
|
|
326
|
-
return result;
|
|
327
|
-
}
|
|
73
|
+
// Post-paint scroll effects.
|
|
74
|
+
const { restoreScrollAfterPaint, scrollToHashAfterPaint } = createScrollEffects(deps);
|
|
75
|
+
|
|
76
|
+
// The only ways out of the SPA. Every failure branch that gives up on
|
|
77
|
+
// client-side navigation goes through one of these, so the "does this
|
|
78
|
+
// navigation still own the router?" question is asked once rather than
|
|
79
|
+
// per branch (TIM-1275, TIM-1276).
|
|
80
|
+
const { leaveSpaIfOwned, leaveSpaSuperseding } = createSpaExits({
|
|
81
|
+
currentOwner,
|
|
82
|
+
supersede: () => void createNavOwner('navigation'),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Every way an RSC fetch can fail that the router answers rather than
|
|
86
|
+
// rethrows. Shared by navigate(), refresh(), and traversals so a path that
|
|
87
|
+
// grows a new branch grows it for all of them (TIM-1277).
|
|
88
|
+
const recoverFromNavigationError = createNavigationRecovery({
|
|
89
|
+
currentOwner,
|
|
90
|
+
leaveSpaIfOwned,
|
|
91
|
+
// Hoisted — `navigate` is a function declaration below.
|
|
92
|
+
navigate: (url) => navigate(url, { replace: true }),
|
|
93
|
+
});
|
|
328
94
|
|
|
329
95
|
async function navigate(url: string, options: NavigationOptions = {}): Promise<void> {
|
|
330
96
|
const scroll = options.scroll !== false;
|
|
331
97
|
const replace = options.replace === true;
|
|
98
|
+
const externalSignal = options._signal as AbortSignal | undefined;
|
|
99
|
+
const skipHistory = options._skipHistory === true;
|
|
100
|
+
|
|
101
|
+
// Split the #fragment off the navigation URL (TIM-1035). The full URL
|
|
102
|
+
// (with hash) is committed to the address bar; the hash-less URL is used
|
|
103
|
+
// for the RSC fetch (fragments are client-only — keeping it would also
|
|
104
|
+
// swallow the ?_rsc cache-bust param into the fragment) and for
|
|
105
|
+
// history-stack/prefetch keys (popstate lookups use pathname + search).
|
|
106
|
+
const hashIndex = url.indexOf('#');
|
|
107
|
+
const hash = hashIndex === -1 ? '' : url.slice(hashIndex);
|
|
108
|
+
const fetchUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
109
|
+
|
|
110
|
+
// Use the pre-intercept departing URL when the Navigation API has already
|
|
111
|
+
// committed the destination (_departingUrl from navigation-api.ts). Otherwise
|
|
112
|
+
// capture it now — getCurrentUrl() is still the departing URL at this point
|
|
113
|
+
// for non-Navigation-API navigations (TIM-1232).
|
|
114
|
+
const departingUrl = options._departingUrl ?? deps.getCurrentUrl();
|
|
332
115
|
|
|
333
116
|
// Capture the departing page's scroll position for scroll={false} preservation.
|
|
334
117
|
const currentScrollY = deps.getScrollY();
|
|
335
118
|
|
|
336
|
-
// Save the departing page's scroll position
|
|
337
|
-
//
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
119
|
+
// Save the departing page's scroll position — use Navigation API entry
|
|
120
|
+
// state when available, otherwise fall back to history.state.
|
|
121
|
+
if (deps.saveNavigationEntryScroll) {
|
|
122
|
+
deps.saveNavigationEntryScroll(currentScrollY);
|
|
123
|
+
} else {
|
|
124
|
+
deps.replaceState({ timber: true, scrollY: currentScrollY }, '', deps.getCurrentUrl());
|
|
125
|
+
}
|
|
342
126
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
127
|
+
// This bundle has been superseded. Every subsequent navigation is a full
|
|
128
|
+
// document load — it is the only way to get code that matches the server,
|
|
129
|
+
// and it is the recovery for a skew detected on an earlier navigation.
|
|
130
|
+
// Deliberately *not* a reload: recovery rides on navigations the user
|
|
131
|
+
// asked for, so a rollout that keeps serving mismatched builds costs one
|
|
132
|
+
// document load per click instead of a self-issued reload loop (TIM-1275).
|
|
133
|
+
// Scroll is saved above, so back-navigation still restores correctly.
|
|
134
|
+
if (isClientStale()) {
|
|
135
|
+
await leaveSpaSuperseding(url, departingUrl);
|
|
136
|
+
}
|
|
347
137
|
|
|
348
|
-
|
|
349
|
-
|
|
138
|
+
let effectiveSkipHistory = skipHistory;
|
|
139
|
+
|
|
140
|
+
await runNavigation(
|
|
141
|
+
url,
|
|
142
|
+
async (owner) => {
|
|
143
|
+
// When Navigation API is active, initiate the navigation via
|
|
144
|
+
// navigation.navigate() BEFORE the fetch. Must happen after
|
|
145
|
+
// createNavOwner supersedes the previous navigation (done by
|
|
146
|
+
// runNavigation) so the old deferred is resolved first.
|
|
147
|
+
if (!effectiveSkipHistory && deps.navigationNavigate) {
|
|
148
|
+
deps.setRouterNavigating?.(true);
|
|
149
|
+
deps.navigationNavigate(url, replace);
|
|
150
|
+
deps.setRouterNavigating?.(false);
|
|
151
|
+
effectiveSkipHistory = true;
|
|
152
|
+
}
|
|
350
153
|
|
|
351
|
-
|
|
352
|
-
|
|
154
|
+
try {
|
|
155
|
+
await renderViaTransition(
|
|
156
|
+
fetchUrl,
|
|
157
|
+
owner,
|
|
158
|
+
() =>
|
|
159
|
+
performNavigationFetch(fetchUrl, {
|
|
160
|
+
replace,
|
|
161
|
+
commitUrl: url,
|
|
162
|
+
signal: owner.fetchAbort.signal,
|
|
163
|
+
skipHistory: effectiveSkipHistory,
|
|
164
|
+
departingUrl,
|
|
165
|
+
}),
|
|
166
|
+
options.onCommit
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
// Scroll-to-top on forward navigation, scroll to the #fragment target
|
|
170
|
+
// when the URL has one, or restore captured position for scroll={false}.
|
|
171
|
+
if (scroll && hash) {
|
|
172
|
+
scrollToHashAfterPaint(hash);
|
|
173
|
+
} else {
|
|
174
|
+
restoreScrollAfterPaint(scroll ? 0 : currentScrollY);
|
|
175
|
+
}
|
|
176
|
+
} catch (error) {
|
|
177
|
+
// `url` is where the user asked to go and `departingUrl` is where
|
|
178
|
+
// they were: a failure here finishes the click as a full document
|
|
179
|
+
// load of the destination, fragment included (TIM-1234). Reloading
|
|
180
|
+
// instead would rebuild the page they were *leaving* and discard
|
|
181
|
+
// the click (TIM-1275).
|
|
182
|
+
if (await recoverFromNavigationError(error, owner, url, departingUrl)) return;
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
externalSignal
|
|
187
|
+
);
|
|
188
|
+
}
|
|
353
189
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
190
|
+
/**
|
|
191
|
+
* Fetch a URL's RSC payload, commit it, and render — the pipeline shared by
|
|
192
|
+
* refresh() and an uncached back/forward traversal. Both can be the path
|
|
193
|
+
* that discovers a version skew, and both recover the same way (TIM-1275).
|
|
194
|
+
*
|
|
195
|
+
* Not `performNavigationFetch`: neither caller consults the prefetch cache
|
|
196
|
+
* (there is no link to have hovered) and neither moves the address bar (the
|
|
197
|
+
* browser is already where it is going), so the fetch is a plain one.
|
|
198
|
+
*/
|
|
199
|
+
async function fetchCommitAndRender(
|
|
200
|
+
url: string,
|
|
201
|
+
opts: {
|
|
202
|
+
/** Omitted by refresh(): the server renders the complete payload. */
|
|
203
|
+
stateTree?: { segments: string[] };
|
|
204
|
+
/** Restored after paint when present — traversals only. */
|
|
205
|
+
scrollY?: number;
|
|
206
|
+
externalSignal?: AbortSignal;
|
|
207
|
+
/** Fires once when React commits, or when the navigation is abandoned. */
|
|
208
|
+
onCommit?: (outcome: CommitOutcome) => void;
|
|
209
|
+
} = {}
|
|
210
|
+
): Promise<void> {
|
|
211
|
+
await runNavigation(
|
|
212
|
+
url,
|
|
213
|
+
async (owner) => {
|
|
214
|
+
try {
|
|
215
|
+
await renderViaTransition(
|
|
216
|
+
url,
|
|
217
|
+
owner,
|
|
218
|
+
async () => {
|
|
219
|
+
const result = await fetchRscPayload(
|
|
220
|
+
url,
|
|
221
|
+
deps,
|
|
222
|
+
opts.stateTree,
|
|
223
|
+
undefined,
|
|
224
|
+
owner.fetchAbort.signal
|
|
225
|
+
);
|
|
226
|
+
const payload = await resolveForFallback(result.payload);
|
|
227
|
+
const params = await result.params;
|
|
228
|
+
const { navState, commit } = prepareNavigation(url, {
|
|
229
|
+
payload,
|
|
230
|
+
params,
|
|
231
|
+
segmentInfo: result.segmentInfo,
|
|
232
|
+
skippedSegments: result.skippedSegments,
|
|
233
|
+
});
|
|
234
|
+
return { ...result, payload, params, navState, commit };
|
|
235
|
+
},
|
|
236
|
+
opts.onCommit
|
|
237
|
+
);
|
|
238
|
+
} catch (error) {
|
|
239
|
+
// Neither path is a navigate(), and neither has a caller that
|
|
240
|
+
// handles a rejection — `refresh()` is `void`-called everywhere it
|
|
241
|
+
// is used, and nobody awaits a traversal at all. Without the same
|
|
242
|
+
// recovery `navigate()` gets, a 500 on Back left the user on the
|
|
243
|
+
// old document with an unhandled rejection in the console
|
|
244
|
+
// (TIM-1277).
|
|
245
|
+
//
|
|
246
|
+
// `url` is both the destination and the departure point: the
|
|
247
|
+
// browser has already traversed, and `refresh()` is by definition
|
|
248
|
+
// where it already is. So `hardNavigate()` takes its same-document
|
|
249
|
+
// branch and reloads rather than pushing an entry.
|
|
250
|
+
if (await recoverFromNavigationError(error, owner, url, url)) return;
|
|
251
|
+
throw error;
|
|
362
252
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
setPending(false);
|
|
369
|
-
await navigate(error.redirectUrl, { replace: true });
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
// Abort errors are not application errors — swallow silently.
|
|
373
|
-
if (isAbortError(error)) return;
|
|
374
|
-
throw error;
|
|
375
|
-
} finally {
|
|
376
|
-
setPending(false);
|
|
377
|
-
}
|
|
253
|
+
|
|
254
|
+
if (opts.scrollY !== undefined) restoreScrollAfterPaint(opts.scrollY);
|
|
255
|
+
},
|
|
256
|
+
opts.externalSignal
|
|
257
|
+
);
|
|
378
258
|
}
|
|
379
259
|
|
|
380
|
-
async function refresh(): Promise<void> {
|
|
260
|
+
async function refresh(options?: { onCommit?: (outcome: CommitOutcome) => void }): Promise<void> {
|
|
381
261
|
const currentUrl = deps.getCurrentUrl();
|
|
382
262
|
|
|
383
|
-
|
|
263
|
+
// A refresh on a stale client is a full document load of the current URL.
|
|
264
|
+
// Same rule as navigate(): the RSC fetch would only be answered with
|
|
265
|
+
// another reload signal, and this is caller-initiated, not spontaneous
|
|
266
|
+
// (TIM-1275).
|
|
267
|
+
if (isClientStale()) {
|
|
268
|
+
await leaveSpaSuperseding(currentUrl, currentUrl);
|
|
269
|
+
}
|
|
384
270
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
// No state tree sent — server renders the complete RSC payload
|
|
388
|
-
const result = await fetchRscPayload(currentUrl, deps);
|
|
389
|
-
// History push handled by renderViaTransition (stores merged payload)
|
|
390
|
-
updateSegmentCache(result.segmentInfo);
|
|
391
|
-
updateNavigationState(result.params, currentUrl);
|
|
392
|
-
return result;
|
|
393
|
-
});
|
|
271
|
+
await fetchCommitAndRender(currentUrl, { onCommit: options?.onCommit });
|
|
272
|
+
}
|
|
394
273
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
274
|
+
async function handlePopState(
|
|
275
|
+
url: string,
|
|
276
|
+
scrollY: number = 0,
|
|
277
|
+
externalSignal?: AbortSignal
|
|
278
|
+
): Promise<void> {
|
|
279
|
+
// A stale client hard-navigates on back/forward too — this path never
|
|
280
|
+
// reaches navigate(), so it needs the same check. `url` is where the
|
|
281
|
+
// browser has *already* traversed to, so leaveSpa's same-document
|
|
282
|
+
// branch reloads there rather than pushing a new entry (TIM-1275).
|
|
283
|
+
//
|
|
284
|
+
// This overrides the cached-payload replay below on purpose. Replaying
|
|
285
|
+
// would work — the payload was decoded by this bundle — but it would keep
|
|
286
|
+
// the user on superseded code for as long as they browse within history.
|
|
287
|
+
if (isClientStale()) {
|
|
288
|
+
await leaveSpaSuperseding(url, url);
|
|
398
289
|
}
|
|
399
|
-
}
|
|
400
290
|
|
|
401
|
-
async function handlePopState(url: string, scrollY: number = 0): Promise<void> {
|
|
402
291
|
// Scroll position is read from history.state by the caller (browser-entry.ts)
|
|
403
292
|
// and passed in. This is more reliable than tracking scroll per-URL in memory
|
|
404
293
|
// because the browser maintains per-entry state even with duplicate URLs.
|
|
405
294
|
const entry = historyStack.get(url);
|
|
406
295
|
|
|
407
296
|
if (entry && entry.payload !== null) {
|
|
408
|
-
// Replay cached payload — no server roundtrip
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
297
|
+
// Replay cached payload — no server roundtrip.
|
|
298
|
+
//
|
|
299
|
+
// runNavigation supersedes any in-flight forward navigation (TIM-1022):
|
|
300
|
+
// aborts its fetch and invalidates its render transition so the stale
|
|
301
|
+
// forward payload can't commit over this replay. The replay itself is
|
|
302
|
+
// synchronous — the fn resolves immediately.
|
|
303
|
+
await runNavigation(
|
|
304
|
+
url,
|
|
305
|
+
async (owner) => {
|
|
306
|
+
// clearSegmentCacheOnEmpty: popstate to an entry without layout
|
|
307
|
+
// metadata (e.g., initial SSR page) clears the cache so the next
|
|
308
|
+
// forward navigation gets a full render.
|
|
309
|
+
//
|
|
310
|
+
// No fetch to be superseded — `runNavigation` has already superseded
|
|
311
|
+
// whatever was in flight before it (TIM-1022) — but the render still
|
|
312
|
+
// goes out through a transition React may hold (a replayed tree can
|
|
313
|
+
// suspend), so the publish rides that commit rather than running
|
|
314
|
+
// here. Publishing first would advertise the replayed route's slot
|
|
315
|
+
// keys while the slot content cache still describes the departing
|
|
316
|
+
// one (TIM-1423, codex on #1108).
|
|
317
|
+
//
|
|
318
|
+
// Routed through renderViaTransition so the replay gets the same
|
|
319
|
+
// lifecycle every other render has — handoff tracking, commit-on-
|
|
320
|
+
// commit, forgetOlderHandoffs — rather than a hand-rolled publish
|
|
321
|
+
// that misses one of them (TIM-1478). The perform resolves
|
|
322
|
+
// immediately: there is no fetch, and the cached payload is
|
|
323
|
+
// already decoded.
|
|
324
|
+
await renderViaTransition(url, owner, async () => {
|
|
325
|
+
const { navState, commit } = prepareNavigation(url, {
|
|
326
|
+
payload: entry.payload,
|
|
327
|
+
params: entry.params,
|
|
328
|
+
segmentInfo: entry.segmentInfo,
|
|
329
|
+
clearSegmentCacheOnEmpty: true,
|
|
330
|
+
});
|
|
331
|
+
return {
|
|
332
|
+
payload: entry.payload,
|
|
333
|
+
params: entry.params,
|
|
334
|
+
navState,
|
|
335
|
+
commit,
|
|
336
|
+
decodePromise: null,
|
|
337
|
+
segmentInfo: entry.segmentInfo ?? null,
|
|
338
|
+
skippedSegments: null,
|
|
339
|
+
};
|
|
340
|
+
});
|
|
341
|
+
restoreScrollAfterPaint(scrollY);
|
|
342
|
+
},
|
|
343
|
+
externalSignal
|
|
344
|
+
);
|
|
416
345
|
} else {
|
|
417
346
|
// No cached payload — fetch from server.
|
|
418
347
|
// This happens when navigating back to the initial SSR'd page
|
|
419
348
|
// (its payload is null since it was rendered via SSR, not RSC fetch)
|
|
420
349
|
// or when the entry doesn't exist at all.
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
updateSegmentCache(result.segmentInfo);
|
|
427
|
-
updateNavigationState(result.params, url);
|
|
428
|
-
// History push handled by renderViaTransition (stores merged payload)
|
|
429
|
-
return result;
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
applyHead(headElements);
|
|
433
|
-
afterPaint(() => {
|
|
434
|
-
deps.scrollTo(0, scrollY);
|
|
435
|
-
window.dispatchEvent(new Event('timber:scroll-restored'));
|
|
436
|
-
});
|
|
437
|
-
} finally {
|
|
438
|
-
setPending(false);
|
|
439
|
-
}
|
|
350
|
+
await fetchCommitAndRender(url, {
|
|
351
|
+
stateTree: currentStateTree(),
|
|
352
|
+
scrollY,
|
|
353
|
+
externalSignal,
|
|
354
|
+
});
|
|
440
355
|
}
|
|
441
356
|
}
|
|
442
357
|
|
|
443
358
|
/**
|
|
444
359
|
* Prefetch an RSC payload for a URL and store it in the prefetch cache.
|
|
445
360
|
* Called on hover of <Link prefetch> elements.
|
|
361
|
+
*
|
|
362
|
+
* Concurrent hovers and a click during the round-trip coalesce via the
|
|
363
|
+
* singleflight inside PrefetchCache (TIM-1438).
|
|
446
364
|
*/
|
|
447
365
|
function prefetch(url: string): void {
|
|
448
|
-
//
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
366
|
+
// A stale client hard-navigates on every navigation, so a prefetched RSC
|
|
367
|
+
// payload could never be consumed — and the fetch would be answered with
|
|
368
|
+
// another reload signal anyway (TIM-1275).
|
|
369
|
+
if (isClientStale()) return;
|
|
370
|
+
|
|
371
|
+
// Strip fragment — it's client-only and would swallow the _rsc cache-bust
|
|
372
|
+
// param into the hash. The hash-less key also matches navigate()'s fetchUrl.
|
|
373
|
+
const hashIndex = url.indexOf('#');
|
|
374
|
+
const fetchUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
375
|
+
|
|
376
|
+
// The page the link is on. Sent as X-Timber-URL so the prefetched payload
|
|
377
|
+
// is the one the click would have produced — an intercepting link hovered
|
|
378
|
+
// from /gallery must prefetch the modal, not the full page — and stored
|
|
379
|
+
// under the same source so only a click departing from here consumes it
|
|
380
|
+
// (TIM-1265). The key is built by the pipeline, which is also what builds
|
|
381
|
+
// the one the click looks up with, so the two cannot disagree.
|
|
382
|
+
const stateTree = currentStateTree();
|
|
383
|
+
const cacheKey = prefetchKeyFor(fetchUrl, deps.getCurrentUrl(), stateTree);
|
|
384
|
+
const from = cacheKey.from;
|
|
385
|
+
|
|
386
|
+
// Don't prefetch if already cached (ready or negative)
|
|
387
|
+
if (prefetchCache.has(cacheKey)) return;
|
|
388
|
+
|
|
389
|
+
// Fire-and-forget. Concurrent hovers coalesce in the singleflight;
|
|
390
|
+
// a click during the round-trip joins the same flight via
|
|
391
|
+
// fetchOrCoalesce in performNavigationFetch (TIM-1438).
|
|
392
|
+
void prefetchCache
|
|
393
|
+
.fetchOrCoalesce(
|
|
394
|
+
cacheKey,
|
|
395
|
+
(signal) => fetchRscPayload(fetchUrl, deps, stateTree, from, signal),
|
|
396
|
+
(err) => err instanceof NonRscResponse
|
|
397
|
+
)
|
|
398
|
+
.then(
|
|
399
|
+
(outcome) => {
|
|
400
|
+
if (outcome.kind === 'ready') {
|
|
401
|
+
// The decode rejects separately from the fetch, so the stale
|
|
402
|
+
// shapes reach us here rather than in the rejection handler
|
|
403
|
+
// below — swallowing it wholesale threw away the same evidence
|
|
404
|
+
// (TIM-1275).
|
|
405
|
+
outcome.result.decodePromise?.catch((error: unknown) => void recordSkew(error));
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
(error) => {
|
|
409
|
+
// A prefetch can be the first thing to learn we are stale —
|
|
410
|
+
// during a rollout it may reach the new deployment while the
|
|
411
|
+
// click that follows reaches the old one and completes as an
|
|
412
|
+
// ordinary SPA navigation, throwing the evidence away. Record
|
|
413
|
+
// it, but never recover from here: nobody navigated, and a page
|
|
414
|
+
// load triggered by a hover is exactly the unasked-for reload
|
|
415
|
+
// this design removed. The next click takes the document-load
|
|
416
|
+
// path (TIM-1275).
|
|
417
|
+
recordSkew(error);
|
|
418
|
+
}
|
|
419
|
+
);
|
|
462
420
|
}
|
|
463
421
|
|
|
464
422
|
return {
|
|
465
423
|
navigate,
|
|
466
424
|
refresh,
|
|
467
425
|
handlePopState,
|
|
468
|
-
isPending
|
|
469
|
-
getPendingUrl
|
|
470
|
-
onPendingChange
|
|
471
|
-
pendingListeners.add(listener);
|
|
472
|
-
return () => pendingListeners.delete(listener);
|
|
473
|
-
},
|
|
426
|
+
isPending,
|
|
427
|
+
getPendingUrl,
|
|
428
|
+
onPendingChange,
|
|
474
429
|
prefetch,
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
430
|
+
epoch: () => lifecycle.epoch(),
|
|
431
|
+
|
|
432
|
+
async applyActionResult(epoch, tree) {
|
|
433
|
+
if (!lifecycle.isEpochCurrent(epoch)) return false;
|
|
434
|
+
if (tree === undefined) {
|
|
435
|
+
// Await through the commit so the next queued action captures a
|
|
436
|
+
// current epoch — refresh() alone resolves before React commits
|
|
437
|
+
// on the History API fallback (codex on #1125). The outcome
|
|
438
|
+
// distinguishes a committed refresh from one superseded by a
|
|
439
|
+
// navigation the user started while the refresh was in flight
|
|
440
|
+
// (TIM-1477).
|
|
441
|
+
let outcomeResolve!: (o: CommitOutcome) => void;
|
|
442
|
+
const outcomePromise = new Promise<CommitOutcome>((r) => (outcomeResolve = r));
|
|
443
|
+
const [, outcome] = await Promise.all([
|
|
444
|
+
refresh({ onCommit: outcomeResolve }).catch(() => {}),
|
|
445
|
+
outcomePromise,
|
|
446
|
+
]);
|
|
447
|
+
return outcome === 'committed';
|
|
448
|
+
}
|
|
449
|
+
// Render the piggybacked payload from a server action response.
|
|
450
|
+
// Routed through renderViaTransition so the piggybacked tree gets
|
|
451
|
+
// the same commit lifecycle every other render has (TIM-1478).
|
|
452
|
+
// The perform resolves immediately — the payload is already in hand.
|
|
480
453
|
const currentUrl = deps.getCurrentUrl();
|
|
481
|
-
const
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
454
|
+
const payloadTree = readPayloadTree(tree);
|
|
455
|
+
const params = readPublishedParams(tree);
|
|
456
|
+
const existingEntry = historyStack.get(currentUrl);
|
|
457
|
+
|
|
458
|
+
let outcomeResolve!: (o: CommitOutcome) => void;
|
|
459
|
+
const outcomePromise = new Promise<CommitOutcome>((r) => (outcomeResolve = r));
|
|
460
|
+
// Place in the lifecycle's slot so a concurrent navigation supersedes
|
|
461
|
+
// this owner. The epoch check above ensures the slot is idle. Don't use
|
|
462
|
+
// createNavOwner — that bumps navigationSeq, which is reserved for
|
|
463
|
+
// navigations (the epoch test pins this: TIM-1474).
|
|
464
|
+
const owner = createRenderOwner('revalidation');
|
|
465
|
+
lifecycle.placeRevalidationOwner(owner);
|
|
466
|
+
const [, outcome] = await Promise.all([
|
|
467
|
+
renderViaTransition(
|
|
468
|
+
currentUrl,
|
|
469
|
+
owner,
|
|
470
|
+
async () => {
|
|
471
|
+
const { navState, commit } = prepareNavigation(currentUrl, {
|
|
472
|
+
payload: payloadTree,
|
|
473
|
+
params,
|
|
474
|
+
segmentInfo: existingEntry?.segmentInfo,
|
|
475
|
+
});
|
|
476
|
+
return {
|
|
477
|
+
payload: payloadTree,
|
|
478
|
+
params,
|
|
479
|
+
navState,
|
|
480
|
+
commit,
|
|
481
|
+
decodePromise: null,
|
|
482
|
+
segmentInfo: existingEntry?.segmentInfo ?? null,
|
|
483
|
+
skippedSegments: null,
|
|
484
|
+
};
|
|
485
|
+
},
|
|
486
|
+
outcomeResolve
|
|
487
|
+
).catch(() => {}),
|
|
488
|
+
outcomePromise,
|
|
489
|
+
]);
|
|
490
|
+
return outcome === 'committed';
|
|
491
|
+
},
|
|
492
|
+
runWhenIdle: (task: () => void) => lifecycle.runWhenIdle(task),
|
|
493
|
+
settleHandoffs: () => lifecycle.settleHandoffs(),
|
|
494
|
+
invalidatePath(path: string): void {
|
|
495
|
+
historyStack.delete(path);
|
|
496
|
+
prefetchCache.invalidateUrl(path);
|
|
497
|
+
},
|
|
498
|
+
evictStaleCaches(): void {
|
|
499
|
+
prefetchCache.clearReady();
|
|
500
|
+
historyStack.clearExcept(deps.getCurrentUrl());
|
|
488
501
|
},
|
|
489
502
|
initSegmentCache: (segments: SegmentInfo[]) => updateSegmentCache(segments),
|
|
490
|
-
cacheElementTree: (element: unknown) => cacheSegmentElements(element, segmentElementCache),
|
|
491
503
|
segmentCache,
|
|
492
504
|
prefetchCache,
|
|
493
505
|
historyStack,
|