@timber-js/app 0.2.0-alpha.207 → 0.2.0-alpha.209
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{primitives-DLAnvsrk.js → actions-BerlqoXA.js} +640 -410
- package/dist/_chunks/actions-BerlqoXA.js.map +1 -0
- package/dist/_chunks/{als-registry-C6kcfprT.js → als-registry-DaxkVjt5.js} +6 -2
- package/dist/_chunks/als-registry-DaxkVjt5.js.map +1 -0
- package/dist/_chunks/{build-manifest-DTmSGLRz.js → build-manifest-DWppEdLB.js} +2 -51
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/{build-output-helper-9dqCv1pZ.js → build-output-helper-RV_BRcF1.js} +50 -53
- package/dist/_chunks/build-output-helper-RV_BRcF1.js.map +1 -0
- package/dist/_chunks/{cache-api-CUD9Ezaq.js → cache-api-CR23J_NC.js} +64 -32
- package/dist/_chunks/cache-api-CR23J_NC.js.map +1 -0
- package/dist/_chunks/{chains-B4bgOl2g.js → chains-CpFg56UB.js} +2 -2
- package/dist/_chunks/{chains-B4bgOl2g.js.map → chains-CpFg56UB.js.map} +1 -1
- package/dist/_chunks/{cli-check-G8o30ldg.js → cli-check-C6Ev6wBO.js} +11 -52
- package/dist/_chunks/cli-check-C6Ev6wBO.js.map +1 -0
- package/dist/_chunks/cli-context-By7k2xVo.js +70 -0
- package/dist/_chunks/cli-context-By7k2xVo.js.map +1 -0
- package/dist/_chunks/{cli-schema-sync--LZKs8Zn.js → cli-schema-sync-CbT2AUUI.js} +3 -3
- package/dist/_chunks/{cli-schema-sync--LZKs8Zn.js.map → cli-schema-sync-CbT2AUUI.js.map} +1 -1
- package/dist/_chunks/{cloudflare-BFb__LYG.js → cloudflare-Byxl8FWP.js} +96 -53
- package/dist/_chunks/{cloudflare-BFb__LYG.js.map → cloudflare-Byxl8FWP.js.map} +1 -1
- package/dist/_chunks/{convention-lint-5KzoMg_A.js → convention-lint-jKTwKwPe.js} +21 -6
- package/dist/_chunks/convention-lint-jKTwKwPe.js.map +1 -0
- package/dist/_chunks/{dev-server-BzBxgYAV.js → dev-server-C4WZdB7L.js} +15 -167
- package/dist/_chunks/dev-server-C4WZdB7L.js.map +1 -0
- package/dist/_chunks/{error-boundary-BndF-3Td.js → error-boundary-tA7kVfs4.js} +84 -104
- package/dist/_chunks/error-boundary-tA7kVfs4.js.map +1 -0
- package/dist/_chunks/{fs-identity-D7vb6GdI.js → fs-identity-BRKuL215.js} +3 -4
- package/dist/_chunks/fs-identity-BRKuL215.js.map +1 -0
- package/dist/_chunks/{graph-cache-CP4GEmf9.js → graph-cache-CYiUS2aS.js} +4 -5
- package/dist/_chunks/graph-cache-CYiUS2aS.js.map +1 -0
- package/dist/_chunks/{json-lossy-check-ClNvBM_3.js → json-lossy-check-ip0Qi0MT.js} +6 -3
- package/dist/_chunks/json-lossy-check-ip0Qi0MT.js.map +1 -0
- package/dist/_chunks/{live-graph-Bm5WTvcr.js → live-graph-Dv-JJCZw.js} +3 -3
- package/dist/_chunks/{live-graph-Bm5WTvcr.js.map → live-graph-Dv-JJCZw.js.map} +1 -1
- package/dist/_chunks/{logger-k2DQ4EUf.js → logger-DiDt5ppH.js} +192 -51
- package/dist/_chunks/logger-DiDt5ppH.js.map +1 -0
- package/dist/_chunks/{navigation-root-mHSK9psY.js → navigation-root-BQfo1-kG.js} +2 -2
- package/dist/_chunks/{navigation-root-mHSK9psY.js.map → navigation-root-BQfo1-kG.js.map} +1 -1
- package/dist/_chunks/{plugin-context-8idfR3UZ.js → plugin-context-BPBPc3lL.js} +28 -4
- package/dist/_chunks/plugin-context-BPBPc3lL.js.map +1 -0
- package/dist/_chunks/{poison-scan-DG5eI2_z.js → poison-scan-CpeT6_OJ.js} +2 -2
- package/dist/_chunks/{poison-scan-DG5eI2_z.js.map → poison-scan-CpeT6_OJ.js.map} +1 -1
- package/dist/_chunks/render-timeout-DOf_BBcO.js +46 -0
- package/dist/_chunks/render-timeout-DOf_BBcO.js.map +1 -0
- package/dist/_chunks/{rsc-payload-path-B_LBodc2.js → rsc-payload-path-dffcs4jp.js} +9 -3
- package/dist/_chunks/{rsc-payload-path-B_LBodc2.js.map → rsc-payload-path-dffcs4jp.js.map} +1 -1
- package/dist/_chunks/{scanner-BQ5sPIJ7.js → scanner-Bw0oq1HB.js} +2 -2
- package/dist/_chunks/{scanner-BQ5sPIJ7.js.map → scanner-Bw0oq1HB.js.map} +1 -1
- package/dist/_chunks/{navigation-context-D0TU0Jog.js → segment-context-xtPUGfdq.js} +36 -34
- package/dist/_chunks/segment-context-xtPUGfdq.js.map +1 -0
- package/dist/_chunks/{singleflight-2lUWfcAk.js → singleflight-BeVMMKi0.js} +4 -3
- package/dist/_chunks/{singleflight-2lUWfcAk.js.map → singleflight-BeVMMKi0.js.map} +1 -1
- package/dist/_chunks/{sizeof-lXffQ1Vr.js → sizeof-UwzwB1uM.js} +3 -2
- package/dist/_chunks/sizeof-UwzwB1uM.js.map +1 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js +49 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js.map +1 -0
- package/dist/_chunks/{state-FippDgxN.js → state-BhNGPsdi.js} +6 -8
- package/dist/_chunks/state-BhNGPsdi.js.map +1 -0
- package/dist/_chunks/{status-page-marker-DwQBrLBz.js → status-page-marker-gaihi0KZ.js} +140 -28
- package/dist/_chunks/status-page-marker-gaihi0KZ.js.map +1 -0
- package/dist/_chunks/{walkers-CN2N_bA-.js → walkers-BXExhzzk.js} +2 -2
- package/dist/_chunks/{walkers-CN2N_bA-.js.map → walkers-BXExhzzk.js.map} +1 -1
- package/dist/_chunks/write-file-atomic-D1qWqHb4.js +32 -0
- package/dist/_chunks/write-file-atomic-D1qWqHb4.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +7 -7
- package/dist/adapters/build-output-helper.d.ts.map +1 -1
- package/dist/adapters/canonicalize-module.d.ts +8 -0
- package/dist/adapters/canonicalize-module.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +2 -2
- package/dist/adapters/cloudflare.d.ts +30 -8
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -2
- package/dist/adapters/compress-module.d.ts +8 -0
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +2 -3
- package/dist/adapters/fs-identity.d.ts.map +1 -1
- package/dist/adapters/nitro-presets.d.ts +0 -6
- package/dist/adapters/nitro-presets.d.ts.map +1 -1
- package/dist/adapters/nitro-preview.d.ts +43 -11
- package/dist/adapters/nitro-preview.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +1 -13
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +291 -176
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +7 -2
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/types.d.ts +105 -21
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js +0 -0
- package/dist/analyze/crawl-entry.js +3 -3
- package/dist/analyze/graph-cache.d.ts.map +1 -1
- package/dist/analyze/graph-command.js +4 -4
- package/dist/cache/index.js +2 -2
- package/dist/cache/json-lossy-check.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts.map +1 -1
- package/dist/cache/stores/memory.js +1 -1
- package/dist/cache/tag-aware-handler.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.js +1 -1
- package/dist/cli-check.d.ts +7 -37
- package/dist/cli-check.d.ts.map +1 -1
- package/dist/cli-context.d.ts +54 -0
- package/dist/cli-context.d.ts.map +1 -0
- package/dist/cli.d.ts +9 -9
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +20 -24
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
- package/dist/client/browser-entry/hydrate.d.ts +19 -29
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/index.d.ts +7 -7
- package/dist/client/browser-entry/post-hydration.d.ts +6 -9
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
- package/dist/client/browser-entry/router-init.d.ts +6 -11
- package/dist/client/browser-entry/router-init.d.ts.map +1 -1
- package/dist/client/error-boundary.d.ts +4 -3
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +1 -1
- package/dist/client/error-reconstituter.d.ts +3 -9
- package/dist/client/error-reconstituter.d.ts.map +1 -1
- package/dist/client/history.d.ts +20 -11
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +5 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +3 -3
- package/dist/client/internal.d.ts.map +1 -1
- package/dist/client/internal.js +95 -108
- package/dist/client/internal.js.map +1 -1
- package/dist/client/navigation-commit.d.ts +20 -7
- package/dist/client/navigation-commit.d.ts.map +1 -1
- package/dist/client/navigation-context.d.ts +3 -5
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/react-root.d.ts +3 -2
- package/dist/client/react-root.d.ts.map +1 -1
- package/dist/client/router-pipeline.d.ts +3 -8
- package/dist/client/router-pipeline.d.ts.map +1 -1
- package/dist/client/router-types.d.ts +45 -39
- package/dist/client/router-types.d.ts.map +1 -1
- package/dist/client/router-url.d.ts +24 -0
- package/dist/client/router-url.d.ts.map +1 -0
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +8 -4
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +44 -4
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/ssr-data.d.ts +18 -64
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/state.d.ts +2 -5
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +1 -1
- package/dist/config-types.d.ts +2 -1
- package/dist/config-types.d.ts.map +1 -1
- package/dist/config-validation.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -1
- package/dist/dev-tools/dev-page-shell.d.ts +17 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -1
- package/dist/dev-tools/index.d.ts +1 -1
- package/dist/dev-tools/index.d.ts.map +1 -1
- package/dist/dev-tools/instrumentation.d.ts +17 -2
- package/dist/dev-tools/instrumentation.d.ts.map +1 -1
- package/dist/dev-tools/overlay.d.ts +6 -27
- package/dist/dev-tools/overlay.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +632 -373
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +26 -40
- package/dist/plugin-context.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +15 -2
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +19 -1
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/post-build.d.ts +110 -0
- package/dist/plugins/post-build.d.ts.map +1 -0
- package/dist/plugins/prebuilt-capture.d.ts +11 -4
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -1
- package/dist/plugins/prebuilt.d.ts +17 -1
- package/dist/plugins/prebuilt.d.ts.map +1 -1
- package/dist/plugins/prerender-sugar.d.ts.map +1 -1
- package/dist/plugins/react-resolve.d.ts +49 -0
- package/dist/plugins/react-resolve.d.ts.map +1 -0
- package/dist/plugins/rsc-assets-manifest.d.ts +33 -0
- package/dist/plugins/rsc-assets-manifest.d.ts.map +1 -0
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +32 -9
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-write.d.ts +0 -9
- package/dist/routing/codegen-write.d.ts.map +1 -1
- package/dist/routing/index.js +2 -2
- package/dist/routing/segment-codegen.d.ts.map +1 -1
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-handler.d.ts +5 -4
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +46 -7
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +58 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/children-interception.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +2 -23
- package/dist/server/cookie-context.d.ts.map +1 -1
- package/dist/server/csp-nonce.d.ts +0 -9
- package/dist/server/csp-nonce.d.ts.map +1 -1
- package/dist/server/csrf.d.ts +27 -4
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/debug.d.ts +0 -1
- package/dist/server/debug.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +2 -1
- package/dist/server/default-logger.d.ts.map +1 -1
- package/dist/server/deny-boundary.d.ts +12 -6
- package/dist/server/deny-boundary.d.ts.map +1 -1
- package/dist/server/deny-renderer.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -3
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +9 -2
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/head-response.d.ts +4 -4
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +0 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +10 -3
- package/dist/server/instrumentation.d.ts.map +1 -1
- package/dist/server/internal.d.ts +1 -4
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +961 -581
- package/dist/server/internal.js.map +1 -1
- package/dist/server/json-status-response.d.ts +34 -0
- package/dist/server/json-status-response.d.ts.map +1 -0
- package/dist/server/logger.d.ts +26 -0
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +11 -6
- package/dist/server/param-coercion.d.ts.map +1 -1
- package/dist/server/pipeline-helpers.d.ts +95 -7
- package/dist/server/pipeline-helpers.d.ts.map +1 -1
- package/dist/server/pipeline-interception.d.ts +11 -0
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +11 -1
- package/dist/server/pipeline-outcome.d.ts.map +1 -1
- package/dist/server/pipeline-phases.d.ts +2 -2
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +23 -35
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/prebuilt/capture-render.d.ts +25 -0
- package/dist/server/prebuilt/capture-render.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-routes.d.ts +37 -0
- package/dist/server/prebuilt/capture-routes.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +79 -35
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -1
- package/dist/server/prebuilt/lifetime.d.ts +38 -0
- package/dist/server/prebuilt/lifetime.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +7 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -1
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -1
- package/dist/server/prebuilt-builder.d.ts.map +1 -1
- package/dist/server/prebuilt-runtime.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +6 -81
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/react-cache-bridge.d.ts +59 -0
- package/dist/server/react-cache-bridge.d.ts.map +1 -0
- package/dist/server/react-cache-scope.d.ts +49 -0
- package/dist/server/react-cache-scope.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +15 -0
- package/dist/server/render-timeout.d.ts.map +1 -1
- package/dist/server/render-utils.d.ts +9 -0
- package/dist/server/render-utils.d.ts.map +1 -1
- package/dist/server/request-context.d.ts +26 -5
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +7 -0
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +22 -22
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts +7 -0
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +32 -6
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +11 -18
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +0 -1
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +5 -15
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +5 -6
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-signals.d.ts +65 -0
- package/dist/server/rsc-entry/render-signals.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +6 -16
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts +7 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +8 -53
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +2 -2
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +9 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -1
- package/dist/server/signal-identity.d.ts +43 -0
- package/dist/server/signal-identity.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +4 -3
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +91 -53
- package/dist/server/ssr-bridge-types.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +8 -5
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +26 -40
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +1 -1
- package/dist/server/static-generator.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +12 -0
- package/dist/server/stream-utils.d.ts.map +1 -1
- package/dist/server/tracing.d.ts +12 -16
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -1
- package/dist/server/version-skew.d.ts +3 -3
- package/dist/shared/csrf-reject.d.ts +16 -0
- package/dist/shared/csrf-reject.d.ts.map +1 -0
- package/dist/shared/error-digest.d.ts +28 -0
- package/dist/shared/error-digest.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +11 -10
- package/dist/shared/payload-root.d.ts.map +1 -1
- package/dist/shared/rsc-payload-path.d.ts +6 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -1
- package/dist/utils/write-file-atomic.d.ts +17 -0
- package/dist/utils/write-file-atomic.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +17 -14
- package/docs/api/32-api-cache.mdx +51 -23
- package/docs/api/34-api-config.mdx +34 -6
- package/docs/api/36-cli.mdx +11 -1
- package/docs/learn/03-fetching-data.mdx +17 -1
- package/docs/learn/04-access-control.mdx +1 -1
- package/docs/learn/10-caching.mdx +29 -11
- package/docs/learn/11-middleware.mdx +8 -2
- package/docs/learn/12-error-handling.mdx +6 -1
- package/package.json +7 -3
- package/src/adapters/build-output-helper.ts +55 -53
- package/src/adapters/canonicalize-module.ts +29 -0
- package/src/adapters/cloudflare.ts +105 -63
- package/src/adapters/compress-module.ts +16 -5
- package/src/adapters/fs-identity.ts +2 -3
- package/src/adapters/nitro-presets.ts +0 -15
- package/src/adapters/nitro-preview.ts +272 -136
- package/src/adapters/nitro.ts +119 -82
- package/src/adapters/shared.ts +23 -14
- package/src/adapters/types.ts +110 -21
- package/src/analyze/graph-cache.ts +3 -4
- package/src/cache/json-lossy-check.ts +3 -9
- package/src/cache/singleflight.ts +5 -2
- package/src/cache/sizeof.ts +3 -1
- package/src/cache/tag-aware-handler.ts +43 -26
- package/src/cli-check.ts +8 -98
- package/src/cli-context.ts +119 -0
- package/src/cli.ts +19 -28
- package/src/client/browser-dev.ts +1 -1
- package/src/client/browser-entry/action-dispatch.ts +26 -4
- package/src/client/browser-entry/hydrate.ts +53 -58
- package/src/client/browser-entry/index.ts +16 -27
- package/src/client/browser-entry/post-hydration.ts +6 -40
- package/src/client/browser-entry/router-init.ts +66 -84
- package/src/client/error-boundary.tsx +9 -41
- package/src/client/error-reconstituter.tsx +10 -5
- package/src/client/history.ts +35 -21
- package/src/client/index.ts +0 -1
- package/src/client/internal.ts +2 -7
- package/src/client/navigation-commit.ts +41 -18
- package/src/client/navigation-context.ts +3 -39
- package/src/client/react-root.ts +3 -2
- package/src/client/router-pipeline.ts +96 -132
- package/src/client/router-types.ts +46 -44
- package/src/client/router-url.ts +32 -0
- package/src/client/router.ts +62 -21
- package/src/client/rsc-fetch.ts +117 -155
- package/src/client/segment-cache.ts +110 -11
- package/src/client/ssr-data.ts +19 -80
- package/src/client/state.ts +2 -9
- package/src/client/use-pathname.ts +1 -1
- package/src/config-types.ts +2 -1
- package/src/config-validation.ts +2 -1
- package/src/dev-tools/dev-page-shell.ts +18 -0
- package/src/dev-tools/index.ts +0 -2
- package/src/dev-tools/instrumentation.ts +50 -2
- package/src/dev-tools/overlay.ts +8 -238
- package/src/index.ts +26 -14
- package/src/plugin-context.ts +39 -40
- package/src/plugins/build-manifest.ts +4 -11
- package/src/plugins/build-report.ts +70 -70
- package/src/plugins/dev-server.ts +24 -44
- package/src/plugins/entries.ts +2 -1
- package/src/plugins/fonts.ts +35 -7
- package/src/plugins/post-build.ts +327 -0
- package/src/plugins/prebuilt-capture.ts +28 -32
- package/src/plugins/prebuilt.ts +54 -39
- package/src/plugins/prerender-sugar.ts +0 -4
- package/src/plugins/react-resolve.ts +149 -0
- package/src/plugins/{adapter-build.ts → rsc-assets-manifest.ts} +20 -109
- package/src/plugins/shims.ts +1 -0
- package/src/plugins/static-build.ts +42 -74
- package/src/routing/codegen-write.ts +25 -3
- package/src/routing/segment-codegen.ts +3 -2
- package/src/rsc-runtime/vendor-types.d.ts +8 -0
- package/src/server/access-gate.tsx +2 -1
- package/src/server/action-client.ts +1 -1
- package/src/server/action-handler.ts +253 -110
- package/src/server/actions.ts +73 -25
- package/src/server/als-registry.ts +73 -5
- package/src/server/chain-url-parts.ts +1 -1
- package/src/server/children-interception.ts +2 -1
- package/src/server/cookie-context.ts +18 -48
- package/src/server/csp-nonce.ts +0 -12
- package/src/server/csrf.ts +140 -8
- package/src/server/debug.ts +0 -1
- package/src/server/default-logger.ts +2 -1
- package/src/server/deny-boundary.ts +25 -13
- package/src/server/deny-renderer.ts +30 -97
- package/src/server/error-boundary-wrapper.ts +7 -3
- package/src/server/fallback-error.ts +26 -11
- package/src/server/flight-scripts.ts +1 -1
- package/src/server/head-response.ts +4 -4
- package/src/server/html-injector-core.ts +2 -2
- package/src/server/html-injectors.ts +2 -4
- package/src/server/index.ts +0 -4
- package/src/server/instrumentation.ts +10 -3
- package/src/server/internal.ts +1 -6
- package/src/server/json-status-response.ts +105 -0
- package/src/server/logger.ts +39 -3
- package/src/server/param-coercion.ts +15 -12
- package/src/server/pipeline-helpers.ts +257 -12
- package/src/server/pipeline-interception.ts +133 -0
- package/src/server/pipeline-outcome.ts +103 -31
- package/src/server/pipeline-phases.ts +127 -237
- package/src/server/pipeline.ts +204 -207
- package/src/server/prebuilt/capture-render.ts +118 -0
- package/src/server/prebuilt/capture-routes.ts +104 -0
- package/src/server/prebuilt/capture-state.ts +155 -48
- package/src/server/prebuilt/lifetime.ts +151 -0
- package/src/server/prebuilt/slots.ts +14 -2
- package/src/server/prebuilt/synthetic-store.ts +3 -0
- package/src/server/prebuilt-builder.ts +30 -320
- package/src/server/prebuilt-runtime.ts +125 -129
- package/src/server/primitives.ts +8 -168
- package/src/server/react-cache-bridge.ts +124 -0
- package/src/server/react-cache-scope.ts +104 -0
- package/src/server/render-timeout.ts +20 -0
- package/src/server/render-utils.ts +11 -1
- package/src/server/request-context.ts +36 -9
- package/src/server/route-element-builder.ts +11 -6
- package/src/server/route-handler.ts +36 -23
- package/src/server/route-matcher.ts +15 -1
- package/src/server/rsc-entry/action-middleware-runner.ts +79 -123
- package/src/server/rsc-entry/api-handler.ts +27 -103
- package/src/server/rsc-entry/deny-fallback.ts +93 -26
- package/src/server/rsc-entry/error-renderer.ts +39 -91
- package/src/server/rsc-entry/helpers.ts +2 -4
- package/src/server/rsc-entry/index.ts +64 -58
- package/src/server/rsc-entry/render-route.ts +15 -80
- package/src/server/rsc-entry/render-signals.ts +108 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +56 -57
- package/src/server/rsc-entry/rsc-payload.ts +28 -61
- package/src/server/rsc-entry/rsc-stream.ts +113 -213
- package/src/server/rsc-entry/ssr-bridge.ts +2 -2
- package/src/server/rsc-entry/ssr-renderer.ts +182 -263
- package/src/server/rsc-entry/wrap-action-dispatch.ts +12 -14
- package/src/server/signal-identity.ts +112 -0
- package/src/server/slot-resolver.ts +18 -18
- package/src/server/slot-subtree-contain.ts +2 -1
- package/src/server/ssr-bridge-types.ts +92 -56
- package/src/server/ssr-entry.ts +87 -111
- package/src/server/ssr-render.ts +55 -64
- package/src/server/ssr-wrappers.tsx +2 -2
- package/src/server/static-generator.ts +7 -42
- package/src/server/static-not-found.ts +3 -3
- package/src/server/stream-utils.ts +51 -0
- package/src/server/tracing.ts +58 -75
- package/src/server/types.ts +1 -1
- package/src/server/version-skew.ts +5 -5
- package/src/shared/csrf-reject.ts +15 -0
- package/src/shared/error-digest.ts +46 -0
- package/src/shared/payload-root.ts +11 -10
- package/src/shared/rsc-payload-path.ts +8 -1
- package/src/utils/write-file-atomic.ts +32 -0
- package/dist/_chunks/actions-jNrXdzgs.js +0 -346
- package/dist/_chunks/actions-jNrXdzgs.js.map +0 -1
- package/dist/_chunks/als-registry-C6kcfprT.js.map +0 -1
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +0 -1
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +0 -1
- package/dist/_chunks/cache-api-CUD9Ezaq.js.map +0 -1
- package/dist/_chunks/cli-check-G8o30ldg.js.map +0 -1
- package/dist/_chunks/convention-lint-5KzoMg_A.js.map +0 -1
- package/dist/_chunks/dev-server-BzBxgYAV.js.map +0 -1
- package/dist/_chunks/error-boundary-BndF-3Td.js.map +0 -1
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +0 -1
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +0 -1
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +0 -1
- package/dist/_chunks/logger-k2DQ4EUf.js.map +0 -1
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +0 -1
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +0 -1
- package/dist/_chunks/primitives-DLAnvsrk.js.map +0 -1
- package/dist/_chunks/segment-context-D9_89u34.js +0 -34
- package/dist/_chunks/segment-context-D9_89u34.js.map +0 -1
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +0 -1
- package/dist/_chunks/ssr-data-D6T6Y3ef.js +0 -60
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +0 -1
- package/dist/_chunks/state-FippDgxN.js.map +0 -1
- package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +0 -1
- package/dist/client/types.d.ts +0 -14
- package/dist/client/types.d.ts.map +0 -1
- package/dist/plugins/adapter-build.d.ts +0 -38
- package/dist/plugins/adapter-build.d.ts.map +0 -1
- package/dist/server/asset-headers.d.ts +0 -32
- package/dist/server/asset-headers.d.ts.map +0 -1
- package/dist/server/dev-source-map.d.ts +0 -22
- package/dist/server/dev-source-map.d.ts.map +0 -1
- package/src/client/types.ts +0 -21
- package/src/server/asset-headers.ts +0 -59
- package/src/server/dev-source-map.ts +0 -31
|
@@ -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,34 +90,42 @@ 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
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
101
|
+
* Delete all entries whose pathname matches `pathname` (TIM-1465).
|
|
102
|
+
* Used by `invalidatePath` when the invalidation target has no search
|
|
103
|
+
* string — `/products` should evict `/products?page=1` too, because
|
|
104
|
+
* `revalidatePath('/products')` invalidates the route regardless of
|
|
105
|
+
* query.
|
|
106
|
+
*/
|
|
107
|
+
deleteByPathname(pathname: string): void {
|
|
108
|
+
pathname = routerUrlKey(pathname);
|
|
109
|
+
for (const url of this.entries.keys()) {
|
|
110
|
+
const qIndex = url.indexOf('?');
|
|
111
|
+
const urlPathname = qIndex === -1 ? url : url.slice(0, qIndex);
|
|
112
|
+
if (urlPathname === pathname) {
|
|
113
|
+
this.entries.delete(url);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
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.
|
|
99
123
|
*
|
|
100
|
-
* The current
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* only, redirect) do not call `applyActionResult`, so their entries
|
|
104
|
-
* 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).
|
|
105
127
|
*/
|
|
106
|
-
|
|
107
|
-
const currentEntry = this.entries.get(currentUrl);
|
|
128
|
+
clear(): void {
|
|
108
129
|
this.entries.clear();
|
|
109
|
-
if (currentEntry) {
|
|
110
|
-
this.entries.set(currentUrl, {
|
|
111
|
-
payload: null,
|
|
112
|
-
params: currentEntry.params,
|
|
113
|
-
segmentInfo: currentEntry.segmentInfo,
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
130
|
}
|
|
117
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,17 +155,30 @@ 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;
|
|
170
|
+
/** Whether segment reuse is currently suppressed (TIM-1466). */
|
|
171
|
+
isSegmentReuseSuppressed(): boolean;
|
|
172
|
+
/** Lift segment reuse suppression after fresh data has been fetched (TIM-1466). */
|
|
173
|
+
restoreSegmentReuse(): void;
|
|
157
174
|
}
|
|
158
175
|
|
|
159
176
|
/**
|
|
160
177
|
* Derive the navigation state (pathname + search) a URL renders with.
|
|
161
178
|
*
|
|
162
|
-
* Pure
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* explicitly to renderRoot/wrapPayload, so a render never depends on the
|
|
166
|
-
* 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).
|
|
167
182
|
*/
|
|
168
183
|
export function deriveNavigationState(url: string): NavigationState {
|
|
169
184
|
// Params are not part of it. They travel with the payload and are published
|
|
@@ -171,7 +186,7 @@ export function deriveNavigationState(url: string): NavigationState {
|
|
|
171
186
|
// also what clears the previous route's — a route with no params of its own
|
|
172
187
|
// still publishes an empty record (TIM-1294/TIM-1297, and the clearing
|
|
173
188
|
// requirement from TIM-1285).
|
|
174
|
-
const parsed =
|
|
189
|
+
const parsed = parseRouterUrl(url);
|
|
175
190
|
return { pathname: parsed.pathname || '/', search: parsed.search };
|
|
176
191
|
}
|
|
177
192
|
|
|
@@ -183,6 +198,9 @@ export function createNavigationCommitter(deps: {
|
|
|
183
198
|
}): NavigationCommitter {
|
|
184
199
|
const { segmentCache, historyStack } = deps;
|
|
185
200
|
|
|
201
|
+
// See `committedSegmentInfo`. Written only by a commit.
|
|
202
|
+
let committedSegmentInfo: SegmentInfo[] | null = null;
|
|
203
|
+
|
|
186
204
|
// See `reportStatusPageRendered`: a status page that commits with no
|
|
187
205
|
// navigation to consume the report still empties the cache.
|
|
188
206
|
_setOnStatusPageRendered(() => segmentCache.clear());
|
|
@@ -195,8 +213,7 @@ export function createNavigationCommitter(deps: {
|
|
|
195
213
|
* navigation. What the flag gates is which parts get serialized — see
|
|
196
214
|
* `currentStateTree`.
|
|
197
215
|
*/
|
|
198
|
-
function updateSegmentCache(segmentInfo: SegmentInfo[]
|
|
199
|
-
if (!segmentInfo || segmentInfo.length === 0) return;
|
|
216
|
+
function updateSegmentCache(segmentInfo: SegmentInfo[]): void {
|
|
200
217
|
const tree = buildSegmentTree(segmentInfo);
|
|
201
218
|
if (tree) {
|
|
202
219
|
segmentCache.set('/', tree);
|
|
@@ -204,7 +221,9 @@ export function createNavigationCommitter(deps: {
|
|
|
204
221
|
}
|
|
205
222
|
|
|
206
223
|
return {
|
|
207
|
-
|
|
224
|
+
committedSegmentInfo: () => committedSegmentInfo,
|
|
225
|
+
isSegmentReuseSuppressed: () => segmentCache.isReuseSuppressed(),
|
|
226
|
+
restoreSegmentReuse: () => segmentCache.restoreReuse(),
|
|
208
227
|
|
|
209
228
|
/**
|
|
210
229
|
* The X-Timber-State-Tree to send with the next RSC request.
|
|
@@ -236,9 +255,13 @@ export function createNavigationCommitter(deps: {
|
|
|
236
255
|
* the URL and is what the incoming tree is *rendered* with, plus a
|
|
237
256
|
* `commit` thunk that performs the writes that make a page current:
|
|
238
257
|
* 1. Segment cache — update from server-provided segment metadata
|
|
239
|
-
* 2.
|
|
258
|
+
* 2. The current page's segment metadata (`committedSegmentInfo`)
|
|
240
259
|
* 3. History stack — store the payload for instant back/forward replay
|
|
241
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
|
+
*
|
|
242
265
|
* Nothing is written until `commit()` runs, and on a transitioned
|
|
243
266
|
* navigation it runs only once the transition is known to have won — see
|
|
244
267
|
* `renderViaTransition` and `NavigationRoot`. A navigation superseded
|
|
@@ -281,12 +304,12 @@ export function createNavigationCommitter(deps: {
|
|
|
281
304
|
segmentCache.clear();
|
|
282
305
|
}
|
|
283
306
|
|
|
284
|
-
|
|
307
|
+
committedSegmentInfo = storedSegmentInfo(segmentInfo) ?? null;
|
|
285
308
|
|
|
286
309
|
historyStack.push(url, {
|
|
287
310
|
payload,
|
|
288
311
|
params: opts.params,
|
|
289
|
-
segmentInfo:
|
|
312
|
+
segmentInfo: committedSegmentInfo,
|
|
290
313
|
});
|
|
291
314
|
},
|
|
292
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
|
/**
|