@timber-js/app 0.2.0-alpha.2 → 0.2.0-alpha.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/agent-skill.md +346 -0
- package/dist/_chunks/actions-d1hCqnU3.js +345 -0
- package/dist/_chunks/actions-d1hCqnU3.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js +135 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +1 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js +370 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/cache-api-ByagcC-J.js +1149 -0
- package/dist/_chunks/cache-api-ByagcC-J.js.map +1 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
- package/dist/_chunks/chains-Bpb0W4ax.js +412 -0
- package/dist/_chunks/chains-Bpb0W4ax.js.map +1 -0
- package/dist/_chunks/cli-check-D6VolrDV.js +293 -0
- package/dist/_chunks/cli-check-D6VolrDV.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js +299 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js.map +1 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js +1290 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js +893 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js +1050 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js +458 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js +150 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js.map +1 -0
- package/dist/_chunks/logger-uLBuGKDI.js +1484 -0
- package/dist/_chunks/logger-uLBuGKDI.js.map +1 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js +135 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js +321 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js +101 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-AiazgH_f.js +1771 -0
- package/dist/_chunks/scanner-AiazgH_f.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-D9_89u34.js +34 -0
- package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
- package/dist/_chunks/segment-keys-lqtdookO.js +256 -0
- package/dist/_chunks/segment-keys-lqtdookO.js.map +1 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-D6T6Y3ef.js} +3 -31
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
- package/dist/_chunks/state-FippDgxN.js +52 -0
- package/dist/_chunks/state-FippDgxN.js.map +1 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +1 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js +226 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -0
- package/dist/_chunks/walkers-B6XUtmqK.js +144 -0
- package/dist/_chunks/walkers-B6XUtmqK.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +74 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +200 -22
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +17 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +82 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +457 -288
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +62 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +28 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +150 -0
- package/dist/analyze/classify.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.d.ts +17 -0
- package/dist/analyze/crawl-entry.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.js +313 -0
- package/dist/analyze/crawl-entry.js.map +1 -0
- package/dist/analyze/crawl.d.ts +134 -0
- package/dist/analyze/crawl.d.ts.map +1 -0
- package/dist/analyze/graph-cache.d.ts +104 -0
- package/dist/analyze/graph-cache.d.ts.map +1 -0
- package/dist/analyze/graph-command.d.ts +43 -0
- package/dist/analyze/graph-command.d.ts.map +1 -0
- package/dist/analyze/graph-command.js +472 -0
- package/dist/analyze/graph-command.js.map +1 -0
- package/dist/analyze/live-graph.d.ts +81 -0
- package/dist/analyze/live-graph.d.ts.map +1 -0
- package/dist/analyze/poison-rules.d.ts +72 -0
- package/dist/analyze/poison-rules.d.ts.map +1 -0
- package/dist/analyze/poison-scan.d.ts +48 -0
- package/dist/analyze/poison-scan.d.ts.map +1 -0
- package/dist/analyze/scan.d.ts +73 -0
- package/dist/analyze/scan.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +27 -0
- package/dist/cache/fast-hash.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +32 -9
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -284
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +141 -9
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +21 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +21 -11
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/cloudflare-purge.js +30 -0
- package/dist/cdn/cloudflare-purge.js.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.js +33 -0
- package/dist/cdn/fastly-purge.js.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/index.js +94 -0
- package/dist/cdn/index.js.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +20 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.js +35 -0
- package/dist/cdn/workers-cache-purge.js.map +1 -0
- package/dist/cli-check.d.ts +163 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +75 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +175 -47
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +44 -0
- package/dist/client/browser-entry/action-queue.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +63 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +46 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +66 -6
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +323 -1148
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +818 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +63 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +98 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +51 -31
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +98 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +187 -0
- package/dist/client/navigation-transition.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +44 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +130 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +87 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +272 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +104 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +161 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +29 -7
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +19 -8
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +13 -11
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +2 -2
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +322 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +46 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +112 -8
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +2 -1
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +5 -3
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +6 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +35 -153
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10488 -13975
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +276 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +54 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +32 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -65
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/graph-endpoint.d.ts +112 -0
- package/dist/plugins/graph-endpoint.d.ts.map +1 -0
- package/dist/plugins/mdx.d.ts +24 -5
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +39 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +218 -21
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +26 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +61 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen-write.d.ts +51 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +8 -3
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/convention-lint.d.ts +55 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +72 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +13 -7
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception-overlap.d.ts +35 -0
- package/dist/routing/interception-overlap.d.ts.map +1 -0
- package/dist/routing/interception.d.ts +234 -10
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +105 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +26 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +14 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +114 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/segment-keys.d.ts +118 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/types.d.ts +74 -26
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +57 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +14 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- package/dist/schema-bridge.d.ts +145 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +262 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +3 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +179 -360
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +81 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/serialize-equal.d.ts +9 -0
- package/dist/search-params/serialize-equal.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +76 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/server/access-gate.d.ts +98 -10
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +39 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +29 -35
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +117 -13
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +25 -30
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/compress.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csp-nonce.d.ts +45 -0
- package/dist/server/csp-nonce.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/debug.d.ts +82 -0
- package/dist/server/debug.d.ts.map +1 -0
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +253 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +20 -9
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +101 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +45 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/html-injector-core.d.ts +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +18 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +212 -2930
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4034 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +71 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +78 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +77 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +59 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +7 -1
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +160 -24
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +63 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +52 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +79 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +129 -45
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +26 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +111 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +40 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +38 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +59 -42
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +40 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +26 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +39 -3
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +37 -5
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +130 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/skippable-prefix.d.ts +29 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +137 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts +54 -0
- package/dist/server/slot-subtree-contain.d.ts.map +1 -0
- package/dist/server/ssr-bridge-types.d.ts +160 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +1 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +69 -22
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +93 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +44 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +112 -0
- package/dist/server/static-generator.d.ts.map +1 -0
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +26 -15
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +56 -11
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +88 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +17 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/waituntil-bridge.d.ts.map +1 -1
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +109 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +16 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +52 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/dist/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- package/dist/shims/navigation.d.ts +10 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +236 -0
- package/docs/api/31-api-client.mdx +167 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +329 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +192 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +252 -0
- package/docs/learn/11-middleware.mdx +158 -0
- package/docs/learn/12-error-handling.mdx +188 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +117 -29
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +747 -130
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +279 -418
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +274 -0
- package/src/adapters/types.ts +28 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +258 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +332 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +162 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +39 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +115 -22
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +69 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +180 -48
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +23 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +34 -0
- package/src/cli-check.ts +507 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +262 -55
- package/src/client/browser-dev.ts +157 -2
- package/src/client/browser-entry/action-dispatch.ts +197 -0
- package/src/client/browser-entry/action-queue.ts +90 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +148 -0
- package/src/client/browser-entry/index.ts +131 -0
- package/src/client/browser-entry/post-hydration.ts +123 -0
- package/src/client/browser-entry/router-init.ts +418 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/deny-last-resort.tsx +54 -0
- package/src/client/error-boundary.tsx +316 -40
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +81 -10
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +452 -159
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +347 -0
- package/src/client/navigation-commit.ts +295 -0
- package/src/client/navigation-context.ts +67 -98
- package/src/client/navigation-root.tsx +224 -0
- package/src/client/navigation-transition.ts +327 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +72 -0
- package/src/client/router-effects.ts +228 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +490 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +294 -0
- package/src/client/router.ts +436 -424
- package/src/client/rsc-fetch.ts +512 -73
- package/src/client/segment-cache.ts +327 -40
- package/src/client/segment-context.ts +13 -5
- package/src/client/segment-outlet.tsx +96 -0
- package/src/client/segment-update-context.ts +23 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-content-cache-context.ts +43 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +30 -9
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +29 -15
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +36 -29
- package/src/client/unload-guard.ts +35 -3
- package/src/client/use-cookie.ts +70 -18
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +22 -31
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +6 -3
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +322 -0
- package/src/config-validation.ts +347 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +185 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +3 -2
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +101 -19
- package/src/fonts/local.ts +13 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +486 -344
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +503 -0
- package/src/plugins/adapter-build.ts +229 -7
- package/src/plugins/build-manifest.ts +201 -26
- package/src/plugins/build-report.ts +275 -43
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +369 -96
- package/src/plugins/entries.ts +148 -18
- package/src/plugins/fonts.ts +251 -524
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +116 -40
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +320 -0
- package/src/plugins/request-dep/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +273 -277
- package/src/plugins/server-bundle.ts +103 -14
- package/src/plugins/shims.ts +259 -97
- package/src/plugins/static-build.ts +708 -66
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +141 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +623 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +393 -219
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +75 -26
- package/src/routing/walkers.ts +98 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +19 -0
- package/src/schema-bridge.ts +380 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +196 -57
- package/src/server/action-client.ts +136 -35
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +256 -56
- package/src/server/actions.ts +112 -68
- package/src/server/als-registry.ts +160 -21
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +33 -57
- package/src/server/canonicalize.ts +6 -3
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +115 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csp-nonce.ts +70 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/debug.ts +137 -0
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +533 -0
- package/src/server/deny-renderer.ts +214 -112
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +181 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +2 -2
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +272 -235
- package/src/server/index.ts +40 -192
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +173 -0
- package/src/server/logger.ts +73 -36
- package/src/server/metadata-collector.ts +174 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +23 -2
- package/src/server/middleware-runner.ts +32 -5
- package/src/server/node-stream-transforms.ts +323 -0
- package/src/server/nuqs-ssr-provider.tsx +8 -7
- package/src/server/param-coercion.ts +198 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +218 -0
- package/src/server/pipeline-phases.ts +606 -0
- package/src/server/pipeline.ts +343 -389
- package/src/server/port-resolution.ts +53 -0
- package/src/server/prebuilt/cache-key.ts +299 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +122 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +202 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +122 -0
- package/src/server/prebuilt-builder.ts +804 -0
- package/src/server/prebuilt-runtime.ts +817 -0
- package/src/server/primitives.ts +246 -97
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +35 -0
- package/src/server/request-context.ts +244 -333
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +508 -360
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +40 -13
- package/src/server/route-matcher.ts +165 -272
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +174 -0
- package/src/server/rsc-entry/api-handler.ts +78 -34
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +373 -95
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +405 -323
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +239 -50
- package/src/server/rsc-entry/rsc-stream.ts +160 -30
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +315 -57
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +3 -1
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +172 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +707 -300
- package/src/server/slot-subtree-contain.ts +255 -0
- package/src/server/ssr-bridge-types.ts +165 -0
- package/src/server/ssr-entry.ts +230 -85
- package/src/server/ssr-render.ts +357 -85
- package/src/server/ssr-wrappers.tsx +162 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +715 -0
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +107 -148
- package/src/server/stream-utils.ts +292 -0
- package/src/server/tracing.ts +151 -16
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +95 -10
- package/src/server/utils/element-type.ts +88 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +5 -2
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/als-slots.ts +74 -0
- package/src/shared/base-path.ts +80 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/param-value.ts +281 -0
- package/src/shared/payload-root.ts +152 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +16 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +59 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +109 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shared/status-reason-phrase.ts +61 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +36 -32
- package/src/shims/navigation-rsc.ts +47 -0
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
- package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
- package/dist/_chunks/format-DNt20Kt8.js +0 -163
- package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
- package/dist/_chunks/interception-DGDIjDbR.js +0 -676
- package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
- package/dist/_chunks/metadata-routes-CQCnF4VK.js +0 -153
- package/dist/_chunks/metadata-routes-CQCnF4VK.js.map +0 -1
- package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
- package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
- package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
- package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
- package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
- package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
- package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js +0 -109
- package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/error-boundary.js.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts +0 -92
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/content/index.d.ts +0 -11
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -2
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/tree-builder.d.ts +0 -126
- package/dist/server/tree-builder.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -99
- package/src/client/browser-entry.ts +0 -674
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -345
- package/src/client/stale-reload.ts +0 -89
- package/src/client/transition-root.tsx +0 -160
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/client/use-params.ts +0 -141
- package/src/content/index.ts +0 -13
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/search-params/registry.ts +0 -31
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -282
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/tree-builder.ts +0 -382
- package/src/shims/server-only-noop.js +0 -6
- package/src/utils/directive-parser.ts +0 -529
|
@@ -6,43 +6,84 @@
|
|
|
6
6
|
* rsc-entry.ts under the 500-line limit.
|
|
7
7
|
*
|
|
8
8
|
* This module handles:
|
|
9
|
-
* 1.
|
|
10
|
-
* 2.
|
|
11
|
-
* 3. Resolving metadata (
|
|
9
|
+
* 1. Running access.ts checks eagerly to gate metadata resolution (TIM-1027)
|
|
10
|
+
* 2. Loading page/layout components from the segment chain
|
|
11
|
+
* 3. Resolving metadata (skipped for denied segments to prevent side effects)
|
|
12
12
|
* 4. Building the React element tree (page → error boundaries → access gates → layouts)
|
|
13
13
|
* 5. Resolving parallel slots
|
|
14
14
|
*
|
|
15
15
|
* See design/02-rendering-pipeline.md, design/04-authorization.md
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import { createElement } from 'react';
|
|
19
|
-
|
|
20
|
-
import { withSpan
|
|
21
|
-
import type { RouteMatch } from './pipeline.
|
|
22
|
-
import type { ManifestSegmentNode } from './route-matcher.
|
|
23
|
-
import {
|
|
24
|
-
import
|
|
25
|
-
import type
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
18
|
+
import { createElement, Fragment } from 'react';
|
|
19
|
+
|
|
20
|
+
import { withSpan } from './tracing.ts';
|
|
21
|
+
import type { RouteMatch } from './pipeline.ts';
|
|
22
|
+
import type { ManifestSegmentNode } from './route-matcher.ts';
|
|
23
|
+
import { isDenySignal, DenySignal } from './primitives.ts';
|
|
24
|
+
import { isClientReference } from './utils/element-type.ts';
|
|
25
|
+
import { loadRouteModules, type MetadataSource, type AccessFn } from './route-module-loader.ts';
|
|
26
|
+
import { MetadataCollector, MetadataHead } from './metadata-collector.ts';
|
|
27
|
+
import { AccessGate } from './access-gate.tsx';
|
|
28
|
+
import { PageDenyBoundary, buildDenyPageChain, handleCaughtDeny } from './deny-boundary.ts';
|
|
29
|
+
import type { DenyPageEntry } from './deny-boundary.ts';
|
|
30
|
+
import {
|
|
31
|
+
resolveSlotProps,
|
|
32
|
+
publishSlotSegmentParams,
|
|
33
|
+
emitSlotInfoForSkippedLayout,
|
|
34
|
+
type SlotSkipEntry,
|
|
35
|
+
} from './slot-resolver.ts';
|
|
36
|
+
import { consumedUrlParts } from './chain-url-parts.ts';
|
|
37
|
+
import { withPublishedParams } from './publish-params.ts';
|
|
38
|
+
import type { RscPayloadRoot } from '../shared/payload-root.ts';
|
|
39
|
+
import { SegmentProvider } from '../client/segment-context.ts';
|
|
40
|
+
import { SegmentOutlet } from '../client/segment-outlet.tsx';
|
|
41
|
+
|
|
42
|
+
import { TimberErrorBoundary } from '../client/error-boundary.tsx';
|
|
43
|
+
import { wrapSegmentWithErrorBoundaries } from './error-boundary-wrapper.ts';
|
|
44
|
+
import type { InterceptionContext } from './pipeline.ts';
|
|
45
|
+
import type { ClientStateTree } from './state-tree-diff.ts';
|
|
46
|
+
import { computeSkippableSet } from './skippable-prefix.ts';
|
|
47
|
+
import { computeSegmentKeys, computeSegmentTreePaths } from '../routing/segment-keys.ts';
|
|
48
|
+
import { setFirstDeniedSegmentIndex } from './deny-boundary.ts';
|
|
49
|
+
import { loadModule } from './safe-load.ts';
|
|
50
|
+
import { replaceOutermostSegmentOutlet } from './route-element-helpers.ts';
|
|
36
51
|
|
|
37
|
-
|
|
52
|
+
/**
|
|
53
|
+
* The `segments` array handed to a layout's `SegmentProvider` — the value
|
|
54
|
+
* `useSelectedLayoutSegment(s)` reads.
|
|
55
|
+
*
|
|
56
|
+
* Only its **length** matters: both hooks take `segments.length` as a depth and
|
|
57
|
+
* index the live pathname with it. So this is really "how many URL parts had
|
|
58
|
+
* been consumed by the time this layout rendered", which is
|
|
59
|
+
* `consumedUrlParts` — the same derivation slot matching and the slot-skip
|
|
60
|
+
* slicing use, so a layout and the slots beside it cannot disagree about how
|
|
61
|
+
* deep they are. The root consumes nothing → `['']`, length 1.
|
|
62
|
+
*
|
|
63
|
+
* @internal — exported for tests; production has exactly one caller.
|
|
64
|
+
*/
|
|
65
|
+
export function computeLayoutSegmentPath(
|
|
66
|
+
segments: ManifestSegmentNode[],
|
|
67
|
+
index: number,
|
|
68
|
+
match: RouteMatch
|
|
69
|
+
): string[] {
|
|
70
|
+
const parts = consumedUrlParts(segments, index, match);
|
|
71
|
+
return parts.length === 0 ? [''] : ['', ...parts];
|
|
72
|
+
}
|
|
38
73
|
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Thrown when a matched route has no page component in its leaf segment.
|
|
76
|
+
* The pipeline catches this and renders the custom 404 page.
|
|
77
|
+
*/
|
|
78
|
+
export class NoPageComponentError extends Error {
|
|
79
|
+
constructor(message: string) {
|
|
80
|
+
super(message);
|
|
81
|
+
this.name = 'NoPageComponentError';
|
|
82
|
+
}
|
|
44
83
|
}
|
|
45
84
|
|
|
85
|
+
// ─── Types ────────────────────────────────────────────────────────────────
|
|
86
|
+
|
|
46
87
|
/** Layout entry with component and segment. */
|
|
47
88
|
export interface LayoutComponentEntry {
|
|
48
89
|
component: (...args: unknown[]) => unknown;
|
|
@@ -51,10 +92,12 @@ export interface LayoutComponentEntry {
|
|
|
51
92
|
|
|
52
93
|
/** Result of building a route element tree. */
|
|
53
94
|
export interface RouteElementResult {
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
95
|
+
/**
|
|
96
|
+
* The payload root: the React element tree (page wrapped in layouts, access
|
|
97
|
+
* gates, error boundaries) plus the params it rendered with, as siblings.
|
|
98
|
+
* See shared/payload-root.ts for why params are not a wrapper around it.
|
|
99
|
+
*/
|
|
100
|
+
payload: RscPayloadRoot;
|
|
58
101
|
/** Layout components loaded along the segment chain. */
|
|
59
102
|
layoutComponents: LayoutComponentEntry[];
|
|
60
103
|
/** Segments from the route match. */
|
|
@@ -68,20 +111,73 @@ export interface RouteElementResult {
|
|
|
68
111
|
* See design/19-client-navigation.md §"X-Timber-State-Tree Header"
|
|
69
112
|
*/
|
|
70
113
|
skippedSegments: string[];
|
|
114
|
+
/**
|
|
115
|
+
* Slot metadata for the X-Timber-Segments header. Contains info about
|
|
116
|
+
* all parallel route slots encountered during element tree construction,
|
|
117
|
+
* enabling the client to populate its segment cache with slot entries.
|
|
118
|
+
*/
|
|
119
|
+
slotSkipInfo: SlotSkipEntry[];
|
|
120
|
+
/**
|
|
121
|
+
* The deny page chain built from the leaf segment outward to root.
|
|
122
|
+
* Threaded into `renderRscStream` for late addressing of nested-component
|
|
123
|
+
* denies in Flight's `onError`. See TIM-1450.
|
|
124
|
+
*/
|
|
125
|
+
leafDenyChain?: DenyPageEntry[];
|
|
71
126
|
}
|
|
72
127
|
|
|
128
|
+
// ─── Wrapping Helpers ────────────────────────────────────────────────────
|
|
129
|
+
|
|
73
130
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
131
|
+
* Wrap an element in MetadataCollector(s) for one segment's metadata sources.
|
|
132
|
+
*
|
|
133
|
+
* The loop wraps innermost-to-outermost, so the last-wrapped collector
|
|
134
|
+
* renders first. `.reverse()` ensures layout metadata is pushed before
|
|
135
|
+
* page metadata, preserving the root→page merge order required by
|
|
136
|
+
* resolveMetadata (page-authoritative). See TIM-1363.
|
|
76
137
|
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
) {
|
|
83
|
-
|
|
138
|
+
function wrapMetadataCollectors(
|
|
139
|
+
element: React.ReactElement,
|
|
140
|
+
sources: MetadataSource[],
|
|
141
|
+
h: (...args: unknown[]) => React.ReactElement
|
|
142
|
+
): React.ReactElement {
|
|
143
|
+
for (const meta of sources) {
|
|
144
|
+
element = h(MetadataCollector, {
|
|
145
|
+
metadataExport: meta.metadataExport,
|
|
146
|
+
segmentName: meta.segmentName,
|
|
147
|
+
isPage: meta.isPage,
|
|
148
|
+
children: element,
|
|
149
|
+
});
|
|
84
150
|
}
|
|
151
|
+
return element;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Wrap an element in an AccessGate for one segment.
|
|
156
|
+
*
|
|
157
|
+
* Skipped segments pass `skippedSegment: true` and omit `denyPages`.
|
|
158
|
+
* Rendered segments pass `denyPages` and omit `skippedSegment`.
|
|
159
|
+
*/
|
|
160
|
+
function wrapAccessGate(
|
|
161
|
+
element: React.ReactElement,
|
|
162
|
+
opts: {
|
|
163
|
+
accessFn: () => unknown;
|
|
164
|
+
segment: ManifestSegmentNode;
|
|
165
|
+
segmentKey: string;
|
|
166
|
+
segmentIndex: number;
|
|
167
|
+
denyPages?: DenyPageEntry[];
|
|
168
|
+
skippedSegment?: boolean;
|
|
169
|
+
},
|
|
170
|
+
h: (...args: unknown[]) => React.ReactElement
|
|
171
|
+
): React.ReactElement {
|
|
172
|
+
return h(AccessGate, {
|
|
173
|
+
accessFn: opts.accessFn,
|
|
174
|
+
segmentName: opts.segment.segmentName,
|
|
175
|
+
segmentKey: opts.segmentKey,
|
|
176
|
+
segmentIndex: opts.segmentIndex,
|
|
177
|
+
...(opts.skippedSegment ? { skippedSegment: true } : {}),
|
|
178
|
+
...(opts.denyPages ? { denyPages: opts.denyPages } : {}),
|
|
179
|
+
children: element,
|
|
180
|
+
});
|
|
85
181
|
}
|
|
86
182
|
|
|
87
183
|
// ─── Builder ──────────────────────────────────────────────────────────────
|
|
@@ -89,223 +185,120 @@ export class RouteSignalWithContext extends Error {
|
|
|
89
185
|
/**
|
|
90
186
|
* Build a React element tree from a matched route.
|
|
91
187
|
*
|
|
92
|
-
* Loads modules,
|
|
93
|
-
* the element tree.
|
|
94
|
-
*
|
|
188
|
+
* Loads route modules, resolves metadata (skipping denied segments via
|
|
189
|
+
* AccessGate), and constructs the element tree. Access checks run during
|
|
190
|
+
* render inside AccessGate — denied segments' metadata never executes.
|
|
95
191
|
*
|
|
96
192
|
* Does NOT serialize to RSC Flight — the caller decides whether to render
|
|
97
193
|
* to a stream or use the element directly (e.g., for action revalidation).
|
|
194
|
+
*
|
|
195
|
+
* For passing segments, AccessGate re-runs access during render so that
|
|
196
|
+
* React.cache is populated for layout dedup (TIM-662). For denied
|
|
197
|
+
* segments, the pre-computed verdict is replayed — no re-execution,
|
|
198
|
+
* no metadata side effects, no head leak (TIM-1027).
|
|
98
199
|
*/
|
|
99
200
|
export async function buildRouteElement(
|
|
100
201
|
req: Request,
|
|
101
202
|
match: RouteMatch,
|
|
102
203
|
interception?: InterceptionContext,
|
|
103
|
-
clientStateTree?:
|
|
204
|
+
clientStateTree?: ClientStateTree | null,
|
|
205
|
+
metadataRouteHashes?: Record<string, string>
|
|
104
206
|
): Promise<RouteElementResult> {
|
|
105
|
-
const segments = match.segments
|
|
106
|
-
|
|
107
|
-
//
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
207
|
+
const segments = match.segments;
|
|
208
|
+
|
|
209
|
+
// ── Module loading ──────────────────────────────────────────────────
|
|
210
|
+
// Load layout/page modules and collect metadata sources. Metadata
|
|
211
|
+
// resolution is deferred to render time via MetadataCollector components
|
|
212
|
+
// placed below each AccessGate — denied segments' metadata() never
|
|
213
|
+
// executes because AccessGate prevents MetadataCollector from rendering.
|
|
214
|
+
// No pre-render access pass needed. See TIM-1363.
|
|
215
|
+
const { metadataSources, layoutComponents, PageComponent, deferSuspenseFor, accessFns } =
|
|
216
|
+
await loadRouteModules(segments, req.url);
|
|
217
|
+
|
|
218
|
+
// Compute state-tree keys for all segments. Route groups accumulate
|
|
219
|
+
// ancestor group names for globally unique keys (e.g., "/(a)/(shared)"
|
|
220
|
+
// instead of just "/(shared)"). This is the single key computation —
|
|
221
|
+
// the same keys are used for skip decisions, SegmentOutlet props, the
|
|
222
|
+
// X-Timber-Segments header (via buildSegmentInfo), the error boundaries,
|
|
223
|
+
// and deny page ownership.
|
|
224
|
+
//
|
|
225
|
+
// Computed here, before the deny chains below, because each chain entry
|
|
226
|
+
// records the key of the segment that owns it.
|
|
227
|
+
const segmentKeys = computeSegmentKeys(segments);
|
|
228
|
+
// The directory path of each segment — the key `setSlotParams` and codegen
|
|
229
|
+
// both use for a slot beneath it, and the identity interception scoping
|
|
230
|
+
// compares against. One derivation, so a slot cannot be keyed two ways.
|
|
231
|
+
const segmentTreePaths = computeSegmentTreePaths(segments);
|
|
232
|
+
|
|
233
|
+
// Build deny page fallback chains for each segment position.
|
|
234
|
+
// When AccessGate or PageDenyBoundary catches a DenySignal, they render
|
|
235
|
+
// the matching deny page in-tree instead of throwing into React Flight.
|
|
236
|
+
// The chain walks from the current segment outward to root, collecting
|
|
237
|
+
// status-code files (403.tsx → 4xx.tsx → error.tsx) in fallback order,
|
|
238
|
+
// each tagged with the key of the segment it came from so the catch site
|
|
239
|
+
// can tell a file it owns from an ancestor's. See TIM-666, TIM-1356.
|
|
240
|
+
const denyPageChains = new Map<number, DenyPageEntry[]>();
|
|
116
241
|
for (let i = 0; i < segments.length; i++) {
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
// Load layout
|
|
121
|
-
if (segment.layout) {
|
|
122
|
-
const mod = (await segment.layout.load()) as Record<string, unknown>;
|
|
123
|
-
if (mod.default) {
|
|
124
|
-
layoutComponents.push({
|
|
125
|
-
component: mod.default as (...args: unknown[]) => unknown,
|
|
126
|
-
segment,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
// Reject legacy generateMetadata export — use `export async function metadata()` instead
|
|
130
|
-
if ('generateMetadata' in mod) {
|
|
131
|
-
const filePath = segment.layout.filePath ?? segment.urlPath;
|
|
132
|
-
throw new Error(
|
|
133
|
-
`${filePath}: "generateMetadata" is not a valid export. ` +
|
|
134
|
-
`Export an async function named "metadata" instead.\n\n` +
|
|
135
|
-
` // Before\n` +
|
|
136
|
-
` export async function generateMetadata({ params }) { ... }\n\n` +
|
|
137
|
-
` // After\n` +
|
|
138
|
-
` export async function metadata({ params }) { ... }`
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
// Unified metadata export: static object or async function
|
|
142
|
-
if (typeof mod.metadata === 'function') {
|
|
143
|
-
type MetadataFn = (props: Record<string, unknown>) => Promise<Metadata>;
|
|
144
|
-
const generated = await withSpan(
|
|
145
|
-
'timber.metadata',
|
|
146
|
-
{ 'timber.segment': segment.segmentName ?? segment.urlPath },
|
|
147
|
-
() => (mod.metadata as MetadataFn)({ params: paramsPromise })
|
|
148
|
-
);
|
|
149
|
-
if (generated) {
|
|
150
|
-
metadataEntries.push({ metadata: generated, isPage: false });
|
|
151
|
-
}
|
|
152
|
-
} else if (mod.metadata) {
|
|
153
|
-
metadataEntries.push({ metadata: mod.metadata as Metadata, isPage: false });
|
|
154
|
-
}
|
|
155
|
-
// deferSuspenseFor hold window — max across all segments
|
|
156
|
-
if (typeof mod.deferSuspenseFor === 'number' && mod.deferSuspenseFor > deferSuspenseFor) {
|
|
157
|
-
deferSuspenseFor = mod.deferSuspenseFor;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Load page (leaf segment only)
|
|
162
|
-
if (isLeaf && segment.page) {
|
|
163
|
-
// Load and apply search-params.ts definition before rendering so
|
|
164
|
-
// searchParams() from @timber-js/app/server returns parsed typed values.
|
|
165
|
-
if (segment.searchParams) {
|
|
166
|
-
const spMod = (await segment.searchParams.load()) as {
|
|
167
|
-
default?: SearchParamsDefinition<Record<string, unknown>>;
|
|
168
|
-
};
|
|
169
|
-
if (spMod.default) {
|
|
170
|
-
const rawSearchParams = new URL(req.url).searchParams;
|
|
171
|
-
const parsed = spMod.default.parse(rawSearchParams);
|
|
172
|
-
setParsedSearchParams(parsed);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const mod = (await segment.page.load()) as Record<string, unknown>;
|
|
177
|
-
if (mod.default) {
|
|
178
|
-
PageComponent = mod.default as (...args: unknown[]) => unknown;
|
|
179
|
-
}
|
|
180
|
-
// Reject legacy generateMetadata export — use `export async function metadata()` instead
|
|
181
|
-
if ('generateMetadata' in mod) {
|
|
182
|
-
const filePath = segment.page.filePath ?? segment.urlPath;
|
|
183
|
-
throw new Error(
|
|
184
|
-
`${filePath}: "generateMetadata" is not a valid export. ` +
|
|
185
|
-
`Export an async function named "metadata" instead.\n\n` +
|
|
186
|
-
` // Before\n` +
|
|
187
|
-
` export async function generateMetadata({ params }) { ... }\n\n` +
|
|
188
|
-
` // After\n` +
|
|
189
|
-
` export async function metadata({ params }) { ... }`
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
// Unified metadata export: static object or async function
|
|
193
|
-
if (typeof mod.metadata === 'function') {
|
|
194
|
-
type MetadataFn = (props: Record<string, unknown>) => Promise<Metadata>;
|
|
195
|
-
const generated = await withSpan(
|
|
196
|
-
'timber.metadata',
|
|
197
|
-
{ 'timber.segment': segment.segmentName ?? segment.urlPath },
|
|
198
|
-
() => (mod.metadata as MetadataFn)({ params: paramsPromise })
|
|
199
|
-
);
|
|
200
|
-
if (generated) {
|
|
201
|
-
metadataEntries.push({ metadata: generated, isPage: true });
|
|
202
|
-
}
|
|
203
|
-
} else if (mod.metadata) {
|
|
204
|
-
metadataEntries.push({ metadata: mod.metadata as Metadata, isPage: true });
|
|
205
|
-
}
|
|
206
|
-
// deferSuspenseFor hold window — max across all segments
|
|
207
|
-
if (typeof mod.deferSuspenseFor === 'number' && mod.deferSuspenseFor > deferSuspenseFor) {
|
|
208
|
-
deferSuspenseFor = mod.deferSuspenseFor;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (!PageComponent) {
|
|
214
|
-
throw new Error(`No page component found for route: ${new URL(req.url).pathname}`);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Run access.ts checks before rendering — top-down through the segment chain.
|
|
218
|
-
// Verdicts are stored so AccessGate can replay them synchronously during
|
|
219
|
-
// render, avoiding duplicate execution and Suspense timing issues.
|
|
220
|
-
// DenySignal and RedirectSignal are wrapped with layout context so the caller
|
|
221
|
-
// can render deny pages inside the layout shell.
|
|
222
|
-
// See design/04-authorization.md §"access.ts Runs on Every Navigation".
|
|
223
|
-
const accessVerdicts = new Map<number, 'pass' | DenySignal | RedirectSignal>();
|
|
224
|
-
|
|
225
|
-
for (let si = 0; si < segments.length; si++) {
|
|
226
|
-
const segment = segments[si];
|
|
227
|
-
if (segment.access) {
|
|
228
|
-
const accessMod = (await segment.access.load()) as Record<string, unknown>;
|
|
229
|
-
const accessFn = accessMod.default as
|
|
230
|
-
| ((ctx: { params: Record<string, string | string[]>; searchParams: unknown }) => unknown)
|
|
231
|
-
| undefined;
|
|
232
|
-
if (accessFn) {
|
|
233
|
-
try {
|
|
234
|
-
await withSpan(
|
|
235
|
-
'timber.access',
|
|
236
|
-
{ 'timber.segment': segment.segmentName ?? 'unknown' },
|
|
237
|
-
async () => {
|
|
238
|
-
try {
|
|
239
|
-
await accessFn({ params: match.params, searchParams: {} });
|
|
240
|
-
await setSpanAttribute('timber.result', 'pass');
|
|
241
|
-
accessVerdicts.set(si, 'pass');
|
|
242
|
-
} catch (error) {
|
|
243
|
-
if (error instanceof DenySignal) {
|
|
244
|
-
await setSpanAttribute('timber.result', 'deny');
|
|
245
|
-
await setSpanAttribute('timber.deny_status', error.status);
|
|
246
|
-
if (error.sourceFile) {
|
|
247
|
-
await setSpanAttribute('timber.deny_file', error.sourceFile);
|
|
248
|
-
}
|
|
249
|
-
accessVerdicts.set(si, error);
|
|
250
|
-
} else if (error instanceof RedirectSignal) {
|
|
251
|
-
await setSpanAttribute('timber.result', 'redirect');
|
|
252
|
-
accessVerdicts.set(si, error);
|
|
253
|
-
}
|
|
254
|
-
throw error;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
);
|
|
258
|
-
} catch (error) {
|
|
259
|
-
if (error instanceof DenySignal || error instanceof RedirectSignal) {
|
|
260
|
-
throw new RouteSignalWithContext(error, layoutComponents, segments);
|
|
261
|
-
}
|
|
262
|
-
throw error;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Resolve metadata
|
|
269
|
-
const resolvedMetadata = resolveMetadata(metadataEntries);
|
|
270
|
-
const headElements = renderMetadataToElements(resolvedMetadata);
|
|
271
|
-
|
|
272
|
-
// Auto-link metadata route files (icon, apple-icon, manifest) from segments.
|
|
273
|
-
// See design/16-metadata.md §"Auto-Linking"
|
|
274
|
-
for (const segment of segments) {
|
|
275
|
-
if (!segment.metadataRoutes) continue;
|
|
276
|
-
for (const baseName of Object.keys(segment.metadataRoutes)) {
|
|
277
|
-
const convention = METADATA_ROUTE_CONVENTIONS[baseName];
|
|
278
|
-
if (!convention) continue;
|
|
279
|
-
// Non-nestable routes only auto-link from root
|
|
280
|
-
if (!convention.nestable && segment.urlPath !== '/') continue;
|
|
281
|
-
// Build the href: segment urlPath + serve path
|
|
282
|
-
const prefix = segment.urlPath === '/' ? '' : segment.urlPath;
|
|
283
|
-
const href = `${prefix}/${convention.servePath}`;
|
|
284
|
-
const autoLink = getMetadataRouteAutoLink(convention.type, href);
|
|
285
|
-
if (autoLink) {
|
|
286
|
-
const attrs: Record<string, string> = { rel: autoLink.rel, href: autoLink.href };
|
|
287
|
-
if (autoLink.type) attrs.type = autoLink.type;
|
|
288
|
-
headElements.push({ tag: 'link', attrs } as MetadataHeadElement);
|
|
289
|
-
}
|
|
242
|
+
const chain = await buildDenyPageChain(segments, i, segmentKeys);
|
|
243
|
+
if (chain.length > 0) {
|
|
244
|
+
denyPageChains.set(i, chain);
|
|
290
245
|
}
|
|
291
246
|
}
|
|
292
247
|
|
|
293
248
|
// Build element tree: page wrapped in layouts (innermost to outermost)
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
249
|
+
type CreateElementFn = (...args: unknown[]) => React.ReactElement;
|
|
250
|
+
const h: CreateElementFn = createElement as CreateElementFn;
|
|
251
|
+
|
|
252
|
+
// Build the page element.
|
|
253
|
+
// Server component pages are wrapped in PageDenyBoundary which calls
|
|
254
|
+
// them as async functions and catches DenySignal — rendering the deny
|
|
255
|
+
// page in-tree instead of throwing into React Flight. This eliminates
|
|
256
|
+
// the second render pass for deny pages. See TIM-666.
|
|
257
|
+
//
|
|
258
|
+
// Client reference pages ('use client') can't call deny() (server-only),
|
|
259
|
+
// so they go through createElement normally — no wrapper needed.
|
|
260
|
+
const leafIndex = segments.length - 1;
|
|
261
|
+
const leafDenyPages = denyPageChains.get(leafIndex);
|
|
262
|
+
let element: React.ReactElement;
|
|
263
|
+
if (isClientReference(PageComponent)) {
|
|
264
|
+
element = h(PageComponent, {});
|
|
265
|
+
} else if (leafDenyPages && leafDenyPages.length > 0) {
|
|
266
|
+
element = h(PageDenyBoundary, {
|
|
267
|
+
Page: PageComponent,
|
|
268
|
+
route: match.segments[leafIndex]?.urlPath ?? '/',
|
|
269
|
+
denyPages: leafDenyPages,
|
|
270
|
+
segmentKey: segmentKeys[leafIndex],
|
|
271
|
+
});
|
|
272
|
+
} else {
|
|
273
|
+
// Server component page WITHOUT deny page chain — trace only
|
|
274
|
+
const TracedPage = async (props: Record<string, unknown>) => {
|
|
275
|
+
return withSpan(
|
|
276
|
+
'timber.page',
|
|
277
|
+
{ 'timber.route': match.segments[leafIndex]?.urlPath ?? '/' },
|
|
278
|
+
() => (PageComponent as (props: Record<string, unknown>) => unknown)(props)
|
|
279
|
+
);
|
|
280
|
+
};
|
|
281
|
+
element = h(TracedPage, {});
|
|
282
|
+
}
|
|
304
283
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
284
|
+
// Place MetadataHead as a SIBLING of the page, not a wrapper. React
|
|
285
|
+
// renders siblings concurrently — the page starts immediately while
|
|
286
|
+
// MetadataHead awaits metadata promises. Float hoists the head
|
|
287
|
+
// elements to <head> regardless of tree position. Both resolve before
|
|
288
|
+
// onShellReady (outside Suspense), but they overlap.
|
|
289
|
+
// Placed at the page level so metadata is always re-rendered on SPA
|
|
290
|
+
// navigation (never skipped by segment tree diffing).
|
|
291
|
+
// See TIM-1363, TIM-1367, design/16-metadata.md.
|
|
292
|
+
element = h(
|
|
293
|
+
Fragment,
|
|
294
|
+
null,
|
|
295
|
+
h(MetadataHead, {
|
|
296
|
+
segments,
|
|
297
|
+
requestUrl: req.url,
|
|
298
|
+
metadataRouteHashes,
|
|
299
|
+
}),
|
|
300
|
+
element
|
|
301
|
+
);
|
|
309
302
|
|
|
310
303
|
// Build a lookup of layout components by segment for O(1) access.
|
|
311
304
|
const layoutBySegment = new Map(
|
|
@@ -316,152 +309,307 @@ export async function buildRouteElement(
|
|
|
316
309
|
// The client uses this to merge the partial payload with its cached segments.
|
|
317
310
|
const skippedSegments: string[] = [];
|
|
318
311
|
|
|
319
|
-
//
|
|
320
|
-
//
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
let hasRenderedLayoutBelow = false;
|
|
312
|
+
// Pre-compute the contiguous skippable prefix (top-down).
|
|
313
|
+
// See skippable-prefix.ts for the three sub-rules and slot-change guard.
|
|
314
|
+
const skippableSet = computeSkippableSet(
|
|
315
|
+
segments,
|
|
316
|
+
segmentKeys,
|
|
317
|
+
layoutBySegment,
|
|
318
|
+
clientStateTree,
|
|
319
|
+
match,
|
|
320
|
+
req
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
let outermostSegmentProvider: React.ReactElement | null = null;
|
|
324
|
+
|
|
325
|
+
// Slot caching uses key-based diffing (TIM-1370). The server computes a
|
|
326
|
+
// content key per slot and the client advertises keys for cached slots.
|
|
327
|
+
// The skip decision is a set-membership check — no departing URL needed.
|
|
328
|
+
const destinationUrl = req.url;
|
|
329
|
+
const slotSkipInfo: SlotSkipEntry[] = [];
|
|
338
330
|
|
|
339
331
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
340
332
|
const segment = segments[i];
|
|
341
333
|
const isLeaf = i === segments.length - 1;
|
|
342
334
|
const layoutComponent = layoutBySegment.get(segment);
|
|
343
335
|
|
|
344
|
-
//
|
|
345
|
-
|
|
346
|
-
// no AccessGate in element tree (access already ran pre-render).
|
|
347
|
-
//
|
|
348
|
-
// Additional constraints beyond shouldSkipSegment:
|
|
349
|
-
// - Must have a rendered layout below (so the merger can find an
|
|
350
|
-
// inner SegmentProvider to splice the new content into)
|
|
351
|
-
// - Route groups are never skipped because sibling groups share the
|
|
352
|
-
// same urlPath (e.g., /(marketing) and /(app) both have "/"),
|
|
353
|
-
// which would cause the wrong cached layout to be reused
|
|
354
|
-
const skip =
|
|
355
|
-
shouldSkipSegment(
|
|
356
|
-
segment.urlPath,
|
|
357
|
-
layoutComponent,
|
|
358
|
-
isLeaf,
|
|
359
|
-
clientStateTree ?? null
|
|
360
|
-
) &&
|
|
361
|
-
hasRenderedLayoutBelow &&
|
|
362
|
-
segment.segmentType !== 'group';
|
|
363
|
-
|
|
364
|
-
if (skip) {
|
|
365
|
-
// Skip this segment entirely — the client uses its cached version.
|
|
366
|
-
// Access.ts already ran in the pre-render loop (security guarantee).
|
|
367
|
-
// Metadata was already resolved above (head elements are correct).
|
|
336
|
+
// Skip decision was pre-computed in the top-down prefix pass.
|
|
337
|
+
if (skippableSet.has(i)) {
|
|
368
338
|
// Record for X-Timber-Skipped-Segments header (outermost first, so prepend).
|
|
369
|
-
skippedSegments.unshift(
|
|
339
|
+
skippedSegments.unshift(segmentKeys[i]);
|
|
340
|
+
|
|
341
|
+
// A skipped layout never reaches resolveSlotProps below, but its slots
|
|
342
|
+
// stay mounted on the client — so their params still have to be
|
|
343
|
+
// published, or useSegmentParams(slotPath) falls back to the main
|
|
344
|
+
// route's record after any navigation that skipped their parent
|
|
345
|
+
// (TIM-1285). Params only: nothing renders and no access chain runs,
|
|
346
|
+
// because an unchanged slot is what made this layout skippable.
|
|
347
|
+
publishSlotSegmentParams(segment, match, destinationUrl, segmentTreePaths[i]);
|
|
348
|
+
|
|
349
|
+
// Emit slot metadata so the client's segment tree retains contentKeys
|
|
350
|
+
// for slots of skipped layouts. Without this, the client rebuilds its
|
|
351
|
+
// tree from the response and loses slot keys it can't advertise next time.
|
|
352
|
+
emitSlotInfoForSkippedLayout(segment, segmentKeys[i], match, destinationUrl, slotSkipInfo);
|
|
353
|
+
|
|
354
|
+
// No error boundaries are wrapped for a skipped segment — the `continue`
|
|
355
|
+
// below returns before that walk. A deny addressed to this segment
|
|
356
|
+
// therefore finds no boundary in the payload, and since TIM-1356 the
|
|
357
|
+
// payload path no longer falls back to a re-render for an addressed
|
|
358
|
+
// deny. What makes that sound is the precondition for skipping at all:
|
|
359
|
+
// `shouldSkipSegment` only returns true when this exact segment key is
|
|
360
|
+
// in the client's state tree, which means the client rendered this
|
|
361
|
+
// segment on an earlier navigation and still has its boundaries mounted,
|
|
362
|
+
// carrying the same key this build would have stamped. The payload
|
|
363
|
+
// splices in below them, so the throw passes through them on its way up.
|
|
364
|
+
//
|
|
365
|
+
// Metadata from skipped segments still needs to be collected (e.g.,
|
|
366
|
+
// root layout title templates). MetadataCollector wraps the element
|
|
367
|
+
// inside AccessGate — if access denies, metadata is excluded.
|
|
368
|
+
const skippedMeta = metadataSources.filter((s) => s.segmentIndex === i).reverse();
|
|
369
|
+
element = wrapMetadataCollectors(element, skippedMeta, h);
|
|
370
|
+
|
|
371
|
+
// SECURITY: Even though the layout is skipped, AccessGate MUST still
|
|
372
|
+
// wrap the element tree. access.ts runs on every navigation regardless
|
|
373
|
+
// of cached layouts or state tree content.
|
|
374
|
+
// See design/13-security.md §"Auth always runs" (test #11).
|
|
375
|
+
//
|
|
376
|
+
// Skipped segments omit denyPages and set skippedSegment=true. If
|
|
377
|
+
// access denies at a skipped segment, AccessGate records the deny in
|
|
378
|
+
// ALS and rethrows. Rendering the deny page in-tree here would appear
|
|
379
|
+
// inside the client's cached layout chrome (TIM-1074), so the throw
|
|
380
|
+
// goes to Flight's onError instead: addressed there against the leaf
|
|
381
|
+
// chain, its row is claimed by the boundary the client still has
|
|
382
|
+
// mounted at the owner (TIM-1450); with no addressable file it stays
|
|
383
|
+
// unplaced, and the response path answers with rscErrorEnvelope so the
|
|
384
|
+
// client hard-navigates for a clean full render — when the deny lands
|
|
385
|
+
// inside Flight's opening window. After it, the unaddressed row reaches
|
|
386
|
+
// the terminal boundary the last full render left mounted. See TIM-1363.
|
|
387
|
+
const accessFn = accessFns[i];
|
|
388
|
+
if (accessFn) {
|
|
389
|
+
element = wrapAccessGate(
|
|
390
|
+
element,
|
|
391
|
+
{
|
|
392
|
+
accessFn,
|
|
393
|
+
segment,
|
|
394
|
+
segmentKey: segmentKeys[i],
|
|
395
|
+
segmentIndex: i,
|
|
396
|
+
skippedSegment: true,
|
|
397
|
+
},
|
|
398
|
+
h
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
|
|
370
402
|
continue;
|
|
371
403
|
}
|
|
372
404
|
|
|
373
|
-
//
|
|
374
|
-
//
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
405
|
+
// Wrap with MetadataCollector(s) INSIDE error boundaries so a
|
|
406
|
+
// metadata() throw is caught by this segment's status-file boundaries,
|
|
407
|
+
// not an ancestor's. Still inside AccessGate (placed below) — when
|
|
408
|
+
// access denies, neither MetadataCollector nor error boundaries render.
|
|
409
|
+
//
|
|
410
|
+
// Reversed: the loop wraps innermost-to-outermost, so the last-wrapped
|
|
411
|
+
// collector renders first. Reversing ensures layout metadata is pushed
|
|
412
|
+
// before page metadata, preserving the root→page merge order required
|
|
413
|
+
// by resolveMetadata (page-authoritative). See TIM-1363.
|
|
414
|
+
const segmentMetadata = metadataSources.filter((s) => s.segmentIndex === i).reverse();
|
|
415
|
+
element = wrapMetadataCollectors(element, segmentMetadata, h);
|
|
378
416
|
|
|
379
417
|
// Wrap with error boundaries from this segment (inside layout).
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
//
|
|
383
|
-
//
|
|
384
|
-
//
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
418
|
+
// Keep ALL error boundaries (including 4xx) — they're the safety net for
|
|
419
|
+
// DenySignal from nested server components that escape AccessGate/PageDenyBoundary
|
|
420
|
+
// try/catch. Status-code files must be 'use client' TSX or MDX to serialize
|
|
421
|
+
// as error boundary fallbacks. See TIM-666.
|
|
422
|
+
// `segmentKey` makes each boundary addressable: a deny hoisted to this
|
|
423
|
+
// segment carries its owner's key, and every other boundary declines it
|
|
424
|
+
// rather than catching it first and rendering at the wrong depth
|
|
425
|
+
// (TIM-1356).
|
|
426
|
+
element = await wrapSegmentWithErrorBoundaries(segment, element, {
|
|
427
|
+
loadModule,
|
|
428
|
+
createElement: h,
|
|
429
|
+
errorBoundaryComponent: TimberErrorBoundary,
|
|
430
|
+
segmentKey: segmentKeys[i],
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
// Wrap with layout BEFORE AccessGate — AccessGate is OUTSIDE the layout.
|
|
434
|
+
// When AccessGate denies, the layout never renders. The deny page appears
|
|
435
|
+
// at the AccessGate level, wrapped by PARENT layouts only.
|
|
436
|
+
// This prevents leaking layout UI (sidebars, nav) on denied pages.
|
|
437
|
+
// See design/04-authorization.md §"Access Failure".
|
|
438
|
+
if (layoutComponent) {
|
|
439
|
+
// Resolve parallel slots for this layout. If a parent AccessGate
|
|
440
|
+
// denies during render, the layout never renders and slot props
|
|
441
|
+
// are never consumed. Slot access functions may still fire eagerly
|
|
442
|
+
// for skip-candidate slots — a follow-up will make that lazy.
|
|
443
|
+
const segmentId = segmentKeys[i];
|
|
444
|
+
const parentTreePath = segmentTreePaths[i];
|
|
445
|
+
const slotProps = await resolveSlotProps({
|
|
446
|
+
segment,
|
|
447
|
+
segmentId,
|
|
448
|
+
match,
|
|
449
|
+
h,
|
|
450
|
+
interception,
|
|
451
|
+
parentTreePath,
|
|
452
|
+
destinationUrl,
|
|
453
|
+
clientStateTree: clientStateTree ?? null,
|
|
454
|
+
slotSkipInfo,
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
const segmentPath = computeLayoutSegmentPath(segments, i, match);
|
|
458
|
+
const parallelRouteKeys = Object.keys(segment.slots ?? {});
|
|
459
|
+
|
|
460
|
+
// Build the layout element.
|
|
461
|
+
// Keep the descendant tree in a SERVER layout's children prop. Moving it
|
|
462
|
+
// to a client-provider prop above that layout makes React Flight evaluate
|
|
463
|
+
// and serialize it independently, even when the layout denies access or
|
|
464
|
+
// deliberately omits children. Client layouts cannot provide this
|
|
465
|
+
// containment: Flight must serialize their server-valued children props
|
|
466
|
+
// before they execute in the browser. Convention lint warns users not to
|
|
467
|
+
// treat a client layout as an authorization or data-hiding boundary.
|
|
468
|
+
let layoutElement: React.ReactElement;
|
|
469
|
+
if (isClientReference(layoutComponent)) {
|
|
470
|
+
layoutElement = h(layoutComponent, {
|
|
471
|
+
...slotProps,
|
|
472
|
+
children: element,
|
|
473
|
+
});
|
|
474
|
+
} else {
|
|
475
|
+
// Server component layout — wrap with OTEL tracing AND DenySignal
|
|
476
|
+
// catching. If the layout calls deny(), the signal is caught here
|
|
477
|
+
// and the matching deny page renders in-tree (same pattern as
|
|
478
|
+
// AccessGate and PageDenyBoundary). Without this, DenySignal
|
|
479
|
+
// escapes to React Flight onError and triggers the re-render
|
|
480
|
+
// fallback path. See TIM-668, design/04-authorization.md.
|
|
481
|
+
const layoutComponentRef = layoutComponent;
|
|
482
|
+
const layoutDenyPages = denyPageChains.get(i);
|
|
483
|
+
const TracedLayout = async (props: Record<string, unknown>) => {
|
|
484
|
+
try {
|
|
485
|
+
return await withSpan('timber.layout', { 'timber.segment': segmentId }, () =>
|
|
486
|
+
(layoutComponentRef as (props: Record<string, unknown>) => unknown)(props)
|
|
487
|
+
);
|
|
488
|
+
} catch (error: unknown) {
|
|
489
|
+
// A layout that denied never renders its own chrome — it threw
|
|
490
|
+
// instead of returning it — so an entry this segment owns is
|
|
491
|
+
// already correctly placed here. Anything owned further up is
|
|
492
|
+
// hoisted (handleCaughtDeny throws). See TIM-1356.
|
|
493
|
+
if (isDenySignal(error)) {
|
|
494
|
+
setFirstDeniedSegmentIndex(i);
|
|
495
|
+
if (layoutDenyPages) {
|
|
496
|
+
return handleCaughtDeny(layoutDenyPages, error, segmentId);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
throw error;
|
|
500
|
+
}
|
|
501
|
+
};
|
|
502
|
+
layoutElement = h(TracedLayout, {
|
|
503
|
+
...slotProps,
|
|
397
504
|
children: element,
|
|
398
505
|
});
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
506
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
507
|
+
// A second, deny-only copy of this segment's boundaries OUTSIDE its
|
|
508
|
+
// layout. The copy above (inside the layout) is the one a page error
|
|
509
|
+
// reaches; a server component this layout renders in its own chrome
|
|
510
|
+
// is a sibling of `children`, so its throw never passes that copy —
|
|
511
|
+
// it passes this one. Claiming is by the same key, so the segment
|
|
512
|
+
// answers a nested deny in its chrome the way `TracedLayout` answers
|
|
513
|
+
// a deny in the layout body: with its own file, replacing the layout.
|
|
514
|
+
// A hoisted deny addressed further up passes through unclaimed.
|
|
515
|
+
//
|
|
516
|
+
// Inside SegmentProvider so a partial navigation, which splices the
|
|
517
|
+
// provider into the client's mounted outlet, carries it along.
|
|
518
|
+
// See TIM-1450, design/04-authorization.md §"Where a Deny Page Renders".
|
|
519
|
+
layoutElement = await wrapSegmentWithErrorBoundaries(segment, layoutElement, {
|
|
520
|
+
loadModule,
|
|
521
|
+
createElement: h,
|
|
522
|
+
errorBoundaryComponent: TimberErrorBoundary,
|
|
523
|
+
segmentKey: segmentId,
|
|
524
|
+
denyOnly: true,
|
|
525
|
+
});
|
|
415
526
|
}
|
|
416
527
|
|
|
417
|
-
const
|
|
418
|
-
const parallelRouteKeys = Object.keys(segment.slots ?? {});
|
|
419
|
-
|
|
420
|
-
// Wrap the layout component in an OTEL span.
|
|
421
|
-
// For route groups, urlPath is "/" (groups don't add URL segments), so
|
|
422
|
-
// include the directory name to distinguish e.g. "layout /(pre-release)"
|
|
423
|
-
// from the root "layout /".
|
|
424
|
-
const segmentForSpan = segment;
|
|
425
|
-
const layoutComponentForSpan = layoutComponent;
|
|
426
|
-
const segmentLabel =
|
|
427
|
-
segmentForSpan.segmentType === 'group'
|
|
428
|
-
? `${segmentForSpan.urlPath === '/' ? '' : segmentForSpan.urlPath}/${segmentForSpan.segmentName}`
|
|
429
|
-
: segmentForSpan.urlPath;
|
|
430
|
-
const TracedLayout = async (props: Record<string, unknown>) => {
|
|
431
|
-
return withSpan('timber.layout', { 'timber.segment': segmentLabel }, () =>
|
|
432
|
-
(layoutComponentForSpan as (props: Record<string, unknown>) => unknown)(props)
|
|
433
|
-
);
|
|
434
|
-
};
|
|
435
|
-
|
|
436
|
-
// segmentId uniquely identifies this segment for client-side element
|
|
437
|
-
// caching. For route groups, urlPath is shared with the parent (both "/"),
|
|
438
|
-
// so we include the group name to distinguish them. Without this, the
|
|
439
|
-
// segment merger's element cache would conflate root and group elements.
|
|
440
|
-
const segmentId =
|
|
441
|
-
segment.segmentType === 'group'
|
|
442
|
-
? `${segment.urlPath === '/' ? '' : segment.urlPath}/${segment.segmentName}`
|
|
443
|
-
: segment.urlPath;
|
|
444
|
-
|
|
445
|
-
element = h(SegmentProvider, {
|
|
528
|
+
const segmentProviderElement = h(SegmentProvider, {
|
|
446
529
|
segments: segmentPath,
|
|
447
530
|
segmentId,
|
|
448
531
|
parallelRouteKeys,
|
|
449
|
-
children:
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
532
|
+
children: layoutElement,
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
element = h(SegmentOutlet, {
|
|
536
|
+
segmentPath: segmentId,
|
|
537
|
+
children: segmentProviderElement,
|
|
455
538
|
});
|
|
539
|
+
|
|
540
|
+
// Track the SegmentProvider for the outermost rendered layout.
|
|
541
|
+
// On partial navigation (segments skipped above), the client already
|
|
542
|
+
// has a SegmentOutlet mounted at this position. Sending another one
|
|
543
|
+
// in the payload causes double-wrapping and infinite context recursion.
|
|
544
|
+
// We'll strip the outermost SegmentOutlet after the loop.
|
|
545
|
+
outermostSegmentProvider = segmentProviderElement;
|
|
456
546
|
}
|
|
547
|
+
|
|
548
|
+
// Wrap in AccessGate OUTSIDE the layout, error boundaries, and MetadataCollector.
|
|
549
|
+
// If access denies, neither the layout nor MetadataCollector renders.
|
|
550
|
+
// Parent layouts (from outer iterations) form the shell. Access runs
|
|
551
|
+
// exactly once, during render, inside React.cache scope — layouts
|
|
552
|
+
// share the cache. See TIM-1363, design/04-authorization.md.
|
|
553
|
+
const accessFn = accessFns[i];
|
|
554
|
+
if (accessFn) {
|
|
555
|
+
element = wrapAccessGate(
|
|
556
|
+
element,
|
|
557
|
+
{
|
|
558
|
+
accessFn,
|
|
559
|
+
segment,
|
|
560
|
+
segmentKey: segmentKeys[i],
|
|
561
|
+
segmentIndex: i,
|
|
562
|
+
denyPages: denyPageChains.get(i),
|
|
563
|
+
},
|
|
564
|
+
h
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// On partial navigation (some segments skipped), the client already has a
|
|
570
|
+
// SegmentOutlet mounted at the outermost non-skipped segment's position.
|
|
571
|
+
// Sending another SegmentOutlet in the payload causes double-wrapping —
|
|
572
|
+
// the inner outlet reads the same context update and recurses infinitely.
|
|
573
|
+
// Replace the outermost SegmentOutlet with just its SegmentProvider child.
|
|
574
|
+
if (skippedSegments.length > 0 && outermostSegmentProvider) {
|
|
575
|
+
element = replaceOutermostSegmentOutlet(element, outermostSegmentProvider);
|
|
457
576
|
}
|
|
458
577
|
|
|
578
|
+
// The deny chain's terminal, for a deny that streamed as an error row and
|
|
579
|
+
// that no segment boundary — inner or outer — could claim. With the outer
|
|
580
|
+
// copies above, that is one shape only: a server component in a layout's
|
|
581
|
+
// chrome denied and no status file exists at or above that layout. Files
|
|
582
|
+
// below it are not candidates (rendering them re-runs the layout that
|
|
583
|
+
// denied), so this renders the framework default page, as the document
|
|
584
|
+
// path does for a deny with no file. A non-deny row nothing claimed ends
|
|
585
|
+
// here too: the terminal leaves the SPA so the document request renders
|
|
586
|
+
// the real error page (see TimberErrorBoundary). Outside every segment
|
|
587
|
+
// boundary, inside the payload root so hydration agrees.
|
|
588
|
+
//
|
|
589
|
+
// Skipped on partial navigations: the terminal from the last full render
|
|
590
|
+
// is still mounted above the merge point, and a copy here would sit below
|
|
591
|
+
// the skipped ancestors' boundaries and intercept denies addressed to them.
|
|
592
|
+
// See TIM-1450.
|
|
593
|
+
if (skippedSegments.length === 0) {
|
|
594
|
+
element = h(TimberErrorBoundary, {
|
|
595
|
+
lastResort: true,
|
|
596
|
+
fallbackComponent: (await import('../client/deny-last-resort.tsx')).DenyLastResort,
|
|
597
|
+
children: element,
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// Publish the request's params beside the finished tree, as the payload's
|
|
602
|
+
// root row. Last, because the partial-navigation rewrite above rebuilds the
|
|
603
|
+
// tree and this takes it as it finally stands.
|
|
604
|
+
const payload = withPublishedParams(element);
|
|
605
|
+
|
|
459
606
|
return {
|
|
460
|
-
|
|
461
|
-
headElements: headElements as HeadElement[],
|
|
607
|
+
payload,
|
|
462
608
|
layoutComponents,
|
|
463
609
|
segments,
|
|
464
610
|
deferSuspenseFor,
|
|
465
611
|
skippedSegments,
|
|
612
|
+
slotSkipInfo,
|
|
613
|
+
leafDenyChain: leafDenyPages,
|
|
466
614
|
};
|
|
467
615
|
}
|