@timber-js/app 0.2.0-alpha.208 → 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-BrHmG-2X.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-CNbpUOPB.js → status-page-marker-gaihi0KZ.js} +53 -20
- 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 +12 -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 +68 -104
- package/dist/client/internal.js.map +1 -1
- package/dist/client/navigation-commit.d.ts +16 -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 +1 -6
- 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/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 +531 -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/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 +5 -1
- 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 +18 -21
- package/src/client/index.ts +0 -1
- package/src/client/internal.ts +2 -7
- package/src/client/navigation-commit.ts +35 -18
- package/src/client/navigation-context.ts +3 -39
- package/src/client/react-root.ts +3 -2
- package/src/client/router-pipeline.ts +65 -128
- package/src/client/router-types.ts +46 -44
- package/src/client/router-url.ts +32 -0
- package/src/client/router.ts +43 -22
- package/src/client/rsc-fetch.ts +117 -155
- 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 +24 -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/{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-BrHmG-2X.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-CNbpUOPB.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
|
@@ -42,33 +42,26 @@
|
|
|
42
42
|
* → skip that entry, warn, keep building.
|
|
43
43
|
*/
|
|
44
44
|
|
|
45
|
-
import { createElement } from 'react';
|
|
46
|
-
|
|
47
|
-
import { requestContextAls } from './als-registry.ts';
|
|
48
45
|
import type { CoercedParams } from '../shared/param-value.ts';
|
|
49
46
|
import { ParamCoercionError } from './param-coercion.ts';
|
|
50
|
-
import { SlotOutlet } from '../client/slot-outlet.tsx';
|
|
51
47
|
import { coerceSegmentParams } from './param-coercion.ts';
|
|
52
|
-
import { isDenySignal, isRedirectSignal } from './
|
|
53
|
-
import {
|
|
54
|
-
beginCapture,
|
|
55
|
-
endCapture,
|
|
56
|
-
PrebuiltCaptureCycleError,
|
|
57
|
-
type NestedWrapperRender,
|
|
58
|
-
} from './prebuilt/capture-state.ts';
|
|
48
|
+
import { isDenySignal, isRedirectSignal } from './signal-identity.ts';
|
|
59
49
|
import { computeComponentCacheKey } from './prebuilt/cache-key.ts';
|
|
60
|
-
import {
|
|
61
|
-
import { BuildTimeContextError, createBuildTimeStore } from './prebuilt/synthetic-store.ts';
|
|
50
|
+
import { bytesToStream, renderEntry } from './prebuilt/capture-render.ts';
|
|
62
51
|
import {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
type
|
|
66
|
-
} from './prebuilt-
|
|
52
|
+
collectCandidateRoutes,
|
|
53
|
+
enumerateCombos,
|
|
54
|
+
type ParamCombo,
|
|
55
|
+
} from './prebuilt/capture-routes.ts';
|
|
56
|
+
import { warnNestingClamps } from './prebuilt/lifetime.ts';
|
|
57
|
+
import { BuildTimeContextError } from './prebuilt/synthetic-store.ts';
|
|
58
|
+
import { getPrebuiltRegistration } from './prebuilt-runtime.ts';
|
|
67
59
|
import { createRouteMatcher } from './route-matcher.ts';
|
|
68
|
-
import type {
|
|
69
|
-
import { createFromReadableStream
|
|
60
|
+
import type { ManifestRoot } from './route-matcher.ts';
|
|
61
|
+
import { createFromReadableStream } from '../rsc-runtime/rsc.ts';
|
|
70
62
|
import { loadModule } from './safe-load.ts';
|
|
71
|
-
import {
|
|
63
|
+
import { resolvePathWithParams } from './sitemap-generator.ts';
|
|
64
|
+
import { resolveRenderTimeoutMs } from './render-timeout.ts';
|
|
72
65
|
|
|
73
66
|
// ─── Types ────────────────────────────────────────────────────────────────
|
|
74
67
|
|
|
@@ -146,66 +139,6 @@ export interface CaptureOptions {
|
|
|
146
139
|
log?: (message: string) => void;
|
|
147
140
|
}
|
|
148
141
|
|
|
149
|
-
const DEFAULT_RENDER_TIMEOUT_MS = 30_000;
|
|
150
|
-
|
|
151
|
-
// ─── Route collection ─────────────────────────────────────────────────────
|
|
152
|
-
|
|
153
|
-
interface CandidateRoute {
|
|
154
|
-
urlPath: string;
|
|
155
|
-
page: ManifestFile;
|
|
156
|
-
/** Layout files along the chain that declare prebuilt components. */
|
|
157
|
-
layoutsToLoad: ManifestFile[];
|
|
158
|
-
/** Component IDs attributed to this route's page + layout chain. */
|
|
159
|
-
componentIds: string[];
|
|
160
|
-
/** Component IDs from layout files (receive SlotOutlet as children). */
|
|
161
|
-
layoutComponentIds: Set<string>;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Walk the manifest tree and collect pages whose file chain (page +
|
|
166
|
-
* layouts above it) has prebuilt components attributed to it. Slots and
|
|
167
|
-
* intercepting/private segments are not walked — slot-scoped prebuilt is
|
|
168
|
-
* already unkeyable at request time when slot params diverge (see
|
|
169
|
-
* resolveKeyParams in prebuilt-runtime.ts), so the build doesn't model
|
|
170
|
-
* slots either.
|
|
171
|
-
*/
|
|
172
|
-
function collectCandidateRoutes(
|
|
173
|
-
root: ManifestSegmentNode,
|
|
174
|
-
fileComponentMap: Record<string, string[]>
|
|
175
|
-
): CandidateRoute[] {
|
|
176
|
-
const routes: CandidateRoute[] = [];
|
|
177
|
-
|
|
178
|
-
const walk = (node: ManifestSegmentNode, layoutChain: ManifestFile[]) => {
|
|
179
|
-
if (node.segmentType === 'intercepting' || node.segmentType === 'private') return;
|
|
180
|
-
const chain = node.layout ? [...layoutChain, node.layout] : layoutChain;
|
|
181
|
-
|
|
182
|
-
if (node.page) {
|
|
183
|
-
const componentIds = new Set<string>();
|
|
184
|
-
const layoutIds = new Set<string>();
|
|
185
|
-
for (const f of chain)
|
|
186
|
-
for (const id of fileComponentMap[f.filePath] ?? []) {
|
|
187
|
-
componentIds.add(id);
|
|
188
|
-
layoutIds.add(id);
|
|
189
|
-
}
|
|
190
|
-
for (const id of fileComponentMap[node.page.filePath] ?? []) componentIds.add(id);
|
|
191
|
-
if (componentIds.size > 0) {
|
|
192
|
-
routes.push({
|
|
193
|
-
urlPath: node.urlPath,
|
|
194
|
-
page: node.page,
|
|
195
|
-
layoutsToLoad: chain.filter((l) => (fileComponentMap[l.filePath] ?? []).length > 0),
|
|
196
|
-
componentIds: Array.from(componentIds),
|
|
197
|
-
layoutComponentIds: layoutIds,
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
for (const child of node.children) walk(child, chain);
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
walk(root, []);
|
|
206
|
-
return routes;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
142
|
// ─── Lazy chunk loading ───────────────────────────────────────────────────
|
|
210
143
|
|
|
211
144
|
/**
|
|
@@ -218,181 +151,6 @@ async function loadLazyChunk(chunkFile: string): Promise<void> {
|
|
|
218
151
|
await import(/* @vite-ignore */ url);
|
|
219
152
|
}
|
|
220
153
|
|
|
221
|
-
// ─── Param enumeration ────────────────────────────────────────────────────
|
|
222
|
-
|
|
223
|
-
type ParamCombo = CoercedParams;
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Resolve the param combos to capture for a route. Static routes have
|
|
227
|
-
* exactly one combo (the empty record) — `export const prerender`-style
|
|
228
|
-
* components on static pages need no enumerator. Dynamic routes require
|
|
229
|
-
* `generateStaticSegmentParams` (design/44 §generateStaticSegmentParams);
|
|
230
|
-
* without it every request renders live and the wrapper is a no-op.
|
|
231
|
-
*/
|
|
232
|
-
async function enumerateCombos(
|
|
233
|
-
route: CandidateRoute,
|
|
234
|
-
pageModule: Record<string, unknown>,
|
|
235
|
-
log: (message: string) => void
|
|
236
|
-
): Promise<ParamCombo[] | null> {
|
|
237
|
-
if (!hasDynamicSegments(route.urlPath)) return [{}];
|
|
238
|
-
|
|
239
|
-
const generateFn = pageModule.generateStaticSegmentParams;
|
|
240
|
-
if (typeof generateFn !== 'function') {
|
|
241
|
-
log(
|
|
242
|
-
`[timber] cache.component: route ${route.urlPath} has prebuilt components but no ` +
|
|
243
|
-
`generateStaticSegmentParams export — all its entries will render dynamically ` +
|
|
244
|
-
`until the page declares its param combos`
|
|
245
|
-
);
|
|
246
|
-
return null;
|
|
247
|
-
}
|
|
248
|
-
const combos: unknown = await (generateFn as () => unknown)();
|
|
249
|
-
if (!Array.isArray(combos)) {
|
|
250
|
-
throw new Error(
|
|
251
|
-
`generateStaticSegmentParams must return an array of param records, got ${typeof combos}`
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
|
-
return combos as ParamCombo[];
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// ─── Rendering ────────────────────────────────────────────────────────────
|
|
258
|
-
|
|
259
|
-
function concatChunks(chunks: Uint8Array[]): Uint8Array {
|
|
260
|
-
let total = 0;
|
|
261
|
-
for (const c of chunks) total += c.byteLength;
|
|
262
|
-
const out = new Uint8Array(total);
|
|
263
|
-
let off = 0;
|
|
264
|
-
for (const c of chunks) {
|
|
265
|
-
out.set(c, off);
|
|
266
|
-
off += c.byteLength;
|
|
267
|
-
}
|
|
268
|
-
return out;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Drain a flight stream to completion under a deadline. On timeout the
|
|
273
|
-
* reader is cancelled (never abandoned mid-read — design/13 A2/A3) and
|
|
274
|
-
* the entry fails.
|
|
275
|
-
*/
|
|
276
|
-
async function drainWithTimeout(
|
|
277
|
-
stream: ReadableStream<Uint8Array>,
|
|
278
|
-
timeoutMs: number
|
|
279
|
-
): Promise<Uint8Array> {
|
|
280
|
-
const reader = stream.getReader();
|
|
281
|
-
const chunks: Uint8Array[] = [];
|
|
282
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
283
|
-
let timedOut = false;
|
|
284
|
-
const deadline = new Promise<never>((_, reject) => {
|
|
285
|
-
timer = setTimeout(() => {
|
|
286
|
-
timedOut = true;
|
|
287
|
-
reject(new Error(`render did not complete within ${timeoutMs}ms`));
|
|
288
|
-
}, timeoutMs);
|
|
289
|
-
});
|
|
290
|
-
try {
|
|
291
|
-
for (;;) {
|
|
292
|
-
const { done, value } = await Promise.race([reader.read(), deadline]);
|
|
293
|
-
if (done) break;
|
|
294
|
-
chunks.push(value as Uint8Array);
|
|
295
|
-
}
|
|
296
|
-
} finally {
|
|
297
|
-
clearTimeout(timer);
|
|
298
|
-
if (timedOut) await reader.cancel().catch(() => {});
|
|
299
|
-
}
|
|
300
|
-
return concatChunks(chunks);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/** Wrap payload bytes as a single-chunk stream for the smoke revival. */
|
|
304
|
-
function bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {
|
|
305
|
-
return new ReadableStream({
|
|
306
|
-
start(c) {
|
|
307
|
-
c.enqueue(bytes);
|
|
308
|
-
c.close();
|
|
309
|
-
},
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* View of a registered component that satisfies createElement — same
|
|
315
|
-
* narrowing rationale as prebuilt-runtime.ts.
|
|
316
|
-
*/
|
|
317
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
318
|
-
type RenderableComponent = (props: any) => React.ReactNode;
|
|
319
|
-
|
|
320
|
-
interface EntryOutcome {
|
|
321
|
-
bytes: Uint8Array | null;
|
|
322
|
-
failure: unknown;
|
|
323
|
-
nested: NestedWrapperRender[];
|
|
324
|
-
resolvedTags: string[] | undefined;
|
|
325
|
-
segmentParamsRead: boolean;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Render one (component, props, coerced-params) entry in isolation and drain
|
|
330
|
-
* its flight payload. Any `onError` during serialization fails the entry —
|
|
331
|
-
* a payload with an embedded error row would replay that error on every
|
|
332
|
-
* future request, so only fully clean renders are captured.
|
|
333
|
-
*/
|
|
334
|
-
async function renderEntry(
|
|
335
|
-
registration: PrebuiltRegistration,
|
|
336
|
-
props: Record<string, unknown>,
|
|
337
|
-
coercedParams: CoercedParams,
|
|
338
|
-
timeoutMs: number,
|
|
339
|
-
isLayout: boolean
|
|
340
|
-
): Promise<EntryOutcome> {
|
|
341
|
-
const storeHandle = createBuildTimeStore(registration.id, coercedParams);
|
|
342
|
-
const { store, violations } = storeHandle;
|
|
343
|
-
let failure: unknown = null;
|
|
344
|
-
|
|
345
|
-
beginCapture(registration.id);
|
|
346
|
-
let bytes: Uint8Array | null = null;
|
|
347
|
-
let resolvedTags: string[] | undefined;
|
|
348
|
-
let nested: NestedWrapperRender[];
|
|
349
|
-
try {
|
|
350
|
-
// Render AND drain inside one ALS scope: flight executes components
|
|
351
|
-
// lazily as the stream is pulled, and each pull must still see the
|
|
352
|
-
// synthetic store (segmentParams.get() inside the component).
|
|
353
|
-
// Tag resolution also runs inside this scope so function-form tags
|
|
354
|
-
// that read segment params see the synthetic store (codex P2 on PR #858).
|
|
355
|
-
// Layout captures get <SlotOutlet slot="children" /> as children so
|
|
356
|
-
// the cached payload has a context-driven hole (design/45, TIM-1181).
|
|
357
|
-
const renderProps =
|
|
358
|
-
isLayout && !('children' in props)
|
|
359
|
-
? { ...props, children: createElement(SlotOutlet, { slot: LAYOUT_CHILDREN_SLOT }) }
|
|
360
|
-
: props;
|
|
361
|
-
bytes = await requestContextAls.run(store, async () => {
|
|
362
|
-
const stream = renderToReadableStream(
|
|
363
|
-
createElement(registration.component as RenderableComponent, renderProps),
|
|
364
|
-
{
|
|
365
|
-
onError(error: unknown) {
|
|
366
|
-
failure ??= error ?? new Error('unknown render error');
|
|
367
|
-
// Digest string keeps flight from warning about a missing
|
|
368
|
-
// digest; the payload is discarded because `failure` is set.
|
|
369
|
-
return 'timber-prebuilt-capture-error';
|
|
370
|
-
},
|
|
371
|
-
}
|
|
372
|
-
);
|
|
373
|
-
const drained = await drainWithTimeout(stream, timeoutMs);
|
|
374
|
-
resolvedTags = resolveCapturedTags(registration.options, props);
|
|
375
|
-
return drained;
|
|
376
|
-
});
|
|
377
|
-
} catch (error) {
|
|
378
|
-
// Sync component throw (renderToReadableStream creation), drain
|
|
379
|
-
// timeout, or stream error.
|
|
380
|
-
failure ??= error;
|
|
381
|
-
} finally {
|
|
382
|
-
nested = endCapture();
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Side-channel check FIRST: a component that touched per-request context
|
|
386
|
-
// is a hard error even when it caught the throw and rendered a fallback —
|
|
387
|
-
// accepting that payload would bake the request-dependent branch for
|
|
388
|
-
// every future request (codex P1 on PR #836).
|
|
389
|
-
const { segmentParamsRead } = storeHandle;
|
|
390
|
-
if (violations.length > 0)
|
|
391
|
-
return { bytes: null, failure: violations[0], nested, resolvedTags, segmentParamsRead };
|
|
392
|
-
if (failure !== null) return { bytes: null, failure, nested, resolvedTags, segmentParamsRead };
|
|
393
|
-
return { bytes, failure: null, nested, resolvedTags, segmentParamsRead };
|
|
394
|
-
}
|
|
395
|
-
|
|
396
154
|
/** Human-readable classification for a failed entry. */
|
|
397
155
|
function describeFailure(error: unknown): string {
|
|
398
156
|
if (isDenySignal(error)) return `component called deny(${error.status})`;
|
|
@@ -401,63 +159,8 @@ function describeFailure(error: unknown): string {
|
|
|
401
159
|
return String(error);
|
|
402
160
|
}
|
|
403
161
|
|
|
404
|
-
// ─── Nesting clamp warnings (design/45 §Nesting Semantics) ────────────────
|
|
405
|
-
|
|
406
|
-
/** Render a lifetime declaration for the clamp warning. */
|
|
407
|
-
function describeLifetime(options: PrebuiltComponentOptions): string {
|
|
408
|
-
const parts: string[] = [];
|
|
409
|
-
if (options.prerender) parts.push('prerender');
|
|
410
|
-
if (options.ttl !== undefined) parts.push(`ttl: ${options.ttl}`);
|
|
411
|
-
if (options.tags !== undefined) {
|
|
412
|
-
parts.push(
|
|
413
|
-
typeof options.tags === 'function' ? 'tags: fn' : `tags: ${JSON.stringify(options.tags)}`
|
|
414
|
-
);
|
|
415
|
-
}
|
|
416
|
-
return parts.join(', ') || 'no lifetime';
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Warn when an inner wrapped component declares a refresh channel the
|
|
421
|
-
* enclosing prerendered entry cannot honor. The outer here is always
|
|
422
|
-
* prerender-tier (that's all the build captures), whose effective
|
|
423
|
-
* lifetime is deploy-long with no tags — so ANY inner ttl/tags warns.
|
|
424
|
-
* Once per (outer, inner) pair per build.
|
|
425
|
-
*/
|
|
426
|
-
function warnNestingClamps(
|
|
427
|
-
outerId: string,
|
|
428
|
-
nested: NestedWrapperRender[],
|
|
429
|
-
warnedPairs: Set<string>,
|
|
430
|
-
log: (message: string) => void
|
|
431
|
-
): number {
|
|
432
|
-
let count = 0;
|
|
433
|
-
for (const { innerId, options } of nested) {
|
|
434
|
-
if (options.ttl === undefined && options.tags === undefined) continue;
|
|
435
|
-
const pairKey = `${outerId} ${innerId}`;
|
|
436
|
-
if (warnedPairs.has(pairKey)) continue;
|
|
437
|
-
warnedPairs.add(pairKey);
|
|
438
|
-
count++;
|
|
439
|
-
log(
|
|
440
|
-
`[timber] ${innerId} (${describeLifetime(options)}) is embedded in prerendered ` +
|
|
441
|
-
`${outerId} — the embedded copy refreshes only when ${outerId} does (on redeploy). ` +
|
|
442
|
-
`Runtime revalidation will NOT update the embedded copy; tag ${outerId} itself if ` +
|
|
443
|
-
`you need that. Chain: ${outerId} (prerender) → ${innerId} (${describeLifetime(options)})`
|
|
444
|
-
);
|
|
445
|
-
}
|
|
446
|
-
return count;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
162
|
// ─── Capture orchestration ────────────────────────────────────────────────
|
|
450
163
|
|
|
451
|
-
/** Resolve tags from callsite options — static arrays pass through, function tags are evaluated with the capture-time props. */
|
|
452
|
-
function resolveCapturedTags(
|
|
453
|
-
options: PrebuiltComponentOptions,
|
|
454
|
-
props: Record<string, unknown>
|
|
455
|
-
): string[] | undefined {
|
|
456
|
-
if (!options.tags) return undefined;
|
|
457
|
-
const resolved = typeof options.tags === 'function' ? options.tags(props) : options.tags;
|
|
458
|
-
return resolved.length > 0 ? resolved : undefined;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
164
|
/** Buffered entry pending the param-independence decision (TIM-1175). */
|
|
462
165
|
interface PendingEntry {
|
|
463
166
|
callSiteProps: Record<string, unknown>;
|
|
@@ -488,7 +191,7 @@ export async function capturePrebuiltPayloads(
|
|
|
488
191
|
options: CaptureOptions
|
|
489
192
|
): Promise<CaptureSummary> {
|
|
490
193
|
const log = options.log ?? ((message: string) => console.warn(message));
|
|
491
|
-
const timeoutMs = options.renderTimeoutMs
|
|
194
|
+
const timeoutMs = resolveRenderTimeoutMs(options.renderTimeoutMs);
|
|
492
195
|
const matchRoute = createRouteMatcher(manifest);
|
|
493
196
|
|
|
494
197
|
const summary: CaptureSummary = { captured: 0, skipped: [], hardErrors: [], nestingWarnings: 0 };
|
|
@@ -588,8 +291,9 @@ export async function capturePrebuiltPayloads(
|
|
|
588
291
|
});
|
|
589
292
|
continue;
|
|
590
293
|
}
|
|
294
|
+
let coercedParams: CoercedParams;
|
|
591
295
|
try {
|
|
592
|
-
await coerceSegmentParams(match);
|
|
296
|
+
coercedParams = await coerceSegmentParams(match);
|
|
593
297
|
} catch (error) {
|
|
594
298
|
skip({
|
|
595
299
|
componentId: route.componentIds[0],
|
|
@@ -602,7 +306,6 @@ export async function capturePrebuiltPayloads(
|
|
|
602
306
|
});
|
|
603
307
|
continue;
|
|
604
308
|
}
|
|
605
|
-
const coercedParams = match.segmentParams;
|
|
606
309
|
|
|
607
310
|
for (const componentId of route.componentIds) {
|
|
608
311
|
let registration = getPrebuiltRegistration(componentId);
|
|
@@ -709,13 +412,6 @@ export async function capturePrebuiltPayloads(
|
|
|
709
412
|
} else if (outcome.failure === null && !pending.anyParamRead) {
|
|
710
413
|
provenParamIndependent.add(proofKey);
|
|
711
414
|
}
|
|
712
|
-
summary.nestingWarnings += warnNestingClamps(
|
|
713
|
-
componentId,
|
|
714
|
-
outcome.nested,
|
|
715
|
-
warnedPairs,
|
|
716
|
-
log
|
|
717
|
-
);
|
|
718
|
-
|
|
719
415
|
if (outcome.failure !== null) {
|
|
720
416
|
const issue: CaptureIssue = {
|
|
721
417
|
componentId,
|
|
@@ -748,6 +444,20 @@ export async function capturePrebuiltPayloads(
|
|
|
748
444
|
continue;
|
|
749
445
|
}
|
|
750
446
|
|
|
447
|
+
// Clamp warnings for an accepted entry only: a skipped one stores
|
|
448
|
+
// nothing to clamp (and a failed render never resolved its tags),
|
|
449
|
+
// and must not spend the pair's one warning.
|
|
450
|
+
summary.nestingWarnings += warnNestingClamps(
|
|
451
|
+
{
|
|
452
|
+
id: componentId,
|
|
453
|
+
options: registration.options,
|
|
454
|
+
tags: outcome.resolvedTags ?? [],
|
|
455
|
+
},
|
|
456
|
+
outcome.nested,
|
|
457
|
+
warnedPairs,
|
|
458
|
+
log
|
|
459
|
+
);
|
|
460
|
+
|
|
751
461
|
// Once param-dependent is confirmed, emit directly instead of
|
|
752
462
|
// buffering — no need to hold bytes in memory (TIM-1179).
|
|
753
463
|
if (pending.anyParamRead) {
|