@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
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* Catches errors thrown by children and renders a fallback component
|
|
7
7
|
* with the appropriate props based on error type:
|
|
8
8
|
* - DenySignal (4xx) → { status, data }
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
9
|
+
* - Unhandled error (500) → { error, digest, reset }, where `digest` is the
|
|
10
|
+
* ID the server logged the error with (shared/error-digest.ts)
|
|
11
11
|
*
|
|
12
12
|
* The `status` prop controls which errors this boundary catches:
|
|
13
13
|
* - Specific code (e.g. 403) → only that status
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import { Component, createContext, createElement, useContext, type ReactNode } from 'react';
|
|
22
|
-
import { getSsrData } from './ssr-data.ts';
|
|
23
22
|
import { getRouterOrNull } from './router-ref.ts';
|
|
24
23
|
import { markStaleFromError } from './stale-client.ts';
|
|
25
24
|
import { StatusPageMarker } from './status-page-marker.tsx';
|
|
25
|
+
import { errorDigestId } from '../shared/error-digest.ts';
|
|
26
26
|
import { leaveSpa } from './router-effects.ts';
|
|
27
27
|
// Page unload detection: when the page is being torn down, error boundaries
|
|
28
28
|
// suppress activation — the error is from the aborted connection, not the
|
|
@@ -60,14 +60,6 @@ interface DenyDigest {
|
|
|
60
60
|
owners?: string[];
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
/** Structured digest returned by RSC onError for RenderError. */
|
|
64
|
-
interface RenderErrorDigest {
|
|
65
|
-
type: 'render-error';
|
|
66
|
-
code: string;
|
|
67
|
-
data: unknown;
|
|
68
|
-
status: number;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
63
|
/** Structured digest returned by RSC onError for RedirectSignal. */
|
|
72
64
|
interface RedirectDigest {
|
|
73
65
|
type: 'redirect';
|
|
@@ -75,7 +67,7 @@ interface RedirectDigest {
|
|
|
75
67
|
status: number;
|
|
76
68
|
}
|
|
77
69
|
|
|
78
|
-
type ParsedDigest = DenyDigest |
|
|
70
|
+
type ParsedDigest = DenyDigest | RedirectDigest;
|
|
79
71
|
|
|
80
72
|
// ─── Props & State ───────────────────────────────────────────────────────────
|
|
81
73
|
|
|
@@ -89,7 +81,8 @@ export interface TimberErrorBoundaryProps {
|
|
|
89
81
|
status?: number;
|
|
90
82
|
/**
|
|
91
83
|
* When true, this boundary wraps a parallel slot. Slot denials are
|
|
92
|
-
* graceful degradation
|
|
84
|
+
* graceful degradation: the boundary claims any addressed deny that
|
|
85
|
+
* reaches it and leaves the page's segment chain unmarked.
|
|
93
86
|
*/
|
|
94
87
|
isSlotBoundary?: boolean;
|
|
95
88
|
/**
|
|
@@ -297,7 +290,7 @@ export class TimberErrorBoundary extends Component<
|
|
|
297
290
|
throw error;
|
|
298
291
|
}
|
|
299
292
|
// The terminal is where that flow ends on the client. A non-deny row
|
|
300
|
-
// nothing claimed — a
|
|
293
|
+
// nothing claimed — a crash on a route with no
|
|
301
294
|
// matching `error.tsx` — has no page to render in-SPA; React would
|
|
302
295
|
// unmount the root. So the terminal does what the router does for an
|
|
303
296
|
// error envelope (design/10 §"Error Page Rendering for Client
|
|
@@ -335,27 +328,6 @@ export class TimberErrorBoundary extends Component<
|
|
|
335
328
|
}
|
|
336
329
|
}
|
|
337
330
|
|
|
338
|
-
// Report DenySignal handling so the pipeline skips the redundant
|
|
339
|
-
// renderDenyPage() re-render.
|
|
340
|
-
//
|
|
341
|
-
// For segment boundaries: also set the HTTP status code from the
|
|
342
|
-
// DenySignal so the Response has the correct 4xx status. This runs
|
|
343
|
-
// synchronously during Fizz rendering, BEFORE onShellReady.
|
|
344
|
-
//
|
|
345
|
-
// For slot boundaries: set _denyHandledByBoundary but do NOT change
|
|
346
|
-
// statusCode — slot denials are graceful degradation.
|
|
347
|
-
//
|
|
348
|
-
// See TIM-664, LOCAL-298.
|
|
349
|
-
if (parsed?.type === 'deny') {
|
|
350
|
-
const ssrData = getSsrData();
|
|
351
|
-
if (ssrData?._navContext) {
|
|
352
|
-
ssrData._navContext._denyHandledByBoundary = true;
|
|
353
|
-
if (!this.props.isSlotBoundary) {
|
|
354
|
-
ssrData._navContext.statusCode = parsed.status;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
331
|
return this.markStatusPage(this.renderFallback(parsed, error));
|
|
360
332
|
}
|
|
361
333
|
|
|
@@ -383,13 +355,10 @@ export class TimberErrorBoundary extends Component<
|
|
|
383
355
|
});
|
|
384
356
|
}
|
|
385
357
|
|
|
386
|
-
//
|
|
387
|
-
const digest =
|
|
388
|
-
parsed?.type === 'render-error' ? { code: parsed.code, data: parsed.data } : null;
|
|
389
|
-
|
|
358
|
+
// Unhandled error (500)
|
|
390
359
|
return createElement(this.props.fallbackComponent as never, {
|
|
391
360
|
error,
|
|
392
|
-
digest,
|
|
361
|
+
digest: errorDigestId(error),
|
|
393
362
|
reset: this.reset,
|
|
394
363
|
});
|
|
395
364
|
}
|
|
@@ -458,7 +427,6 @@ function denyError(status: number, original: Error): Error {
|
|
|
458
427
|
*/
|
|
459
428
|
function getErrorStatus(parsed: ParsedDigest | null, error: Error): number | null {
|
|
460
429
|
if (parsed?.type === 'deny') return parsed.status;
|
|
461
|
-
if (parsed?.type === 'render-error') return parsed.status;
|
|
462
430
|
if (parsed?.type === 'redirect') return parsed.status;
|
|
463
431
|
|
|
464
432
|
// Fallback: parse DenySignal message pattern for errors that lost their digest
|
|
@@ -30,7 +30,7 @@ export interface SerializableError {
|
|
|
30
30
|
* Props for the ErrorReconstituter wrapper component.
|
|
31
31
|
* All props are RSC-serializable:
|
|
32
32
|
* - error: plain object (SerializableError)
|
|
33
|
-
* - digest:
|
|
33
|
+
* - digest: the server log's correlation ID for the error, or null
|
|
34
34
|
* - reset: undefined (only meaningful on client after boundary catch)
|
|
35
35
|
* - component: client module reference (RSC Flight serializes as opaque ref)
|
|
36
36
|
* - status / data: set only when error.tsx serves a deny()
|
|
@@ -39,11 +39,11 @@ export interface SerializableError {
|
|
|
39
39
|
*/
|
|
40
40
|
interface ErrorReconstituterProps {
|
|
41
41
|
error: SerializableError;
|
|
42
|
-
digest:
|
|
42
|
+
digest: string | null;
|
|
43
43
|
reset: undefined;
|
|
44
44
|
component: ComponentType<{
|
|
45
45
|
error: Error;
|
|
46
|
-
digest:
|
|
46
|
+
digest: string | null;
|
|
47
47
|
reset: (() => void) | undefined;
|
|
48
48
|
status?: number;
|
|
49
49
|
data?: unknown;
|
|
@@ -64,10 +64,15 @@ export function ErrorReconstituter({
|
|
|
64
64
|
status,
|
|
65
65
|
data,
|
|
66
66
|
}: ErrorReconstituterProps): ReactNode {
|
|
67
|
-
// Reconstitute a real Error so instanceof checks work in user code
|
|
67
|
+
// Reconstitute a real Error so instanceof checks work in user code.
|
|
68
|
+
// `new Error()` captures a stack of wherever this component renders — in
|
|
69
|
+
// SSR that is the server's bundle paths and React internals. Production
|
|
70
|
+
// serializes no stack (design/13-security.md), so the stack is set to the
|
|
71
|
+
// header line alone: nothing about the server, and the same string in SSR
|
|
72
|
+
// and on the client (TIM-1551).
|
|
68
73
|
const error = Object.assign(new Error(serialized.message), {
|
|
69
74
|
name: serialized.name,
|
|
70
|
-
|
|
75
|
+
stack: serialized.stack ?? `${serialized.name}: ${serialized.message}`,
|
|
71
76
|
});
|
|
72
77
|
|
|
73
78
|
return createElement(component, {
|
package/src/client/history.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import type { ParamsSource } from '../shared/payload-root.ts';
|
|
5
5
|
import type { SegmentInfo } from '../shared/segment-info.ts';
|
|
6
|
+
import { routerUrlKey } from './router-url.ts';
|
|
6
7
|
|
|
7
8
|
// ─── Types ───────────────────────────────────────────────────────
|
|
8
9
|
|
|
@@ -42,7 +43,10 @@ export interface HistoryEntry {
|
|
|
42
43
|
* On forward navigation, the new page's payload is pushed onto the stack.
|
|
43
44
|
* On popstate, the cached payload is replayed instantly.
|
|
44
45
|
*
|
|
45
|
-
* Entries are keyed by pathname + search
|
|
46
|
+
* Entries are keyed by pathname + search in the browser's own spelling
|
|
47
|
+
* (`routerUrlKey`), whatever spelling a caller passes: an entry stored by
|
|
48
|
+
* `navigate('/café')` is found by a traversal that reads `/caf%C3%A9` off
|
|
49
|
+
* the address bar, and `/a?` is `/a` (TIM-1541). Used with the History API
|
|
46
50
|
* fallback and the Navigation API.
|
|
47
51
|
*
|
|
48
52
|
* Scroll positions are stored in history.state or Navigation API entry
|
|
@@ -63,6 +67,7 @@ export class HistoryStack {
|
|
|
63
67
|
}
|
|
64
68
|
|
|
65
69
|
push(url: string, entry: HistoryEntry): void {
|
|
70
|
+
url = routerUrlKey(url);
|
|
66
71
|
// Push runs when a page becomes current (or hydration seeds it). Promote
|
|
67
72
|
// replacements too, so the current page always survives overflow.
|
|
68
73
|
this.entries.delete(url);
|
|
@@ -74,6 +79,7 @@ export class HistoryStack {
|
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
get(url: string): HistoryEntry | undefined {
|
|
82
|
+
url = routerUrlKey(url);
|
|
77
83
|
const entry = this.entries.get(url);
|
|
78
84
|
if (entry) {
|
|
79
85
|
this.entries.delete(url);
|
|
@@ -84,11 +90,11 @@ export class HistoryStack {
|
|
|
84
90
|
|
|
85
91
|
/** Presence checks (such as hover prefetch probes) do not promote entries. */
|
|
86
92
|
has(url: string): boolean {
|
|
87
|
-
return this.entries.has(url);
|
|
93
|
+
return this.entries.has(routerUrlKey(url));
|
|
88
94
|
}
|
|
89
95
|
|
|
90
96
|
delete(url: string): boolean {
|
|
91
|
-
return this.entries.delete(url);
|
|
97
|
+
return this.entries.delete(routerUrlKey(url));
|
|
92
98
|
}
|
|
93
99
|
|
|
94
100
|
/**
|
|
@@ -99,6 +105,7 @@ export class HistoryStack {
|
|
|
99
105
|
* query.
|
|
100
106
|
*/
|
|
101
107
|
deleteByPathname(pathname: string): void {
|
|
108
|
+
pathname = routerUrlKey(pathname);
|
|
102
109
|
for (const url of this.entries.keys()) {
|
|
103
110
|
const qIndex = url.indexOf('?');
|
|
104
111
|
const urlPathname = qIndex === -1 ? url : url.slice(0, qIndex);
|
|
@@ -109,26 +116,16 @@ export class HistoryStack {
|
|
|
109
116
|
}
|
|
110
117
|
|
|
111
118
|
/**
|
|
112
|
-
* Evict
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
119
|
+
* Evict every entry (TIM-1476). Called after a server action that
|
|
120
|
+
* revalidated data — history entries are equally stale since they replay
|
|
121
|
+
* on back/forward without a server check. Clearing forces a fresh fetch on
|
|
122
|
+
* the next traversal.
|
|
116
123
|
*
|
|
117
|
-
* The current
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
* only, redirect) do not call `applyActionResult`, so their entries
|
|
121
|
-
* are fully removed (codex on #1131 round 2).
|
|
124
|
+
* The current page's entry goes too. Nothing reads it for anything but a
|
|
125
|
+
* replay: the segment metadata a revalidation needs is the committer's
|
|
126
|
+
* record of the current page, not this stack's (TIM-1541).
|
|
122
127
|
*/
|
|
123
|
-
|
|
124
|
-
const currentEntry = this.entries.get(currentUrl);
|
|
128
|
+
clear(): void {
|
|
125
129
|
this.entries.clear();
|
|
126
|
-
if (currentEntry) {
|
|
127
|
-
this.entries.set(currentUrl, {
|
|
128
|
-
payload: null,
|
|
129
|
-
params: currentEntry.params,
|
|
130
|
-
segmentInfo: currentEntry.segmentInfo,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
130
|
}
|
|
134
131
|
}
|
package/src/client/index.ts
CHANGED
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
|
|
8
8
|
// JsonSerializable moved to @timber-js/app/codec as the single canonical path.
|
|
9
9
|
// Re-export removed per TIM-721.
|
|
10
|
-
export type { RenderErrorDigest } from './types.ts';
|
|
11
10
|
|
|
12
11
|
// Navigation
|
|
13
12
|
export { Link, interpolateParams, resolveHref, validateLinkHref, buildLinkProps } from './link.tsx';
|
package/src/client/internal.ts
CHANGED
|
@@ -18,13 +18,12 @@ export type {
|
|
|
18
18
|
RouterDeps,
|
|
19
19
|
RouterPhase,
|
|
20
20
|
RscDecoder,
|
|
21
|
-
RootRenderer,
|
|
22
21
|
} from './router-types.ts';
|
|
23
22
|
export { getRouter, getRouterOrNull, setGlobalRouter } from './router-ref.ts';
|
|
24
23
|
export type { NavigationEpoch } from './router-lifecycle.ts';
|
|
25
24
|
|
|
26
25
|
// ── SSR bridge ───────────────────────────────────────────────────────────
|
|
27
|
-
export {
|
|
26
|
+
export { registerSsrDataProvider, getSsrData } from './ssr-data.ts';
|
|
28
27
|
export type { SsrData } from './ssr-data.ts';
|
|
29
28
|
|
|
30
29
|
// ── Segment context ──────────────────────────────────────────────────────
|
|
@@ -44,11 +43,7 @@ export type { HistoryEntry } from './history.ts';
|
|
|
44
43
|
export { useSearchParams } from './use-search-params.ts';
|
|
45
44
|
|
|
46
45
|
// ── Navigation context ───────────────────────────────────────────────────
|
|
47
|
-
export {
|
|
48
|
-
NavigationProvider,
|
|
49
|
-
getNavigationState,
|
|
50
|
-
setNavigationState,
|
|
51
|
-
} from './navigation-context.ts';
|
|
46
|
+
export { NavigationProvider } from './navigation-context.ts';
|
|
52
47
|
export type { NavigationState } from './navigation-context.ts';
|
|
53
48
|
|
|
54
49
|
// ── Query states (internal binder) ───────────────────────────────────────
|
|
@@ -14,7 +14,8 @@ import { buildSegmentTree, type SegmentCache } from './segment-cache.ts';
|
|
|
14
14
|
import type { HistoryStack } from './history.ts';
|
|
15
15
|
import type { SegmentInfo, StateTree } from '../shared/segment-info.ts';
|
|
16
16
|
import type { ParamsSource } from '../shared/payload-root.ts';
|
|
17
|
-
import {
|
|
17
|
+
import type { NavigationState } from './navigation-context.ts';
|
|
18
|
+
import { parseRouterUrl } from './router-url.ts';
|
|
18
19
|
import {
|
|
19
20
|
statusPageRendered,
|
|
20
21
|
_setStatusPageRendered,
|
|
@@ -128,10 +129,11 @@ function hasSkippedSlot(segmentInfo: SegmentInfo[] | null | undefined): boolean
|
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
/**
|
|
131
|
-
* The metadata a history entry
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
132
|
+
* The metadata a committed page keeps — on its history entry, and as the
|
|
133
|
+
* current page's `committedSegmentInfo()`. `skipped` describes the
|
|
134
|
+
* *response* — "this slot's content was omitted" — and neither stores such
|
|
135
|
+
* a payload (the entry stores null). Kept, the flag outlives the response:
|
|
136
|
+
* `applyActionResult()` reuses the current page's metadata beside a full
|
|
135
137
|
* re-render and would have that judged non-replayable too.
|
|
136
138
|
*/
|
|
137
139
|
function storedSegmentInfo(segmentInfo: SegmentInfo[] | null | undefined) {
|
|
@@ -153,7 +155,18 @@ export interface PreparedNavigation {
|
|
|
153
155
|
export interface NavigationCommitter {
|
|
154
156
|
prepareNavigation(url: string, opts: NavigationCommitInput): PreparedNavigation;
|
|
155
157
|
currentStateTree(): StateTree | undefined;
|
|
156
|
-
|
|
158
|
+
/**
|
|
159
|
+
* The segment metadata of the page the last commit made current, as that
|
|
160
|
+
* commit recorded it — null when it carried none.
|
|
161
|
+
*
|
|
162
|
+
* Server-action responses carry no segment metadata, so a revalidation
|
|
163
|
+
* re-renders the current page with this. It is the committer's own record
|
|
164
|
+
* rather than a history-stack lookup: the stack is keyed by the URL string
|
|
165
|
+
* a navigation was asked for, and the current page is known by
|
|
166
|
+
* `window.location`'s spelling of it, and the two need not agree
|
|
167
|
+
* (`/a?` against `/a`, a percent-encoded path against a decoded one).
|
|
168
|
+
*/
|
|
169
|
+
committedSegmentInfo(): SegmentInfo[] | null;
|
|
157
170
|
/** Whether segment reuse is currently suppressed (TIM-1466). */
|
|
158
171
|
isSegmentReuseSuppressed(): boolean;
|
|
159
172
|
/** Lift segment reuse suppression after fresh data has been fetched (TIM-1466). */
|
|
@@ -163,11 +176,9 @@ export interface NavigationCommitter {
|
|
|
163
176
|
/**
|
|
164
177
|
* Derive the navigation state (pathname + search) a URL renders with.
|
|
165
178
|
*
|
|
166
|
-
* Pure
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* explicitly to renderRoot/wrapPayload, so a render never depends on the
|
|
170
|
-
* publish having happened first.
|
|
179
|
+
* Pure. The value travels with the tree it describes — callers pass it to
|
|
180
|
+
* `wrapPayload`, and the router's record of the displayed tree keeps it
|
|
181
|
+
* beside that tree — so there is no store to publish it to (TIM-1541).
|
|
171
182
|
*/
|
|
172
183
|
export function deriveNavigationState(url: string): NavigationState {
|
|
173
184
|
// Params are not part of it. They travel with the payload and are published
|
|
@@ -175,7 +186,7 @@ export function deriveNavigationState(url: string): NavigationState {
|
|
|
175
186
|
// also what clears the previous route's — a route with no params of its own
|
|
176
187
|
// still publishes an empty record (TIM-1294/TIM-1297, and the clearing
|
|
177
188
|
// requirement from TIM-1285).
|
|
178
|
-
const parsed =
|
|
189
|
+
const parsed = parseRouterUrl(url);
|
|
179
190
|
return { pathname: parsed.pathname || '/', search: parsed.search };
|
|
180
191
|
}
|
|
181
192
|
|
|
@@ -187,6 +198,9 @@ export function createNavigationCommitter(deps: {
|
|
|
187
198
|
}): NavigationCommitter {
|
|
188
199
|
const { segmentCache, historyStack } = deps;
|
|
189
200
|
|
|
201
|
+
// See `committedSegmentInfo`. Written only by a commit.
|
|
202
|
+
let committedSegmentInfo: SegmentInfo[] | null = null;
|
|
203
|
+
|
|
190
204
|
// See `reportStatusPageRendered`: a status page that commits with no
|
|
191
205
|
// navigation to consume the report still empties the cache.
|
|
192
206
|
_setOnStatusPageRendered(() => segmentCache.clear());
|
|
@@ -199,8 +213,7 @@ export function createNavigationCommitter(deps: {
|
|
|
199
213
|
* navigation. What the flag gates is which parts get serialized — see
|
|
200
214
|
* `currentStateTree`.
|
|
201
215
|
*/
|
|
202
|
-
function updateSegmentCache(segmentInfo: SegmentInfo[]
|
|
203
|
-
if (!segmentInfo || segmentInfo.length === 0) return;
|
|
216
|
+
function updateSegmentCache(segmentInfo: SegmentInfo[]): void {
|
|
204
217
|
const tree = buildSegmentTree(segmentInfo);
|
|
205
218
|
if (tree) {
|
|
206
219
|
segmentCache.set('/', tree);
|
|
@@ -208,7 +221,7 @@ export function createNavigationCommitter(deps: {
|
|
|
208
221
|
}
|
|
209
222
|
|
|
210
223
|
return {
|
|
211
|
-
|
|
224
|
+
committedSegmentInfo: () => committedSegmentInfo,
|
|
212
225
|
isSegmentReuseSuppressed: () => segmentCache.isReuseSuppressed(),
|
|
213
226
|
restoreSegmentReuse: () => segmentCache.restoreReuse(),
|
|
214
227
|
|
|
@@ -242,9 +255,13 @@ export function createNavigationCommitter(deps: {
|
|
|
242
255
|
* the URL and is what the incoming tree is *rendered* with, plus a
|
|
243
256
|
* `commit` thunk that performs the writes that make a page current:
|
|
244
257
|
* 1. Segment cache — update from server-provided segment metadata
|
|
245
|
-
* 2.
|
|
258
|
+
* 2. The current page's segment metadata (`committedSegmentInfo`)
|
|
246
259
|
* 3. History stack — store the payload for instant back/forward replay
|
|
247
260
|
*
|
|
261
|
+
* Pathname and search are not written here: they are the returned
|
|
262
|
+
* `navState`, which the tree renders with and the router's record of the
|
|
263
|
+
* displayed tree keeps (browser-entry/router-init.ts `publishTree`).
|
|
264
|
+
*
|
|
248
265
|
* Nothing is written until `commit()` runs, and on a transitioned
|
|
249
266
|
* navigation it runs only once the transition is known to have won — see
|
|
250
267
|
* `renderViaTransition` and `NavigationRoot`. A navigation superseded
|
|
@@ -287,12 +304,12 @@ export function createNavigationCommitter(deps: {
|
|
|
287
304
|
segmentCache.clear();
|
|
288
305
|
}
|
|
289
306
|
|
|
290
|
-
|
|
307
|
+
committedSegmentInfo = storedSegmentInfo(segmentInfo) ?? null;
|
|
291
308
|
|
|
292
309
|
historyStack.push(url, {
|
|
293
310
|
payload,
|
|
294
311
|
params: opts.params,
|
|
295
|
-
segmentInfo:
|
|
312
|
+
segmentInfo: committedSegmentInfo,
|
|
296
313
|
});
|
|
297
314
|
},
|
|
298
315
|
};
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Segment params are NOT here — see the note on NavigationState below.
|
|
14
14
|
*
|
|
15
|
-
* By wrapping the RSC payload element in NavigationProvider inside
|
|
16
|
-
*
|
|
15
|
+
* By wrapping the RSC payload element in NavigationProvider inside the
|
|
16
|
+
* router's `renderTree` (browser-entry/router-init.ts), the context value and the element tree are passed to
|
|
17
17
|
* reactRoot.render() in the same call — atomic by construction.
|
|
18
18
|
* All consumers (usePathname, useSearchParams) see the new values in the
|
|
19
19
|
* same render pass as the new tree.
|
|
@@ -43,7 +43,6 @@
|
|
|
43
43
|
*/
|
|
44
44
|
|
|
45
45
|
import { createContext, useContext, createElement, type ReactNode } from 'react';
|
|
46
|
-
import type { SlotParamsRecord } from '../shared/slot-params.ts';
|
|
47
46
|
|
|
48
47
|
// ---------------------------------------------------------------------------
|
|
49
48
|
// Context type
|
|
@@ -118,7 +117,7 @@ export interface NavigationProviderProps {
|
|
|
118
117
|
/**
|
|
119
118
|
* Wraps children with NavigationContext.Provider.
|
|
120
119
|
*
|
|
121
|
-
* Used in browser-entry.ts
|
|
120
|
+
* Used in browser-entry/router-init.ts `renderTree` to wrap the RSC payload element
|
|
122
121
|
* so that navigation state updates atomically with the tree render.
|
|
123
122
|
*/
|
|
124
123
|
export function NavigationProvider({
|
|
@@ -128,41 +127,6 @@ export function NavigationProvider({
|
|
|
128
127
|
return createElement(getOrCreateContext().Provider, { value }, children);
|
|
129
128
|
}
|
|
130
129
|
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
// Module-level state for renderRoot to read
|
|
133
|
-
// ---------------------------------------------------------------------------
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Navigation state communicated between the router and renderRoot.
|
|
137
|
-
*
|
|
138
|
-
* The router calls setNavigationState() before renderRoot(). The
|
|
139
|
-
* renderRoot callback reads via getNavigationState() to create the
|
|
140
|
-
* NavigationProvider with the correct params/pathname.
|
|
141
|
-
*
|
|
142
|
-
* This is NOT used by hooks directly — hooks read from React context.
|
|
143
|
-
*
|
|
144
|
-
* Stored on globalThis (like the context instances above) because the
|
|
145
|
-
* router lives in one chunk while renderRoot lives in another. Module-
|
|
146
|
-
* level variables would be separate per chunk.
|
|
147
|
-
*/
|
|
148
|
-
const NAV_STATE_KEY = Symbol.for('__timber_nav_state');
|
|
149
|
-
|
|
150
|
-
function _getNavStateStore(): { current: NavigationState } {
|
|
151
|
-
const g = globalThis as Record<symbol, unknown>;
|
|
152
|
-
if (!g[NAV_STATE_KEY]) {
|
|
153
|
-
g[NAV_STATE_KEY] = { current: { pathname: '/', search: '' } };
|
|
154
|
-
}
|
|
155
|
-
return g[NAV_STATE_KEY] as { current: NavigationState };
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export function setNavigationState(state: NavigationState): void {
|
|
159
|
-
_getNavStateStore().current = state;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export function getNavigationState(): NavigationState {
|
|
163
|
-
return _getNavStateStore().current;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
130
|
// ---------------------------------------------------------------------------
|
|
167
131
|
// Pending navigation state lives in the router, not here
|
|
168
132
|
// ---------------------------------------------------------------------------
|
package/src/client/react-root.ts
CHANGED
|
@@ -27,8 +27,9 @@ import type { TopLoaderConfig } from './top-loader.tsx';
|
|
|
27
27
|
export interface ReactRootHost {
|
|
28
28
|
/**
|
|
29
29
|
* Hydrate the server HTML with `element` as the initial tree. Nothing is
|
|
30
|
-
* published on that commit — the
|
|
31
|
-
*
|
|
30
|
+
* published on that commit — the router made the page current before
|
|
31
|
+
* handing it over (`RouterInstance.hydrate`), and React may never commit
|
|
32
|
+
* it: an early render switches the root to client rendering.
|
|
32
33
|
*/
|
|
33
34
|
hydrate(element: ReactNode, options?: HydrationOptions): void;
|
|
34
35
|
/**
|