@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
package/src/dev-tools/overlay.ts
CHANGED
|
@@ -4,51 +4,15 @@
|
|
|
4
4
|
* Integrates with Vite's built-in error overlay (`server.hot.send`) rather
|
|
5
5
|
* than implementing a custom overlay.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* used because it hardcodes the SSR module graph, which doesn't contain
|
|
11
|
-
* source maps for RSC modules (separate Vite environment with its own
|
|
12
|
-
* module graph). This caused RSC errors to show transpiled line numbers
|
|
13
|
-
* instead of original source positions.
|
|
7
|
+
* Stacks are shown as they arrive: Vite's module runner already reports
|
|
8
|
+
* source positions for the code it runs, and a second mapping pass moves
|
|
9
|
+
* them (TIM-1555).
|
|
14
10
|
*
|
|
15
|
-
* Design doc: 21-dev-server.md §"Error Overlay"
|
|
11
|
+
* Design doc: 21-dev-server.md §"Error Overlay", §"RSC Source-Mapping"
|
|
16
12
|
*/
|
|
17
13
|
|
|
18
|
-
import type { ViteDevServer
|
|
19
|
-
import {
|
|
20
|
-
import { resolve, dirname } from 'node:path';
|
|
21
|
-
import { classifyFrame, type FrameType } from './stack-classifier.ts';
|
|
22
|
-
|
|
23
|
-
// ─── Trace Mapping (lazy-loaded) ─────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
interface TraceMappingModule {
|
|
26
|
-
TraceMap: new (map: unknown) => unknown;
|
|
27
|
-
originalPositionFor: (
|
|
28
|
-
map: unknown,
|
|
29
|
-
needle: { line: number; column: number }
|
|
30
|
-
) => { source: string | null; line: number | null; column: number | null };
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
let _traceMapping: TraceMappingModule | null = null;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Lazy-load @jridgewell/trace-mapping from Vite's dependency tree.
|
|
37
|
-
* Vite bundles it internally; we resolve from Vite's package to avoid
|
|
38
|
-
* adding a direct dependency.
|
|
39
|
-
*/
|
|
40
|
-
function getTraceMapping(): TraceMappingModule {
|
|
41
|
-
if (_traceMapping) return _traceMapping;
|
|
42
|
-
// Resolve from Vite's package location so we pick up its transitive
|
|
43
|
-
// @jridgewell/trace-mapping without declaring it as a direct dependency.
|
|
44
|
-
// createRequire(import.meta.url) gives us ESM-compatible require (TIM-796),
|
|
45
|
-
// then we hop to Vite's path to reach its dependency tree (TIM-804).
|
|
46
|
-
const esmRequire = createRequire(import.meta.url);
|
|
47
|
-
const vitePath = esmRequire.resolve('vite');
|
|
48
|
-
const viteRequire = createRequire(vitePath);
|
|
49
|
-
_traceMapping = viteRequire('@jridgewell/trace-mapping') as TraceMappingModule;
|
|
50
|
-
return _traceMapping;
|
|
51
|
-
}
|
|
14
|
+
import type { ViteDevServer } from 'vite';
|
|
15
|
+
import { classifyFrame } from './stack-classifier.ts';
|
|
52
16
|
|
|
53
17
|
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
54
18
|
|
|
@@ -164,200 +128,13 @@ export function classifyErrorPhase(error: Error, projectRoot: string): ErrorPhas
|
|
|
164
128
|
import { formatTerminalError as _formatTerminalError } from './terminal.ts';
|
|
165
129
|
export const formatTerminalError = _formatTerminalError;
|
|
166
130
|
|
|
167
|
-
// ─── Module Runner Offset ───────────────────────────────────────────────────
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Dynamically compute the line offset that Vite's module runner adds
|
|
171
|
-
* when wrapping modules in an async function.
|
|
172
|
-
*
|
|
173
|
-
* Vite's `calculateOffsetOnce()` uses the same technique: create a new
|
|
174
|
-
* AsyncFunction, throw from line 1, and check where the engine reports
|
|
175
|
-
* the error. The difference between the reported line and 1 is the offset.
|
|
176
|
-
*
|
|
177
|
-
* This is engine-dependent (currently 2 on Node 18-22) and could change
|
|
178
|
-
* in future Node.js or V8 versions. Computing it at runtime ensures we
|
|
179
|
-
* always match the actual behavior.
|
|
180
|
-
*/
|
|
181
|
-
let _cachedOffset: number | null = null;
|
|
182
|
-
|
|
183
|
-
export function calculateModuleRunnerOffset(): number {
|
|
184
|
-
if (_cachedOffset !== null) return _cachedOffset;
|
|
185
|
-
|
|
186
|
-
try {
|
|
187
|
-
// Parse the AsyncFunction source to count wrapper lines before the body.
|
|
188
|
-
// AsyncFunction.toString() returns something like:
|
|
189
|
-
// "async function anonymous(\n) {\nBODY\n}"
|
|
190
|
-
// The number of newlines before BODY is the offset Vite's module runner adds.
|
|
191
|
-
// eslint-disable-next-line no-new-func -- intentional: mirrors Vite's technique
|
|
192
|
-
const AsyncFunction = async function () {}.constructor as typeof Function;
|
|
193
|
-
const wrapper = new AsyncFunction('BODY');
|
|
194
|
-
const src = wrapper.toString();
|
|
195
|
-
const bodyIndex = src.indexOf('BODY');
|
|
196
|
-
if (bodyIndex === -1) {
|
|
197
|
-
_cachedOffset = 2; // fallback
|
|
198
|
-
return _cachedOffset;
|
|
199
|
-
}
|
|
200
|
-
const beforeBody = src.slice(0, bodyIndex);
|
|
201
|
-
const newlineCount = (beforeBody.match(/\n/g) || []).length;
|
|
202
|
-
_cachedOffset = newlineCount;
|
|
203
|
-
} catch (e) {
|
|
204
|
-
console.debug(
|
|
205
|
-
'[timber] overlay offset calculation failed:',
|
|
206
|
-
e instanceof Error ? e.message : e
|
|
207
|
-
);
|
|
208
|
-
_cachedOffset = 2; // fallback to known-good value
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return _cachedOffset;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// ─── Stack Trace Source-Mapping ──────────────────────────────────────────────
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Phases where the error originated in the RSC environment.
|
|
218
|
-
* These use `server.environments.rsc.moduleGraph` for source-mapping.
|
|
219
|
-
*/
|
|
220
|
-
const RSC_PHASES: ReadonlySet<ErrorPhase> = new Set(['render', 'access', 'middleware', 'handler']);
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Rewrite an error's stack trace using the correct Vite environment module graph.
|
|
224
|
-
*
|
|
225
|
-
* `server.ssrFixStacktrace()` hardcodes `server.environments.ssr.moduleGraph`,
|
|
226
|
-
* but RSC errors have stack frames pointing to modules loaded in the RSC
|
|
227
|
-
* environment — a separate Vite module graph with separate transform results
|
|
228
|
-
* and source maps. Using the SSR module graph silently fails to find the
|
|
229
|
-
* modules, leaving transpiled/bundled line numbers in the stack trace.
|
|
230
|
-
*
|
|
231
|
-
* This function picks the RSC module graph for render-phase errors and falls
|
|
232
|
-
* back to SSR for module-transform/proxy errors. If the first pass doesn't
|
|
233
|
-
* rewrite any frames (e.g., mixed RSC+SSR stack), it tries the other graph.
|
|
234
|
-
*/
|
|
235
|
-
function fixStacktraceForEnvironment(server: ViteDevServer, error: Error, phase: ErrorPhase): void {
|
|
236
|
-
if (!error.stack) return;
|
|
237
|
-
|
|
238
|
-
// Pick the primary environment based on error phase
|
|
239
|
-
const primaryEnvName = RSC_PHASES.has(phase) ? 'rsc' : 'ssr';
|
|
240
|
-
const fallbackEnvName = primaryEnvName === 'rsc' ? 'ssr' : 'rsc';
|
|
241
|
-
|
|
242
|
-
const primaryEnv = server.environments[primaryEnvName] as DevEnvironment | undefined;
|
|
243
|
-
const fallbackEnv = server.environments[fallbackEnvName] as DevEnvironment | undefined;
|
|
244
|
-
|
|
245
|
-
// Try primary environment first
|
|
246
|
-
if (primaryEnv?.moduleGraph) {
|
|
247
|
-
const rewritten = rewriteStacktrace(error.stack, primaryEnv.moduleGraph);
|
|
248
|
-
if (rewritten.changed) {
|
|
249
|
-
error.stack = rewritten.stack;
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Fall back to the other environment if primary didn't rewrite anything
|
|
255
|
-
if (fallbackEnv?.moduleGraph) {
|
|
256
|
-
const rewritten = rewriteStacktrace(error.stack, fallbackEnv.moduleGraph);
|
|
257
|
-
if (rewritten.changed) {
|
|
258
|
-
error.stack = rewritten.stack;
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Rewrite stack trace frames using source maps from an environment's module graph.
|
|
266
|
-
*
|
|
267
|
-
* Mirrors Vite's internal `ssrRewriteStacktrace` logic but works with any
|
|
268
|
-
* `EnvironmentModuleGraph`, not just the SSR one.
|
|
269
|
-
*
|
|
270
|
-
* Returns the rewritten stack and whether any frames were actually changed.
|
|
271
|
-
*/
|
|
272
|
-
function rewriteStacktrace(
|
|
273
|
-
stack: string,
|
|
274
|
-
moduleGraph: DevEnvironment['moduleGraph']
|
|
275
|
-
): { stack: string; changed: boolean } {
|
|
276
|
-
let changed = false;
|
|
277
|
-
|
|
278
|
-
const result = stack
|
|
279
|
-
.split('\n')
|
|
280
|
-
.map((line) => {
|
|
281
|
-
return line.replace(
|
|
282
|
-
/^ {4}at (?:(\S.*?)\s\()?(.+?):(\d+)(?::(\d+))?\)?/,
|
|
283
|
-
(input, varName, id, lineStr, colStr) => {
|
|
284
|
-
if (!id) return input;
|
|
285
|
-
|
|
286
|
-
const mod = moduleGraph.getModuleById(id);
|
|
287
|
-
const rawSourceMap = mod?.transformResult?.map;
|
|
288
|
-
if (!rawSourceMap) return input;
|
|
289
|
-
|
|
290
|
-
// Vite's module runner wraps each module in an async function,
|
|
291
|
-
// adding N lines before the module body. The offset is computed
|
|
292
|
-
// dynamically to match the actual engine behavior (see TIM-783).
|
|
293
|
-
const OFFSET = calculateModuleRunnerOffset();
|
|
294
|
-
const origLine = Number(lineStr) - OFFSET;
|
|
295
|
-
const origCol = Number(colStr) - 1;
|
|
296
|
-
if (origLine <= 0 || origCol < 0) return input;
|
|
297
|
-
|
|
298
|
-
// Use @jridgewell/trace-mapping resolved from Vite's dependency tree.
|
|
299
|
-
// Vite bundles it internally; we resolve from Vite's package location
|
|
300
|
-
// to avoid adding a direct dependency.
|
|
301
|
-
let pos: { source: string | null; line: number | null; column: number | null };
|
|
302
|
-
try {
|
|
303
|
-
const { TraceMap: TM, originalPositionFor: opf } = getTraceMapping();
|
|
304
|
-
const traced = new TM(rawSourceMap);
|
|
305
|
-
pos = opf(traced, { line: origLine, column: origCol });
|
|
306
|
-
} catch (e) {
|
|
307
|
-
console.debug(
|
|
308
|
-
'[timber] source map tracing failed:',
|
|
309
|
-
e instanceof Error ? e.message : e
|
|
310
|
-
);
|
|
311
|
-
return input;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
if (!pos.source || pos.line == null) return input;
|
|
315
|
-
|
|
316
|
-
changed = true;
|
|
317
|
-
const source = `${resolve(dirname(id), pos.source)}:${pos.line}:${(pos.column ?? 0) + 1}`;
|
|
318
|
-
const trimmedVarName = varName?.trim();
|
|
319
|
-
if (!trimmedVarName || trimmedVarName === 'eval') return ` at ${source}`;
|
|
320
|
-
return ` at ${trimmedVarName} (${source})`;
|
|
321
|
-
}
|
|
322
|
-
);
|
|
323
|
-
})
|
|
324
|
-
.join('\n');
|
|
325
|
-
|
|
326
|
-
return { stack: result, changed };
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// ─── Error Source-Mapping (exported for use by fallback-error.ts) ────────────
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Source-map an error's stack trace using the Vite dev server's module graph.
|
|
333
|
-
*
|
|
334
|
-
* Exported so that the fallback error renderer (fallback-error.ts) can
|
|
335
|
-
* source-map errors before rendering the dev error page. Without this,
|
|
336
|
-
* the dev error page shows transpiled positions (e.g. page.tsx:1:1 instead
|
|
337
|
-
* of page.tsx:4:9).
|
|
338
|
-
*
|
|
339
|
-
* See TIM-811.
|
|
340
|
-
*/
|
|
341
|
-
export function fixErrorStacktrace(server: ViteDevServer, error: Error, phase?: ErrorPhase): void {
|
|
342
|
-
fixStacktraceForEnvironment(
|
|
343
|
-
server,
|
|
344
|
-
error,
|
|
345
|
-
phase ?? classifyErrorPhase(error, server.config.root)
|
|
346
|
-
);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
131
|
// ─── Overlay Integration ────────────────────────────────────────────────────
|
|
350
132
|
|
|
351
133
|
/**
|
|
352
134
|
* Send an error to Vite's browser overlay and log it to stderr.
|
|
353
135
|
*
|
|
354
|
-
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* When `rscDebugComponents` is provided (dev mode only), the server
|
|
358
|
-
* component tree context is appended to the error message. This helps
|
|
359
|
-
* developers identify which server component caused the error without
|
|
360
|
-
* exposing source code.
|
|
136
|
+
* Reads `error` and never writes it: the pipeline may render the same object
|
|
137
|
+
* on the fallback error page after reporting it here.
|
|
361
138
|
*
|
|
362
139
|
* The dev server remains running — errors are handled, not fatal.
|
|
363
140
|
*/
|
|
@@ -367,13 +144,6 @@ export function sendErrorToOverlay(
|
|
|
367
144
|
phase: ErrorPhase,
|
|
368
145
|
projectRoot: string
|
|
369
146
|
): void {
|
|
370
|
-
// Fix stack trace to use source-mapped positions.
|
|
371
|
-
// Use the RSC environment's module graph for render/access/middleware errors
|
|
372
|
-
// (which originate in the RSC environment), and fall back to SSR for others.
|
|
373
|
-
// server.ssrFixStacktrace() is NOT used — it hardcodes the SSR module graph
|
|
374
|
-
// which doesn't contain source maps for RSC-loaded modules.
|
|
375
|
-
fixStacktraceForEnvironment(server, error, phase);
|
|
376
|
-
|
|
377
147
|
// Log to stderr with frame dimming
|
|
378
148
|
const formatted = formatTerminalError(error, phase, projectRoot);
|
|
379
149
|
process.stderr.write(`${formatted}\n`);
|
package/src/index.ts
CHANGED
|
@@ -37,7 +37,7 @@ import { timberRequestDep } from './plugins/request-dep/index.ts';
|
|
|
37
37
|
import { timberPrebuilt } from './plugins/prebuilt.ts';
|
|
38
38
|
import { timberPrerenderSugar } from './plugins/prerender-sugar.ts';
|
|
39
39
|
import { timberCloudflareWasm } from './plugins/cloudflare-wasm.ts';
|
|
40
|
-
import {
|
|
40
|
+
import { timberPostBuild } from './plugins/post-build.ts';
|
|
41
41
|
import { timberBuildReport } from './plugins/build-report.ts';
|
|
42
42
|
import { createNoopTimer } from './utils/startup-timer.ts';
|
|
43
43
|
import {
|
|
@@ -289,11 +289,11 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
289
289
|
// ── Resolve build output directory ─────────────────────────
|
|
290
290
|
// Priority: timber.config.ts `buildDir` > Vite `build.outDir` > .timber/dist
|
|
291
291
|
// Set Vite's build.outDir so the RSC plugin and all environment
|
|
292
|
-
// builds write to the correct location.
|
|
293
|
-
|
|
294
|
-
|
|
292
|
+
// builds write to the correct location. ctx.buildDir is read back
|
|
293
|
+
// from Vite in configResolved, so there is one answer to where the
|
|
294
|
+
// build went.
|
|
295
295
|
const resolvedRoot = resolve(userConfig.root ?? process.cwd());
|
|
296
|
-
|
|
296
|
+
const buildDir = resolveBuildDir(resolvedRoot, ctx.config.buildDir, userConfig.build?.outDir);
|
|
297
297
|
|
|
298
298
|
// Warn if the Vite root differs from cwd and the re-loaded config
|
|
299
299
|
// has reactCompiler but the early cwd-based load missed it. In this
|
|
@@ -386,9 +386,9 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
386
386
|
resolvedDevPortExplicit = start.explicit;
|
|
387
387
|
}
|
|
388
388
|
|
|
389
|
-
// Derive relative buildOutDir from the absolute
|
|
389
|
+
// Derive relative buildOutDir from the absolute buildDir (set above)
|
|
390
390
|
// so Vite's config receives a root-relative path.
|
|
391
|
-
const buildOutDir = relative(resolvedRoot,
|
|
391
|
+
const buildOutDir = relative(resolvedRoot, buildDir);
|
|
392
392
|
|
|
393
393
|
// Set per-environment build.outDir so Vite's RSC plugin writes
|
|
394
394
|
// each environment to the correct subdirectory under our buildDir.
|
|
@@ -500,8 +500,10 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
500
500
|
// The watcher.add() call in dev-server.ts ensures the files are
|
|
501
501
|
// watched even if created after server start.
|
|
502
502
|
|
|
503
|
-
//
|
|
504
|
-
//
|
|
503
|
+
// The build directory is what Vite resolved build.outDir to — the
|
|
504
|
+
// config hook's value after every other plugin and the user config had
|
|
505
|
+
// their say. Vite keeps outDir as-is (may be relative), so resolve
|
|
506
|
+
// against root.
|
|
505
507
|
ctx.buildDir = resolve(resolved.root, resolved.build.outDir);
|
|
506
508
|
// In production builds, swap to a no-op timer to avoid overhead
|
|
507
509
|
if (!ctx.dev) {
|
|
@@ -552,6 +554,14 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
552
554
|
// We do NOT set customBuildApp — the RSC plugin's orchestration is correct
|
|
553
555
|
// and handles bundle ordering, asset manifest generation, and environment
|
|
554
556
|
// imports manifest. See @vitejs/plugin-rsc's buildApp implementation.
|
|
557
|
+
//
|
|
558
|
+
// Everything after it runs in timber-post-build, in the order that plugin
|
|
559
|
+
// states. The plugins that own a post-build step expose it as their `api`
|
|
560
|
+
// and are handed to it here, so no step's order depends on where a plugin
|
|
561
|
+
// sits in this array. See design/18-build-system.md §"Post-Build Phase".
|
|
562
|
+
const fonts = timberFonts(ctx);
|
|
563
|
+
const prebuilt = timberPrebuilt(ctx);
|
|
564
|
+
const buildReport = timberBuildReport(ctx);
|
|
555
565
|
return [
|
|
556
566
|
rootSync,
|
|
557
567
|
timberReactResolve(),
|
|
@@ -570,19 +580,19 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
570
580
|
timberRouting(ctx),
|
|
571
581
|
timberEntries(ctx),
|
|
572
582
|
timberBuildManifest(ctx),
|
|
573
|
-
|
|
583
|
+
fonts,
|
|
574
584
|
timberMdx(ctx),
|
|
575
585
|
timberRequestDep(ctx),
|
|
576
586
|
timberCacheTransform(ctx),
|
|
577
587
|
timberPrerenderSugar(ctx), // export const prerender → cache.component() desugaring
|
|
578
|
-
|
|
579
|
-
timberStaticBuild(ctx), // Static mode: validate
|
|
588
|
+
prebuilt, // cache.component() → __prebuilt() callsite rewrite
|
|
589
|
+
timberStaticBuild(ctx), // Static mode: validate dynamic API usage
|
|
580
590
|
timberContent(ctx),
|
|
581
591
|
timberServerBundle(), // Bundle all deps in server environments for prod
|
|
582
592
|
timberCloudflareWasm(ctx), // Externalize WASM for Cloudflare Workers
|
|
583
593
|
timberChunks(ctx),
|
|
584
|
-
|
|
585
|
-
|
|
594
|
+
buildReport, // Route table with bundle sizes, printed by timber-post-build
|
|
595
|
+
timberPostBuild(ctx, { fonts: fonts.api, prebuilt: prebuilt.api, report: buildReport.api }),
|
|
586
596
|
timberDevLogs(ctx), // Dev-only: forward server console.* to browser console
|
|
587
597
|
timberDevServer(ctx), // Must be last — configureServer post-hook runs after all watchers
|
|
588
598
|
];
|
package/src/plugin-context.ts
CHANGED
|
@@ -14,13 +14,13 @@ import { createRequire } from 'node:module';
|
|
|
14
14
|
import { parseAst } from 'vite';
|
|
15
15
|
import type { RouteTree } from './routing/types.ts';
|
|
16
16
|
import type { BuildManifest } from './server/build-manifest.ts';
|
|
17
|
-
import type { CaptureSummary } from './server/prebuilt-builder.ts';
|
|
18
17
|
import type { StartupTimer } from './utils/startup-timer.ts';
|
|
19
18
|
import { createStartupTimer } from './utils/startup-timer.ts';
|
|
20
19
|
import type { TimberUserConfig, ClientJavascriptConfig } from './config-types.ts';
|
|
21
|
-
import type { RscManifest } from './plugins/static-build.ts';
|
|
22
20
|
import type { HoldingServer } from './dev-tools/holding-server.ts';
|
|
23
21
|
import type { ProgramNode } from './plugins/callsite-ast.ts';
|
|
22
|
+
import type { TimberConfig, TimberPlatformAdapter } from './adapters/types.ts';
|
|
23
|
+
import { normalizeBasePath } from './shared/base-path.ts';
|
|
24
24
|
|
|
25
25
|
// Re-export for sub-plugin convenience — they import from plugin-context.ts
|
|
26
26
|
export type { TimberUserConfig, ClientJavascriptConfig } from './config-types.ts';
|
|
@@ -88,7 +88,11 @@ export interface PluginContext {
|
|
|
88
88
|
* does). See TIM-1261.
|
|
89
89
|
*/
|
|
90
90
|
base: string;
|
|
91
|
-
/**
|
|
91
|
+
/**
|
|
92
|
+
* The build manifest. Created by timber-build-manifest from the client
|
|
93
|
+
* bundle and finalized by the post-build phase (plugins/post-build.ts),
|
|
94
|
+
* which is the only reader. Null in dev.
|
|
95
|
+
*/
|
|
92
96
|
buildManifest: BuildManifest | null;
|
|
93
97
|
/** Per-build deployment ID for version skew detection (null in dev) */
|
|
94
98
|
deploymentId: string | null;
|
|
@@ -103,13 +107,16 @@ export interface PluginContext {
|
|
|
103
107
|
* `timber.config.ts` `buildDir` or Vite's `build.outDir`.
|
|
104
108
|
* Timber config takes precedence when both are set.
|
|
105
109
|
*
|
|
106
|
-
*
|
|
110
|
+
* The `config` hook resolves it into Vite's `build.outDir`, and
|
|
111
|
+
* `configResolved` reads it back from Vite — the one assignment after
|
|
112
|
+
* construction, so what the build writes to and what `timber preview`
|
|
113
|
+
* serves (through {@link TimberPluginApi}) are the same directory.
|
|
107
114
|
*/
|
|
108
115
|
buildDir: string;
|
|
109
116
|
/**
|
|
110
117
|
* Per-route client reference keys captured during the RSC build.
|
|
111
118
|
* Maps absolute route file paths to the set of client reference
|
|
112
|
-
* hash keys they transitively import. Used by
|
|
119
|
+
* hash keys they transitively import. Used by the post-build phase to
|
|
113
120
|
* populate per-route modulepreload entries from clientReferenceDeps.
|
|
114
121
|
*/
|
|
115
122
|
routeClientRefKeys?: Map<string, Set<string>>;
|
|
@@ -138,19 +145,6 @@ export interface PluginContext {
|
|
|
138
145
|
* See design/27-chunking-strategy.md, TIM-1107.
|
|
139
146
|
*/
|
|
140
147
|
sharedModuleFacades?: Map<string, string[]>;
|
|
141
|
-
/**
|
|
142
|
-
* Module ID → prebuilt component IDs declared in it. Recorded by the
|
|
143
|
-
* timber-prebuilt transform (RSC environment, production builds only),
|
|
144
|
-
* consumed by the RSC `generateBundle` module-graph walk that computes
|
|
145
|
-
* `routePrebuiltComponents`. See design/44-render-at-build-time.md.
|
|
146
|
-
*/
|
|
147
|
-
prebuiltModuleComponents?: Map<string, string[]>;
|
|
148
|
-
/**
|
|
149
|
-
* Module ID → mapping of variable name to component ID for the prebuilt
|
|
150
|
-
* components declared in that module. Used at `generateBundle` time to
|
|
151
|
-
* trace imports from other modules back to specific component IDs.
|
|
152
|
-
*/
|
|
153
|
-
prebuiltBindingNames?: Map<string, Map<string, string>>;
|
|
154
148
|
/**
|
|
155
149
|
* Component ID → distinct static call-site prop objects captured from
|
|
156
150
|
* JSX usage sites during the transform and generateBundle phases.
|
|
@@ -165,12 +159,6 @@ export interface PluginContext {
|
|
|
165
159
|
* components to render under which route's param combos.
|
|
166
160
|
*/
|
|
167
161
|
routePrebuiltComponents?: Map<string, string[]>;
|
|
168
|
-
/**
|
|
169
|
-
* Page file paths that were desugared from `export const prerender` by
|
|
170
|
-
* timber-prerender-sugar. The prebuilt transform uses this to verify
|
|
171
|
-
* the generated `cache.component(...)` call was picked up.
|
|
172
|
-
*/
|
|
173
|
-
prerenderSugarPages?: Set<string>;
|
|
174
162
|
/**
|
|
175
163
|
* Component ID → built chunk file name for prebuilt-declaring modules
|
|
176
164
|
* that are only reachable via dynamic imports (import.meta.glob, lazy
|
|
@@ -179,8 +167,6 @@ export interface PluginContext {
|
|
|
179
167
|
* RSC generateBundle alongside routePrebuiltComponents.
|
|
180
168
|
*/
|
|
181
169
|
prebuiltLazyChunks?: Map<string, string>;
|
|
182
|
-
/** Post-build prebuilt capture summary (populated by timber-prebuilt, consumed by build-report). */
|
|
183
|
-
captureSummary?: CaptureSummary;
|
|
184
170
|
/**
|
|
185
171
|
* Content-keyed AST parse memo shared across cache/prebuilt/prerender-sugar
|
|
186
172
|
* transforms. Collapses both cross-plugin and cross-environment duplicate
|
|
@@ -192,18 +178,6 @@ export interface PluginContext {
|
|
|
192
178
|
* ranges and rewrite CODE via MagicString; the AST itself is never mutated.
|
|
193
179
|
*/
|
|
194
180
|
parseCached?: ParseMemo;
|
|
195
|
-
/**
|
|
196
|
-
* Content-Type mappings for extensionless static API route outputs.
|
|
197
|
-
* Populated during static generation, consumed by adapter-build to
|
|
198
|
-
* write per-path Content-Type rules in _headers. See TIM-1241.
|
|
199
|
-
*/
|
|
200
|
-
staticContentTypes?: Record<string, string>;
|
|
201
|
-
/**
|
|
202
|
-
* RSC flight payload manifest mapping unhashed → hashed URLs.
|
|
203
|
-
* Populated during static generation, consumed by adapters to set
|
|
204
|
-
* immutable cache headers for `_rsc/` files. See TIM-1254.
|
|
205
|
-
*/
|
|
206
|
-
rscManifest?: RscManifest;
|
|
207
181
|
}
|
|
208
182
|
|
|
209
183
|
// ── AST parse memo ───────────────────────────────────────────────────────
|
|
@@ -274,6 +248,30 @@ export function isTimberPluginApi(api: unknown): api is TimberPluginApi {
|
|
|
274
248
|
);
|
|
275
249
|
}
|
|
276
250
|
|
|
251
|
+
/**
|
|
252
|
+
* The configured platform adapter. `adapter` is typed `unknown` on the user
|
|
253
|
+
* config so that `timber.config.ts` does not depend on the adapter types; the
|
|
254
|
+
* adapter factories are what produce values of this shape.
|
|
255
|
+
*/
|
|
256
|
+
export function contextAdapter(ctx: PluginContext): TimberPlatformAdapter | undefined {
|
|
257
|
+
return ctx.config.adapter as TimberPlatformAdapter | undefined;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* The configuration an adapter is handed, derived once from the resolved
|
|
262
|
+
* context — by the post-build phase for `buildOutput` and by `timber preview`
|
|
263
|
+
* for `preview`.
|
|
264
|
+
*/
|
|
265
|
+
export function adapterConfig(ctx: PluginContext): TimberConfig {
|
|
266
|
+
return {
|
|
267
|
+
root: ctx.root,
|
|
268
|
+
// Normalized once here, not in each adapter: the platform files
|
|
269
|
+
// adapters write address deployed-URL space (TIM-1274).
|
|
270
|
+
base: normalizeBasePath(ctx.base),
|
|
271
|
+
clientJavascriptDisabled: ctx.clientJavascript.disabled,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
277
275
|
/**
|
|
278
276
|
* Resolve the app directory. Checks (in order):
|
|
279
277
|
* 1. Explicit `configAppDir` from timber.config.ts
|
|
@@ -439,8 +437,9 @@ export function loadTimberConfigFile(root: string): TimberUserConfig | null {
|
|
|
439
437
|
|
|
440
438
|
/**
|
|
441
439
|
* Detect config keys set in both inline (vite.config.ts) and file (timber.config.ts)
|
|
442
|
-
* and warn the user.
|
|
443
|
-
*
|
|
440
|
+
* and warn the user. Only keys the inline config actually sets count — the
|
|
441
|
+
* `output` default is applied after the merge (timber-root-sync), so it never
|
|
442
|
+
* appears here as an inline key.
|
|
444
443
|
*
|
|
445
444
|
* Returns the list of conflicting key names (for testing).
|
|
446
445
|
*/
|
|
@@ -418,7 +418,7 @@ export function timberBuildManifest(ctx: PluginContext): Plugin {
|
|
|
418
418
|
|
|
419
419
|
// RSC environment: walk the module graph to find which client
|
|
420
420
|
// references each route file transitively imports. Store the
|
|
421
|
-
// mapping in ctx so the
|
|
421
|
+
// mapping in ctx so the post-build phase can cross-reference
|
|
422
422
|
// with clientReferenceDeps to populate per-route modulepreloads.
|
|
423
423
|
if (envName === 'rsc' && ctx.routeTree) {
|
|
424
424
|
const clientRefIndex = buildClientRefIndex(bundle);
|
|
@@ -475,17 +475,10 @@ export function timberBuildManifest(ctx: PluginContext): Plugin {
|
|
|
475
475
|
|
|
476
476
|
// When client JavaScript is disabled, strip JS chunks from the bundle
|
|
477
477
|
// so Rollup never writes them to disk. CSS assets are preserved —
|
|
478
|
-
// they're still needed for server-rendered HTML.
|
|
479
|
-
//
|
|
480
|
-
//
|
|
481
|
-
// build manifest and RSC assets manifest as a defense-in-depth fallback.
|
|
478
|
+
// they're still needed for server-rendered HTML. The JS references
|
|
479
|
+
// in the manifest are stripped once, by the post-build phase, after
|
|
480
|
+
// it has merged in everything else (plugins/post-build.ts).
|
|
482
481
|
if (ctx.clientJavascript.disabled) {
|
|
483
|
-
// Clear JS and modulepreload from the manifest (they'd be stripped
|
|
484
|
-
// by adapter-build.ts anyway, but doing it here avoids the round-trip).
|
|
485
|
-
ctx.buildManifest.js = {};
|
|
486
|
-
ctx.buildManifest.modulepreload = {};
|
|
487
|
-
|
|
488
|
-
// Remove JS chunks from the Rollup bundle — prevents disk writes.
|
|
489
482
|
for (const [fileName, item] of Object.entries(bundle)) {
|
|
490
483
|
if (item.type === 'chunk') {
|
|
491
484
|
delete bundle[fileName];
|