@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
|
@@ -16,33 +16,79 @@
|
|
|
16
16
|
* See design/02-rendering-pipeline.md §"Parallel Slots"
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import { TimberErrorBoundary } from '
|
|
20
|
-
import SlotErrorFallback from '
|
|
21
|
-
import { SlotAccessGate } from './access-gate.
|
|
22
|
-
import { wrapSegmentWithErrorBoundaries } from './error-boundary-wrapper.
|
|
23
|
-
import
|
|
24
|
-
import {
|
|
25
|
-
import
|
|
19
|
+
import { TimberErrorBoundary } from '../client/error-boundary.tsx';
|
|
20
|
+
import SlotErrorFallback from '../client/slot-error-fallback.tsx';
|
|
21
|
+
import { SlotAccessGate } from './access-gate.tsx';
|
|
22
|
+
import { wrapSegmentWithErrorBoundaries } from './error-boundary-wrapper.ts';
|
|
23
|
+
import { isClientReference } from './utils/element-type.ts';
|
|
24
|
+
import { containSlotSubtree } from './slot-subtree-contain.ts';
|
|
25
|
+
import { loadModule } from './safe-load.ts';
|
|
26
|
+
import type { InterceptionContext, RouteMatch } from './pipeline.ts';
|
|
27
|
+
import { isDenySignal, isRedirectSignal } from './primitives.ts';
|
|
28
|
+
import { logRenderError } from './logger.ts';
|
|
29
|
+
import type { ManifestSegmentNode } from './route-matcher.ts';
|
|
30
|
+
import { setSlotParams, runWithSlotSegmentParams } from './request-context.ts';
|
|
31
|
+
import { coerceSlotParams } from './param-coercion.ts';
|
|
32
|
+
import type { CoercedParams } from '../shared/param-value.ts';
|
|
33
|
+
import { matchUrlParts } from './tree-match.ts';
|
|
34
|
+
import { extractUrlParts, consumedPartsThroughSegment } from './chain-url-parts.ts';
|
|
35
|
+
import { findInterceptingMatch } from './slot-interception.ts';
|
|
36
|
+
import { SegmentOutlet } from '../client/segment-outlet.tsx';
|
|
37
|
+
import { shouldSkipSlot, type ClientStateTree } from './state-tree-diff.ts';
|
|
38
|
+
import { computeSlotKey, computeSlotContentKey } from '../routing/segment-keys.ts';
|
|
39
|
+
import { isStaticRequestDependent } from './request-dep.ts';
|
|
26
40
|
|
|
27
41
|
type CreateElementFn = (...args: unknown[]) => React.ReactElement;
|
|
28
42
|
|
|
43
|
+
// ─── Module Loading Helpers ─────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Load a module and extract its default export as a component function.
|
|
47
|
+
* Returns undefined if no default export exists.
|
|
48
|
+
*/
|
|
49
|
+
async function loadComponent(loader: {
|
|
50
|
+
load: () => Promise<unknown>;
|
|
51
|
+
filePath: string;
|
|
52
|
+
}): Promise<((...args: unknown[]) => unknown) | undefined> {
|
|
53
|
+
const mod = await loadModule(loader);
|
|
54
|
+
return mod.default as ((...args: unknown[]) => unknown) | undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Load and render the default.tsx fallback for a slot node.
|
|
59
|
+
* Returns null if the slot has no default.tsx or it has no default export.
|
|
60
|
+
*/
|
|
61
|
+
async function renderDefaultFallback(
|
|
62
|
+
slotNode: ManifestSegmentNode,
|
|
63
|
+
h: CreateElementFn
|
|
64
|
+
): Promise<React.ReactElement | null> {
|
|
65
|
+
if (!slotNode.default) return null;
|
|
66
|
+
const DefaultComp = await loadComponent(slotNode.default);
|
|
67
|
+
if (!DefaultComp) return null;
|
|
68
|
+
return h(DefaultComp, {});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ─── Slot Element Resolution ────────────────────────────────────────────────
|
|
72
|
+
|
|
29
73
|
/**
|
|
30
74
|
* Resolve the element for a parallel slot.
|
|
31
75
|
*
|
|
32
76
|
* Finds a matching page in the slot's sub-tree for the current route.
|
|
33
77
|
* Falls back to default.tsx if no match, or null if no default.
|
|
34
78
|
*
|
|
35
|
-
* When a match is found, the element is wrapped
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
79
|
+
* When a match is found, the element is wrapped per segment in the slot's
|
|
80
|
+
* matched chain with (innermost → outermost):
|
|
81
|
+
* 1. Error boundaries
|
|
82
|
+
* 2. Layout
|
|
83
|
+
* 3. SlotAccessGate if the segment has access.ts (gate OUTSIDE the layout,
|
|
84
|
+
* so a denied layout never executes — see TIM-1074)
|
|
39
85
|
*/
|
|
40
86
|
export async function resolveSlotElement(
|
|
41
87
|
slotNode: ManifestSegmentNode,
|
|
42
88
|
match: RouteMatch,
|
|
43
|
-
paramsPromise: Promise<Record<string, string | string[]>>,
|
|
44
89
|
h: CreateElementFn,
|
|
45
|
-
interception?: InterceptionContext
|
|
90
|
+
interception?: InterceptionContext,
|
|
91
|
+
parentTreePath?: string
|
|
46
92
|
): Promise<React.ReactElement | null> {
|
|
47
93
|
// When interception is active, try to match intercepting children in this
|
|
48
94
|
// slot against the target pathname. If an intercepting child matches, render
|
|
@@ -54,133 +100,126 @@ export async function resolveSlotElement(
|
|
|
54
100
|
: findSlotMatch(slotNode, match);
|
|
55
101
|
|
|
56
102
|
if (slotMatch) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
103
|
+
// Coerce the slot's own chain params through the global schema codecs
|
|
104
|
+
// (same as the main route) and expose them two ways:
|
|
105
|
+
//
|
|
106
|
+
// - keyed, in the ALS slot map, so `getSegmentParams(slotPath)` resolves
|
|
107
|
+
// from anywhere in the request;
|
|
108
|
+
// - scoped, around every component this resolver invokes from the slot's
|
|
109
|
+
// matched chain, so a no-arg `getSegmentParams()` inside the slot
|
|
110
|
+
// returns the slot's params instead of the main route's. An
|
|
111
|
+
// intercepting page has no other way to see its own params: the
|
|
112
|
+
// pipeline re-matched the SOURCE pathname, so the main params describe
|
|
113
|
+
// the page rendering *behind* the modal (TIM-1283).
|
|
114
|
+
//
|
|
115
|
+
// Both derive from the same coerced record, so the keyed overload and the
|
|
116
|
+
// no-arg call inside the slot can never disagree.
|
|
117
|
+
const coerced = coerceSlotParams(slotMatch.chain, slotMatch.slotParams);
|
|
118
|
+
const fullSlotPath = computeSlotSegmentPath(slotMatch.chain, parentTreePath);
|
|
119
|
+
|
|
120
|
+
if (fullSlotPath && Object.keys(coerced).length > 0) {
|
|
121
|
+
setSlotParams(fullSlotPath, coerced);
|
|
122
|
+
}
|
|
123
|
+
const scope = <T>(fn: () => T): T => runWithSlotSegmentParams(fullSlotPath, coerced, fn);
|
|
60
124
|
|
|
125
|
+
const SlotPage = await loadComponent(slotMatch.page);
|
|
126
|
+
if (SlotPage) {
|
|
61
127
|
// Load default.tsx fallback for notFound() handling in the slot page.
|
|
62
128
|
// When a slot page calls notFound() or deny(), it should gracefully
|
|
63
129
|
// degrade to default.tsx or null — not crash the page. This matches
|
|
64
130
|
// Next.js behavior. See design/02-rendering-pipeline.md
|
|
65
131
|
// §"Slot Access Failure = Graceful Degradation"
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
// (index 0) is handled separately after the access gate below.
|
|
101
|
-
for (let i = slotMatch.chain.length - 1; i > 0; i--) {
|
|
102
|
-
const seg = slotMatch.chain[i];
|
|
103
|
-
|
|
104
|
-
// Error boundaries from this segment
|
|
105
|
-
element = await wrapSegmentWithErrorBoundaries(seg, element, h);
|
|
106
|
-
|
|
107
|
-
// Layout from this segment
|
|
108
|
-
if (seg.layout) {
|
|
109
|
-
const layoutMod = (await seg.layout.load()) as Record<string, unknown>;
|
|
110
|
-
if (layoutMod.default) {
|
|
111
|
-
const Layout = layoutMod.default as (...args: unknown[]) => unknown;
|
|
112
|
-
element = h(Layout, {
|
|
113
|
-
params: paramsPromise,
|
|
114
|
-
searchParams: {},
|
|
115
|
-
children: element,
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Wrap in SlotAccessGate if slot root has access.ts.
|
|
122
|
-
// On denial: denied.tsx → default.tsx → null (graceful degradation).
|
|
123
|
-
// See design/04-authorization.md §"Slot-Level Auth".
|
|
124
|
-
if (slotNode.access) {
|
|
125
|
-
const accessMod = (await slotNode.access.load()) as Record<string, unknown>;
|
|
126
|
-
const accessFn = accessMod.default as
|
|
127
|
-
| ((ctx: { params: Record<string, string | string[]>; searchParams: unknown }) => unknown)
|
|
128
|
-
| undefined;
|
|
129
|
-
if (accessFn) {
|
|
130
|
-
// Load denied.tsx fallback
|
|
131
|
-
let deniedFallback: React.ReactElement | null = null;
|
|
132
|
-
if (slotNode.denied) {
|
|
133
|
-
const deniedMod = (await slotNode.denied.load()) as Record<string, unknown>;
|
|
134
|
-
const DeniedComponent = deniedMod.default as
|
|
135
|
-
| ((...args: unknown[]) => unknown)
|
|
136
|
-
| undefined;
|
|
137
|
-
if (DeniedComponent) {
|
|
138
|
-
deniedFallback = h(DeniedComponent, {});
|
|
132
|
+
const denyFallback = await renderDefaultFallback(slotNode, h);
|
|
133
|
+
|
|
134
|
+
// Build the slot page element.
|
|
135
|
+
// Client references ('use client' pages) must NOT be called as functions —
|
|
136
|
+
// they are proxy objects that throw when invoked. For client references,
|
|
137
|
+
// use createElement directly. Error catching is unnecessary because client
|
|
138
|
+
// references are serialized as references in the RSC Flight stream — they
|
|
139
|
+
// don't execute on the server. See TIM-627.
|
|
140
|
+
//
|
|
141
|
+
// For server components, wrap in SafeSlotPage to catch ALL errors at the
|
|
142
|
+
// component level. This prevents errors from leaving unresolved Flight
|
|
143
|
+
// rows in the RSC stream — see TIM-524 for details.
|
|
144
|
+
//
|
|
145
|
+
// The catch below covers the page function. The tree it RETURNS is
|
|
146
|
+
// contained separately (`containSlotSubtree`): a server component
|
|
147
|
+
// nested in that tree runs as its own Flight task, outside this
|
|
148
|
+
// try/catch, and a deny there would otherwise reach Flight's global
|
|
149
|
+
// onError as a page-level 4xx. See slot-subtree-contain.ts, TIM-1450.
|
|
150
|
+
let element: React.ReactElement;
|
|
151
|
+
if (isClientReference(SlotPage)) {
|
|
152
|
+
element = h(SlotPage, {});
|
|
153
|
+
} else {
|
|
154
|
+
const SafeSlotPage = async (props: Record<string, unknown>) => {
|
|
155
|
+
try {
|
|
156
|
+
const rendered = await scope(() =>
|
|
157
|
+
(SlotPage as (props: Record<string, unknown>) => unknown)(props)
|
|
158
|
+
);
|
|
159
|
+
return containSlotSubtree(rendered as React.ReactNode, denyFallback);
|
|
160
|
+
} catch (error) {
|
|
161
|
+
// RedirectSignal must propagate — the pipeline handles redirects
|
|
162
|
+
// at the top level. Swallowing it here would silently return
|
|
163
|
+
// fallback content instead of redirecting. See TIM-554.
|
|
164
|
+
if (isRedirectSignal(error)) {
|
|
165
|
+
throw error;
|
|
139
166
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
// Load default.tsx fallback
|
|
143
|
-
let defaultFallback: React.ReactElement | null = null;
|
|
144
|
-
if (slotNode.default) {
|
|
145
|
-
const defaultMod = (await slotNode.default.load()) as Record<string, unknown>;
|
|
146
|
-
const DefaultComp = defaultMod.default as ((...args: unknown[]) => unknown) | undefined;
|
|
147
|
-
if (DefaultComp) {
|
|
148
|
-
defaultFallback = h(DefaultComp, { params: paramsPromise, searchParams: {} });
|
|
167
|
+
if (isDenySignal(error)) {
|
|
168
|
+
return denyFallback;
|
|
149
169
|
}
|
|
170
|
+
// Log the error but don't re-throw — returning fallback ensures
|
|
171
|
+
// the Flight row is resolved and the page hydrates correctly.
|
|
172
|
+
logRenderError({
|
|
173
|
+
method: '',
|
|
174
|
+
path: '',
|
|
175
|
+
error,
|
|
176
|
+
});
|
|
177
|
+
return denyFallback;
|
|
150
178
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
element = h(SlotAccessGate, {
|
|
154
|
-
accessFn,
|
|
155
|
-
params,
|
|
156
|
-
searchParams: {},
|
|
157
|
-
deniedFallback,
|
|
158
|
-
defaultFallback,
|
|
159
|
-
children: element,
|
|
160
|
-
});
|
|
161
|
-
}
|
|
179
|
+
};
|
|
180
|
+
element = h(SafeSlotPage, {});
|
|
162
181
|
}
|
|
163
182
|
|
|
164
|
-
// Wrap with
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
//
|
|
178
|
-
element = await
|
|
183
|
+
// Wrap with error boundaries, layouts, and access gates from
|
|
184
|
+
// intermediate slot segments (everything between slot root and leaf).
|
|
185
|
+
// Process innermost-first, same order as route-element-builder.ts
|
|
186
|
+
// handles main segments. The slot root (index 0) is handled below.
|
|
187
|
+
element = await wrapWithIntermediateSegments(
|
|
188
|
+
slotMatch.chain,
|
|
189
|
+
element,
|
|
190
|
+
h,
|
|
191
|
+
scope,
|
|
192
|
+
denyFallback
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
// Wrap with slot root's layout — INSIDE the access gate, so the layout
|
|
196
|
+
// server component never executes when access.ts denies. See TIM-1074.
|
|
197
|
+
element = await wrapWithLayout(slotNode, element, h, scope, denyFallback);
|
|
198
|
+
|
|
199
|
+
// Wrap in SlotAccessGate if slot root has access.ts. The gate is
|
|
200
|
+
// OUTSIDE the layout, matching the segment model in
|
|
201
|
+
// route-element-builder.ts: a denied layout must not render, or it
|
|
202
|
+
// would fetch/serialize protected data into the RSC Flight stream.
|
|
203
|
+
// On denial: denied.tsx → default.tsx → null (graceful degradation),
|
|
204
|
+
// rendered WITHOUT the denied slot's own layout.
|
|
205
|
+
// See design/04-authorization.md §"Slot-Level Auth".
|
|
206
|
+
element = await wrapWithAccessGate(slotNode, element, h, scope);
|
|
207
|
+
|
|
208
|
+
// Wrap with slot root's error boundaries (outermost). Slot identity on
|
|
209
|
+
// every one of them, not only the catch-all below: a slot's own
|
|
210
|
+
// status page must not set the document status or empty the main
|
|
211
|
+
// route's segment cache.
|
|
212
|
+
element = await wrapSegmentWithErrorBoundaries(slotNode, element, {
|
|
213
|
+
loadModule,
|
|
214
|
+
createElement: h,
|
|
215
|
+
errorBoundaryComponent: TimberErrorBoundary,
|
|
216
|
+
isSlotBoundary: true,
|
|
217
|
+
});
|
|
179
218
|
|
|
180
219
|
// Catch-all error boundary: ensures slot errors NEVER propagate to the
|
|
181
220
|
// parent layout. Without this, a slot without error.tsx that throws
|
|
182
221
|
// causes SSR's renderToReadableStream to reject, triggering renderDenyPage
|
|
183
|
-
// which re-executes all layout server components (including
|
|
222
|
+
// which re-executes all layout server components (including getHeaders() calls
|
|
184
223
|
// that fail in the SSR environment). The null fallback means the slot
|
|
185
224
|
// degrades to nothing — consistent with the slot access denial behavior.
|
|
186
225
|
// See design/02-rendering-pipeline.md §"Slot Access Failure = Graceful Degradation"
|
|
@@ -194,25 +233,198 @@ export async function resolveSlotElement(
|
|
|
194
233
|
}
|
|
195
234
|
}
|
|
196
235
|
|
|
197
|
-
// No matching page — render default.tsx fallback
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
236
|
+
// No matching page — render default.tsx fallback.
|
|
237
|
+
// Per design/02-rendering-pipeline.md: "No access check for default.tsx."
|
|
238
|
+
// Access verdicts from the eager evaluation are not applied here.
|
|
239
|
+
// Pass taintKey so accessor calls inside default.tsx are scoped to this
|
|
240
|
+
return renderDefaultFallback(slotNode, h);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* The full tree path of a slot's matched chain — the key both the ALS slot
|
|
245
|
+
* params map and the generated `getSegmentParams` overloads use.
|
|
246
|
+
*
|
|
247
|
+
* Built from the parent's tree path plus each chain node's directory name,
|
|
248
|
+
* so an intercepting node contributes its marker
|
|
249
|
+
* (`/gallery/@modal/(.)photo/[id]`) and a route group contributes its
|
|
250
|
+
* parentheses. Returns undefined when the caller has no parent tree path,
|
|
251
|
+
* which is how the resolver's test callers and any path-less entry point opt
|
|
252
|
+
* out of keyed lookups.
|
|
253
|
+
*
|
|
254
|
+
* One definition for both the render path and the eager access path: they
|
|
255
|
+
* key the same map, and a divergence would silently strand one of them.
|
|
256
|
+
*/
|
|
257
|
+
function computeSlotSegmentPath(
|
|
258
|
+
chain: ManifestSegmentNode[],
|
|
259
|
+
parentTreePath: string | undefined
|
|
260
|
+
): string | undefined {
|
|
261
|
+
if (!parentTreePath) return undefined;
|
|
262
|
+
const slotSuffix = chain
|
|
263
|
+
.map((s) => s.segmentName)
|
|
264
|
+
.filter(Boolean)
|
|
265
|
+
.join('/');
|
|
266
|
+
const prefix = parentTreePath === '/' ? '' : parentTreePath;
|
|
267
|
+
return `${prefix}/${slotSuffix}`;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ─── Element Wrapping Helpers ───────────────────────────────────────────────
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Wrap an element with error boundaries, access gates, and layouts from
|
|
274
|
+
* intermediate slot segments (indices 1..n, skipping the slot root at index 0).
|
|
275
|
+
* Processes innermost-first to match route-element-builder.ts ordering.
|
|
276
|
+
*
|
|
277
|
+
* Access gates are enforced for every intermediate segment that has access.ts,
|
|
278
|
+
* not just the slot root. Without this, nested slot children (e.g.,
|
|
279
|
+
* @admin/reports/access.ts) and intercepting route children with access.ts
|
|
280
|
+
* would bypass authorization. See TIM-999.
|
|
281
|
+
*
|
|
282
|
+
* Wrap order per segment (innermost → outermost): error boundaries → layout
|
|
283
|
+
* → access gate. The gate must be OUTSIDE the layout so a denying access.ts
|
|
284
|
+
* prevents the layout server component from executing — otherwise the layout
|
|
285
|
+
* would fetch/serialize protected data into the RSC Flight stream. Matches
|
|
286
|
+
* route-element-builder.ts. See TIM-1074.
|
|
287
|
+
*/
|
|
288
|
+
async function wrapWithIntermediateSegments(
|
|
289
|
+
chain: ManifestSegmentNode[],
|
|
290
|
+
element: React.ReactElement,
|
|
291
|
+
h: CreateElementFn,
|
|
292
|
+
scope?: SlotParamScope,
|
|
293
|
+
denyFallback?: React.ReactNode
|
|
294
|
+
): Promise<React.ReactElement> {
|
|
295
|
+
for (let i = chain.length - 1; i > 0; i--) {
|
|
296
|
+
const seg = chain[i];
|
|
297
|
+
element = await wrapSegmentWithErrorBoundaries(seg, element, {
|
|
298
|
+
loadModule,
|
|
299
|
+
createElement: h,
|
|
300
|
+
errorBoundaryComponent: TimberErrorBoundary,
|
|
301
|
+
isSlotBoundary: true,
|
|
302
|
+
});
|
|
303
|
+
element = await wrapWithLayout(seg, element, h, scope, denyFallback);
|
|
304
|
+
element = await wrapWithAccessGate(seg, element, h, scope);
|
|
204
305
|
}
|
|
306
|
+
return element;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Runs a function with the slot's own segment params in scope.
|
|
311
|
+
*
|
|
312
|
+
* Applied to every component this module invokes from a slot's matched chain
|
|
313
|
+
* — page, layouts, access functions — so all of them agree on what a no-arg
|
|
314
|
+
* `getSegmentParams()` means inside a slot. A partial application would be
|
|
315
|
+
* worse than none: a layout and the page under it would disagree about the
|
|
316
|
+
* params of the same render.
|
|
317
|
+
*/
|
|
318
|
+
type SlotParamScope = <T>(fn: () => T) => T;
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Invokes a slot layout inside that slot's param scope.
|
|
322
|
+
*
|
|
323
|
+
* Declared at module scope, and given the layout and the scope as props,
|
|
324
|
+
* so its component identity is the same on every render. A closure created
|
|
325
|
+
* per render would be a new component type each time, and React would
|
|
326
|
+
* unmount and remount the whole layout subtree — including client
|
|
327
|
+
* components' state — on every navigation that re-renders the slot.
|
|
328
|
+
*
|
|
329
|
+
* Server component: the function-valued props are called here on the server
|
|
330
|
+
* and never reach the Flight stream, the same way `SlotAccessGate` takes
|
|
331
|
+
* `accessFn`.
|
|
332
|
+
*
|
|
333
|
+
* The layout's own chrome is part of the slot's subtree, so the tree it
|
|
334
|
+
* returns is contained like the page's: a server component the layout
|
|
335
|
+
* renders beside `children` that denies becomes the slot fallback in place,
|
|
336
|
+
* not a page-level 4xx. `children` is the element the resolver built for the
|
|
337
|
+
* level below, already contained there, and is passed to the walk as the one
|
|
338
|
+
* subtree to leave alone. See slot-subtree-contain.ts.
|
|
339
|
+
*/
|
|
340
|
+
function ScopedSlotLayout(props: {
|
|
341
|
+
layout: (props: Record<string, unknown>) => unknown;
|
|
342
|
+
scope: SlotParamScope;
|
|
343
|
+
denyFallback: React.ReactNode;
|
|
344
|
+
children: React.ReactElement;
|
|
345
|
+
}): unknown {
|
|
346
|
+
const rendered = props.scope(() => props.layout({ children: props.children }));
|
|
347
|
+
return containSlotSubtree(rendered as React.ReactNode, props.denyFallback, props.children);
|
|
348
|
+
}
|
|
205
349
|
|
|
206
|
-
|
|
207
|
-
|
|
350
|
+
/**
|
|
351
|
+
* Wrap an element with a segment's layout component, if present.
|
|
352
|
+
*
|
|
353
|
+
* A server-component layout is invoked through the slot param scope, so it
|
|
354
|
+
* sees the slot's params rather than the main route's — a layout and the
|
|
355
|
+
* page beneath it must not disagree about the params of one render. A
|
|
356
|
+
* client-reference layout is passed through untouched: it never executes on
|
|
357
|
+
* the server, and its params arrive over the client channel
|
|
358
|
+
* (`useSegmentParams`).
|
|
359
|
+
*/
|
|
360
|
+
async function wrapWithLayout(
|
|
361
|
+
node: ManifestSegmentNode,
|
|
362
|
+
element: React.ReactElement,
|
|
363
|
+
h: CreateElementFn,
|
|
364
|
+
scope?: SlotParamScope,
|
|
365
|
+
denyFallback: React.ReactNode = null
|
|
366
|
+
): Promise<React.ReactElement> {
|
|
367
|
+
if (!node.layout) return element;
|
|
368
|
+
const Layout = await loadComponent(node.layout);
|
|
369
|
+
if (!Layout) return element;
|
|
370
|
+
if (!scope || isClientReference(Layout)) return h(Layout, { children: element });
|
|
371
|
+
|
|
372
|
+
return h(ScopedSlotLayout, {
|
|
373
|
+
layout: Layout as (props: Record<string, unknown>) => unknown,
|
|
374
|
+
scope,
|
|
375
|
+
denyFallback,
|
|
376
|
+
children: element,
|
|
377
|
+
});
|
|
208
378
|
}
|
|
209
379
|
|
|
380
|
+
/**
|
|
381
|
+
* Wrap an element with a SlotAccessGate if the node has access.ts.
|
|
382
|
+
* On denial: denied.tsx → default.tsx → null (graceful degradation).
|
|
383
|
+
*/
|
|
384
|
+
async function wrapWithAccessGate(
|
|
385
|
+
slotNode: ManifestSegmentNode,
|
|
386
|
+
element: React.ReactElement,
|
|
387
|
+
h: CreateElementFn,
|
|
388
|
+
scope?: SlotParamScope
|
|
389
|
+
): Promise<React.ReactElement> {
|
|
390
|
+
if (!slotNode.access) return element;
|
|
391
|
+
|
|
392
|
+
const loaded = await loadComponent(slotNode.access);
|
|
393
|
+
if (!loaded) return element;
|
|
394
|
+
|
|
395
|
+
// The gate calls this during render, so the scope has to travel with the
|
|
396
|
+
// function rather than wrap the call site.
|
|
397
|
+
const accessFn = scope ? () => scope(() => loaded()) : loaded;
|
|
398
|
+
|
|
399
|
+
let DeniedComponent: ((...args: unknown[]) => unknown) | null = null;
|
|
400
|
+
if (slotNode.denied) {
|
|
401
|
+
DeniedComponent = (await loadComponent(slotNode.denied)) ?? null;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const slotName = slotNode.segmentName?.replace(/^@/, '') ?? '';
|
|
405
|
+
|
|
406
|
+
const defaultFallback = await renderDefaultFallback(slotNode, h);
|
|
407
|
+
|
|
408
|
+
return h(SlotAccessGate, {
|
|
409
|
+
accessFn,
|
|
410
|
+
DeniedComponent,
|
|
411
|
+
slotName,
|
|
412
|
+
createElement: h,
|
|
413
|
+
defaultFallback,
|
|
414
|
+
children: element,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// ─── Slot Matching ──────────────────────────────────────────────────────────
|
|
419
|
+
|
|
210
420
|
/** Result of matching a slot's sub-tree against the current route. */
|
|
211
|
-
interface SlotMatchResult {
|
|
421
|
+
export interface SlotMatchResult {
|
|
212
422
|
/** The page file at the matched leaf. */
|
|
213
423
|
page: NonNullable<ManifestSegmentNode['page']>;
|
|
214
424
|
/** The full chain of slot nodes traversed (slot root → … → leaf with page). */
|
|
215
425
|
chain: ManifestSegmentNode[];
|
|
426
|
+
/** Params collected from the slot's segment chain (pre-coercion, may differ from main route params). */
|
|
427
|
+
slotParams: Record<string, string | string[]>;
|
|
216
428
|
}
|
|
217
429
|
|
|
218
430
|
/**
|
|
@@ -230,205 +442,400 @@ interface SlotMatchResult {
|
|
|
230
442
|
* We compare the matched route's segment chain against the slot's children
|
|
231
443
|
* to find the deepest matching page.
|
|
232
444
|
*/
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
445
|
+
/**
|
|
446
|
+
* The index in the matched chain of the segment that owns this slot.
|
|
447
|
+
*
|
|
448
|
+
* **By identity**, because `urlPath` cannot answer it. Slots add no URL depth,
|
|
449
|
+
* so the owner shares the slot's `urlPath` — but so does every route group
|
|
450
|
+
* above it (`/` for both the root and `(browse)`), and since TIM-1280 so does
|
|
451
|
+
* an intercepting node on the children path, which sits *below* the owner.
|
|
452
|
+
* Picking the deepest urlPath match — the rule before this — therefore chose
|
|
453
|
+
* the intercepting node for a tree like `(browse)/@sidebar/` +
|
|
454
|
+
* `(browse)/(.)item/[id]/`, slicing one segment too many off the chain and
|
|
455
|
+
* handing `@sidebar` a shorter URL than it matches against. It would render
|
|
456
|
+
* its `default.tsx` where a page exists.
|
|
457
|
+
*
|
|
458
|
+
* The index must also agree with `slotUrlParts`, which slices the destination
|
|
459
|
+
* pathname at the same point and already used `indexOf(owner)`. Two derivations
|
|
460
|
+
* of one index is how they came apart; this is the shared one.
|
|
461
|
+
*
|
|
462
|
+
*/
|
|
463
|
+
export function findSlotOwnerIndex(
|
|
464
|
+
slotNode: ManifestSegmentNode,
|
|
465
|
+
segments: ManifestSegmentNode[]
|
|
466
|
+
): number {
|
|
245
467
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
break;
|
|
468
|
+
for (const candidate of Object.values(segments[i].slots ?? {})) {
|
|
469
|
+
if (candidate === slotNode) return i;
|
|
249
470
|
}
|
|
250
471
|
}
|
|
251
472
|
|
|
473
|
+
return -1;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
function findSlotMatch(slotNode: ManifestSegmentNode, match: RouteMatch): SlotMatchResult | null {
|
|
477
|
+
const segments = match.segments;
|
|
478
|
+
|
|
479
|
+
const parentIndex = findSlotOwnerIndex(slotNode, segments);
|
|
480
|
+
|
|
252
481
|
// The remaining segments after the parent are what we need to match
|
|
253
482
|
// against the slot's children.
|
|
254
483
|
const remainingSegments = parentIndex >= 0 ? segments.slice(parentIndex + 1) : [];
|
|
255
484
|
|
|
256
|
-
//
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
// Check for optional-catch-all child — [[...slug]] matches zero segments
|
|
262
|
-
for (const child of slotNode.children ?? []) {
|
|
263
|
-
if (child.segmentType === 'optional-catch-all' && child.page) {
|
|
264
|
-
return { page: child.page, chain: [slotNode, child] };
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
485
|
+
// Extract raw URL parts from the remaining main-route segments.
|
|
486
|
+
// Use rawSegmentParams (pre-coercion) to ensure we get actual URL strings,
|
|
487
|
+
// not codec-transformed values. Fall back to segmentParams for tests/compat.
|
|
488
|
+
const rawParams = match.rawSegmentParams ?? match.segmentParams ?? {};
|
|
489
|
+
const urlParts = extractUrlParts(remainingSegments, rawParams);
|
|
269
490
|
|
|
270
|
-
//
|
|
271
|
-
//
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
const childName = seg.segmentName;
|
|
276
|
-
const directChildren = currentNode.children ?? [];
|
|
277
|
-
|
|
278
|
-
let found: ManifestSegmentNode | null = null;
|
|
279
|
-
for (const child of directChildren) {
|
|
280
|
-
// Exact static match
|
|
281
|
-
if (child.segmentType === 'static' && child.segmentName === childName) {
|
|
282
|
-
found = child;
|
|
283
|
-
break;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
491
|
+
// Match URL parts against the slot's segment tree using the shared walker.
|
|
492
|
+
// Handles zero parts (slot's own page), catch-all, optional-catch-all,
|
|
493
|
+
// groups, backtracking, and correct priority ordering.
|
|
494
|
+
const result = matchUrlParts(slotNode, urlParts);
|
|
495
|
+
if (!result) return null;
|
|
286
496
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
for (const child of directChildren) {
|
|
290
|
-
if (child.segmentType === 'dynamic') {
|
|
291
|
-
found = child;
|
|
292
|
-
break;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
497
|
+
const leaf = result.chain[result.chain.length - 1];
|
|
498
|
+
if (!leaf.page) return null;
|
|
296
499
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
500
|
+
return { page: leaf.page, chain: result.chain, slotParams: result.params };
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// ─── Slot Caching ──────────────────────────────────────────────────────────
|
|
504
|
+
|
|
505
|
+
export interface SlotSkipEntry {
|
|
506
|
+
slotKey: string;
|
|
507
|
+
parentSegmentId: string;
|
|
508
|
+
/**
|
|
509
|
+
* Whether the slot's components called request accessors (getHeaders,
|
|
510
|
+
* getSearchParams, cookies) during their last render. Replaces the
|
|
511
|
+
* unreliable AsyncFunction heuristic — taint-tracked via ALS.
|
|
512
|
+
*/
|
|
513
|
+
isRequestDependent: boolean;
|
|
514
|
+
/** Whether the slot's access.ts denied on this render. */
|
|
515
|
+
denied: boolean;
|
|
516
|
+
/** Whether the slot was skipped (content not rendered, client keeps cached). */
|
|
517
|
+
skipped?: boolean;
|
|
518
|
+
/**
|
|
519
|
+
* Content key encoding owner parts + slot name + entry file + slot params.
|
|
520
|
+
* Sent to the client via X-Timber-Segments; the client advertises it back
|
|
521
|
+
* so the server can decide skips by key membership (TIM-1370).
|
|
522
|
+
*/
|
|
523
|
+
contentKey: string;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* The destination URL parts a segment's slots match against.
|
|
528
|
+
*
|
|
529
|
+
* A slot walks its own sub-tree starting where its owning segment stopped
|
|
530
|
+
* consuming the URL, so the parts are sliced at the length its ancestors
|
|
531
|
+
* consumed. Shared by `resolveSlotProps` and `publishSlotSegmentParams` — both
|
|
532
|
+
* have to slice identically or the two would disagree about which page a slot
|
|
533
|
+
* matched, and only one of them would be right.
|
|
534
|
+
*
|
|
535
|
+
* @internal
|
|
536
|
+
*/
|
|
537
|
+
export function slotUrlParts(
|
|
538
|
+
segment: ManifestSegmentNode,
|
|
539
|
+
match: RouteMatch,
|
|
540
|
+
url: string
|
|
541
|
+
): string[] {
|
|
542
|
+
const pathname = new URL(url, 'http://localhost').pathname;
|
|
543
|
+
// Slice through the owning segment inclusive, to match findSlotMatch, which
|
|
544
|
+
// walks the chain from parentIndex + 1. `consumedUrlParts` drops the root
|
|
545
|
+
// (it consumes no URL part) and honors the interception anchor, so a slot on
|
|
546
|
+
// a retained owner above a climbing marker is not handed parts the target
|
|
547
|
+
// does not contain.
|
|
548
|
+
const sliceAt = consumedPartsThroughSegment(segment, match).length;
|
|
549
|
+
const all = pathname === '/' ? [] : pathname.slice(1).split('/');
|
|
550
|
+
return all.slice(sliceAt);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* Seed per-slot segment params for a segment whose layout is being SKIPPED.
|
|
555
|
+
*
|
|
556
|
+
* `resolveSlotProps` seeds these as part of resolving slot props, but a skipped
|
|
557
|
+
* layout never gets there — `route-element-builder` continues past it. Its
|
|
558
|
+
* slots are still mounted on the client, though, so leaving them out of the
|
|
559
|
+
* published map made `useSegmentParams(slotPath)` fall back to the main route's
|
|
560
|
+
* record after any navigation that skipped their parent (TIM-1285).
|
|
561
|
+
*
|
|
562
|
+
* Only the params are seeded. Nothing renders, no access chain runs — a skipped
|
|
563
|
+
* layout's slots are unchanged by definition, which is what made it skippable.
|
|
564
|
+
*
|
|
565
|
+
* @internal
|
|
566
|
+
*/
|
|
567
|
+
export function publishSlotSegmentParams(
|
|
568
|
+
segment: ManifestSegmentNode,
|
|
569
|
+
match: RouteMatch,
|
|
570
|
+
destinationUrl: string,
|
|
571
|
+
parentTreePath: string | undefined
|
|
572
|
+
): void {
|
|
573
|
+
const slotEntries = Object.entries(segment.slots ?? {});
|
|
574
|
+
if (slotEntries.length === 0) return;
|
|
575
|
+
const destinationParts = slotUrlParts(segment, match, destinationUrl);
|
|
576
|
+
|
|
577
|
+
for (const [, slotNode] of slotEntries) {
|
|
578
|
+
const destMatch = matchUrlParts(slotNode as ManifestSegmentNode, destinationParts);
|
|
579
|
+
if (!destMatch) continue;
|
|
580
|
+
const coerced = coerceSlotParams(destMatch.chain, destMatch.params);
|
|
581
|
+
const fullSlotPath = computeSlotSegmentPath(destMatch.chain, parentTreePath);
|
|
582
|
+
if (fullSlotPath && Object.keys(coerced).length > 0) {
|
|
583
|
+
setSlotParams(fullSlotPath, coerced);
|
|
311
584
|
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
312
587
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
588
|
+
/**
|
|
589
|
+
* Emit slot metadata for a layout whose rendering was SKIPPED.
|
|
590
|
+
*
|
|
591
|
+
* Skipped layouts never reach `resolveSlotProps`, but the client rebuilds
|
|
592
|
+
* its segment tree from each navigation's X-Timber-Segments response. If
|
|
593
|
+
* skipped slots are absent, the client loses their contentKeys and can't
|
|
594
|
+
* advertise them on the next navigation — breaking key-based slot skipping.
|
|
595
|
+
*
|
|
596
|
+
* This computes contentKey and isRequestDependent for each slot without
|
|
597
|
+
* rendering anything, using the same derivation as `resolveSlotProps`.
|
|
598
|
+
*/
|
|
599
|
+
export function emitSlotInfoForSkippedLayout(
|
|
600
|
+
segment: ManifestSegmentNode,
|
|
601
|
+
segmentId: string,
|
|
602
|
+
match: RouteMatch,
|
|
603
|
+
destinationUrl: string,
|
|
604
|
+
slotSkipInfo: SlotSkipEntry[]
|
|
605
|
+
): void {
|
|
606
|
+
const slotEntries = Object.entries(segment.slots ?? {});
|
|
607
|
+
if (slotEntries.length === 0) return;
|
|
608
|
+
|
|
609
|
+
const destinationParts = slotUrlParts(segment, match, destinationUrl);
|
|
610
|
+
const ownerParts = consumedPartsThroughSegment(segment, match);
|
|
611
|
+
|
|
612
|
+
for (const [slotName, slotNode] of slotEntries) {
|
|
613
|
+
const slotManifest = slotNode as ManifestSegmentNode;
|
|
614
|
+
const slotKey = computeSlotKey(segmentId, `@${slotName}`);
|
|
615
|
+
const destMatch = matchUrlParts(slotManifest, destinationParts);
|
|
616
|
+
|
|
617
|
+
const destLeaf = destMatch?.chain[destMatch.chain.length - 1];
|
|
618
|
+
const entryFile = destLeaf?.page?.filePath ?? null;
|
|
619
|
+
const contentKey = computeSlotContentKey(
|
|
620
|
+
slotKey,
|
|
621
|
+
ownerParts,
|
|
622
|
+
entryFile,
|
|
623
|
+
destMatch?.params ?? {}
|
|
624
|
+
);
|
|
625
|
+
|
|
626
|
+
const hasAccessInChain =
|
|
627
|
+
!!slotManifest.access || (destMatch?.chain.some((seg) => seg.access) ?? false);
|
|
628
|
+
|
|
629
|
+
let slotRequestDep = hasAccessInChain;
|
|
630
|
+
if (!slotRequestDep) {
|
|
631
|
+
const hasRenderedPage = destMatch && destLeaf?.page;
|
|
632
|
+
if (hasRenderedPage) {
|
|
633
|
+
if (
|
|
634
|
+
slotManifest.layout?.filePath &&
|
|
635
|
+
isStaticRequestDependent(slotManifest.layout.filePath)
|
|
636
|
+
) {
|
|
637
|
+
slotRequestDep = true;
|
|
638
|
+
}
|
|
639
|
+
if (!slotRequestDep) {
|
|
640
|
+
for (const seg of destMatch.chain) {
|
|
641
|
+
if (seg.layout?.filePath && isStaticRequestDependent(seg.layout.filePath)) {
|
|
642
|
+
slotRequestDep = true;
|
|
320
643
|
break;
|
|
321
644
|
}
|
|
322
645
|
}
|
|
323
|
-
|
|
646
|
+
}
|
|
647
|
+
if (!slotRequestDep && destLeaf?.page?.filePath) {
|
|
648
|
+
slotRequestDep = isStaticRequestDependent(destLeaf.page.filePath);
|
|
649
|
+
}
|
|
650
|
+
} else {
|
|
651
|
+
const defaultFile = slotManifest.default?.filePath;
|
|
652
|
+
if (!defaultFile) {
|
|
653
|
+
slotRequestDep = true;
|
|
654
|
+
} else {
|
|
655
|
+
slotRequestDep = isStaticRequestDependent(defaultFile);
|
|
324
656
|
}
|
|
325
657
|
}
|
|
326
658
|
}
|
|
327
659
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
660
|
+
slotSkipInfo.push({
|
|
661
|
+
slotKey,
|
|
662
|
+
parentSegmentId: segmentId,
|
|
663
|
+
isRequestDependent: slotRequestDep,
|
|
664
|
+
denied: false,
|
|
665
|
+
contentKey,
|
|
666
|
+
});
|
|
334
667
|
}
|
|
668
|
+
}
|
|
335
669
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
670
|
+
interface ResolveSlotPropsArgs {
|
|
671
|
+
segment: ManifestSegmentNode;
|
|
672
|
+
segmentId: string;
|
|
673
|
+
match: RouteMatch;
|
|
674
|
+
h: CreateElementFn;
|
|
675
|
+
interception?: InterceptionContext;
|
|
676
|
+
parentTreePath: string;
|
|
677
|
+
destinationUrl: string;
|
|
678
|
+
clientStateTree: ClientStateTree | null;
|
|
679
|
+
slotSkipInfo: SlotSkipEntry[];
|
|
340
680
|
}
|
|
341
681
|
|
|
342
682
|
/**
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
* the target pathname to find which intercepting page to render.
|
|
683
|
+
* Resolve all parallel route slots for a layout, wrapping each in a
|
|
684
|
+
* SegmentOutlet for client-side caching. Slots whose content key matches
|
|
685
|
+
* one the client advertised are rendered with `skip=true` so the client
|
|
686
|
+
* keeps its cached content.
|
|
348
687
|
*
|
|
349
|
-
* The
|
|
350
|
-
*
|
|
351
|
-
*
|
|
688
|
+
* The skip decision is key-based (TIM-1370): the server computes a content
|
|
689
|
+
* key per slot from the owning segment's URL parts, the slot name, the
|
|
690
|
+
* matched entry file, and the slot's own params. The client advertises
|
|
691
|
+
* the keys it has cached; the server checks membership. This replaces
|
|
692
|
+
* the previous approach of reconstructing the client's state from a
|
|
693
|
+
* departing URL.
|
|
352
694
|
*/
|
|
353
|
-
function
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
const
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
695
|
+
export async function resolveSlotProps({
|
|
696
|
+
segment,
|
|
697
|
+
segmentId,
|
|
698
|
+
match,
|
|
699
|
+
h,
|
|
700
|
+
interception,
|
|
701
|
+
parentTreePath,
|
|
702
|
+
destinationUrl,
|
|
703
|
+
clientStateTree,
|
|
704
|
+
slotSkipInfo,
|
|
705
|
+
}: ResolveSlotPropsArgs): Promise<Record<string, unknown>> {
|
|
706
|
+
const slotProps: Record<string, unknown> = {};
|
|
707
|
+
const slotEntries = Object.entries(segment.slots ?? {});
|
|
708
|
+
if (slotEntries.length === 0) return slotProps;
|
|
709
|
+
|
|
710
|
+
const destinationParts = slotUrlParts(segment, match, destinationUrl);
|
|
711
|
+
const clientSlotKeys = clientStateTree?.slots ?? null;
|
|
712
|
+
|
|
713
|
+
// Owner URL parts — the URL values consumed through this segment.
|
|
714
|
+
// These are part of the content key because the slot's page may read
|
|
715
|
+
// parent params (e.g., via getSegmentParams).
|
|
716
|
+
const ownerParts = consumedPartsThroughSegment(segment, match);
|
|
717
|
+
|
|
718
|
+
for (const [slotName, slotNode] of slotEntries) {
|
|
719
|
+
const slotManifest = slotNode as ManifestSegmentNode;
|
|
720
|
+
const slotKey = computeSlotKey(segmentId, `@${slotName}`);
|
|
721
|
+
|
|
722
|
+
// Match the slot's sub-tree against the destination URL parts.
|
|
723
|
+
const destMatch = matchUrlParts(slotManifest, destinationParts);
|
|
724
|
+
|
|
725
|
+
// Compute the content key for this slot at the destination URL.
|
|
726
|
+
const destLeaf = destMatch?.chain[destMatch.chain.length - 1];
|
|
727
|
+
const entryFile = destLeaf?.page?.filePath ?? null;
|
|
728
|
+
const contentKey = computeSlotContentKey(
|
|
729
|
+
slotKey,
|
|
730
|
+
ownerParts,
|
|
731
|
+
entryFile,
|
|
732
|
+
destMatch?.params ?? {}
|
|
733
|
+
);
|
|
734
|
+
|
|
735
|
+
// Auth-bearing slots are inherently request-dependent — their content
|
|
736
|
+
// changes based on user state. Skipping them would require eager
|
|
737
|
+
// evaluation of access.ts outside React.cache scope, causing double
|
|
738
|
+
// execution (TIM-1364). Instead, exclude them from skip candidates
|
|
739
|
+
// entirely and let SlotAccessGate handle access during render.
|
|
740
|
+
// The client filters these out via isRequestDependent, so their keys
|
|
741
|
+
// are never advertised — but checking here is defense-in-depth.
|
|
742
|
+
const hasAccessInChain =
|
|
743
|
+
!!slotManifest.access || (destMatch?.chain.some((seg) => seg.access) ?? false);
|
|
744
|
+
const hasInterceptingChildren = slotManifest.children.some(
|
|
745
|
+
(c) => c.segmentType === 'intercepting'
|
|
746
|
+
);
|
|
747
|
+
const canSkip =
|
|
748
|
+
!interception &&
|
|
749
|
+
!hasInterceptingChildren &&
|
|
750
|
+
!hasAccessInChain &&
|
|
751
|
+
shouldSkipSlot(contentKey, clientSlotKeys);
|
|
752
|
+
|
|
753
|
+
if (canSkip) {
|
|
754
|
+
// No access.ts in this slot's chain (excluded above), so no gate needed.
|
|
755
|
+
slotProps[slotName] = h(SegmentOutlet, {
|
|
756
|
+
segmentPath: slotKey,
|
|
757
|
+
skip: true,
|
|
758
|
+
children: null,
|
|
759
|
+
});
|
|
760
|
+
slotSkipInfo.push({
|
|
761
|
+
slotKey,
|
|
762
|
+
parentSegmentId: segmentId,
|
|
763
|
+
isRequestDependent: false,
|
|
764
|
+
denied: false,
|
|
765
|
+
skipped: true,
|
|
766
|
+
contentKey,
|
|
767
|
+
});
|
|
768
|
+
} else {
|
|
769
|
+
const resolvedElement = await resolveSlotElement(
|
|
770
|
+
slotManifest,
|
|
771
|
+
match,
|
|
772
|
+
h,
|
|
773
|
+
interception,
|
|
774
|
+
parentTreePath
|
|
775
|
+
);
|
|
776
|
+
slotProps[slotName] = h(SegmentOutlet, {
|
|
777
|
+
segmentPath: slotKey,
|
|
778
|
+
children: resolvedElement,
|
|
779
|
+
});
|
|
780
|
+
// Static analysis: check if any file in the slot's RENDERED tree
|
|
781
|
+
// is request-dependent. Only check layouts when destMatch exists —
|
|
782
|
+
// unmatched slots render default.tsx directly without layouts.
|
|
783
|
+
// Slots with access.ts are inherently request-dependent — their
|
|
784
|
+
// content varies with user state (TIM-1364).
|
|
785
|
+
let slotRequestDep = hasAccessInChain;
|
|
786
|
+
const hasRenderedPage = destMatch && destLeaf?.page;
|
|
787
|
+
if (slotRequestDep) {
|
|
788
|
+
// Already marked — skip static analysis
|
|
789
|
+
} else if (interception) {
|
|
790
|
+
// `destMatch` walks the slot's ordinary children against the
|
|
791
|
+
// destination URL; the interception resolver renders an intercepting
|
|
792
|
+
// child instead, which that walk never sees. So the files analyzed
|
|
793
|
+
// below are not the files that rendered — and `false` here tells the
|
|
794
|
+
// client the slot is reusable. Stay conservative: a needlessly
|
|
795
|
+
// request-dependent slot is a wasted refetch, a wrongly static one is
|
|
796
|
+
// a stale modal.
|
|
797
|
+
slotRequestDep = true;
|
|
798
|
+
} else if (hasRenderedPage) {
|
|
799
|
+
// Check slot root layout (rendered by wrapWithLayout)
|
|
800
|
+
if (
|
|
801
|
+
slotManifest.layout?.filePath &&
|
|
802
|
+
isStaticRequestDependent(slotManifest.layout.filePath)
|
|
803
|
+
) {
|
|
804
|
+
slotRequestDep = true;
|
|
397
805
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
break;
|
|
806
|
+
// Check intermediate slot layouts
|
|
807
|
+
if (!slotRequestDep) {
|
|
808
|
+
for (const seg of destMatch.chain) {
|
|
809
|
+
if (seg.layout?.filePath && isStaticRequestDependent(seg.layout.filePath)) {
|
|
810
|
+
slotRequestDep = true;
|
|
811
|
+
break;
|
|
812
|
+
}
|
|
406
813
|
}
|
|
407
814
|
}
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
for (const c of children) {
|
|
413
|
-
if (c.segmentType === 'catch-all' || c.segmentType === 'optional-catch-all') {
|
|
414
|
-
found = c;
|
|
415
|
-
break;
|
|
815
|
+
// Check leaf page
|
|
816
|
+
if (!slotRequestDep) {
|
|
817
|
+
if (destLeaf?.page?.filePath && isStaticRequestDependent(destLeaf.page.filePath)) {
|
|
818
|
+
slotRequestDep = true;
|
|
416
819
|
}
|
|
417
820
|
}
|
|
821
|
+
} else {
|
|
822
|
+
// No match — only default.tsx is rendered (no layouts)
|
|
823
|
+
const defaultFile = slotManifest.default?.filePath;
|
|
824
|
+
if (!defaultFile) {
|
|
825
|
+
slotRequestDep = true; // No entry file → conservative
|
|
826
|
+
} else {
|
|
827
|
+
slotRequestDep = isStaticRequestDependent(defaultFile);
|
|
828
|
+
}
|
|
418
829
|
}
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
if (matched && currentNode.page) {
|
|
429
|
-
return { page: currentNode.page, chain };
|
|
830
|
+
slotSkipInfo.push({
|
|
831
|
+
slotKey,
|
|
832
|
+
parentSegmentId: segmentId,
|
|
833
|
+
isRequestDependent: slotRequestDep,
|
|
834
|
+
denied: false,
|
|
835
|
+
contentKey,
|
|
836
|
+
});
|
|
430
837
|
}
|
|
431
838
|
}
|
|
432
839
|
|
|
433
|
-
return
|
|
840
|
+
return slotProps;
|
|
434
841
|
}
|