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