@timber-js/app 0.2.0-alpha.185 → 0.2.0-alpha.186
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/{actions-O_LsyCE4.js → actions-C-Rw9vPc.js} +3 -3
- package/dist/_chunks/{actions-O_LsyCE4.js.map → actions-C-Rw9vPc.js.map} +1 -1
- package/dist/_chunks/als-slots-mFweg276.js +27 -0
- package/dist/_chunks/als-slots-mFweg276.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
- package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
- package/dist/_chunks/{cache-api-B-lhk9p4.js → cache-api-Cd0VZ_Pd.js} +3 -3
- package/dist/_chunks/{cache-api-B-lhk9p4.js.map → cache-api-Cd0VZ_Pd.js.map} +1 -1
- package/dist/_chunks/cli-schema-sync-CKgHC2MB.js +1857 -0
- package/dist/_chunks/cli-schema-sync-CKgHC2MB.js.map +1 -0
- package/dist/_chunks/{cloudflare-CnT5Lr7U.js → cloudflare-Cs0uZXea.js} +89 -12
- package/dist/_chunks/{cloudflare-CnT5Lr7U.js.map → cloudflare-Cs0uZXea.js.map} +1 -1
- package/dist/_chunks/error-boundary-DpYRI_I1.js +330 -0
- package/dist/_chunks/error-boundary-DpYRI_I1.js.map +1 -0
- package/dist/_chunks/{fast-hash-D6hIVt1Y.js → fast-hash-C-tVYrLb.js} +6 -1
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/{logger-AWfuX-KJ.js → logger-N7e5auP0.js} +9 -13
- package/dist/_chunks/logger-N7e5auP0.js.map +1 -0
- package/dist/_chunks/navigation-root-B29qg0_T.js +274 -0
- package/dist/_chunks/navigation-root-B29qg0_T.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/{plugin-context---kTF5v8.js → plugin-context-DEGLSJs3.js} +2 -1
- package/dist/_chunks/plugin-context-DEGLSJs3.js.map +1 -0
- package/dist/_chunks/{router-ref-CtmF-aPv.js → router-ref-DuYuV_0Q.js} +2 -2
- package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
- package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
- package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
- package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
- package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/{segment-classify-Byy425ng.js → segment-classify-C539Pa2O.js} +23 -2
- package/dist/_chunks/{segment-classify-Byy425ng.js.map → segment-classify-C539Pa2O.js.map} +1 -1
- package/dist/_chunks/{canonicalize-DQHyFClh.js → segment-keys-BawYuNFO.js} +61 -2
- package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
- package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
- package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
- package/dist/_chunks/{ssr-data-BOWsq18U.js → ssr-data-14MXm7Pj.js} +17 -2
- package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
- package/dist/_chunks/use-segment-params-ClyUNq4d.js +128 -0
- package/dist/_chunks/use-segment-params-ClyUNq4d.js.map +1 -0
- package/dist/_chunks/{walkers-_6zKFlch.js → walkers-BhhwI9TD.js} +21 -87
- package/dist/_chunks/walkers-BhhwI9TD.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +37 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -1
- package/dist/adapters/cloudflare-dev.js +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +1 -1
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +2 -3
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +57 -1
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/types.d.ts +13 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/fast-hash.d.ts +5 -0
- package/dist/cache/fast-hash.d.ts.map +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/cli.js +2 -2
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
- package/dist/client/browser-entry/hydrate.d.ts +20 -9
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/post-hydration.d.ts +4 -1
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
- package/dist/client/browser-entry/router-init.d.ts +3 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -1
- package/dist/client/browser-entry/rsc-stream.d.ts +8 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -1
- package/dist/client/error-boundary.d.ts +1 -0
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +1 -162
- package/dist/client/history.d.ts +13 -6
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.js +18 -11
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +4 -3
- package/dist/client/internal.d.ts.map +1 -1
- package/dist/client/internal.js +865 -306
- package/dist/client/internal.js.map +1 -1
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +2 -2
- package/dist/client/navigation-commit.d.ts +71 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +37 -20
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +63 -23
- package/dist/client/navigation-root.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +129 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +55 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +84 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +207 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -182
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -25
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +79 -34
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/ssr-data.d.ts +6 -0
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +10 -1
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/top-loader.d.ts +2 -1
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-segment-params.d.ts +18 -8
- package/dist/client/use-segment-params.d.ts.map +1 -1
- package/dist/cookies/index.js +3 -3
- package/dist/cookies/index.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +906 -321
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +31 -0
- package/dist/plugin-context.d.ts.map +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +1 -1
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/request-dep/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +9 -0
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +136 -8
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-types.d.ts +18 -0
- package/dist/routing/codegen-types.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/index.js +3 -3
- package/dist/routing/interception.d.ts +235 -6
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/manifest-codegen.d.ts.map +1 -1
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +33 -0
- package/dist/routing/segment-classify.d.ts.map +1 -1
- package/dist/routing/segment-keys.d.ts +95 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/walkers.d.ts +6 -0
- package/dist/routing/walkers.d.ts.map +1 -1
- package/dist/search-params/define.d.ts +0 -6
- package/dist/search-params/define.d.ts.map +1 -1
- package/dist/search-params/index.js +176 -2
- package/dist/search-params/index.js.map +1 -1
- package/dist/segment-params/define.d.ts +0 -6
- package/dist/segment-params/define.d.ts.map +1 -1
- package/dist/segment-params/index.js +69 -1
- package/dist/segment-params/index.js.map +1 -0
- package/dist/server/actions.d.ts +6 -3
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +2 -1
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +13 -1
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +14 -3
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/index.js +2 -2
- package/dist/server/internal.js +393 -212
- package/dist/server/internal.js.map +1 -1
- package/dist/server/param-coercion.d.ts +10 -1
- package/dist/server/param-coercion.d.ts.map +1 -1
- package/dist/server/pipeline-helpers.d.ts +0 -18
- package/dist/server/pipeline-helpers.d.ts.map +1 -1
- package/dist/server/pipeline-interception.d.ts +59 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts.map +1 -1
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +11 -0
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +48 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +32 -2
- 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 +13 -0
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +14 -2
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +2 -10
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -2
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +3 -2
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +2 -0
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/skippable-prefix.d.ts +23 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +70 -8
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +6 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +24 -13
- package/dist/server/ssr-wrappers.d.ts.map +1 -1
- package/dist/server/state-tree-diff.d.ts +6 -27
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +6 -0
- package/dist/server/static-generator.d.ts.map +1 -1
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +41 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +80 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +108 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +25 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +59 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +51 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/docs/api/31-api-client.mdx +4 -2
- package/docs/learn/02-pages-and-layouts.mdx +1 -1
- package/docs/learn/11-error-handling.mdx +2 -0
- package/docs/learn/12-client-navigation.mdx +2 -2
- package/docs/learn/14-deploying.mdx +23 -0
- package/docs/more/01-advanced-routing.mdx +172 -2
- package/docs/more/04-metadata-and-fonts.mdx +1 -1
- package/package.json +2 -2
- package/src/adapters/build-output-helper.ts +116 -3
- package/src/adapters/cloudflare.ts +86 -11
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro.ts +6 -6
- package/src/adapters/shared.ts +196 -21
- package/src/adapters/types.ts +13 -1
- package/src/cache/fast-hash.ts +5 -0
- package/src/client/browser-entry/action-dispatch.ts +9 -4
- package/src/client/browser-entry/hydrate.ts +40 -29
- package/src/client/browser-entry/index.ts +15 -1
- package/src/client/browser-entry/post-hydration.ts +10 -9
- package/src/client/browser-entry/router-init.ts +104 -48
- package/src/client/browser-entry/rsc-stream.ts +11 -2
- package/src/client/error-boundary.tsx +20 -15
- package/src/client/history.ts +13 -6
- package/src/client/internal.ts +4 -3
- package/src/client/link.tsx +55 -8
- package/src/client/navigation-api.ts +3 -3
- package/src/client/navigation-commit.ts +174 -0
- package/src/client/navigation-context.ts +40 -67
- package/src/client/navigation-root.tsx +326 -101
- package/src/client/params-context.ts +192 -0
- package/src/client/router-effects.ts +231 -0
- package/src/client/router-lifecycle.ts +288 -0
- package/src/client/router-pipeline.ts +389 -0
- package/src/client/router-ref.ts +1 -1
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +230 -0
- package/src/client/router.ts +242 -707
- package/src/client/rsc-fetch.ts +169 -102
- package/src/client/segment-cache.ts +121 -44
- package/src/client/ssr-data.ts +6 -0
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +14 -1
- package/src/client/top-loader.tsx +2 -1
- package/src/client/unload-guard.ts +34 -2
- package/src/client/use-cookie.ts +9 -2
- package/src/client/use-router.ts +1 -1
- package/src/client/use-segment-params.ts +41 -18
- package/src/index.ts +5 -1
- package/src/plugin-context.ts +32 -0
- package/src/plugins/adapter-build.ts +4 -0
- package/src/plugins/build-manifest.ts +34 -13
- package/src/plugins/entries.ts +4 -0
- package/src/plugins/fonts.ts +11 -8
- package/src/plugins/request-dep/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +59 -2
- package/src/plugins/static-build.ts +315 -73
- package/src/routing/codegen-types.ts +18 -0
- package/src/routing/codegen.ts +50 -10
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/interception.ts +896 -50
- package/src/routing/manifest-codegen.ts +5 -3
- package/src/routing/scanner.ts +114 -89
- package/src/routing/segment-classify.ts +57 -0
- package/src/routing/segment-keys.ts +146 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/walkers.ts +8 -0
- package/src/search-params/define.ts +6 -29
- package/src/segment-params/define.ts +4 -27
- package/src/server/action-handler.ts +3 -1
- package/src/server/actions.ts +6 -3
- package/src/server/als-registry.ts +2 -1
- package/src/server/build-manifest.ts +14 -1
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +115 -0
- package/src/server/default-status-page.ts +127 -0
- package/src/server/deny-renderer.ts +81 -20
- package/src/server/head-response.ts +54 -0
- package/src/server/param-coercion.ts +48 -18
- package/src/server/pipeline-helpers.ts +0 -45
- package/src/server/pipeline-interception.ts +81 -32
- package/src/server/pipeline-outcome.ts +2 -4
- package/src/server/pipeline-phases.ts +68 -16
- package/src/server/pipeline.ts +57 -10
- package/src/server/prebuilt-runtime.ts +4 -4
- package/src/server/publish-params.ts +42 -0
- package/src/server/request-context.ts +97 -18
- package/src/server/route-element-builder.ts +89 -98
- package/src/server/route-handler.ts +8 -8
- package/src/server/route-matcher.ts +21 -9
- package/src/server/rsc-cache-key-guard.ts +170 -0
- package/src/server/rsc-entry/api-handler.ts +6 -8
- package/src/server/rsc-entry/error-renderer.ts +64 -25
- package/src/server/rsc-entry/helpers.ts +31 -16
- package/src/server/rsc-entry/index.ts +36 -28
- package/src/server/rsc-entry/render-route.ts +9 -4
- package/src/server/rsc-entry/revalidate-renderer.ts +1 -1
- package/src/server/rsc-entry/rsc-payload.ts +14 -25
- package/src/server/rsc-entry/rsc-stream.ts +4 -3
- package/src/server/rsc-entry/ssr-renderer.ts +13 -9
- package/src/server/skippable-prefix.ts +92 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +253 -156
- package/src/server/ssr-bridge-types.ts +6 -0
- package/src/server/ssr-entry.ts +12 -4
- package/src/server/ssr-wrappers.tsx +33 -32
- package/src/server/state-tree-diff.ts +14 -55
- package/src/server/static-generator.ts +65 -27
- package/src/server/static-not-found.ts +134 -0
- package/src/shared/als-slots.ts +72 -0
- package/src/shared/base-path.ts +80 -0
- package/src/shared/param-value.ts +244 -0
- package/src/shared/payload-root.ts +151 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +31 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +60 -0
- package/src/shared/slot-params.ts +111 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/dist/_chunks/build-output-helper-DOGYFb_X.js +0 -196
- package/dist/_chunks/build-output-helper-DOGYFb_X.js.map +0 -1
- package/dist/_chunks/canonicalize-DQHyFClh.js.map +0 -1
- package/dist/_chunks/cli-schema-sync-BTWEKJXo.js +0 -668
- package/dist/_chunks/cli-schema-sync-BTWEKJXo.js.map +0 -1
- package/dist/_chunks/define-COtkxMRT.js +0 -191
- package/dist/_chunks/define-COtkxMRT.js.map +0 -1
- package/dist/_chunks/define-c4au4I9R.js +0 -82
- package/dist/_chunks/define-c4au4I9R.js.map +0 -1
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +0 -1
- package/dist/_chunks/logger-AWfuX-KJ.js.map +0 -1
- package/dist/_chunks/navigation-root-bUDZLw74.js +0 -124
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +0 -1
- package/dist/_chunks/plugin-context---kTF5v8.js.map +0 -1
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +0 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +0 -1
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +0 -151
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +0 -1
- package/dist/_chunks/walkers-_6zKFlch.js.map +0 -1
- package/dist/client/error-boundary.js.map +0 -1
- package/dist/plugins/request-dep.d.ts +0 -32
- package/dist/plugins/request-dep.d.ts.map +0 -1
- package/src/plugins/request-dep.ts +0 -499
|
@@ -97,8 +97,8 @@ export interface NavigationApiController {
|
|
|
97
97
|
/**
|
|
98
98
|
* Resolve the deferred promise created by setRouterNavigating(true),
|
|
99
99
|
* clearing the browser's native loading state. Call this when the
|
|
100
|
-
* navigation fully completes —
|
|
101
|
-
*
|
|
100
|
+
* navigation fully completes — the same finally block in router.navigate
|
|
101
|
+
* that clears the router's pending store.
|
|
102
102
|
*/
|
|
103
103
|
completeRouterNavigation: () => void;
|
|
104
104
|
|
|
@@ -147,7 +147,7 @@ export function setupNavigationApi(callbacks: NavigationApiCallbacks): Navigatio
|
|
|
147
147
|
// setRouterNavigating(true) is called, resolved by completeRouterNavigation().
|
|
148
148
|
// The navigate event handler intercepts with this promise so the browser's
|
|
149
149
|
// native loading state (tab spinner) stays active until the navigation
|
|
150
|
-
// completes —
|
|
150
|
+
// completes — the same lifecycle the TopLoader is driven by.
|
|
151
151
|
let routerNavDeferred: { promise: Promise<void>; resolve: () => void } | null = null;
|
|
152
152
|
|
|
153
153
|
function handleNavigate(event: NavigateEvent): void {
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What it means for a page to be "current" on the client.
|
|
3
|
+
*
|
|
4
|
+
* One module owns every write that makes a navigation's destination the
|
|
5
|
+
* current page, and the read that describes the current page back to the
|
|
6
|
+
* server. Keeping them together is the point: `X-Timber-State-Tree` is
|
|
7
|
+
* derived from the segment cache, so the thing that publishes and the thing
|
|
8
|
+
* that reports have to agree about when a page becomes current.
|
|
9
|
+
*
|
|
10
|
+
* See design/19-client-navigation.md §"State Update Invariants".
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { buildSegmentTree, type SegmentCache } from './segment-cache.js';
|
|
14
|
+
import type { HistoryStack } from './history.js';
|
|
15
|
+
import type { SegmentInfo, StateTree } from '../shared/segment-info.js';
|
|
16
|
+
import type { ParamsSource } from '../shared/payload-root.js';
|
|
17
|
+
import { setNavigationState, type NavigationState } from './navigation-context.js';
|
|
18
|
+
|
|
19
|
+
/** Everything a commit needs to describe the page it makes current. */
|
|
20
|
+
export interface NavigationCommitInput {
|
|
21
|
+
payload: unknown;
|
|
22
|
+
/** The params that payload published — replayed with it on popstate. */
|
|
23
|
+
params: ParamsSource;
|
|
24
|
+
/**
|
|
25
|
+
* The rendered chain's metadata, or null/undefined when this commit
|
|
26
|
+
* carries none at all — a revalidation payload, or a history entry
|
|
27
|
+
* stored before the channel existed.
|
|
28
|
+
*
|
|
29
|
+
* An empty *array* is a different statement from an absent one: the
|
|
30
|
+
* server rendered a route with no layout-bearing segments (a layoutless
|
|
31
|
+
* app — the missing-root-layout check is a warning, not an error), so
|
|
32
|
+
* the correct tree is the empty one. Collapsing the two left the
|
|
33
|
+
* departing route's tree in place, which `treePaths` then reported as
|
|
34
|
+
* mounted — enough to select an intercepting rewrite whose slot is not
|
|
35
|
+
* on screen (TIM-1282).
|
|
36
|
+
*/
|
|
37
|
+
segmentInfo?: SegmentInfo[] | null;
|
|
38
|
+
/** When true, clear the segment cache if segmentInfo is absent
|
|
39
|
+
* (popstate replay for entries without layout metadata). */
|
|
40
|
+
clearSegmentCacheOnEmpty?: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A navigation's destination, split into what a render needs and what a
|
|
45
|
+
* commit publishes.
|
|
46
|
+
*/
|
|
47
|
+
export interface PreparedNavigation {
|
|
48
|
+
/** The state the incoming tree renders with. Pure — safe before winning. */
|
|
49
|
+
navState: NavigationState;
|
|
50
|
+
/** Publishes the destination. Call only once the render has won. */
|
|
51
|
+
commit: () => void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface NavigationCommitter {
|
|
55
|
+
prepareNavigation(url: string, opts: NavigationCommitInput): PreparedNavigation;
|
|
56
|
+
currentStateTree(): StateTree | undefined;
|
|
57
|
+
updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Derive the navigation state (pathname + search) a URL renders with.
|
|
62
|
+
*
|
|
63
|
+
* Pure: publishing it — the module-level fallback for tests and SSR, and the
|
|
64
|
+
* globalThis bridge — is `prepareNavigation`'s commit, which runs only once
|
|
65
|
+
* the render is known to have won (TIM-1301). Callers pass the returned value
|
|
66
|
+
* explicitly to renderRoot/wrapPayload, so a render never depends on the
|
|
67
|
+
* publish having happened first.
|
|
68
|
+
*/
|
|
69
|
+
export function deriveNavigationState(url: string): NavigationState {
|
|
70
|
+
// Params are not part of it. They travel with the payload and are published
|
|
71
|
+
// by the one client-owned `ParamsProvider` as the new tree renders, which is
|
|
72
|
+
// also what clears the previous route's — a route with no params of its own
|
|
73
|
+
// still publishes an empty record (TIM-1294/TIM-1297, and the clearing
|
|
74
|
+
// requirement from TIM-1285).
|
|
75
|
+
const parsed = new URL(url, 'http://localhost');
|
|
76
|
+
return { pathname: parsed.pathname || '/', search: parsed.search };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function createNavigationCommitter(deps: {
|
|
80
|
+
segmentCache: SegmentCache;
|
|
81
|
+
historyStack: HistoryStack;
|
|
82
|
+
/** Read at call time — the router's `clientSegmentCache` opt-in. */
|
|
83
|
+
clientSegmentCache: () => boolean | undefined;
|
|
84
|
+
}): NavigationCommitter {
|
|
85
|
+
const { segmentCache, historyStack } = deps;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Update the segment cache from server-provided segment metadata.
|
|
89
|
+
*
|
|
90
|
+
* Runs whether or not `clientSegmentCache` is enabled: the tree is also
|
|
91
|
+
* where the mounted tree paths come from, and those cross on every
|
|
92
|
+
* navigation. What the flag gates is which parts get serialized — see
|
|
93
|
+
* `currentStateTree`.
|
|
94
|
+
*/
|
|
95
|
+
function updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void {
|
|
96
|
+
if (!segmentInfo || segmentInfo.length === 0) return;
|
|
97
|
+
const tree = buildSegmentTree(segmentInfo);
|
|
98
|
+
if (tree) {
|
|
99
|
+
segmentCache.set('/', tree);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
updateSegmentCache,
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The X-Timber-State-Tree to send with the next RSC request.
|
|
108
|
+
*
|
|
109
|
+
* Two different things travel on one header. `segments`/`slots` are the
|
|
110
|
+
* caching opt-in and are omitted unless `clientSegmentCache` is on.
|
|
111
|
+
* `treePaths` is how the server learns which route is actually mounted,
|
|
112
|
+
* which stops being derivable from the address bar as soon as a modal is
|
|
113
|
+
* open — so it crosses regardless (TIM-1282). Undefined when there is
|
|
114
|
+
* nothing to say, so a no-op header never enters the `_rsc` cache key.
|
|
115
|
+
*
|
|
116
|
+
* Reads what the last *committed* navigation published, so a superseded
|
|
117
|
+
* navigation's destination can never end up describing the mounted tree
|
|
118
|
+
* (TIM-1301).
|
|
119
|
+
*/
|
|
120
|
+
currentStateTree(): StateTree | undefined {
|
|
121
|
+
const tree = segmentCache.serializeStateTree();
|
|
122
|
+
if (deps.clientSegmentCache()) return tree;
|
|
123
|
+
return tree.treePaths ? { segments: [], treePaths: tree.treePaths } : undefined;
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Prepare all navigation-owned state for a new page — without publishing
|
|
128
|
+
* any of it. Every code path that changes the "current page" must go
|
|
129
|
+
* through this function, which is what makes "forgot a field" impossible
|
|
130
|
+
* by construction.
|
|
131
|
+
*
|
|
132
|
+
* Returns the destination's `NavigationState`, which is a pure function of
|
|
133
|
+
* the URL and is what the incoming tree is *rendered* with, plus a
|
|
134
|
+
* `commit` thunk that performs the writes that make a page current:
|
|
135
|
+
* 1. Segment cache — update from server-provided segment metadata
|
|
136
|
+
* 2. Navigation state — pathname/search for usePathname/useSearchParams
|
|
137
|
+
* 3. History stack — store the payload for instant back/forward replay
|
|
138
|
+
*
|
|
139
|
+
* Nothing is written until `commit()` runs, and on a transitioned
|
|
140
|
+
* navigation it runs only once the transition is known to have won — see
|
|
141
|
+
* `renderViaTransition` and `NavigationRoot`. A navigation superseded
|
|
142
|
+
* while its payload was in flight never calls it, so the cache, the
|
|
143
|
+
* pathname the client reports and the history stack all keep describing
|
|
144
|
+
* the route still on screen (TIM-1301).
|
|
145
|
+
*
|
|
146
|
+
* Callers with state of their own to publish — the address bar, the
|
|
147
|
+
* client's record of the mounted tree — wrap this thunk rather than
|
|
148
|
+
* commit beside it, so there stays exactly one moment at which a page
|
|
149
|
+
* becomes current.
|
|
150
|
+
*/
|
|
151
|
+
prepareNavigation(url: string, opts: NavigationCommitInput): PreparedNavigation {
|
|
152
|
+
const navState = deriveNavigationState(url);
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
navState,
|
|
156
|
+
commit() {
|
|
157
|
+
if (opts.segmentInfo && opts.segmentInfo.length > 0) {
|
|
158
|
+
updateSegmentCache(opts.segmentInfo);
|
|
159
|
+
} else if (opts.segmentInfo?.length === 0 || opts.clearSegmentCacheOnEmpty) {
|
|
160
|
+
segmentCache.clear();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
setNavigationState(navState);
|
|
164
|
+
|
|
165
|
+
historyStack.push(url, {
|
|
166
|
+
payload: opts.payload,
|
|
167
|
+
params: opts.params,
|
|
168
|
+
segmentInfo: opts.segmentInfo,
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
@@ -3,17 +3,19 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* NavigationContext — React context for navigation state.
|
|
5
5
|
*
|
|
6
|
-
* Holds the current
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
6
|
+
* Holds the current pathname and search, updated atomically with the RSC
|
|
7
|
+
* tree on each navigation. This replaces the previous useSyncExternalStore
|
|
8
|
+
* approach for usePathname() and useSearchParams(), which suffered from a
|
|
9
|
+
* timing gap: the new tree could commit before the external store
|
|
10
|
+
* re-renders fired, causing a frame where both old and new active states
|
|
11
|
+
* were visible simultaneously.
|
|
12
|
+
*
|
|
13
|
+
* Segment params are NOT here — see the note on NavigationState below.
|
|
12
14
|
*
|
|
13
15
|
* By wrapping the RSC payload element in NavigationProvider inside
|
|
14
16
|
* renderRoot(), the context value and the element tree are passed to
|
|
15
17
|
* reactRoot.render() in the same call — atomic by construction.
|
|
16
|
-
* All consumers (
|
|
18
|
+
* All consumers (usePathname, useSearchParams) see the new values in the
|
|
17
19
|
* same render pass as the new tree.
|
|
18
20
|
*
|
|
19
21
|
* During SSR, no NavigationProvider is mounted. Hooks fall back to
|
|
@@ -40,13 +42,23 @@
|
|
|
40
42
|
*/
|
|
41
43
|
|
|
42
44
|
import React, { createElement, type ReactNode } from 'react';
|
|
45
|
+
import type { SlotParamsRecord } from '../shared/slot-params.js';
|
|
43
46
|
|
|
44
47
|
// ---------------------------------------------------------------------------
|
|
45
48
|
// Context type
|
|
46
49
|
// ---------------------------------------------------------------------------
|
|
47
50
|
|
|
51
|
+
/**
|
|
52
|
+
* What the browser knows about the current location.
|
|
53
|
+
*
|
|
54
|
+
* Params are deliberately absent: they are a property of the tree the server
|
|
55
|
+
* rendered, not of the address bar, and they now travel inside the payload as
|
|
56
|
+
* the payload root. Keeping a copy here meant the router had to thread
|
|
57
|
+
* the record from a response header into context on every path — navigation,
|
|
58
|
+
* traversal, prefetch, revalidation — and each of those was a place to drop it
|
|
59
|
+
* (TIM-1294).
|
|
60
|
+
*/
|
|
48
61
|
export interface NavigationState {
|
|
49
|
-
params: Record<string, string | string[]>;
|
|
50
62
|
pathname: string;
|
|
51
63
|
search: string;
|
|
52
64
|
}
|
|
@@ -68,15 +80,10 @@ export interface NavigationState {
|
|
|
68
80
|
* reads from context B. globalThis guarantees a single instance.
|
|
69
81
|
*
|
|
70
82
|
* See design/27-chunking-strategy.md §"Singleton Safety"
|
|
71
|
-
*
|
|
72
|
-
* NOTE: Despite similar naming, `usePendingNavigationUrl()` here is an
|
|
73
|
-
* internal helper — the public hook is `usePendingNavigation()` in
|
|
74
|
-
* use-pending-navigation.ts.
|
|
75
83
|
*/
|
|
76
84
|
|
|
77
85
|
// Symbol keys for globalThis storage — prevents collisions with user code
|
|
78
86
|
const NAV_CTX_KEY = Symbol.for('__timber_nav_ctx');
|
|
79
|
-
const PENDING_CTX_KEY = Symbol.for('__timber_pending_nav_ctx');
|
|
80
87
|
|
|
81
88
|
function getOrCreateContext(): React.Context<NavigationState | null> | undefined {
|
|
82
89
|
const existing = (globalThis as Record<symbol, unknown>)[NAV_CTX_KEY] as
|
|
@@ -95,7 +102,7 @@ function getOrCreateContext(): React.Context<NavigationState | null> | undefined
|
|
|
95
102
|
/**
|
|
96
103
|
* Read the navigation context. Returns null during SSR (no provider)
|
|
97
104
|
* or in the RSC environment (no context available).
|
|
98
|
-
* Internal — used by
|
|
105
|
+
* Internal — used by usePathname() and useSearchParams().
|
|
99
106
|
*/
|
|
100
107
|
export function useNavigationContext(): NavigationState | null {
|
|
101
108
|
const ctx = getOrCreateContext();
|
|
@@ -155,7 +162,7 @@ const NAV_STATE_KEY = Symbol.for('__timber_nav_state');
|
|
|
155
162
|
function _getNavStateStore(): { current: NavigationState } {
|
|
156
163
|
const g = globalThis as Record<symbol, unknown>;
|
|
157
164
|
if (!g[NAV_STATE_KEY]) {
|
|
158
|
-
g[NAV_STATE_KEY] = { current: {
|
|
165
|
+
g[NAV_STATE_KEY] = { current: { pathname: '/', search: '' } };
|
|
159
166
|
}
|
|
160
167
|
return g[NAV_STATE_KEY] as { current: NavigationState };
|
|
161
168
|
}
|
|
@@ -169,59 +176,25 @@ export function getNavigationState(): NavigationState {
|
|
|
169
176
|
}
|
|
170
177
|
|
|
171
178
|
// ---------------------------------------------------------------------------
|
|
172
|
-
// Pending
|
|
179
|
+
// Pending navigation state lives in the router, not here
|
|
173
180
|
// ---------------------------------------------------------------------------
|
|
174
181
|
|
|
175
182
|
/**
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* (
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
(globalThis as Record<symbol, unknown>)[PENDING_CTX_KEY] = ctx;
|
|
194
|
-
return ctx;
|
|
195
|
-
}
|
|
196
|
-
return undefined;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Read the pending navigation URL from context.
|
|
201
|
-
* Returns null during SSR (no provider) or in the RSC environment.
|
|
202
|
-
*/
|
|
203
|
-
export function usePendingNavigationUrl(): string | null {
|
|
204
|
-
const ctx = getOrCreatePendingContext();
|
|
205
|
-
if (!ctx) return null;
|
|
206
|
-
if (typeof React.useContext !== 'function') return null;
|
|
207
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks -- conditional on environment, not render path
|
|
208
|
-
return React.useContext(ctx);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Provider for the pending navigation URL. Wraps children with
|
|
213
|
-
* the pending context Provider.
|
|
183
|
+
* There was a second React context here — `PendingNavigationContext`, holding
|
|
184
|
+
* the in-flight navigation URL, provided by `NavigationRoot` out of a
|
|
185
|
+
* `useState` — plus a `usePendingNavigationUrl()` reader for it. Both are gone
|
|
186
|
+
* (TIM-1307).
|
|
187
|
+
*
|
|
188
|
+
* Nothing read them. `usePendingNavigation()` (use-pending-navigation.ts) and
|
|
189
|
+
* `TopLoader` both subscribe to the router's external pending store via
|
|
190
|
+
* `useSyncExternalStore`: sync priority, immune to transition entanglement,
|
|
191
|
+
* and cleared by `runNavigation`'s supersession-guarded `finally` (TIM-1034).
|
|
192
|
+
* The context was a parallel representation of the same fact that no consumer
|
|
193
|
+
* ever migrated to, and one that could not even agree with the store — a
|
|
194
|
+
* navigation superseded by a cached popstate replay left its URL set until the
|
|
195
|
+
* next full navigation, because the staleness guard skipped the clear and no
|
|
196
|
+
* other path touched it.
|
|
197
|
+
*
|
|
198
|
+
* One representation, and it is the router's. See
|
|
199
|
+
* design/19-client-navigation.md §"How Pending State Works".
|
|
214
200
|
*/
|
|
215
|
-
export function PendingNavigationProvider({
|
|
216
|
-
value,
|
|
217
|
-
children,
|
|
218
|
-
}: {
|
|
219
|
-
value: string | null;
|
|
220
|
-
children?: ReactNode;
|
|
221
|
-
}): React.ReactElement {
|
|
222
|
-
const ctx = getOrCreatePendingContext();
|
|
223
|
-
if (!ctx) {
|
|
224
|
-
return children as React.ReactElement;
|
|
225
|
-
}
|
|
226
|
-
return createElement(ctx.Provider, { value }, children);
|
|
227
|
-
}
|