@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
|
@@ -0,0 +1,1024 @@
|
|
|
1
|
+
import { n as isRscContentType, t as RSC_CONTENT_TYPE } from "./rsc-media-type-DDc7duTD.js";
|
|
2
|
+
import { i as withBasePath, r as stripBasePath } from "./base-path-DaQrzbez.js";
|
|
3
|
+
import { n as rscPayloadPath } from "./rsc-payload-path-dffcs4jp.js";
|
|
4
|
+
import { a as randomRscCacheKey, n as RSC_KEY_PARAM, o as recordLookup, s as rscCacheKey } from "./rsc-cache-key-ClUiXQnK.js";
|
|
5
|
+
import { t as StatusPageMarker } from "./status-page-marker-BRX9Ib-d.js";
|
|
6
|
+
import { o as _setUnloading, p as unloading } from "./state-BhNGPsdi.js";
|
|
7
|
+
import { i as getRouterOrNull, t as setHardNavigating } from "./navigation-root-BQfo1-kG.js";
|
|
8
|
+
import { Component, createContext, createElement } from "react";
|
|
9
|
+
//#region src/shared/payload-root.ts
|
|
10
|
+
/**
|
|
11
|
+
* What a reader gets when the value it was handed is not a payload root.
|
|
12
|
+
*
|
|
13
|
+
* In the browser this is unreachable for a real response: all four producers
|
|
14
|
+
* of a route payload go through `withPublishedParams`, and a client talking to
|
|
15
|
+
* a different build is answered with 204 at Stage 1c
|
|
16
|
+
* (`server/pipeline-phases.ts`) before any payload exists. It is what a page
|
|
17
|
+
* with no payload at all publishes — a document hydrated without an inlined
|
|
18
|
+
* payload, or a prefetch entry that carries no params.
|
|
19
|
+
*/
|
|
20
|
+
var NO_PUBLISHED_PARAMS = {
|
|
21
|
+
params: {},
|
|
22
|
+
slotParams: null
|
|
23
|
+
};
|
|
24
|
+
/** True when `value` carries published params — a root, or a read of one. */
|
|
25
|
+
function hasPublishedParams(value) {
|
|
26
|
+
return typeof value === "object" && value !== null && "params" in value && typeof value.params === "object" && value.params !== null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Read the params published beside a tree.
|
|
30
|
+
*
|
|
31
|
+
* Accepts a payload root *or* a `PublishedParams` already split off one, so
|
|
32
|
+
* the client can pre-resolve on the navigation path and still hand the same
|
|
33
|
+
* value to the same provider. Never throws.
|
|
34
|
+
*/
|
|
35
|
+
function readPublishedParams(source) {
|
|
36
|
+
if (!hasPublishedParams(source)) return NO_PUBLISHED_PARAMS;
|
|
37
|
+
return {
|
|
38
|
+
params: source.params,
|
|
39
|
+
slotParams: source.slotParams ?? null
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Read the renderable tree out of a payload root.
|
|
44
|
+
*
|
|
45
|
+
* Returns the value unchanged when it is not a root, so a malformed value
|
|
46
|
+
* reaches React (and its error boundaries) rather than vanishing here.
|
|
47
|
+
*/
|
|
48
|
+
function readPayloadTree(root) {
|
|
49
|
+
if (typeof root === "object" && root !== null && "tree" in root && hasPublishedParams(root)) return root.tree;
|
|
50
|
+
return root;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Split a decoded payload root into its tree and its params.
|
|
54
|
+
*
|
|
55
|
+
* Accepts a settled root or a thenable of one, and preserves which it was: a
|
|
56
|
+
* settled root splits synchronously, so no code path gains a suspend point it
|
|
57
|
+
* did not already have.
|
|
58
|
+
*/
|
|
59
|
+
function splitPayloadRoot(root) {
|
|
60
|
+
if (typeof root !== "object" || root === null || typeof root.then !== "function") return {
|
|
61
|
+
tree: readPayloadTree(root),
|
|
62
|
+
params: readPublishedParams(root)
|
|
63
|
+
};
|
|
64
|
+
const settled = root;
|
|
65
|
+
const tree = Promise.resolve(settled).then(readPayloadTree);
|
|
66
|
+
tree.catch(() => {});
|
|
67
|
+
return {
|
|
68
|
+
tree,
|
|
69
|
+
params: Promise.resolve(settled).then(readPublishedParams, () => NO_PUBLISHED_PARAMS)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/client/rsc-fetch.ts
|
|
74
|
+
/**
|
|
75
|
+
* RSC Fetch — handles fetching and parsing RSC Flight payloads.
|
|
76
|
+
*
|
|
77
|
+
* Extracted from router.ts to keep both files under the 500-line limit.
|
|
78
|
+
* This module handles:
|
|
79
|
+
* - Cache-busting URL generation for RSC requests
|
|
80
|
+
* - Building RSC request headers (Accept, X-Timber-State-Tree)
|
|
81
|
+
* - Extracting metadata from RSC response headers
|
|
82
|
+
* - Fetching and decoding RSC payloads
|
|
83
|
+
*
|
|
84
|
+
* See design/19-client-navigation.md §"RSC Payload Handling"
|
|
85
|
+
*/
|
|
86
|
+
/**
|
|
87
|
+
* Append a `_rsc=<key>` query parameter to the URL (TIM-1268).
|
|
88
|
+
*
|
|
89
|
+
* The key is a deterministic hash of the RSC request headers, so identical
|
|
90
|
+
* requests share a URL and the payload becomes cacheable. It also keeps the
|
|
91
|
+
* document and the payload on different URLs, so a shared cache cannot
|
|
92
|
+
* return HTML for an RSC request (or vice versa) even where `Vary` is
|
|
93
|
+
* opt-in configuration rather than default behaviour — Cloudflare and
|
|
94
|
+
* CloudFront both. See GHSA-wfc6-r584-vfw7, design/13-security.md.
|
|
95
|
+
*
|
|
96
|
+
* The origin recomputes this key from the received headers and refuses to
|
|
97
|
+
* let a mismatched response be shared-cached, so a caller cannot claim
|
|
98
|
+
* another client's key while sending its own headers.
|
|
99
|
+
*
|
|
100
|
+
* Falls back to a random value when no key can be derived — `crypto.subtle`
|
|
101
|
+
* is absent in non-secure browsing contexts (plain `http://` on a LAN
|
|
102
|
+
* address). Dropping the parameter instead would put the payload back on
|
|
103
|
+
* the document URL, where a query-keyed cache that ignores `Vary` could
|
|
104
|
+
* store a Flight response under `/about` and serve it to an HTML
|
|
105
|
+
* navigation. The random parameter this feature replaced did separate those
|
|
106
|
+
* representations, and the fallback must not be worse than what it
|
|
107
|
+
* replaced. The origin cannot verify a random key, so it refuses to
|
|
108
|
+
* share-cache the response — which is exactly the old behaviour, where a
|
|
109
|
+
* unique URL was never a cache hit anyway.
|
|
110
|
+
*
|
|
111
|
+
* Strips any #fragment before appending — fragments are client-only and
|
|
112
|
+
* fetch() discards them, so _rsc would land inside the hash and be lost.
|
|
113
|
+
*/
|
|
114
|
+
async function appendRscParam(url, headers) {
|
|
115
|
+
const hashIndex = url.indexOf("#");
|
|
116
|
+
const urlWithoutHash = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
117
|
+
const key = await rscCacheKey(recordLookup(headers)) ?? randomRscCacheKey();
|
|
118
|
+
return `${urlWithoutHash}${urlWithoutHash.includes("?") ? "&" : "?"}${RSC_KEY_PARAM}=${key}`;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The client's deployment ID, set at bootstrap from the runtime config.
|
|
122
|
+
* Sent with every RSC/action request for version skew detection.
|
|
123
|
+
* Null in dev mode. See TIM-446.
|
|
124
|
+
*/
|
|
125
|
+
var clientDeploymentId = null;
|
|
126
|
+
/**
|
|
127
|
+
* The deployment base path (Vite's resolved `base`), normalized.
|
|
128
|
+
* Set at bootstrap from `virtual:timber-config`; `'/'` unless the app is
|
|
129
|
+
* deployed under a sub-path. See design/11-platform.md, TIM-1261.
|
|
130
|
+
*
|
|
131
|
+
* **The base is applied in exactly one place: at fetch time**
|
|
132
|
+
* (`toStaticRscUrl`). The static build writes the RSC manifest with
|
|
133
|
+
* root-relative keys *and* root-relative URLs, so the generated site stays
|
|
134
|
+
* relocatable and there is no second copy of the base to drift from this one.
|
|
135
|
+
*/
|
|
136
|
+
var basePath = "/";
|
|
137
|
+
/**
|
|
138
|
+
* When true, RSC fetches use _rsc/*.rsc file URLs instead of
|
|
139
|
+
* the route URL with Accept headers. Static hosts ignore Accept
|
|
140
|
+
* headers, so the client must fetch the pre-generated .rsc files
|
|
141
|
+
* directly. Set at bootstrap from virtual:timber-config output mode.
|
|
142
|
+
*/
|
|
143
|
+
var staticMode = false;
|
|
144
|
+
/**
|
|
145
|
+
* RSC manifest mapping unhashed → content-hashed `.rsc` URLs. Populated from
|
|
146
|
+
* `window.__TIMBER_RSC_MANIFEST__` (injected into HTML during static
|
|
147
|
+
* generation). Shape shared with the static build that writes it — see
|
|
148
|
+
* `shared/rsc-manifest.ts`. See TIM-1254.
|
|
149
|
+
*/
|
|
150
|
+
var rscManifest = null;
|
|
151
|
+
function getRscManifest() {
|
|
152
|
+
if (rscManifest) return rscManifest;
|
|
153
|
+
if (typeof window !== "undefined" && window.__TIMBER_RSC_MANIFEST__) rscManifest = window.__TIMBER_RSC_MANIFEST__;
|
|
154
|
+
return rscManifest;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Resolve a route URL to the `_rsc/*.rsc` file to fetch. The naming rule is
|
|
158
|
+
* `shared/rsc-payload-path.ts`, shared with the build that writes the files.
|
|
159
|
+
*
|
|
160
|
+
* When an RSC manifest is available (hashed filenames from TIM-1254),
|
|
161
|
+
* the manifest is consulted to resolve to the hashed path.
|
|
162
|
+
*
|
|
163
|
+
* / → /_rsc/index.rsc (or /_rsc/index-B7YxEKdN.rsc with manifest)
|
|
164
|
+
* /about → /_rsc/about/index.rsc (or /_rsc/about/index-C8ZzFLfO.rsc)
|
|
165
|
+
* /blog/hello → /_rsc/blog/hello/index.rsc
|
|
166
|
+
*
|
|
167
|
+
* The manifest is written and read in route space (no base prefix), so the
|
|
168
|
+
* base is applied here — once, on the way out. See client/base-path.ts.
|
|
169
|
+
*/
|
|
170
|
+
function toStaticRscUrl(url) {
|
|
171
|
+
const unhashed = toUnhashedRscUrl(url);
|
|
172
|
+
const hashedUrl = manifestLookup(unhashed);
|
|
173
|
+
return {
|
|
174
|
+
url: withBasePath(basePath, hashedUrl ?? unhashed),
|
|
175
|
+
hashed: hashedUrl !== null
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Compute the unhashed `_rsc/*.rsc` path for a route URL.
|
|
180
|
+
*
|
|
181
|
+
* Returns a **route-space** path: the deployment base is stripped from the
|
|
182
|
+
* incoming URL and is NOT re-applied, because this value doubles as the RSC
|
|
183
|
+
* manifest key, and the manifest is base-less. `toStaticRscUrl` applies the
|
|
184
|
+
* base to whatever is actually fetched.
|
|
185
|
+
*
|
|
186
|
+
* @internal Exported for testing.
|
|
187
|
+
*/
|
|
188
|
+
function toUnhashedRscUrl(url) {
|
|
189
|
+
const hashIndex = url.indexOf("#");
|
|
190
|
+
const queryIndex = url.indexOf("?");
|
|
191
|
+
const hashEnd = hashIndex === -1 ? url.length : hashIndex;
|
|
192
|
+
const queryEnd = queryIndex === -1 ? url.length : queryIndex;
|
|
193
|
+
const end = Math.min(hashEnd, queryEnd);
|
|
194
|
+
let pathname = stripBasePath(basePath, url.slice(0, end));
|
|
195
|
+
if (pathname.length > 1 && pathname.endsWith("/")) pathname = pathname.slice(0, -1);
|
|
196
|
+
return rscPayloadPath(pathname);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Look up a key in the RSC manifest, falling back to percent-decoded
|
|
200
|
+
* lookup for encoded browser URLs. Returns the entry or null.
|
|
201
|
+
*/
|
|
202
|
+
function manifestEntry(key) {
|
|
203
|
+
const manifest = getRscManifest();
|
|
204
|
+
if (!manifest) return null;
|
|
205
|
+
if (manifest[key]) return manifest[key];
|
|
206
|
+
try {
|
|
207
|
+
const decoded = decodeURIComponent(key);
|
|
208
|
+
if (decoded !== key && manifest[decoded]) return manifest[decoded];
|
|
209
|
+
} catch {}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Look up the hashed URL for an unhashed RSC path.
|
|
214
|
+
*/
|
|
215
|
+
function manifestLookup(key) {
|
|
216
|
+
return manifestEntry(key)?.url ?? null;
|
|
217
|
+
}
|
|
218
|
+
/** Header name used by the server to signal a version skew reload. */
|
|
219
|
+
var RELOAD_HEADER = "X-Timber-Reload";
|
|
220
|
+
/** Header name for the client's deployment ID. */
|
|
221
|
+
var DEPLOYMENT_ID_HEADER = "X-Timber-Deployment-Id";
|
|
222
|
+
/**
|
|
223
|
+
* Check if a response signals a version skew reload.
|
|
224
|
+
* Triggers a full page reload if the server indicates the client is stale.
|
|
225
|
+
*/
|
|
226
|
+
function checkReloadSignal(response) {
|
|
227
|
+
return response.headers.get(RELOAD_HEADER) === "1";
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Build the headers for an RSC payload request.
|
|
231
|
+
*
|
|
232
|
+
* **Every header added here is hashed into the payload URL** as the `_rsc`
|
|
233
|
+
* cache key (see `rscCacheKey`), and URLs are logged by proxies, CDNs, and
|
|
234
|
+
* origin access logs. So: no credentials, no session identifiers, no
|
|
235
|
+
* user-supplied content. `fnv1aHash` is a cache-key hash, not a KDF — a
|
|
236
|
+
* low-entropy secret would be recoverable from the URL by brute force.
|
|
237
|
+
* Authentication already travels on cookies, which are not part of this
|
|
238
|
+
* object and never enter the key.
|
|
239
|
+
*/
|
|
240
|
+
function buildRscHeaders(stateTree, currentUrl) {
|
|
241
|
+
const headers = { Accept: RSC_CONTENT_TYPE };
|
|
242
|
+
if (stateTree) headers["X-Timber-State-Tree"] = JSON.stringify(stateTree);
|
|
243
|
+
if (currentUrl) headers["X-Timber-URL"] = currentUrl;
|
|
244
|
+
if (clientDeploymentId) headers[DEPLOYMENT_ID_HEADER] = clientDeploymentId;
|
|
245
|
+
return headers;
|
|
246
|
+
}
|
|
247
|
+
/** Dev-only warning for malformed framework headers. Tree-shaken in production. */
|
|
248
|
+
function warnMalformedHeader(headerName, raw) {
|
|
249
|
+
if (process.env.NODE_ENV !== "production") {
|
|
250
|
+
const preview = raw.length > 200 ? raw.slice(0, 200) + "…" : raw;
|
|
251
|
+
console.warn(`[timber] Malformed ${headerName} header \u2014 JSON.parse failed. This indicates a framework bug or header corruption. Raw (first 200 chars): ${preview}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Extract segment metadata from the X-Timber-Segments response header.
|
|
256
|
+
* Returns null if the header is missing or malformed.
|
|
257
|
+
*
|
|
258
|
+
* Format: JSON array of {path, isRequestDependent} objects describing the rendered
|
|
259
|
+
* segment chain from root to leaf. Used to populate the client-side
|
|
260
|
+
* segment cache for state tree diffing on subsequent navigations.
|
|
261
|
+
*/
|
|
262
|
+
function extractSegmentInfo(response) {
|
|
263
|
+
const header = response.headers.get("X-Timber-Segments");
|
|
264
|
+
if (!header) return null;
|
|
265
|
+
try {
|
|
266
|
+
return JSON.parse(header);
|
|
267
|
+
} catch {
|
|
268
|
+
warnMalformedHeader("X-Timber-Segments", header);
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Extract skipped segment paths from the X-Timber-Skipped-Segments header.
|
|
274
|
+
* Returns null if the header is missing or malformed.
|
|
275
|
+
*
|
|
276
|
+
* When the server skips sync layouts the client already has cached,
|
|
277
|
+
* it sends this header listing the skipped segment paths (outermost first).
|
|
278
|
+
* The client uses this to merge the partial payload with cached segments.
|
|
279
|
+
*/
|
|
280
|
+
function extractSkippedSegments(response) {
|
|
281
|
+
const header = response.headers.get("X-Timber-Skipped-Segments");
|
|
282
|
+
if (!header) return null;
|
|
283
|
+
try {
|
|
284
|
+
const parsed = JSON.parse(header);
|
|
285
|
+
return Array.isArray(parsed) ? parsed : null;
|
|
286
|
+
} catch {
|
|
287
|
+
warnMalformedHeader("X-Timber-Skipped-Segments", header);
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Thrown when an RSC payload response contains X-Timber-Redirect header.
|
|
293
|
+
* Caught in navigate() to trigger a soft router navigation to the redirect target.
|
|
294
|
+
*/
|
|
295
|
+
var RedirectError = class extends Error {
|
|
296
|
+
redirectUrl;
|
|
297
|
+
constructor(url) {
|
|
298
|
+
super(`Server redirect to ${url}`);
|
|
299
|
+
this.redirectUrl = url;
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
/**
|
|
303
|
+
* Thrown when the server signals a version skew (X-Timber-Reload header).
|
|
304
|
+
* Caught in navigate() to trigger a full page reload.
|
|
305
|
+
* See TIM-446.
|
|
306
|
+
*/
|
|
307
|
+
var VersionSkewError = class extends Error {
|
|
308
|
+
constructor() {
|
|
309
|
+
super("Version skew detected — server has been redeployed");
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
/**
|
|
313
|
+
* Thrown when the server returns an error for an RSC payload request.
|
|
314
|
+
* The server sends X-Timber-Error header and a JSON body instead of a
|
|
315
|
+
* RSC stream it cannot answer in-SPA (a deny that needs a fallback page, a
|
|
316
|
+
* broken first read). Caught in
|
|
317
|
+
* navigate() to trigger a hard navigation so the server can render
|
|
318
|
+
* the error page as HTML.
|
|
319
|
+
*
|
|
320
|
+
* See design/10-error-handling.md §"Error Page Rendering for Client Navigation"
|
|
321
|
+
*/
|
|
322
|
+
var ServerErrorResponse = class extends Error {
|
|
323
|
+
status;
|
|
324
|
+
url;
|
|
325
|
+
constructor(status, url) {
|
|
326
|
+
super(`Server error ${status} during navigation to ${url}`);
|
|
327
|
+
this.status = status;
|
|
328
|
+
this.url = url;
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
/**
|
|
332
|
+
* Thrown when the RSC fetch response has a Content-Type that is not
|
|
333
|
+
* text/x-component — e.g., a static asset (image, CSS, JS) served
|
|
334
|
+
* for a same-origin URL that isn't a route. The response body is
|
|
335
|
+
* cancelled immediately (headers-only cost). Caught in navigate()
|
|
336
|
+
* to trigger a hard navigation; caught in prefetch() to store a
|
|
337
|
+
* negative cache entry so click hard-navigates without a second fetch.
|
|
338
|
+
*
|
|
339
|
+
* See TIM-1231.
|
|
340
|
+
*/
|
|
341
|
+
var NonRscResponse = class extends Error {
|
|
342
|
+
url;
|
|
343
|
+
constructor(url) {
|
|
344
|
+
super(`Non-RSC response for ${url}`);
|
|
345
|
+
this.url = url;
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
/**
|
|
349
|
+
* Wrap a response body stream to track when it's fully consumed.
|
|
350
|
+
* Returns a new body that passes all chunks through unchanged, plus
|
|
351
|
+
* a `done` promise that resolves when the last chunk is read (or
|
|
352
|
+
* rejects if the stream errors).
|
|
353
|
+
*
|
|
354
|
+
* createFromFetch's thenable resolves on shell arrival, but callers need to
|
|
355
|
+
* know when the stream is fully decoded: that is what `navigateTransition`'s
|
|
356
|
+
* returned promise means, and what the router's pending store, the Navigation
|
|
357
|
+
* API deferred and `<Link>`'s `isPending` are all timed against.
|
|
358
|
+
*/
|
|
359
|
+
function trackStreamCompletion(body) {
|
|
360
|
+
let resolveDone;
|
|
361
|
+
let rejectDone;
|
|
362
|
+
const done = new Promise((res, rej) => {
|
|
363
|
+
resolveDone = res;
|
|
364
|
+
rejectDone = rej;
|
|
365
|
+
});
|
|
366
|
+
const reader = body.getReader();
|
|
367
|
+
return {
|
|
368
|
+
body: new ReadableStream({
|
|
369
|
+
async pull(controller) {
|
|
370
|
+
try {
|
|
371
|
+
const result = await reader.read();
|
|
372
|
+
if (result.done) {
|
|
373
|
+
controller.close();
|
|
374
|
+
resolveDone();
|
|
375
|
+
} else controller.enqueue(result.value);
|
|
376
|
+
} catch (error) {
|
|
377
|
+
controller.error(error);
|
|
378
|
+
rejectDone(error);
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
cancel(reason) {
|
|
382
|
+
reader.cancel(reason);
|
|
383
|
+
resolveDone();
|
|
384
|
+
}
|
|
385
|
+
}),
|
|
386
|
+
done
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Fetch an RSC payload from the server and start decoding it.
|
|
391
|
+
*
|
|
392
|
+
* Every response is classified here, once: a version-skew reload, a 204 or
|
|
393
|
+
* 3xx redirect, a server error envelope and a non-RSC body are each turned
|
|
394
|
+
* into their error before `decodeRsc` sees the body. There is no second
|
|
395
|
+
* path — tests decode real Flight bytes through the same code (TIM-1541).
|
|
396
|
+
*/
|
|
397
|
+
async function fetchRscPayload(url, deps, stateTree, currentUrl, signal) {
|
|
398
|
+
const staticTarget = staticMode ? toStaticRscUrl(url) : null;
|
|
399
|
+
const fetchTarget = staticTarget ? staticTarget.url : url;
|
|
400
|
+
const headers = staticMode ? buildRscHeaders(void 0, void 0) : buildRscHeaders(stateTree, currentUrl);
|
|
401
|
+
const rscUrl = staticTarget?.hashed ? fetchTarget : await appendRscParam(fetchTarget, headers);
|
|
402
|
+
signal?.throwIfAborted();
|
|
403
|
+
const fetchPromise = deps.fetch(rscUrl, {
|
|
404
|
+
headers,
|
|
405
|
+
redirect: "manual",
|
|
406
|
+
signal
|
|
407
|
+
});
|
|
408
|
+
let segmentInfo = null;
|
|
409
|
+
let skippedSegments = null;
|
|
410
|
+
let streamDone = Promise.resolve();
|
|
411
|
+
const wrappedPromise = fetchPromise.then((response) => {
|
|
412
|
+
if (checkReloadSignal(response)) throw new VersionSkewError();
|
|
413
|
+
const redirectLocation = response.headers.get("X-Timber-Redirect") || (response.status >= 300 && response.status < 400 ? response.headers.get("Location") : null);
|
|
414
|
+
if (redirectLocation) throw new RedirectError(redirectLocation);
|
|
415
|
+
if (response.headers.get("X-Timber-Error") === "1") throw new ServerErrorResponse(response.status, url);
|
|
416
|
+
if (staticMode) {
|
|
417
|
+
const contentType = response.headers.get("content-type");
|
|
418
|
+
if (!response.ok || contentType && contentType.split(";")[0].trim().toLowerCase() === "text/html") {
|
|
419
|
+
response.body?.cancel();
|
|
420
|
+
throw new NonRscResponse(url);
|
|
421
|
+
}
|
|
422
|
+
} else if (!isRscContentType(response.headers.get("content-type"))) {
|
|
423
|
+
response.body?.cancel();
|
|
424
|
+
throw new NonRscResponse(url);
|
|
425
|
+
}
|
|
426
|
+
segmentInfo = extractSegmentInfo(response);
|
|
427
|
+
skippedSegments = extractSkippedSegments(response);
|
|
428
|
+
if (response.body) {
|
|
429
|
+
const tracked = trackStreamCompletion(response.body);
|
|
430
|
+
streamDone = tracked.done;
|
|
431
|
+
streamDone.catch(() => {});
|
|
432
|
+
return new Response(tracked.body, {
|
|
433
|
+
headers: response.headers,
|
|
434
|
+
status: response.status
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
return response;
|
|
438
|
+
});
|
|
439
|
+
await wrappedPromise;
|
|
440
|
+
const root = deps.decodeRsc(wrappedPromise);
|
|
441
|
+
const { tree: payload, params } = splitPayloadRoot(root);
|
|
442
|
+
const rootDecoded = Promise.resolve(root).then(() => {});
|
|
443
|
+
rootDecoded.catch(() => {});
|
|
444
|
+
const decodePromise = Promise.all([streamDone, rootDecoded]).then(() => {});
|
|
445
|
+
decodePromise.catch(() => {});
|
|
446
|
+
return {
|
|
447
|
+
payload,
|
|
448
|
+
params,
|
|
449
|
+
decodePromise,
|
|
450
|
+
segmentInfo,
|
|
451
|
+
skippedSegments
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
//#endregion
|
|
455
|
+
//#region src/client/unload-guard.ts
|
|
456
|
+
/**
|
|
457
|
+
* Page unload detection — suppresses spurious errors during page refresh/navigation.
|
|
458
|
+
*
|
|
459
|
+
* When the user refreshes the page or navigates away while React is still
|
|
460
|
+
* streaming Suspense content, the aborted connection causes streaming errors.
|
|
461
|
+
* These are not application errors — they're a side effect of the browser
|
|
462
|
+
* tearing down the connection. This module tracks whether the page is being
|
|
463
|
+
* unloaded so error boundaries and error handlers can suppress abort-related
|
|
464
|
+
* errors during the unload window.
|
|
465
|
+
*
|
|
466
|
+
* This is the single owner of "is this document going away". Anything that
|
|
467
|
+
* needs the answer imports `isPageUnloading()` — an unload flag maintained a
|
|
468
|
+
* second time somewhere else is a flag that will drift out of agreement with
|
|
469
|
+
* this one (TIM-1260).
|
|
470
|
+
*
|
|
471
|
+
* Mutable state is delegated to client/state.ts for singleton guarantees.
|
|
472
|
+
* See design/18-build-system.md §"Singleton State Registry"
|
|
473
|
+
*
|
|
474
|
+
* See design/10-error-handling.md §"Known limitation: deny() inside Suspense and hydration"
|
|
475
|
+
*/
|
|
476
|
+
/**
|
|
477
|
+
* Departure is *committed*: `pagehide` has fired, or this document has called
|
|
478
|
+
* reload() on itself. `beforeunload` alone doesn't qualify — it is
|
|
479
|
+
* speculative, and the user can still cancel out of it.
|
|
480
|
+
*/
|
|
481
|
+
var committed = false;
|
|
482
|
+
if (typeof window !== "undefined") {
|
|
483
|
+
window.addEventListener("beforeunload", () => {
|
|
484
|
+
_setUnloading(true);
|
|
485
|
+
setTimeout(() => {
|
|
486
|
+
if (!committed) _setUnloading(false);
|
|
487
|
+
}, 0);
|
|
488
|
+
});
|
|
489
|
+
window.addEventListener("pagehide", () => {
|
|
490
|
+
committed = true;
|
|
491
|
+
_setUnloading(true);
|
|
492
|
+
});
|
|
493
|
+
window.addEventListener("pageshow", (event) => {
|
|
494
|
+
if (event.persisted) {
|
|
495
|
+
committed = false;
|
|
496
|
+
_setUnloading(false);
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Returns true if the page is currently being unloaded (user refreshed
|
|
502
|
+
* or navigated away). Error boundaries should suppress errors in this state.
|
|
503
|
+
*/
|
|
504
|
+
function isPageUnloading() {
|
|
505
|
+
return unloading;
|
|
506
|
+
}
|
|
507
|
+
//#endregion
|
|
508
|
+
//#region src/client/stale-client.ts
|
|
509
|
+
/**
|
|
510
|
+
* Stale Client — knowing when this bundle has been superseded.
|
|
511
|
+
*
|
|
512
|
+
* Layer 1 of version skew handling (see design/33-version-skew.md) is
|
|
513
|
+
* proactive: the server compares `X-Timber-Deployment-Id` against the current
|
|
514
|
+
* build and answers a stale client with `X-Timber-Reload: 1`. That covers
|
|
515
|
+
* every RSC navigation and every server action — as long as there is a server
|
|
516
|
+
* in the request path.
|
|
517
|
+
*
|
|
518
|
+
* This module is the reactive half, plus the state both halves feed. It
|
|
519
|
+
* recognizes the two error shapes a stale client produces on its own:
|
|
520
|
+
*
|
|
521
|
+
* 1. **Stale client references** — React's Flight client throws
|
|
522
|
+
* "Could not find the module …" when an RSC payload names a client module
|
|
523
|
+
* ID that isn't in this bundle's manifest.
|
|
524
|
+
* 2. **Chunk load failures** — a content-hashed chunk that no longer exists on
|
|
525
|
+
* the CDN fails to `import()`. Every engine words this differently.
|
|
526
|
+
*
|
|
527
|
+
* It matters most for `output: 'static'`, where there is no server to send the
|
|
528
|
+
* reload header and this is the *only* skew detection that can run.
|
|
529
|
+
*
|
|
530
|
+
* **Nothing here reloads the page.** A stale client is recorded, not acted on;
|
|
531
|
+
* the router turns the next user-initiated navigation into a full document
|
|
532
|
+
* load. See design/33-version-skew.md §"Recovery on the next navigation" for
|
|
533
|
+
* why — a self-issued `location.reload()` cannot tell a recovery from a bounce
|
|
534
|
+
* between two live deployments, and mid-rollout it produces exactly that loop.
|
|
535
|
+
*
|
|
536
|
+
* See TIM-1260, TIM-1275.
|
|
537
|
+
*/
|
|
538
|
+
/**
|
|
539
|
+
* Substrings that identify a failed dynamic import, lowercased for
|
|
540
|
+
* case-insensitive matching. Engines and bundlers each word this
|
|
541
|
+
* differently and none of them expose a stable error code.
|
|
542
|
+
*/
|
|
543
|
+
var CHUNK_LOAD_PATTERNS = [
|
|
544
|
+
"failed to fetch dynamically imported module",
|
|
545
|
+
"error loading dynamically imported module",
|
|
546
|
+
"importing a module script failed",
|
|
547
|
+
"unable to preload css for"
|
|
548
|
+
];
|
|
549
|
+
/** Substring React's Flight client uses when a client module ID is unknown. */
|
|
550
|
+
var STALE_REFERENCE_PATTERN = "could not find the module";
|
|
551
|
+
/**
|
|
552
|
+
* Pull a comparable message out of an unknown thrown value. Rejections cross
|
|
553
|
+
* enough boundaries (event handlers, `unhandledrejection`, Vite's preload
|
|
554
|
+
* event) that the value is not reliably an `Error`.
|
|
555
|
+
*/
|
|
556
|
+
function messageOf(error) {
|
|
557
|
+
if (typeof error === "string") return error.toLowerCase();
|
|
558
|
+
if (error instanceof Error) return error.message.toLowerCase();
|
|
559
|
+
if (error && typeof error === "object" && "message" in error) {
|
|
560
|
+
const message = error.message;
|
|
561
|
+
if (typeof message === "string") return message.toLowerCase();
|
|
562
|
+
}
|
|
563
|
+
return "";
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* True when the error is React's "client reference not in this manifest"
|
|
567
|
+
* failure — the payload was produced by a build this bundle doesn't match.
|
|
568
|
+
*/
|
|
569
|
+
function isStaleClientReference(error) {
|
|
570
|
+
return messageOf(error).includes(STALE_REFERENCE_PATTERN);
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* True when the error is a failed dynamic import or CSS preload — the
|
|
574
|
+
* content-hashed chunk this bundle asks for is gone from the CDN.
|
|
575
|
+
*/
|
|
576
|
+
function isChunkLoadError(error) {
|
|
577
|
+
if (error instanceof Error && error.name === "ChunkLoadError") return true;
|
|
578
|
+
const message = messageOf(error);
|
|
579
|
+
return CHUNK_LOAD_PATTERNS.some((pattern) => message.includes(pattern));
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* True once this client is known to be running against a superseded
|
|
583
|
+
* deployment. One-way: a document that has gone stale cannot come back, since
|
|
584
|
+
* the only way to get fresh code is to load a new document.
|
|
585
|
+
*
|
|
586
|
+
* In-memory on purpose. Persisting it would be wrong — the next document gets
|
|
587
|
+
* whatever build the server hands it, and if that one is stale too it will
|
|
588
|
+
* find out the same way.
|
|
589
|
+
*/
|
|
590
|
+
var stale = false;
|
|
591
|
+
/**
|
|
592
|
+
* True once {@link initStaleClient} has seen a deployment ID — i.e. this is a
|
|
593
|
+
* production build. False in dev, where nothing is ever stale: HMR owns code
|
|
594
|
+
* updates, and a failed dynamic import is a real error the developer needs to
|
|
595
|
+
* see rather than something a page load fixes.
|
|
596
|
+
*/
|
|
597
|
+
var deployed = false;
|
|
598
|
+
/** Whether this client has been superseded by a newer deployment. */
|
|
599
|
+
function isClientStale() {
|
|
600
|
+
return stale;
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Record that the origin has told us this client is stale — the `X-Timber-Reload`
|
|
604
|
+
* header on an RSC or action response. Authoritative, so it is not gated on
|
|
605
|
+
* anything: a dev server never sends the header in the first place.
|
|
606
|
+
*/
|
|
607
|
+
function markClientStale() {
|
|
608
|
+
stale = true;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Record staleness if `error` is one of the shapes a superseded bundle
|
|
612
|
+
* produces. Returns whether it did, so a caller mid-navigation can decide to
|
|
613
|
+
* hard-navigate instead of surfacing the error.
|
|
614
|
+
*
|
|
615
|
+
* Inference, unlike {@link markClientStale}, so it is gated on being a
|
|
616
|
+
* production build. This is the single place that gate lives — call sites
|
|
617
|
+
* cannot see each other, and "remember to gate the next one too" is not a
|
|
618
|
+
* guarantee.
|
|
619
|
+
*/
|
|
620
|
+
function markStaleFromError(error) {
|
|
621
|
+
if (!deployed) return false;
|
|
622
|
+
if (isPageUnloading()) return false;
|
|
623
|
+
if (!isStaleClientReference(error) && !isChunkLoadError(error)) return false;
|
|
624
|
+
stale = true;
|
|
625
|
+
return true;
|
|
626
|
+
}
|
|
627
|
+
//#endregion
|
|
628
|
+
//#region src/client/router-skew.ts
|
|
629
|
+
/**
|
|
630
|
+
* Router Skew Recording — turning a rejection into "this bundle is superseded".
|
|
631
|
+
*
|
|
632
|
+
* Detection lives in `stale-client.ts`; this is the one place the router (and
|
|
633
|
+
* anything else holding an RSC rejection) turns an error into that verdict.
|
|
634
|
+
* Recovery is not here: every path that gives up on client-side navigation —
|
|
635
|
+
* skew or not — leaves through `createSpaExits()` in `router-effects.ts`.
|
|
636
|
+
*
|
|
637
|
+
* See design/33-version-skew.md §"Recovery on the next navigation"
|
|
638
|
+
*/
|
|
639
|
+
/**
|
|
640
|
+
* Record a version skew if `error` is one, and report whether it was.
|
|
641
|
+
*
|
|
642
|
+
* `VersionSkewError` is the origin saying so outright; the reactive shapes are
|
|
643
|
+
* inferred from the error text and are a no-op in dev.
|
|
644
|
+
*
|
|
645
|
+
* Closes over nothing — anywhere an RSC payload can fail needs it, including
|
|
646
|
+
* places that have no router instance to hand.
|
|
647
|
+
*/
|
|
648
|
+
function recordSkew(error) {
|
|
649
|
+
if (error instanceof VersionSkewError) {
|
|
650
|
+
markClientStale();
|
|
651
|
+
return true;
|
|
652
|
+
}
|
|
653
|
+
return markStaleFromError(error);
|
|
654
|
+
}
|
|
655
|
+
//#endregion
|
|
656
|
+
//#region src/client/router-effects.ts
|
|
657
|
+
/**
|
|
658
|
+
* Router Effects — full-page navigation and post-paint scroll.
|
|
659
|
+
*
|
|
660
|
+
* The two things the router does *to the document* rather than to its own
|
|
661
|
+
* state: leaving the SPA entirely, and moving the scroll position once React
|
|
662
|
+
* has committed. Extracted from `router.ts` to keep that file focused on
|
|
663
|
+
* navigation state (see design/18-build-system.md §"No file >500 lines").
|
|
664
|
+
*
|
|
665
|
+
* See design/19-client-navigation.md §"Scroll Restoration"
|
|
666
|
+
*/
|
|
667
|
+
function createScrollEffects(deps) {
|
|
668
|
+
/** Run a callback after the next paint (after React commit). */
|
|
669
|
+
function afterPaint(callback) {
|
|
670
|
+
if (deps.afterPaint) deps.afterPaint(callback);
|
|
671
|
+
else callback();
|
|
672
|
+
}
|
|
673
|
+
function restoreScrollAfterPaint(scrollY) {
|
|
674
|
+
afterPaint(() => {
|
|
675
|
+
deps.scrollTo(0, scrollY);
|
|
676
|
+
window.dispatchEvent(new Event("timber:scroll-restored"));
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
function scrollToHashAfterPaint(hash) {
|
|
680
|
+
afterPaint(() => {
|
|
681
|
+
if (deps.scrollToHash?.(hash) !== true) deps.scrollTo(0, 0);
|
|
682
|
+
window.dispatchEvent(new Event("timber:scroll-restored"));
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
return {
|
|
686
|
+
restoreScrollAfterPaint,
|
|
687
|
+
scrollToHashAfterPaint
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Leave the SPA and never come back.
|
|
692
|
+
*
|
|
693
|
+
* Every router path that gives up on client-side navigation does the same
|
|
694
|
+
* three things: flag the hard navigation so the Navigation API and React stop
|
|
695
|
+
* acting on a dying document, perform the document load, then block forever so
|
|
696
|
+
* the caller cannot carry on rendering into it. The returned promise is
|
|
697
|
+
* deliberately unresolvable — `location` assignment does not stop this turn of
|
|
698
|
+
* the event loop.
|
|
699
|
+
*
|
|
700
|
+
* Callers: server error, non-RSC response, and every version skew path
|
|
701
|
+
* ([33-version-skew.md](../../../../design/33-version-skew.md)).
|
|
702
|
+
*/
|
|
703
|
+
function leaveSpa(url, fromUrl) {
|
|
704
|
+
setHardNavigating(true);
|
|
705
|
+
hardNavigate(url, fromUrl);
|
|
706
|
+
return new Promise(() => {});
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* The two ownership-aware ways out of the SPA.
|
|
710
|
+
*
|
|
711
|
+
* Both wrap {@link leaveSpa} with the question "is this navigation still the
|
|
712
|
+
* one the user is waiting for?" — asked before leaving on a failure, answered
|
|
713
|
+
* by force on a path that decided before any navigation began. They live
|
|
714
|
+
* together because every caller of `leaveSpa()` needs one or the other, and
|
|
715
|
+
* an unguarded call is the bug (TIM-1275, TIM-1276).
|
|
716
|
+
*/
|
|
717
|
+
function createSpaExits({ currentOwner, supersede }) {
|
|
718
|
+
async function leaveSpaIfOwned(owner, url, fromUrl) {
|
|
719
|
+
if (currentOwner() !== owner) return;
|
|
720
|
+
await leaveSpa(url, fromUrl);
|
|
721
|
+
}
|
|
722
|
+
function leaveSpaSuperseding(url, fromUrl) {
|
|
723
|
+
supersede();
|
|
724
|
+
return leaveSpa(url, fromUrl);
|
|
725
|
+
}
|
|
726
|
+
return {
|
|
727
|
+
leaveSpaIfOwned,
|
|
728
|
+
leaveSpaSuperseding
|
|
729
|
+
};
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* Answer the failures an RSC fetch can end on, or report that this one is not
|
|
733
|
+
* ours to answer.
|
|
734
|
+
*
|
|
735
|
+
* Returns `true` when the error was handled; the caller rethrows on `false`.
|
|
736
|
+
* Handling a failure by leaving the SPA never resolves at all — the document
|
|
737
|
+
* is going away and the caller must not carry on rendering into it.
|
|
738
|
+
*
|
|
739
|
+
* There is exactly one family of these and one response to it, so it lives in
|
|
740
|
+
* one function rather than once per fetch path. `navigate()`, `refresh()` and
|
|
741
|
+
* an uncached traversal all reach it: the latter two used to rethrow instead,
|
|
742
|
+
* and since nobody awaits a traversal that meant pressing Back on a 500 left
|
|
743
|
+
* the user on the old document with an unhandled rejection (TIM-1277).
|
|
744
|
+
*
|
|
745
|
+
* Order matters in exactly one way: `recordSkew()` ends in error-*text*
|
|
746
|
+
* matching, so it goes last and can never pre-empt a framework control-flow
|
|
747
|
+
* signal whose message happens to read like a stale bundle. The class checks
|
|
748
|
+
* above it are mutually exclusive, so their order is free.
|
|
749
|
+
*
|
|
750
|
+
* Must be called from inside the `runNavigation()` callback — see
|
|
751
|
+
* {@link SpaExits.leaveSpaIfOwned}.
|
|
752
|
+
*/
|
|
753
|
+
function createNavigationRecovery({ currentOwner, leaveSpaIfOwned, navigate }) {
|
|
754
|
+
return async function recoverFromNavigationError(error, owner, url, fromUrl, types) {
|
|
755
|
+
if (error instanceof RedirectError) {
|
|
756
|
+
if (currentOwner() !== owner) return true;
|
|
757
|
+
await navigate(error.redirectUrl, types);
|
|
758
|
+
return true;
|
|
759
|
+
}
|
|
760
|
+
if (error instanceof ServerErrorResponse || error instanceof NonRscResponse || recordSkew(error)) {
|
|
761
|
+
await leaveSpaIfOwned(owner, url, fromUrl);
|
|
762
|
+
return true;
|
|
763
|
+
}
|
|
764
|
+
return false;
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Perform the full document load.
|
|
769
|
+
*
|
|
770
|
+
* `fromUrl` is the URL the navigation departed from, passed explicitly
|
|
771
|
+
* because the address bar may have already been updated.
|
|
772
|
+
*
|
|
773
|
+
* When the target differs from the departure point only by #fragment,
|
|
774
|
+
* assigning `href` is a hash change, not a load — so assign first (to update
|
|
775
|
+
* the address bar) and then reload (TIM-1235).
|
|
776
|
+
*/
|
|
777
|
+
function hardNavigate(url, fromUrl) {
|
|
778
|
+
const current = new URL(fromUrl, window.location.origin);
|
|
779
|
+
const target = new URL(url, window.location.origin);
|
|
780
|
+
if (target.pathname === current.pathname && target.search === current.search) {
|
|
781
|
+
window.location.href = url;
|
|
782
|
+
window.location.reload();
|
|
783
|
+
} else window.location.href = url;
|
|
784
|
+
}
|
|
785
|
+
//#endregion
|
|
786
|
+
//#region src/shared/error-digest.ts
|
|
787
|
+
/**
|
|
788
|
+
* The correlation ID in an error's Flight digest, or `null` when the error
|
|
789
|
+
* carries none — a deny or redirect row, an error that never crossed Flight,
|
|
790
|
+
* or anything that is not an object.
|
|
791
|
+
*/
|
|
792
|
+
function errorDigestId(error) {
|
|
793
|
+
if (typeof error !== "object" || error === null) return null;
|
|
794
|
+
const digest = Reflect.get(error, "digest");
|
|
795
|
+
if (typeof digest !== "string") return null;
|
|
796
|
+
let parsed;
|
|
797
|
+
try {
|
|
798
|
+
parsed = JSON.parse(digest);
|
|
799
|
+
} catch {
|
|
800
|
+
return null;
|
|
801
|
+
}
|
|
802
|
+
if (typeof parsed !== "object" || parsed === null) return null;
|
|
803
|
+
const errorId = Reflect.get(parsed, "errorId");
|
|
804
|
+
return Reflect.get(parsed, "type") === "error" && typeof errorId === "string" ? errorId : null;
|
|
805
|
+
}
|
|
806
|
+
//#endregion
|
|
807
|
+
//#region src/client/error-boundary.tsx
|
|
808
|
+
/**
|
|
809
|
+
* Framework-injected React error boundary.
|
|
810
|
+
*
|
|
811
|
+
* Catches errors thrown by children and renders a fallback component
|
|
812
|
+
* with the appropriate props based on error type:
|
|
813
|
+
* - DenySignal (4xx) → { status, data }
|
|
814
|
+
* - Unhandled error (500) → { error, digest, reset }, where `digest` is the
|
|
815
|
+
* ID the server logged the error with (shared/error-digest.ts)
|
|
816
|
+
*
|
|
817
|
+
* The `status` prop controls which errors this boundary catches:
|
|
818
|
+
* - Specific code (e.g. 403) → only that status
|
|
819
|
+
* - Category (400) → any 4xx
|
|
820
|
+
* - Category (500) → any 5xx
|
|
821
|
+
* - Omitted → catches everything (error.tsx behavior)
|
|
822
|
+
*
|
|
823
|
+
* See design/10-error-handling.md §"Status-Code Files"
|
|
824
|
+
*/
|
|
825
|
+
/**
|
|
826
|
+
* Tracks the chain of segment keys from root to the current boundary.
|
|
827
|
+
* Each keyed `TimberErrorBoundary` appends its `segmentKey`; unkeyed
|
|
828
|
+
* slot boundaries pass the parent value through. The claim rule uses
|
|
829
|
+
* this to find the first *reachable* owner from the `owners` list,
|
|
830
|
+
* eliminating the owner-below-throw-site escape. See TIM-1450.
|
|
831
|
+
*/
|
|
832
|
+
var DenyAncestryContext = createContext([]);
|
|
833
|
+
var _handledRedirects = /* @__PURE__ */ new WeakSet();
|
|
834
|
+
var _handledExits = /* @__PURE__ */ new WeakSet();
|
|
835
|
+
var _pendingRedirectLocation = null;
|
|
836
|
+
var TimberErrorBoundary = class extends Component {
|
|
837
|
+
constructor(props) {
|
|
838
|
+
super(props);
|
|
839
|
+
this.state = {
|
|
840
|
+
hasError: false,
|
|
841
|
+
error: null
|
|
842
|
+
};
|
|
843
|
+
}
|
|
844
|
+
static getDerivedStateFromError(error) {
|
|
845
|
+
if (isPageUnloading()) return {
|
|
846
|
+
hasError: false,
|
|
847
|
+
error: null
|
|
848
|
+
};
|
|
849
|
+
return {
|
|
850
|
+
hasError: true,
|
|
851
|
+
error
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
componentDidCatch(error) {
|
|
855
|
+
markStaleFromError(error);
|
|
856
|
+
}
|
|
857
|
+
componentDidUpdate(prevProps) {
|
|
858
|
+
if (this.state.hasError && prevProps.children !== this.props.children) this.setState({
|
|
859
|
+
hasError: false,
|
|
860
|
+
error: null
|
|
861
|
+
});
|
|
862
|
+
}
|
|
863
|
+
/** Reset the error state so children re-render. */
|
|
864
|
+
reset = () => {
|
|
865
|
+
this.setState({
|
|
866
|
+
hasError: false,
|
|
867
|
+
error: null
|
|
868
|
+
});
|
|
869
|
+
};
|
|
870
|
+
static contextType = DenyAncestryContext;
|
|
871
|
+
get childAncestry() {
|
|
872
|
+
const parent = this.context ?? [];
|
|
873
|
+
const key = this.props.segmentKey;
|
|
874
|
+
return key && !parent.includes(key) ? [...parent, key] : parent;
|
|
875
|
+
}
|
|
876
|
+
render() {
|
|
877
|
+
if (!this.state.hasError || !this.state.error) return createElement(DenyAncestryContext.Provider, { value: this.childAncestry }, this.props.children);
|
|
878
|
+
const error = this.state.error;
|
|
879
|
+
const parsed = parseDigest(error);
|
|
880
|
+
if (parsed?.type === "redirect") {
|
|
881
|
+
if (typeof window === "undefined") throw error;
|
|
882
|
+
if (!(_handledRedirects.has(error) || _pendingRedirectLocation === parsed.location)) {
|
|
883
|
+
_handledRedirects.add(error);
|
|
884
|
+
const router = getRouterOrNull();
|
|
885
|
+
if (router) {
|
|
886
|
+
_pendingRedirectLocation = parsed.location;
|
|
887
|
+
queueMicrotask(() => {
|
|
888
|
+
router.navigate(parsed.location, { replace: true }).catch(() => {
|
|
889
|
+
window.location.href = parsed.location;
|
|
890
|
+
}).finally(() => {
|
|
891
|
+
_pendingRedirectLocation = null;
|
|
892
|
+
});
|
|
893
|
+
});
|
|
894
|
+
} else window.location.href = parsed.location;
|
|
895
|
+
}
|
|
896
|
+
return this.markStatusPage(null);
|
|
897
|
+
}
|
|
898
|
+
if (parsed?.type === "deny" && Array.isArray(parsed.owners) && parsed.owners.length > 0) {
|
|
899
|
+
if (!this.props.lastResort && !this.props.isSlotBoundary) {
|
|
900
|
+
const reachable = parsed.owners.find((k) => this.childAncestry.includes(k));
|
|
901
|
+
if (!this.props.segmentKey || reachable !== this.props.segmentKey) throw error;
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
if (this.props.denyOnly && !this.props.lastResort && parsed?.type !== "deny") throw error;
|
|
905
|
+
if (this.props.lastResort && parsed?.type !== "deny") {
|
|
906
|
+
if (typeof window === "undefined") throw error;
|
|
907
|
+
if (!_handledExits.has(error)) {
|
|
908
|
+
_handledExits.add(error);
|
|
909
|
+
const router = getRouterOrNull();
|
|
910
|
+
const current = window.location.pathname + window.location.search;
|
|
911
|
+
const target = router?.getPendingUrl() ?? current;
|
|
912
|
+
queueMicrotask(() => {
|
|
913
|
+
leaveSpa(target, current);
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
return null;
|
|
917
|
+
}
|
|
918
|
+
if (this.props.status != null) {
|
|
919
|
+
const errorStatus = getErrorStatus(parsed, error);
|
|
920
|
+
if (errorStatus == null || !statusMatches(this.props.status, errorStatus)) throw error;
|
|
921
|
+
}
|
|
922
|
+
return this.markStatusPage(this.renderFallback(parsed, error));
|
|
923
|
+
}
|
|
924
|
+
/**
|
|
925
|
+
* The status page this boundary shows for a row it claimed. Its shape is
|
|
926
|
+
* the file's documented contract: TSX status files get `{ status,
|
|
927
|
+
* data }`, `error.tsx` gets `{ error, digest, reset }` (plus
|
|
928
|
+
* the deny extras for dual-shape implementations — without the error prop,
|
|
929
|
+
* an error.tsx reading error.message crashes on deny fall-through, TIM-1081).
|
|
930
|
+
*/
|
|
931
|
+
renderFallback(parsed, error) {
|
|
932
|
+
if (parsed?.type === "deny") {
|
|
933
|
+
if (this.props.status != null) return createElement(this.props.fallbackComponent, {
|
|
934
|
+
status: parsed.status,
|
|
935
|
+
data: parsed.data
|
|
936
|
+
});
|
|
937
|
+
return createElement(this.props.fallbackComponent, {
|
|
938
|
+
error: denyError(parsed.status, error),
|
|
939
|
+
digest: null,
|
|
940
|
+
reset: this.reset,
|
|
941
|
+
status: parsed.status,
|
|
942
|
+
data: parsed.data
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
return createElement(this.props.fallbackComponent, {
|
|
946
|
+
error,
|
|
947
|
+
digest: errorDigestId(error),
|
|
948
|
+
reset: this.reset
|
|
949
|
+
});
|
|
950
|
+
}
|
|
951
|
+
/**
|
|
952
|
+
* A status page (or, for a redirect row, nothing at all) replaced part of
|
|
953
|
+
* the main route, and the segment cache must not learn a chain that never
|
|
954
|
+
* mounted; the marker tells the navigation that commits this tree. A boundary that declined in `render()` re-threw
|
|
955
|
+
* before getting here, so only the boundary that put a page on screen
|
|
956
|
+
* speaks. A slot degrading leaves the page and its chain intact, so slot
|
|
957
|
+
* boundaries stay silent. See `status-page-marker.tsx` (TIM-1495).
|
|
958
|
+
*/
|
|
959
|
+
markStatusPage(page) {
|
|
960
|
+
if (this.props.isSlotBoundary) return page;
|
|
961
|
+
return createElement(StatusPageMarker, null, page);
|
|
962
|
+
}
|
|
963
|
+
};
|
|
964
|
+
/**
|
|
965
|
+
* Parse the structured digest from the error.
|
|
966
|
+
* React sets `error.digest` from the string returned by RSC's onError.
|
|
967
|
+
*/
|
|
968
|
+
function parseDigest(error) {
|
|
969
|
+
const raw = error.digest;
|
|
970
|
+
if (typeof raw !== "string") return null;
|
|
971
|
+
try {
|
|
972
|
+
const parsed = JSON.parse(raw);
|
|
973
|
+
if (parsed && typeof parsed === "object" && typeof parsed.type === "string") return parsed;
|
|
974
|
+
} catch (e) {
|
|
975
|
+
console.debug("[timber] error digest is not valid JSON:", e instanceof Error ? e.message : e);
|
|
976
|
+
}
|
|
977
|
+
return null;
|
|
978
|
+
}
|
|
979
|
+
/**
|
|
980
|
+
* The Error an `error.tsx` serving a deny should receive.
|
|
981
|
+
*
|
|
982
|
+
* The error that actually arrives here is React's, not the framework's: a
|
|
983
|
+
* server-thrown error crossing Flight has its message and name replaced with
|
|
984
|
+
* a generic redacted string in production, by design. An `error.tsx` written
|
|
985
|
+
* per the docs branches on `error.message` — so handing it the redacted error
|
|
986
|
+
* gives it nothing to branch on, while the in-tree path hands the same file a
|
|
987
|
+
* `DenySignal` named error reading `Access denied with status <N>` (see
|
|
988
|
+
* `renderDenyEntry`). This reconstructs that shape from the digest, which is
|
|
989
|
+
* where the status already is.
|
|
990
|
+
*
|
|
991
|
+
* Derived from the status alone — no stack, no server data — so it is safe on
|
|
992
|
+
* the client for the same reason the digest is. See design/13-security.md
|
|
993
|
+
* §"Errors don't leak", TIM-1081.
|
|
994
|
+
*/
|
|
995
|
+
function denyError(status, original) {
|
|
996
|
+
if (original.name === "DenySignal") return original;
|
|
997
|
+
const error = /* @__PURE__ */ new Error(`Access denied with status ${status}`);
|
|
998
|
+
error.name = "DenySignal";
|
|
999
|
+
return error;
|
|
1000
|
+
}
|
|
1001
|
+
/**
|
|
1002
|
+
* Extract the HTTP status code from a parsed digest or error message.
|
|
1003
|
+
* Falls back to message pattern matching for errors without a digest.
|
|
1004
|
+
*/
|
|
1005
|
+
function getErrorStatus(parsed, error) {
|
|
1006
|
+
if (parsed?.type === "deny") return parsed.status;
|
|
1007
|
+
if (parsed?.type === "redirect") return parsed.status;
|
|
1008
|
+
const match = error.message.match(/^Access denied with status (\d+)$/);
|
|
1009
|
+
if (match) return parseInt(match[1], 10);
|
|
1010
|
+
return 500;
|
|
1011
|
+
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Check whether an error's status matches the boundary's status filter.
|
|
1014
|
+
* Category markers (400, 500) match any status in that range.
|
|
1015
|
+
*/
|
|
1016
|
+
function statusMatches(boundaryStatus, errorStatus) {
|
|
1017
|
+
if (boundaryStatus === 400) return errorStatus >= 400 && errorStatus <= 499;
|
|
1018
|
+
if (boundaryStatus === 500) return errorStatus >= 500 && errorStatus <= 599;
|
|
1019
|
+
return boundaryStatus === errorStatus;
|
|
1020
|
+
}
|
|
1021
|
+
//#endregion
|
|
1022
|
+
export { createSpaExits as a, NonRscResponse as c, readPublishedParams as d, createScrollEffects as i, fetchRscPayload as l, TimberErrorBoundary as n, recordSkew as o, createNavigationRecovery as r, isClientStale as s, DenyAncestryContext as t, readPayloadTree as u };
|
|
1023
|
+
|
|
1024
|
+
//# sourceMappingURL=error-boundary-DsNScGRM.js.map
|