@timber-js/app 0.2.0-alpha.207 → 0.2.0-alpha.209
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/dist/_chunks/{primitives-DLAnvsrk.js → actions-BerlqoXA.js} +640 -410
- package/dist/_chunks/actions-BerlqoXA.js.map +1 -0
- package/dist/_chunks/{als-registry-C6kcfprT.js → als-registry-DaxkVjt5.js} +6 -2
- package/dist/_chunks/als-registry-DaxkVjt5.js.map +1 -0
- package/dist/_chunks/{build-manifest-DTmSGLRz.js → build-manifest-DWppEdLB.js} +2 -51
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/{build-output-helper-9dqCv1pZ.js → build-output-helper-RV_BRcF1.js} +50 -53
- package/dist/_chunks/build-output-helper-RV_BRcF1.js.map +1 -0
- package/dist/_chunks/{cache-api-CUD9Ezaq.js → cache-api-CR23J_NC.js} +64 -32
- package/dist/_chunks/cache-api-CR23J_NC.js.map +1 -0
- package/dist/_chunks/{chains-B4bgOl2g.js → chains-CpFg56UB.js} +2 -2
- package/dist/_chunks/{chains-B4bgOl2g.js.map → chains-CpFg56UB.js.map} +1 -1
- package/dist/_chunks/{cli-check-G8o30ldg.js → cli-check-C6Ev6wBO.js} +11 -52
- package/dist/_chunks/cli-check-C6Ev6wBO.js.map +1 -0
- package/dist/_chunks/cli-context-By7k2xVo.js +70 -0
- package/dist/_chunks/cli-context-By7k2xVo.js.map +1 -0
- package/dist/_chunks/{cli-schema-sync--LZKs8Zn.js → cli-schema-sync-CbT2AUUI.js} +3 -3
- package/dist/_chunks/{cli-schema-sync--LZKs8Zn.js.map → cli-schema-sync-CbT2AUUI.js.map} +1 -1
- package/dist/_chunks/{cloudflare-BFb__LYG.js → cloudflare-Byxl8FWP.js} +96 -53
- package/dist/_chunks/{cloudflare-BFb__LYG.js.map → cloudflare-Byxl8FWP.js.map} +1 -1
- package/dist/_chunks/{convention-lint-5KzoMg_A.js → convention-lint-jKTwKwPe.js} +21 -6
- package/dist/_chunks/convention-lint-jKTwKwPe.js.map +1 -0
- package/dist/_chunks/{dev-server-BzBxgYAV.js → dev-server-C4WZdB7L.js} +15 -167
- package/dist/_chunks/dev-server-C4WZdB7L.js.map +1 -0
- package/dist/_chunks/{error-boundary-BndF-3Td.js → error-boundary-tA7kVfs4.js} +84 -104
- package/dist/_chunks/error-boundary-tA7kVfs4.js.map +1 -0
- package/dist/_chunks/{fs-identity-D7vb6GdI.js → fs-identity-BRKuL215.js} +3 -4
- package/dist/_chunks/fs-identity-BRKuL215.js.map +1 -0
- package/dist/_chunks/{graph-cache-CP4GEmf9.js → graph-cache-CYiUS2aS.js} +4 -5
- package/dist/_chunks/graph-cache-CYiUS2aS.js.map +1 -0
- package/dist/_chunks/{json-lossy-check-ClNvBM_3.js → json-lossy-check-ip0Qi0MT.js} +6 -3
- package/dist/_chunks/json-lossy-check-ip0Qi0MT.js.map +1 -0
- package/dist/_chunks/{live-graph-Bm5WTvcr.js → live-graph-Dv-JJCZw.js} +3 -3
- package/dist/_chunks/{live-graph-Bm5WTvcr.js.map → live-graph-Dv-JJCZw.js.map} +1 -1
- package/dist/_chunks/{logger-k2DQ4EUf.js → logger-DiDt5ppH.js} +192 -51
- package/dist/_chunks/logger-DiDt5ppH.js.map +1 -0
- package/dist/_chunks/{navigation-root-mHSK9psY.js → navigation-root-BQfo1-kG.js} +2 -2
- package/dist/_chunks/{navigation-root-mHSK9psY.js.map → navigation-root-BQfo1-kG.js.map} +1 -1
- package/dist/_chunks/{plugin-context-8idfR3UZ.js → plugin-context-BPBPc3lL.js} +28 -4
- package/dist/_chunks/plugin-context-BPBPc3lL.js.map +1 -0
- package/dist/_chunks/{poison-scan-DG5eI2_z.js → poison-scan-CpeT6_OJ.js} +2 -2
- package/dist/_chunks/{poison-scan-DG5eI2_z.js.map → poison-scan-CpeT6_OJ.js.map} +1 -1
- package/dist/_chunks/render-timeout-DOf_BBcO.js +46 -0
- package/dist/_chunks/render-timeout-DOf_BBcO.js.map +1 -0
- package/dist/_chunks/{rsc-payload-path-B_LBodc2.js → rsc-payload-path-dffcs4jp.js} +9 -3
- package/dist/_chunks/{rsc-payload-path-B_LBodc2.js.map → rsc-payload-path-dffcs4jp.js.map} +1 -1
- package/dist/_chunks/{scanner-BQ5sPIJ7.js → scanner-Bw0oq1HB.js} +2 -2
- package/dist/_chunks/{scanner-BQ5sPIJ7.js.map → scanner-Bw0oq1HB.js.map} +1 -1
- package/dist/_chunks/{navigation-context-D0TU0Jog.js → segment-context-xtPUGfdq.js} +36 -34
- package/dist/_chunks/segment-context-xtPUGfdq.js.map +1 -0
- package/dist/_chunks/{singleflight-2lUWfcAk.js → singleflight-BeVMMKi0.js} +4 -3
- package/dist/_chunks/{singleflight-2lUWfcAk.js.map → singleflight-BeVMMKi0.js.map} +1 -1
- package/dist/_chunks/{sizeof-lXffQ1Vr.js → sizeof-UwzwB1uM.js} +3 -2
- package/dist/_chunks/sizeof-UwzwB1uM.js.map +1 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js +49 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js.map +1 -0
- package/dist/_chunks/{state-FippDgxN.js → state-BhNGPsdi.js} +6 -8
- package/dist/_chunks/state-BhNGPsdi.js.map +1 -0
- package/dist/_chunks/{status-page-marker-DwQBrLBz.js → status-page-marker-gaihi0KZ.js} +140 -28
- package/dist/_chunks/status-page-marker-gaihi0KZ.js.map +1 -0
- package/dist/_chunks/{walkers-CN2N_bA-.js → walkers-BXExhzzk.js} +2 -2
- package/dist/_chunks/{walkers-CN2N_bA-.js.map → walkers-BXExhzzk.js.map} +1 -1
- package/dist/_chunks/write-file-atomic-D1qWqHb4.js +32 -0
- package/dist/_chunks/write-file-atomic-D1qWqHb4.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +7 -7
- package/dist/adapters/build-output-helper.d.ts.map +1 -1
- package/dist/adapters/canonicalize-module.d.ts +8 -0
- package/dist/adapters/canonicalize-module.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +2 -2
- package/dist/adapters/cloudflare.d.ts +30 -8
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -2
- package/dist/adapters/compress-module.d.ts +8 -0
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +2 -3
- package/dist/adapters/fs-identity.d.ts.map +1 -1
- package/dist/adapters/nitro-presets.d.ts +0 -6
- package/dist/adapters/nitro-presets.d.ts.map +1 -1
- package/dist/adapters/nitro-preview.d.ts +43 -11
- package/dist/adapters/nitro-preview.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +1 -13
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +291 -176
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +7 -2
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/types.d.ts +105 -21
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js +0 -0
- package/dist/analyze/crawl-entry.js +3 -3
- package/dist/analyze/graph-cache.d.ts.map +1 -1
- package/dist/analyze/graph-command.js +4 -4
- package/dist/cache/index.js +2 -2
- package/dist/cache/json-lossy-check.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts.map +1 -1
- package/dist/cache/stores/memory.js +1 -1
- package/dist/cache/tag-aware-handler.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.js +1 -1
- package/dist/cli-check.d.ts +7 -37
- package/dist/cli-check.d.ts.map +1 -1
- package/dist/cli-context.d.ts +54 -0
- package/dist/cli-context.d.ts.map +1 -0
- package/dist/cli.d.ts +9 -9
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +20 -24
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
- package/dist/client/browser-entry/hydrate.d.ts +19 -29
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/index.d.ts +7 -7
- package/dist/client/browser-entry/post-hydration.d.ts +6 -9
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
- package/dist/client/browser-entry/router-init.d.ts +6 -11
- package/dist/client/browser-entry/router-init.d.ts.map +1 -1
- package/dist/client/error-boundary.d.ts +4 -3
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +1 -1
- package/dist/client/error-reconstituter.d.ts +3 -9
- package/dist/client/error-reconstituter.d.ts.map +1 -1
- package/dist/client/history.d.ts +20 -11
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +5 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +3 -3
- package/dist/client/internal.d.ts.map +1 -1
- package/dist/client/internal.js +95 -108
- package/dist/client/internal.js.map +1 -1
- package/dist/client/navigation-commit.d.ts +20 -7
- package/dist/client/navigation-commit.d.ts.map +1 -1
- package/dist/client/navigation-context.d.ts +3 -5
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/react-root.d.ts +3 -2
- package/dist/client/react-root.d.ts.map +1 -1
- package/dist/client/router-pipeline.d.ts +3 -8
- package/dist/client/router-pipeline.d.ts.map +1 -1
- package/dist/client/router-types.d.ts +45 -39
- package/dist/client/router-types.d.ts.map +1 -1
- package/dist/client/router-url.d.ts +24 -0
- package/dist/client/router-url.d.ts.map +1 -0
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +8 -4
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +44 -4
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/ssr-data.d.ts +18 -64
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/state.d.ts +2 -5
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +1 -1
- package/dist/config-types.d.ts +2 -1
- package/dist/config-types.d.ts.map +1 -1
- package/dist/config-validation.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -1
- package/dist/dev-tools/dev-page-shell.d.ts +17 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -1
- package/dist/dev-tools/index.d.ts +1 -1
- package/dist/dev-tools/index.d.ts.map +1 -1
- package/dist/dev-tools/instrumentation.d.ts +17 -2
- package/dist/dev-tools/instrumentation.d.ts.map +1 -1
- package/dist/dev-tools/overlay.d.ts +6 -27
- package/dist/dev-tools/overlay.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +632 -373
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +26 -40
- package/dist/plugin-context.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +15 -2
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +19 -1
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/post-build.d.ts +110 -0
- package/dist/plugins/post-build.d.ts.map +1 -0
- package/dist/plugins/prebuilt-capture.d.ts +11 -4
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -1
- package/dist/plugins/prebuilt.d.ts +17 -1
- package/dist/plugins/prebuilt.d.ts.map +1 -1
- package/dist/plugins/prerender-sugar.d.ts.map +1 -1
- package/dist/plugins/react-resolve.d.ts +49 -0
- package/dist/plugins/react-resolve.d.ts.map +1 -0
- package/dist/plugins/rsc-assets-manifest.d.ts +33 -0
- package/dist/plugins/rsc-assets-manifest.d.ts.map +1 -0
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +32 -9
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-write.d.ts +0 -9
- package/dist/routing/codegen-write.d.ts.map +1 -1
- package/dist/routing/index.js +2 -2
- package/dist/routing/segment-codegen.d.ts.map +1 -1
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-handler.d.ts +5 -4
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +46 -7
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +58 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/children-interception.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +2 -23
- package/dist/server/cookie-context.d.ts.map +1 -1
- package/dist/server/csp-nonce.d.ts +0 -9
- package/dist/server/csp-nonce.d.ts.map +1 -1
- package/dist/server/csrf.d.ts +27 -4
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/debug.d.ts +0 -1
- package/dist/server/debug.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +2 -1
- package/dist/server/default-logger.d.ts.map +1 -1
- package/dist/server/deny-boundary.d.ts +12 -6
- package/dist/server/deny-boundary.d.ts.map +1 -1
- package/dist/server/deny-renderer.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -3
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +9 -2
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/head-response.d.ts +4 -4
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +0 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +10 -3
- package/dist/server/instrumentation.d.ts.map +1 -1
- package/dist/server/internal.d.ts +1 -4
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +961 -581
- package/dist/server/internal.js.map +1 -1
- package/dist/server/json-status-response.d.ts +34 -0
- package/dist/server/json-status-response.d.ts.map +1 -0
- package/dist/server/logger.d.ts +26 -0
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +11 -6
- package/dist/server/param-coercion.d.ts.map +1 -1
- package/dist/server/pipeline-helpers.d.ts +95 -7
- package/dist/server/pipeline-helpers.d.ts.map +1 -1
- package/dist/server/pipeline-interception.d.ts +11 -0
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +11 -1
- package/dist/server/pipeline-outcome.d.ts.map +1 -1
- package/dist/server/pipeline-phases.d.ts +2 -2
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +23 -35
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/prebuilt/capture-render.d.ts +25 -0
- package/dist/server/prebuilt/capture-render.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-routes.d.ts +37 -0
- package/dist/server/prebuilt/capture-routes.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +79 -35
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -1
- package/dist/server/prebuilt/lifetime.d.ts +38 -0
- package/dist/server/prebuilt/lifetime.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +7 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -1
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -1
- package/dist/server/prebuilt-builder.d.ts.map +1 -1
- package/dist/server/prebuilt-runtime.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +6 -81
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/react-cache-bridge.d.ts +59 -0
- package/dist/server/react-cache-bridge.d.ts.map +1 -0
- package/dist/server/react-cache-scope.d.ts +49 -0
- package/dist/server/react-cache-scope.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +15 -0
- package/dist/server/render-timeout.d.ts.map +1 -1
- package/dist/server/render-utils.d.ts +9 -0
- package/dist/server/render-utils.d.ts.map +1 -1
- package/dist/server/request-context.d.ts +26 -5
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +7 -0
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +22 -22
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts +7 -0
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +32 -6
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +11 -18
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +0 -1
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +5 -15
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +5 -6
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-signals.d.ts +65 -0
- package/dist/server/rsc-entry/render-signals.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +6 -16
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts +7 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +8 -53
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +2 -2
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +9 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -1
- package/dist/server/signal-identity.d.ts +43 -0
- package/dist/server/signal-identity.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +4 -3
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +91 -53
- package/dist/server/ssr-bridge-types.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +8 -5
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +26 -40
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +1 -1
- package/dist/server/static-generator.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +12 -0
- package/dist/server/stream-utils.d.ts.map +1 -1
- package/dist/server/tracing.d.ts +12 -16
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -1
- package/dist/server/version-skew.d.ts +3 -3
- package/dist/shared/csrf-reject.d.ts +16 -0
- package/dist/shared/csrf-reject.d.ts.map +1 -0
- package/dist/shared/error-digest.d.ts +28 -0
- package/dist/shared/error-digest.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +11 -10
- package/dist/shared/payload-root.d.ts.map +1 -1
- package/dist/shared/rsc-payload-path.d.ts +6 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -1
- package/dist/utils/write-file-atomic.d.ts +17 -0
- package/dist/utils/write-file-atomic.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +17 -14
- package/docs/api/32-api-cache.mdx +51 -23
- package/docs/api/34-api-config.mdx +34 -6
- package/docs/api/36-cli.mdx +11 -1
- package/docs/learn/03-fetching-data.mdx +17 -1
- package/docs/learn/04-access-control.mdx +1 -1
- package/docs/learn/10-caching.mdx +29 -11
- package/docs/learn/11-middleware.mdx +8 -2
- package/docs/learn/12-error-handling.mdx +6 -1
- package/package.json +7 -3
- package/src/adapters/build-output-helper.ts +55 -53
- package/src/adapters/canonicalize-module.ts +29 -0
- package/src/adapters/cloudflare.ts +105 -63
- package/src/adapters/compress-module.ts +16 -5
- package/src/adapters/fs-identity.ts +2 -3
- package/src/adapters/nitro-presets.ts +0 -15
- package/src/adapters/nitro-preview.ts +272 -136
- package/src/adapters/nitro.ts +119 -82
- package/src/adapters/shared.ts +23 -14
- package/src/adapters/types.ts +110 -21
- package/src/analyze/graph-cache.ts +3 -4
- package/src/cache/json-lossy-check.ts +3 -9
- package/src/cache/singleflight.ts +5 -2
- package/src/cache/sizeof.ts +3 -1
- package/src/cache/tag-aware-handler.ts +43 -26
- package/src/cli-check.ts +8 -98
- package/src/cli-context.ts +119 -0
- package/src/cli.ts +19 -28
- package/src/client/browser-dev.ts +1 -1
- package/src/client/browser-entry/action-dispatch.ts +26 -4
- package/src/client/browser-entry/hydrate.ts +53 -58
- package/src/client/browser-entry/index.ts +16 -27
- package/src/client/browser-entry/post-hydration.ts +6 -40
- package/src/client/browser-entry/router-init.ts +66 -84
- package/src/client/error-boundary.tsx +9 -41
- package/src/client/error-reconstituter.tsx +10 -5
- package/src/client/history.ts +35 -21
- package/src/client/index.ts +0 -1
- package/src/client/internal.ts +2 -7
- package/src/client/navigation-commit.ts +41 -18
- package/src/client/navigation-context.ts +3 -39
- package/src/client/react-root.ts +3 -2
- package/src/client/router-pipeline.ts +96 -132
- package/src/client/router-types.ts +46 -44
- package/src/client/router-url.ts +32 -0
- package/src/client/router.ts +62 -21
- package/src/client/rsc-fetch.ts +117 -155
- package/src/client/segment-cache.ts +110 -11
- package/src/client/ssr-data.ts +19 -80
- package/src/client/state.ts +2 -9
- package/src/client/use-pathname.ts +1 -1
- package/src/config-types.ts +2 -1
- package/src/config-validation.ts +2 -1
- package/src/dev-tools/dev-page-shell.ts +18 -0
- package/src/dev-tools/index.ts +0 -2
- package/src/dev-tools/instrumentation.ts +50 -2
- package/src/dev-tools/overlay.ts +8 -238
- package/src/index.ts +26 -14
- package/src/plugin-context.ts +39 -40
- package/src/plugins/build-manifest.ts +4 -11
- package/src/plugins/build-report.ts +70 -70
- package/src/plugins/dev-server.ts +24 -44
- package/src/plugins/entries.ts +2 -1
- package/src/plugins/fonts.ts +35 -7
- package/src/plugins/post-build.ts +327 -0
- package/src/plugins/prebuilt-capture.ts +28 -32
- package/src/plugins/prebuilt.ts +54 -39
- package/src/plugins/prerender-sugar.ts +0 -4
- package/src/plugins/react-resolve.ts +149 -0
- package/src/plugins/{adapter-build.ts → rsc-assets-manifest.ts} +20 -109
- package/src/plugins/shims.ts +1 -0
- package/src/plugins/static-build.ts +42 -74
- package/src/routing/codegen-write.ts +25 -3
- package/src/routing/segment-codegen.ts +3 -2
- package/src/rsc-runtime/vendor-types.d.ts +8 -0
- package/src/server/access-gate.tsx +2 -1
- package/src/server/action-client.ts +1 -1
- package/src/server/action-handler.ts +253 -110
- package/src/server/actions.ts +73 -25
- package/src/server/als-registry.ts +73 -5
- package/src/server/chain-url-parts.ts +1 -1
- package/src/server/children-interception.ts +2 -1
- package/src/server/cookie-context.ts +18 -48
- package/src/server/csp-nonce.ts +0 -12
- package/src/server/csrf.ts +140 -8
- package/src/server/debug.ts +0 -1
- package/src/server/default-logger.ts +2 -1
- package/src/server/deny-boundary.ts +25 -13
- package/src/server/deny-renderer.ts +30 -97
- package/src/server/error-boundary-wrapper.ts +7 -3
- package/src/server/fallback-error.ts +26 -11
- package/src/server/flight-scripts.ts +1 -1
- package/src/server/head-response.ts +4 -4
- package/src/server/html-injector-core.ts +2 -2
- package/src/server/html-injectors.ts +2 -4
- package/src/server/index.ts +0 -4
- package/src/server/instrumentation.ts +10 -3
- package/src/server/internal.ts +1 -6
- package/src/server/json-status-response.ts +105 -0
- package/src/server/logger.ts +39 -3
- package/src/server/param-coercion.ts +15 -12
- package/src/server/pipeline-helpers.ts +257 -12
- package/src/server/pipeline-interception.ts +133 -0
- package/src/server/pipeline-outcome.ts +103 -31
- package/src/server/pipeline-phases.ts +127 -237
- package/src/server/pipeline.ts +204 -207
- package/src/server/prebuilt/capture-render.ts +118 -0
- package/src/server/prebuilt/capture-routes.ts +104 -0
- package/src/server/prebuilt/capture-state.ts +155 -48
- package/src/server/prebuilt/lifetime.ts +151 -0
- package/src/server/prebuilt/slots.ts +14 -2
- package/src/server/prebuilt/synthetic-store.ts +3 -0
- package/src/server/prebuilt-builder.ts +30 -320
- package/src/server/prebuilt-runtime.ts +125 -129
- package/src/server/primitives.ts +8 -168
- package/src/server/react-cache-bridge.ts +124 -0
- package/src/server/react-cache-scope.ts +104 -0
- package/src/server/render-timeout.ts +20 -0
- package/src/server/render-utils.ts +11 -1
- package/src/server/request-context.ts +36 -9
- package/src/server/route-element-builder.ts +11 -6
- package/src/server/route-handler.ts +36 -23
- package/src/server/route-matcher.ts +15 -1
- package/src/server/rsc-entry/action-middleware-runner.ts +79 -123
- package/src/server/rsc-entry/api-handler.ts +27 -103
- package/src/server/rsc-entry/deny-fallback.ts +93 -26
- package/src/server/rsc-entry/error-renderer.ts +39 -91
- package/src/server/rsc-entry/helpers.ts +2 -4
- package/src/server/rsc-entry/index.ts +64 -58
- package/src/server/rsc-entry/render-route.ts +15 -80
- package/src/server/rsc-entry/render-signals.ts +108 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +56 -57
- package/src/server/rsc-entry/rsc-payload.ts +28 -61
- package/src/server/rsc-entry/rsc-stream.ts +113 -213
- package/src/server/rsc-entry/ssr-bridge.ts +2 -2
- package/src/server/rsc-entry/ssr-renderer.ts +182 -263
- package/src/server/rsc-entry/wrap-action-dispatch.ts +12 -14
- package/src/server/signal-identity.ts +112 -0
- package/src/server/slot-resolver.ts +18 -18
- package/src/server/slot-subtree-contain.ts +2 -1
- package/src/server/ssr-bridge-types.ts +92 -56
- package/src/server/ssr-entry.ts +87 -111
- package/src/server/ssr-render.ts +55 -64
- package/src/server/ssr-wrappers.tsx +2 -2
- package/src/server/static-generator.ts +7 -42
- package/src/server/static-not-found.ts +3 -3
- package/src/server/stream-utils.ts +51 -0
- package/src/server/tracing.ts +58 -75
- package/src/server/types.ts +1 -1
- package/src/server/version-skew.ts +5 -5
- package/src/shared/csrf-reject.ts +15 -0
- package/src/shared/error-digest.ts +46 -0
- package/src/shared/payload-root.ts +11 -10
- package/src/shared/rsc-payload-path.ts +8 -1
- package/src/utils/write-file-atomic.ts +32 -0
- package/dist/_chunks/actions-jNrXdzgs.js +0 -346
- package/dist/_chunks/actions-jNrXdzgs.js.map +0 -1
- package/dist/_chunks/als-registry-C6kcfprT.js.map +0 -1
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +0 -1
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +0 -1
- package/dist/_chunks/cache-api-CUD9Ezaq.js.map +0 -1
- package/dist/_chunks/cli-check-G8o30ldg.js.map +0 -1
- package/dist/_chunks/convention-lint-5KzoMg_A.js.map +0 -1
- package/dist/_chunks/dev-server-BzBxgYAV.js.map +0 -1
- package/dist/_chunks/error-boundary-BndF-3Td.js.map +0 -1
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +0 -1
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +0 -1
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +0 -1
- package/dist/_chunks/logger-k2DQ4EUf.js.map +0 -1
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +0 -1
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +0 -1
- package/dist/_chunks/primitives-DLAnvsrk.js.map +0 -1
- package/dist/_chunks/segment-context-D9_89u34.js +0 -34
- package/dist/_chunks/segment-context-D9_89u34.js.map +0 -1
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +0 -1
- package/dist/_chunks/ssr-data-D6T6Y3ef.js +0 -60
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +0 -1
- package/dist/_chunks/state-FippDgxN.js.map +0 -1
- package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +0 -1
- package/dist/client/types.d.ts +0 -14
- package/dist/client/types.d.ts.map +0 -1
- package/dist/plugins/adapter-build.d.ts +0 -38
- package/dist/plugins/adapter-build.d.ts.map +0 -1
- package/dist/server/asset-headers.d.ts +0 -32
- package/dist/server/asset-headers.d.ts.map +0 -1
- package/dist/server/dev-source-map.d.ts +0 -22
- package/dist/server/dev-source-map.d.ts.map +0 -1
- package/src/client/types.ts +0 -21
- package/src/server/asset-headers.ts +0 -59
- package/src/server/dev-source-map.ts +0 -31
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* RSC Error
|
|
2
|
+
* RSC Error Renderer — handles error pages. (The 404 page for an unmatched
|
|
3
|
+
* URL is a deny page, assembled by `deny-fallback.ts`.)
|
|
3
4
|
*
|
|
4
5
|
* Error pages are 'use client' components rendered through the RSC → SSR
|
|
5
6
|
* pipeline: the Error is converted to SerializableError, wrapped with
|
|
@@ -13,15 +14,14 @@ import { renderToReadableStream } from '../../rsc-runtime/rsc.ts';
|
|
|
13
14
|
|
|
14
15
|
import type { RouteMatch } from '../pipeline.ts';
|
|
15
16
|
import { logRenderError } from '../logger.ts';
|
|
17
|
+
import { loadFallbackModule, reportRenderError } from '../pipeline-helpers.ts';
|
|
16
18
|
import { appVisibleSearch } from '../../shared/rsc-cache-key.ts';
|
|
17
|
-
import { getSlotParamsForClient } from '../request-context.ts';
|
|
18
19
|
import type { ManifestSegmentNode } from '../route-matcher.ts';
|
|
19
|
-
import {
|
|
20
|
+
import { errorDigestId } from '../../shared/error-digest.ts';
|
|
20
21
|
import type { ClientBootstrapConfig } from '../html-injectors.ts';
|
|
21
22
|
import { flightInitScript, htmlEscapeJsonString } from '../flight-scripts.ts';
|
|
22
23
|
import { getCspNonce } from '../csp-nonce.ts';
|
|
23
|
-
import {
|
|
24
|
-
import type { DefaultPageRenderer, LayoutEntry } from '../deny-renderer.ts';
|
|
24
|
+
import type { LayoutEntry } from '../deny-renderer.ts';
|
|
25
25
|
import type { NavContext } from '../ssr-bridge-types.ts';
|
|
26
26
|
import { isRscRequest } from '../../shared/rsc-media-type.ts';
|
|
27
27
|
import { withPublishedParams } from '../publish-params.ts';
|
|
@@ -31,8 +31,7 @@ import { teeWithErrorPropagation } from '../stream-utils.ts';
|
|
|
31
31
|
import { isDevMode } from '../debug.ts';
|
|
32
32
|
import { ErrorReconstituter } from '../../client/error-reconstituter.tsx';
|
|
33
33
|
import type { SerializableError } from '../../client/error-reconstituter.tsx';
|
|
34
|
-
import {
|
|
35
|
-
import { sourceMapError } from '../dev-source-map.ts';
|
|
34
|
+
import type { ManifestLoader } from '../safe-load.ts';
|
|
36
35
|
import { defaultStatusPageResponse } from '../default-status-page.ts';
|
|
37
36
|
import { rscErrorEnvelope } from '../rsc-error-envelope.ts';
|
|
38
37
|
|
|
@@ -67,6 +66,7 @@ interface ErrorFileResolution {
|
|
|
67
66
|
async function resolveErrorFile(
|
|
68
67
|
status: number,
|
|
69
68
|
segments: ManifestSegmentNode[],
|
|
69
|
+
load: (file: ManifestLoader) => Promise<Record<string, unknown> | null>,
|
|
70
70
|
maxIndex?: number
|
|
71
71
|
): Promise<ErrorFileResolution | null> {
|
|
72
72
|
const start =
|
|
@@ -79,10 +79,11 @@ async function resolveErrorFile(
|
|
|
79
79
|
const statusKey = String(status);
|
|
80
80
|
const specificFile = segment.statusFiles[statusKey];
|
|
81
81
|
if (specificFile) {
|
|
82
|
-
//
|
|
83
|
-
// missing file),
|
|
82
|
+
// `load` returns null when the error page module itself fails to
|
|
83
|
+
// load (syntax error, missing file), after reporting it, so the next
|
|
84
|
+
// tier answers instead of a recursive failure.
|
|
84
85
|
// See TIM-584, design/spike-TIM-551-dynamic-import-audit.md §H1.
|
|
85
|
-
const mod = await
|
|
86
|
+
const mod = await load(specificFile);
|
|
86
87
|
if (mod?.default) {
|
|
87
88
|
return {
|
|
88
89
|
component: mod.default as (...args: unknown[]) => unknown,
|
|
@@ -94,7 +95,7 @@ async function resolveErrorFile(
|
|
|
94
95
|
// Check 5xx.tsx category catch-all
|
|
95
96
|
const categoryFile = segment.statusFiles['5xx'];
|
|
96
97
|
if (categoryFile && status >= 500 && status <= 599) {
|
|
97
|
-
const mod = await
|
|
98
|
+
const mod = await load(categoryFile);
|
|
98
99
|
if (mod?.default) {
|
|
99
100
|
return {
|
|
100
101
|
component: mod.default as (...args: unknown[]) => unknown,
|
|
@@ -106,7 +107,7 @@ async function resolveErrorFile(
|
|
|
106
107
|
|
|
107
108
|
// Check error.tsx
|
|
108
109
|
if (segment.error) {
|
|
109
|
-
const mod = await
|
|
110
|
+
const mod = await load(segment.error);
|
|
110
111
|
if (mod?.default) {
|
|
111
112
|
return {
|
|
112
113
|
component: mod.default as (...args: unknown[]) => unknown,
|
|
@@ -154,7 +155,7 @@ function toSerializableError(error: unknown): SerializableError {
|
|
|
154
155
|
}
|
|
155
156
|
|
|
156
157
|
/**
|
|
157
|
-
* Render an error page for unhandled
|
|
158
|
+
* Render an error page for an unhandled throw outside Suspense.
|
|
158
159
|
*
|
|
159
160
|
* All error pages (TSX and MDX) go through RSC → SSR:
|
|
160
161
|
* - TSX: ErrorReconstituter wrapper converts SerializableError → real Error
|
|
@@ -164,13 +165,13 @@ function toSerializableError(error: unknown): SerializableError {
|
|
|
164
165
|
* envelope instead. Every tier below produces an HTML document, and the
|
|
165
166
|
* client's Flight decoder is waiting for `text/x-component`; handing it HTML
|
|
166
167
|
* crashes the decode. The check lives here rather than at the call sites
|
|
167
|
-
* because it holds for
|
|
168
|
-
* (
|
|
169
|
-
* of this function's —
|
|
170
|
-
* (TIM-1322).
|
|
171
|
-
* (`render-route.ts` returns the payload before it reaches
|
|
172
|
-
* `outcomeToResponse` answers RSC errors itself), so this
|
|
173
|
-
*
|
|
168
|
+
* because it holds for every one of them, and the deny path's equivalent split
|
|
169
|
+
* (the deny fallback's page / Flight branches) had already been forgotten at one
|
|
170
|
+
* of this function's — a since-deleted synchronous render-error exit in
|
|
171
|
+
* `render-route.ts` (TIM-1322). Neither remaining caller is reachable for an
|
|
172
|
+
* RSC request today (`render-route.ts` returns the payload before it reaches
|
|
173
|
+
* SSR, and `outcomeToResponse` answers RSC errors itself), so this guards
|
|
174
|
+
* against drift rather than firing on a live path.
|
|
174
175
|
*/
|
|
175
176
|
export async function renderErrorPage(
|
|
176
177
|
error: unknown,
|
|
@@ -184,24 +185,25 @@ export async function renderErrorPage(
|
|
|
184
185
|
globalError?: GlobalErrorFile,
|
|
185
186
|
firstDeniedIndex = Infinity
|
|
186
187
|
): Promise<Response> {
|
|
187
|
-
// The error itself is not logged here — every producer
|
|
188
|
-
//
|
|
189
|
-
// `onError
|
|
188
|
+
// The error itself is not logged here — every producer already logged it
|
|
189
|
+
// where it was caught, so a log on this exit would double up: `rsc-stream.ts`'s
|
|
190
|
+
// `onError` for an error the RSC render threw, Fizz's `onError`
|
|
191
|
+
// (`ssr-render.ts`) for a shell error SSR threw itself, `outcomeToResponse`
|
|
192
|
+
// for a pipeline error. Each of them is also the error's one
|
|
193
|
+
// `onRequestError` report, except Fizz's, which reaches no hook; see
|
|
194
|
+
// design/17 §"Which errors reach it".
|
|
190
195
|
if (isRscRequest(req)) {
|
|
191
196
|
return rscErrorEnvelope(status, responseHeaders);
|
|
192
197
|
}
|
|
193
198
|
|
|
194
|
-
// Source-map the error's stack trace in dev mode so the error page
|
|
195
|
-
// shows original source positions instead of transpiled/bundled ones.
|
|
196
|
-
// See TIM-811.
|
|
197
|
-
sourceMapError(error);
|
|
198
199
|
// Walk segments from leaf to root to find the error component.
|
|
199
200
|
// When firstDeniedIndex is finite, bound the walk so error files below
|
|
200
201
|
// the denied segment are not selected — matching the deny renderer's
|
|
201
202
|
// behavior. For plain errors (firstDeniedIndex = Infinity), the full
|
|
202
203
|
// chain is searched. See TIM-1358.
|
|
203
204
|
const errorMaxIndex = firstDeniedIndex < Infinity ? firstDeniedIndex : undefined;
|
|
204
|
-
const
|
|
205
|
+
const load = (file: ManifestLoader) => loadFallbackModule(file, req, segments);
|
|
206
|
+
const resolution = await resolveErrorFile(status, segments, load, errorMaxIndex);
|
|
205
207
|
|
|
206
208
|
// Tier 2: No segment-level error file — try global-error.tsx
|
|
207
209
|
if (!resolution && globalError) {
|
|
@@ -265,7 +267,9 @@ async function renderErrorPageViaRsc(
|
|
|
265
267
|
const url = new URL(req.url);
|
|
266
268
|
|
|
267
269
|
const serializedError = toSerializableError(error);
|
|
268
|
-
|
|
270
|
+
// The ID the server logged this error with, when it crossed Flight — a
|
|
271
|
+
// shell crash SSR relays here. A pipeline error has none.
|
|
272
|
+
const digest = errorDigestId(error);
|
|
269
273
|
|
|
270
274
|
let element: React.ReactElement = h(ErrorReconstituter, {
|
|
271
275
|
error: serializedError,
|
|
@@ -288,22 +292,16 @@ async function renderErrorPageViaRsc(
|
|
|
288
292
|
const rscStream = renderToReadableStream(withPublishedParams(element), {
|
|
289
293
|
signal: req.signal,
|
|
290
294
|
onError(err: unknown) {
|
|
291
|
-
|
|
295
|
+
reportRenderError(err, req, { segments: match.segments });
|
|
292
296
|
},
|
|
293
297
|
});
|
|
294
298
|
|
|
295
299
|
const [ssrStream, inlineStream] = teeWithErrorPropagation(rscStream);
|
|
296
300
|
|
|
297
|
-
// Params ride the payload root, beside the tree, so there is no
|
|
298
|
-
// bootstrap script. Read here for the SSR-side ALS context below.
|
|
299
|
-
const slotParams = getSlotParamsForClient();
|
|
300
|
-
|
|
301
301
|
const nonce = getCspNonce();
|
|
302
302
|
const navContext: NavContext = {
|
|
303
303
|
pathname: url.pathname,
|
|
304
304
|
search: appVisibleSearch(url).search,
|
|
305
|
-
segmentParams: match.segmentParams,
|
|
306
|
-
slotParams,
|
|
307
305
|
statusCode: status,
|
|
308
306
|
responseHeaders,
|
|
309
307
|
headHtml: flightInitScript(nonce),
|
|
@@ -317,7 +315,7 @@ async function renderErrorPageViaRsc(
|
|
|
317
315
|
// `await` inside the try on purpose: SSR of the error page fails
|
|
318
316
|
// asynchronously far more often than synchronously, and returning the
|
|
319
317
|
// promise bare let every such rejection escape this guard.
|
|
320
|
-
return await callSsr(ssrStream, navContext);
|
|
318
|
+
return (await callSsr(ssrStream, navContext)).response;
|
|
321
319
|
} catch (renderError) {
|
|
322
320
|
// The error page itself failed to render — guards against recursive
|
|
323
321
|
// errors in user error page code. Terminates in the framework default
|
|
@@ -344,10 +342,10 @@ async function renderGlobalErrorPage(
|
|
|
344
342
|
responseHeaders: Headers,
|
|
345
343
|
clientBootstrap: ClientBootstrapConfig
|
|
346
344
|
): Promise<Response> {
|
|
347
|
-
//
|
|
348
|
-
// not a usable Tier 2 match — fall through to the framework default
|
|
349
|
-
// rather than a blank body. See TIM-584, TIM-1258.
|
|
350
|
-
const mod = await
|
|
345
|
+
// If global-error.tsx fails to load (reported) or exports no component, it
|
|
346
|
+
// is not a usable Tier 2 match — fall through to the framework default
|
|
347
|
+
// page rather than a blank body. See TIM-584, TIM-1258.
|
|
348
|
+
const mod = await loadFallbackModule(globalError, req, match.segments);
|
|
351
349
|
if (!mod?.default) {
|
|
352
350
|
return defaultStatusPageResponse(status, responseHeaders);
|
|
353
351
|
}
|
|
@@ -365,53 +363,3 @@ async function renderGlobalErrorPage(
|
|
|
365
363
|
clientBootstrap
|
|
366
364
|
);
|
|
367
365
|
}
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Render a 404 page for URLs that don't match any route.
|
|
371
|
-
*
|
|
372
|
-
* Uses the root segment's 404.tsx (or 4xx.tsx / error.tsx fallback)
|
|
373
|
-
* wrapped in the root layout, via the same renderDenyPage path
|
|
374
|
-
* used for in-route deny() calls.
|
|
375
|
-
*/
|
|
376
|
-
export async function renderNoMatchPage(
|
|
377
|
-
req: Request,
|
|
378
|
-
rootSegment: ManifestSegmentNode,
|
|
379
|
-
responseHeaders: Headers,
|
|
380
|
-
clientBootstrap: ClientBootstrapConfig,
|
|
381
|
-
defaultPage?: DefaultPageRenderer
|
|
382
|
-
): Promise<Response> {
|
|
383
|
-
const segments = [rootSegment];
|
|
384
|
-
|
|
385
|
-
// Load root layout if present. A layout that fails to import or evaluate
|
|
386
|
-
// must not take the 404 down with it — render the status page unwrapped,
|
|
387
|
-
// as renderFallbackError does for the same reason.
|
|
388
|
-
const layoutComponents: LayoutEntry[] = [];
|
|
389
|
-
if (rootSegment.layout) {
|
|
390
|
-
const mod = await loadModule(rootSegment.layout).catch(() => null);
|
|
391
|
-
if (mod?.default) {
|
|
392
|
-
layoutComponents.push({
|
|
393
|
-
component: mod.default as (...args: unknown[]) => unknown,
|
|
394
|
-
segment: rootSegment,
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
const deny = new DenySignal(404);
|
|
400
|
-
const match: RouteMatch = { segments, segmentParams: {}, middlewareChain: [] };
|
|
401
|
-
|
|
402
|
-
if (isRscRequest(req)) {
|
|
403
|
-
return renderDenyPageAsRsc(deny, segments, layoutComponents, req, responseHeaders);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
return renderDenyPage(
|
|
407
|
-
deny,
|
|
408
|
-
segments,
|
|
409
|
-
layoutComponents,
|
|
410
|
-
req,
|
|
411
|
-
match,
|
|
412
|
-
responseHeaders,
|
|
413
|
-
clientBootstrap,
|
|
414
|
-
callSsr,
|
|
415
|
-
defaultPage
|
|
416
|
-
);
|
|
417
|
-
}
|
|
@@ -106,10 +106,8 @@ export function buildSegmentInfo(
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
// Re-export consolidated helpers from their single source of truth.
|
|
109
|
-
// Callers within rsc-entry/ import from this file; the
|
|
110
|
-
//
|
|
111
|
-
// (isAbortError). See TIM-1071 item 1.
|
|
112
|
-
export { buildRedirectResponse } from '../pipeline-helpers.ts';
|
|
109
|
+
// Callers within rsc-entry/ import from this file; the implementation
|
|
110
|
+
// lives in render-utils.ts. See TIM-1071 item 1.
|
|
113
111
|
export { isAbortError } from '../render-utils.ts';
|
|
114
112
|
|
|
115
113
|
// escapeHtml is now imported from server/utils/escape-html.ts
|
|
@@ -40,6 +40,7 @@ import globalSchemaCodecs from 'virtual:timber-schema';
|
|
|
40
40
|
|
|
41
41
|
import { wrapPipelineWithActionDispatch, buildActionDispatcher } from './wrap-action-dispatch.ts';
|
|
42
42
|
import type { BodyLimitsConfig } from '../body-limits.ts';
|
|
43
|
+
import type { DevHooks } from '../../dev-tools/dev-page-shell.ts';
|
|
43
44
|
import type { BuildManifest } from '../build-manifest.ts';
|
|
44
45
|
import { resolveLogMode } from '../../dev-tools/logger.ts';
|
|
45
46
|
import { sendEarlyHints103 } from '../early-hints-sender.ts';
|
|
@@ -56,13 +57,13 @@ import { createRevalidateRendererFactory } from './revalidate-renderer.ts';
|
|
|
56
57
|
import { renderFallbackError as renderFallback } from '../fallback-error.ts';
|
|
57
58
|
import { loadInstrumentation } from '../instrumentation.ts';
|
|
58
59
|
import { createDenyFallbackRenderer } from './deny-fallback.ts';
|
|
59
|
-
import {
|
|
60
|
+
import { DenySignal } from '../primitives.ts';
|
|
60
61
|
import { renderRoute } from './render-route.ts';
|
|
61
62
|
import { isDebug, isDevMode, setDebugFromConfig } from '../debug.ts';
|
|
62
|
-
import { setSourceMapCallback } from '../dev-source-map.ts';
|
|
63
63
|
import { capturePrebuiltPayloads } from '../prebuilt-builder.ts';
|
|
64
64
|
import { setPrebuiltPayloadSource } from '../prebuilt/payload-source.ts';
|
|
65
65
|
import { setRscFunctions, setComponentRefreshTimeout } from '../prebuilt-runtime.ts';
|
|
66
|
+
import { installReactCacheBridge } from '../react-cache-bridge.ts';
|
|
66
67
|
import { setKeyDisciplineStrict } from '../prebuilt/key-discipline.ts';
|
|
67
68
|
import { createAutoSitemapHandler } from '../sitemap-handler.ts';
|
|
68
69
|
import { generateStaticSite } from '../static-generator.ts';
|
|
@@ -82,18 +83,16 @@ function resolveServerTimingMode(
|
|
|
82
83
|
return 'total';
|
|
83
84
|
}
|
|
84
85
|
|
|
86
|
+
/** The dev server's hooks. Empty in production. */
|
|
87
|
+
let devHooks: DevHooks = {};
|
|
88
|
+
|
|
85
89
|
/**
|
|
86
|
-
* Set the dev
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* module graph source-mapping into the error rendering pipeline. Errors
|
|
90
|
-
* rendered by renderErrorPage / renderFallbackError will have their
|
|
91
|
-
* stack traces rewritten to show original source positions.
|
|
92
|
-
*
|
|
93
|
-
* No-op in production.
|
|
90
|
+
* Set the dev hooks. Called by the dev server after it imports this module;
|
|
91
|
+
* the handler reads them at request time, so a later call takes effect on
|
|
92
|
+
* the next request.
|
|
94
93
|
*/
|
|
95
|
-
export function
|
|
96
|
-
|
|
94
|
+
export function setDevHooks(hooks: DevHooks): void {
|
|
95
|
+
devHooks = hooks;
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
/**
|
|
@@ -103,12 +102,11 @@ export function setDevSourceMapHandler(handler: (error: Error) => void): void {
|
|
|
103
102
|
* 103 Early Hints → middleware.ts → render (RSC → SSR → HTML).
|
|
104
103
|
*/
|
|
105
104
|
async function createRequestHandler(manifest: typeof routeManifest, runtimeConfig: typeof config) {
|
|
106
|
-
// Initialize deployment ID for version skew detection (TIM-446).
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
| undefined;
|
|
105
|
+
// Initialize deployment ID for version skew detection (TIM-446). It is
|
|
106
|
+
// serialized into virtual:timber-config at build time — the same value the
|
|
107
|
+
// browser entry sends back — and is null in dev, where skew checks are
|
|
108
|
+
// skipped.
|
|
109
|
+
const deploymentId = (runtimeConfig as Record<string, unknown>).deploymentId as string | null;
|
|
112
110
|
if (deploymentId) {
|
|
113
111
|
const { setDeploymentId } = await import('../version-skew.ts');
|
|
114
112
|
setDeploymentId(deploymentId);
|
|
@@ -181,6 +179,19 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
181
179
|
renderToReadableStream: rscMod.renderToReadableStream,
|
|
182
180
|
});
|
|
183
181
|
|
|
182
|
+
// One React.cache scope per request, shared by proxy.ts, middleware.ts,
|
|
183
|
+
// route handlers, and the render (TIM-1529). Flight installs its
|
|
184
|
+
// dispatcher lazily, so the warm-up constructs one throwaway render.
|
|
185
|
+
const bridge = installReactCacheBridge(() => {
|
|
186
|
+
rscMod.renderToReadableStream(null, { onError() {} }).cancel();
|
|
187
|
+
});
|
|
188
|
+
if (!bridge.installed) {
|
|
189
|
+
console.warn(
|
|
190
|
+
`[timber] React.cache bridge not installed (${bridge.reason}) — React.cache ` +
|
|
191
|
+
`will not dedupe between middleware.ts and the render.`
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
184
195
|
const matchRoute = createRouteMatcher(manifest);
|
|
185
196
|
const matchMetadataRoute = createMetadataRouteMatcher(manifest);
|
|
186
197
|
|
|
@@ -196,7 +207,10 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
196
207
|
((runtimeConfig as Record<string, unknown>).clientSegmentCache as boolean) ?? false;
|
|
197
208
|
const clientBootstrap = buildClientScripts({
|
|
198
209
|
...runtimeConfig,
|
|
199
|
-
clientJavascript: clientJsConfig ?? {
|
|
210
|
+
clientJavascript: clientJsConfig ?? {
|
|
211
|
+
disabled: false,
|
|
212
|
+
enableHMRInDev: false,
|
|
213
|
+
},
|
|
200
214
|
devBrowserLogs: (runtimeConfig as Record<string, unknown>).devBrowserLogs as string | undefined,
|
|
201
215
|
buildManifest: buildManifest as BuildManifest,
|
|
202
216
|
});
|
|
@@ -213,7 +227,9 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
213
227
|
// `timber.config.ts` without needing to plumb config through each action.
|
|
214
228
|
// See TIM-816 and design/08-forms-and-actions.md §"Validation errors".
|
|
215
229
|
const formsConfig = (runtimeConfig as Record<string, unknown>).forms as
|
|
216
|
-
| {
|
|
230
|
+
| {
|
|
231
|
+
stripSensitiveFields?: import('../sensitive-fields.ts').SensitiveFieldsOption;
|
|
232
|
+
}
|
|
217
233
|
| undefined;
|
|
218
234
|
if (formsConfig) {
|
|
219
235
|
const { setGlobalSensitiveFieldsConfig } = await import('../sensitive-fields.ts');
|
|
@@ -241,10 +257,6 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
241
257
|
const devLogMode = resolveLogMode();
|
|
242
258
|
if (devLogMode !== 'quiet') {
|
|
243
259
|
await initDevTracing({ mode: devLogMode, slowPhaseMs });
|
|
244
|
-
// Patch globalThis.fetch to create OTEL spans for fetch calls.
|
|
245
|
-
// Spans appear as children of the active component span in the dev log tree.
|
|
246
|
-
const { instrumentDevFetch } = await import('../../dev-tools/instrumentation.ts');
|
|
247
|
-
instrumentDevFetch();
|
|
248
260
|
}
|
|
249
261
|
}
|
|
250
262
|
|
|
@@ -257,6 +269,14 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
257
269
|
? { kind: 'lazy', loader: manifest.proxy.load }
|
|
258
270
|
: undefined;
|
|
259
271
|
|
|
272
|
+
// The one assembler of deny pages: signals that escape a phase, the
|
|
273
|
+
// no-match 404, and the missing-page 404. See deny-fallback.ts,
|
|
274
|
+
// design/04-authorization.md, design/10-error-handling.md.
|
|
275
|
+
const renderDenyFallback = createDenyFallbackRenderer({
|
|
276
|
+
rootSegment: manifest.root,
|
|
277
|
+
clientBootstrap,
|
|
278
|
+
});
|
|
279
|
+
|
|
260
280
|
const pipelineConfig: PipelineConfig = {
|
|
261
281
|
proxy: proxyConfig,
|
|
262
282
|
matchRoute,
|
|
@@ -280,7 +300,6 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
280
300
|
req: Request,
|
|
281
301
|
match: RouteMatch,
|
|
282
302
|
responseHeaders: Headers,
|
|
283
|
-
_requestHeaderOverlay: Headers,
|
|
284
303
|
interception?: InterceptionContext
|
|
285
304
|
) => {
|
|
286
305
|
return renderRoute(
|
|
@@ -291,7 +310,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
291
310
|
clientBootstrap,
|
|
292
311
|
clientJsDisabled,
|
|
293
312
|
clientSegmentCache,
|
|
294
|
-
|
|
313
|
+
renderDenyFallback,
|
|
295
314
|
buildManifest: typedBuildManifest,
|
|
296
315
|
globalError: manifest.globalError,
|
|
297
316
|
},
|
|
@@ -321,9 +340,9 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
321
340
|
? (_status: number, headers: Headers) => {
|
|
322
341
|
const routes = devPage.collectRoutes(manifest.root);
|
|
323
342
|
const pathname = new URL(req.url).pathname;
|
|
324
|
-
//
|
|
325
|
-
//
|
|
326
|
-
const html = devPage.generateDev404Page(pathname, routes,
|
|
343
|
+
// Read at request time: the dev server sets the hooks after
|
|
344
|
+
// this module is imported.
|
|
345
|
+
const html = devPage.generateDev404Page(pathname, routes, devHooks.hmrOptions);
|
|
327
346
|
return new Response(html, {
|
|
328
347
|
status: 404,
|
|
329
348
|
headers: {
|
|
@@ -334,7 +353,8 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
334
353
|
}
|
|
335
354
|
: undefined;
|
|
336
355
|
|
|
337
|
-
|
|
356
|
+
// With no match, the fallback renders the root chain's 404 page.
|
|
357
|
+
return renderDenyFallback(new DenySignal(404), req, responseHeaders, undefined, defaultPage);
|
|
338
358
|
},
|
|
339
359
|
interceptionRewrites: manifest.interceptionRewrites,
|
|
340
360
|
matchInterceptedRoute: createInterceptedRouteMatcher(manifest.root),
|
|
@@ -343,18 +363,15 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
343
363
|
slowRequestMs: (runtimeConfig as Record<string, unknown>).slowRequestMs as number | undefined,
|
|
344
364
|
serverTiming: resolveServerTimingMode(runtimeConfig, isDev),
|
|
345
365
|
onPipelineError: isDev
|
|
346
|
-
? (error: Error, phase: string) =>
|
|
347
|
-
if (pipelineConfig.devPipelineErrorHandler) {
|
|
348
|
-
pipelineConfig.devPipelineErrorHandler(error, phase);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
366
|
+
? (error: Error, phase: string) => devHooks.onPipelineError?.(error, phase)
|
|
351
367
|
: undefined,
|
|
352
368
|
|
|
353
|
-
renderFallbackError: (error, req, responseHeaders) =>
|
|
369
|
+
renderFallbackError: (error, req, responseHeaders, match) =>
|
|
354
370
|
renderFallback(
|
|
355
371
|
error,
|
|
356
372
|
req,
|
|
357
373
|
responseHeaders,
|
|
374
|
+
match,
|
|
358
375
|
isDev,
|
|
359
376
|
manifest.root,
|
|
360
377
|
clientBootstrap,
|
|
@@ -369,15 +386,12 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
369
386
|
isDev ? manifest.viteRoot : undefined,
|
|
370
387
|
// HMR options for the dev error page's auto-reload WebSocket —
|
|
371
388
|
// set by the dev server after import, read at request time.
|
|
372
|
-
isDev ?
|
|
389
|
+
isDev ? devHooks.hmrOptions : undefined
|
|
373
390
|
),
|
|
374
391
|
// Deny fallback — renders the deny page (403.tsx, 404.tsx, etc.) for
|
|
375
392
|
// DenySignals that escape from middleware or the render phase.
|
|
376
393
|
// See deny-fallback.ts, design/04-authorization.md, design/10-error-handling.md.
|
|
377
|
-
renderDenyFallback
|
|
378
|
-
rootSegment: manifest.root,
|
|
379
|
-
clientBootstrap,
|
|
380
|
-
}),
|
|
394
|
+
renderDenyFallback,
|
|
381
395
|
// Auto-generated sitemap handler — enabled when sitemap.enabled is true
|
|
382
396
|
// and no user-authored sitemap exists at the app root.
|
|
383
397
|
// See design/16-metadata.md §"Auto-generated Sitemap"
|
|
@@ -423,7 +437,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
423
437
|
csrfConfig,
|
|
424
438
|
});
|
|
425
439
|
|
|
426
|
-
return
|
|
440
|
+
return handler;
|
|
427
441
|
}
|
|
428
442
|
|
|
429
443
|
// Re-export for generated entry points (e.g., Nitro node-server/bun) to wrap
|
|
@@ -487,12 +501,13 @@ setGlobalSchemaCodecs(globalSchemaCodecs);
|
|
|
487
501
|
|
|
488
502
|
// Singleflight timeout protects against deadlocked cache calls — needed
|
|
489
503
|
// in both capture mode (components may call timber.cache) and normal mode.
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
504
|
+
// Always wired: an unbounded singleflight deadlocks a key forever
|
|
505
|
+
// (TIM-1440). plugins/entries.ts resolves the value (0 → ceiling) before
|
|
506
|
+
// it reaches the runtime config.
|
|
507
|
+
const renderTimeoutMs = (config as Record<string, unknown>).renderTimeoutMs as number;
|
|
508
|
+
const { setDefaultSingleflightTimeout } = await import('../../cache/timber-cache.ts');
|
|
509
|
+
setDefaultSingleflightTimeout(renderTimeoutMs);
|
|
510
|
+
setComponentRefreshTimeout(renderTimeoutMs);
|
|
496
511
|
|
|
497
512
|
const cacheConfig = (config as Record<string, unknown>).cache as
|
|
498
513
|
| { strictKeyDiscipline?: boolean }
|
|
@@ -519,18 +534,9 @@ if (userCacheHandler) {
|
|
|
519
534
|
const isCaptureMode = !!(globalThis as Record<string, unknown>).__TIMBER_CAPTURE_MODE__;
|
|
520
535
|
|
|
521
536
|
let _handler: ((req: Request) => Promise<Response>) | undefined;
|
|
522
|
-
let _pipelineConfig: PipelineConfig | undefined;
|
|
523
537
|
|
|
524
538
|
if (!isCaptureMode) {
|
|
525
|
-
|
|
526
|
-
_handler = result.handler;
|
|
527
|
-
_pipelineConfig = result.pipelineConfig;
|
|
539
|
+
_handler = await createRequestHandler(routeManifest, config);
|
|
528
540
|
}
|
|
529
541
|
|
|
530
|
-
/**
|
|
531
|
-
* The pipeline configuration object. Exported so the dev server can set
|
|
532
|
-
* `devPipelineErrorHandler` after import without a module-level singleton.
|
|
533
|
-
*/
|
|
534
|
-
export const pipelineConfig = _pipelineConfig!;
|
|
535
|
-
|
|
536
542
|
export default _handler!;
|