@timber-js/app 0.2.0-alpha.184 → 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-C539Pa2O.js.map +1 -0
- 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-BtTlKviE.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 +872 -305
- 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 +39 -16
- 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 +915 -320
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +33 -1
- 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 +149 -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/types.d.ts +1 -3
- package/dist/routing/types.d.ts.map +1 -1
- 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-boundary.d.ts +4 -7
- package/dist/server/deny-boundary.d.ts.map +1 -1
- 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 +528 -373
- 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/prebuilt-builder.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +0 -12
- package/dist/server/primitives.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/sitemap-generator.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/server/status-code-resolver.d.ts +3 -10
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- 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/dist/shims/navigation-client.d.ts +8 -19
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +0 -1
- package/dist/shims/navigation.d.ts.map +1 -1
- 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 +4 -3
- 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 -690
- package/src/client/rsc-fetch.ts +180 -122
- 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 +34 -1
- 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 +60 -3
- package/src/plugins/static-build.ts +333 -63
- 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 +6 -9
- package/src/routing/scanner.ts +114 -113
- 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/types.ts +1 -3
- 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-boundary.ts +5 -31
- package/src/server/deny-renderer.ts +83 -22
- 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 +3 -5
- package/src/server/pipeline-phases.ts +68 -16
- package/src/server/pipeline.ts +57 -10
- package/src/server/prebuilt-builder.ts +1 -7
- package/src/server/prebuilt-runtime.ts +4 -4
- package/src/server/primitives.ts +0 -18
- 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 +12 -7
- 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/sitemap-generator.ts +1 -7
- 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 +67 -45
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +4 -47
- 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/src/shims/navigation-client.ts +8 -26
- package/src/shims/navigation.ts +0 -4
- 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-D3naS3eH.js +0 -688
- package/dist/_chunks/cli-schema-sync-D3naS3eH.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/segment-classify-Byy425ng.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-BtTlKviE.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
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skippable-prefix truncation.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `route-element-builder.ts`, which was over the 500-line limit
|
|
5
|
+
* (design/18-build-system.md). This is a self-contained question — "may this
|
|
6
|
+
* segment's layout still be skipped, given what its slots would render?" — with
|
|
7
|
+
* no dependency on element construction.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { ManifestSegmentNode } from './route-matcher.js';
|
|
11
|
+
import type { RouteMatch } from './pipeline.js';
|
|
12
|
+
import { shouldSkipSlot, type ClientStateTree } from './state-tree-diff.js';
|
|
13
|
+
import { consumedUrlParts } from './chain-url-parts.js';
|
|
14
|
+
import { computeSlotKey } from '../routing/segment-keys.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Truncate the skippable prefix when a skippable layout has slots whose
|
|
18
|
+
* content changed between the departing and destination URLs (TIM-1232).
|
|
19
|
+
*
|
|
20
|
+
* Without this, changed slots at skipped layouts are never sent to the
|
|
21
|
+
* client — the `continue` in the main loop skips slot resolution entirely.
|
|
22
|
+
* Removing the segment from the skippable set forces it to render with
|
|
23
|
+
* its slots. The prefix must stay contiguous, so all segments after the
|
|
24
|
+
* first changed-slot segment are also removed.
|
|
25
|
+
*/
|
|
26
|
+
export function truncateSkippableForChangedSlots(
|
|
27
|
+
skippableSet: Set<number>,
|
|
28
|
+
segments: ManifestSegmentNode[],
|
|
29
|
+
segmentKeys: string[],
|
|
30
|
+
match: RouteMatch,
|
|
31
|
+
clientStateTree: ClientStateTree,
|
|
32
|
+
req: Request
|
|
33
|
+
): void {
|
|
34
|
+
const departingUrl = req.headers.get('X-Timber-URL');
|
|
35
|
+
let depParsed: URL | null = null;
|
|
36
|
+
if (departingUrl) {
|
|
37
|
+
try {
|
|
38
|
+
depParsed = new URL(departingUrl, 'http://localhost');
|
|
39
|
+
} catch {
|
|
40
|
+
skippableSet.clear();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const destPathname = new URL(req.url, 'http://localhost').pathname;
|
|
45
|
+
const depPathname = depParsed?.pathname ?? null;
|
|
46
|
+
const split = (p: string) => (p === '/' ? [] : p.slice(1).split('/'));
|
|
47
|
+
const destAll = split(destPathname);
|
|
48
|
+
const depAll = depPathname ? split(depPathname) : null;
|
|
49
|
+
const clientSlots = clientStateTree.slots ?? null;
|
|
50
|
+
const rawParams = match.rawSegmentParams ?? match.segmentParams ?? {};
|
|
51
|
+
|
|
52
|
+
for (let i = 0; i < segments.length; i++) {
|
|
53
|
+
if (!skippableSet.has(i)) continue;
|
|
54
|
+
const segment = segments[i];
|
|
55
|
+
const slotEntries = Object.entries(segment.slots ?? {});
|
|
56
|
+
if (slotEntries.length === 0) continue;
|
|
57
|
+
|
|
58
|
+
const segIdx = match.segments.indexOf(segment);
|
|
59
|
+
// The root consumes no URL part, and a climbing interception marker
|
|
60
|
+
// removes owner segments from the target — `consumedUrlParts` handles both,
|
|
61
|
+
// and is the same derivation slot matching and layout depth use.
|
|
62
|
+
const sliceAt = segIdx >= 0 ? consumedUrlParts(match.segments, segIdx, match).length : 0;
|
|
63
|
+
const destParts = destAll.slice(sliceAt);
|
|
64
|
+
const depParts = depAll ? depAll.slice(sliceAt) : null;
|
|
65
|
+
let parentChanged = false;
|
|
66
|
+
if (depAll) {
|
|
67
|
+
const dp = depAll.slice(0, sliceAt),
|
|
68
|
+
dd = destAll.slice(0, sliceAt);
|
|
69
|
+
parentChanged = dp.length !== dd.length || dp.some((p, j) => p !== dd[j]);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
for (const [slotName, slotNode] of slotEntries) {
|
|
73
|
+
const m = slotNode as ManifestSegmentNode;
|
|
74
|
+
const k = computeSlotKey(segmentKeys[i], `@${slotName}`);
|
|
75
|
+
if (
|
|
76
|
+
m.children.some((c) => c.segmentType === 'intercepting') ||
|
|
77
|
+
parentChanged ||
|
|
78
|
+
depParts === null ||
|
|
79
|
+
!shouldSkipSlot({
|
|
80
|
+
slotKey: k,
|
|
81
|
+
clientSlots,
|
|
82
|
+
slotNode: m,
|
|
83
|
+
departingUrlParts: depParts,
|
|
84
|
+
destinationUrlParts: destParts,
|
|
85
|
+
})
|
|
86
|
+
) {
|
|
87
|
+
for (let j = i; j < segments.length; j++) skippableSet.delete(j);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intercepting-route resolution for parallel slots.
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY interception-aware part of the render pipeline. The normal
|
|
5
|
+
* children path — `tree-match.ts`, `route-matcher.ts` — has none, and must
|
|
6
|
+
* keep none: teaching the shared walker to match intercepting nodes would make
|
|
7
|
+
* the *main* route matcher render modals on hard navigation. Interception
|
|
8
|
+
* therefore lives here, behind one entry point the slot resolver calls when
|
|
9
|
+
* the pipeline has flagged a soft navigation.
|
|
10
|
+
*
|
|
11
|
+
* Split out of `slot-resolver.ts` when the matching rules grew (TIM-1281):
|
|
12
|
+
* anchoring, sibling priority, and the identity a marker'd directory name
|
|
13
|
+
* stands for are one subject, and slot resolution proper is another.
|
|
14
|
+
*
|
|
15
|
+
* See design/07-routing.md §"Intercepting Routes"
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { ManifestFile, ManifestSegmentNode } from './route-matcher.js';
|
|
19
|
+
import type { SlotMatchResult } from './slot-resolver.js';
|
|
20
|
+
import {
|
|
21
|
+
groupByInterceptedAnchor,
|
|
22
|
+
interceptorProxy,
|
|
23
|
+
type InterceptorAnchorGroup,
|
|
24
|
+
} from '../routing/interception.js';
|
|
25
|
+
import { matchUrlParts } from './tree-match.js';
|
|
26
|
+
import { pathnameMatchesPattern } from './pipeline-interception.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Whether an anchor group applies to this target at all.
|
|
30
|
+
*
|
|
31
|
+
* The group's base is a build-time URL *pattern* — `computeInterceptedBase`
|
|
32
|
+
* climbs `slotNode.urlPath`, which carries directory names, so a dynamic
|
|
33
|
+
* ancestor survives as `[id]`. Every pattern part stands for exactly one URL
|
|
34
|
+
* part, which makes the anchor index simply the base's length —
|
|
35
|
+
* `groupByInterceptedAnchor` derives it there, once, for both the resolver and
|
|
36
|
+
* the build-time collision validator.
|
|
37
|
+
*
|
|
38
|
+
* The one part that breaks that 1:1 correspondence is a catch-all, whose
|
|
39
|
+
* width varies per request. An interception based below one is therefore
|
|
40
|
+
* only resolvable when the catch-all happens to have consumed a single
|
|
41
|
+
* segment; deeper, the fixed index lands on the wrong part, the base check
|
|
42
|
+
* below fails, and the interception is dropped so the canonical route
|
|
43
|
+
* renders. That is the fail-safe outcome, never a wrong page — but it is a
|
|
44
|
+
* modal that silently does not open, so `validateInterceptionPlacement`
|
|
45
|
+
* rejects the shape at build time (TIM-1288). The behaviour here is what
|
|
46
|
+
* that rule is stated against, and stays as the fail-safe if a tree ever
|
|
47
|
+
* reaches the resolver unvalidated.
|
|
48
|
+
*
|
|
49
|
+
* The base must also *match* the target's leading parts, not merely count
|
|
50
|
+
* them. A slot can hold interceptors at different marker depths, and the
|
|
51
|
+
* pipeline's rewrite gate only established that *some* rewrite matched — not
|
|
52
|
+
* this child's. Under a slot at `/gallery/albums`, a navigation to
|
|
53
|
+
* `/gallery/photo/9` is meant for `(..)photo/[id]`, but `(.)[id]` anchors one
|
|
54
|
+
* part deeper and its slice `['9']` matches, so without this check the album
|
|
55
|
+
* modal opens on a photo URL. Name-equality used to rule that out as a side
|
|
56
|
+
* effect of comparing the directory name; positional anchoring has to check
|
|
57
|
+
* it deliberately (TIM-1281).
|
|
58
|
+
*
|
|
59
|
+
* `pathnameMatchesPattern` is the pipeline's own pattern matcher, so a base
|
|
60
|
+
* accepted here is one that gate would accept too.
|
|
61
|
+
*/
|
|
62
|
+
function anchorApplies(
|
|
63
|
+
group: InterceptorAnchorGroup<ManifestFile>,
|
|
64
|
+
targetParts: string[]
|
|
65
|
+
): boolean {
|
|
66
|
+
if (group.anchorIndex > targetParts.length) return false;
|
|
67
|
+
|
|
68
|
+
const targetPrefix =
|
|
69
|
+
group.anchorIndex === 0 ? '/' : `/${targetParts.slice(0, group.anchorIndex).join('/')}`;
|
|
70
|
+
return pathnameMatchesPattern(targetPrefix, group.base);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Find a matching intercepting route in a slot's children for the target pathname.
|
|
75
|
+
*
|
|
76
|
+
* When interception is active, the pipeline has already re-matched the source URL.
|
|
77
|
+
* Here we check the slot's intercepting children (e.g. `(.)photo/[id]`) against
|
|
78
|
+
* the target pathname to find which intercepting page to render.
|
|
79
|
+
*
|
|
80
|
+
* Two things distinguish an intercepting child from an ordinary slot child,
|
|
81
|
+
* and both used to be handled by hand here (TIM-1281):
|
|
82
|
+
*
|
|
83
|
+
* **Where its segment sits in the target.** The marker says how far above the
|
|
84
|
+
* slot owner the intercepted route lives, which makes the intercepted
|
|
85
|
+
* segment's index in the target pathname a position rather than something to
|
|
86
|
+
* search for. The old code scanned the target from the end for a part equal
|
|
87
|
+
* to the directory name, which found the wrong index whenever a *value*
|
|
88
|
+
* happened to equal that name (`/gallery/photo/photo`) and could never work
|
|
89
|
+
* at all for a dynamic intercepted segment.
|
|
90
|
+
*
|
|
91
|
+
* The index is derived from `computeInterceptedBase` — a build-time URL
|
|
92
|
+
* pattern — and NOT from the re-matched source route. That route is matched
|
|
93
|
+
* from `interceptingPrefix`, which is itself a pattern, so under a dynamic
|
|
94
|
+
* ancestor its params are literals: re-matching `/docs/[...path]` binds
|
|
95
|
+
* `path` to `['[...path]']`, and any depth read from it is the pattern's,
|
|
96
|
+
* not the URL's.
|
|
97
|
+
*
|
|
98
|
+
* A pattern part maps 1:1 onto a URL part except for a catch-all, whose
|
|
99
|
+
* width varies per request; `anchorApplies` documents what that costs.
|
|
100
|
+
*
|
|
101
|
+
* **What its segment matches.** `(.)photo` matches the literal `photo`;
|
|
102
|
+
* `(.)[id]`, `(.)img-[id].png` and `(.)[...rest]` match the way the same
|
|
103
|
+
* bracket syntax matches anywhere else. Rather than re-classify here, the
|
|
104
|
+
* node is handed to the shared walker under its `effectiveUrlSegment`
|
|
105
|
+
* identity, so priority ordering, affix stripping, catch-all collection and
|
|
106
|
+
* the terminal-leaf rule all come from `tree-match.ts` — which stays
|
|
107
|
+
* interception-unaware, as it must: teaching it to match intercepting nodes
|
|
108
|
+
* would make the *main* route matcher render modals on hard navigation.
|
|
109
|
+
*
|
|
110
|
+
* **Siblings compete, so they are walked together.** Two interceptors that
|
|
111
|
+
* anchor at the same URL index — `(.)photo/page.tsx` and `(.)[slug]/page.tsx`
|
|
112
|
+
* — are both candidates for the same part, exactly like two ordinary
|
|
113
|
+
* siblings. Matching each in its own tree and returning the first that
|
|
114
|
+
* succeeded would resolve them in manifest (filesystem) order, so
|
|
115
|
+
* `/gallery/photo` would render the dynamic modal whenever the dynamic
|
|
116
|
+
* directory happened to be enumerated first. Grouping by anchor and handing
|
|
117
|
+
* the whole group to one walk restores static > dynamic > catch-all, and
|
|
118
|
+
* gives backtracking across siblings for free.
|
|
119
|
+
*
|
|
120
|
+
* Groups are tried deepest anchor first, so a `(.)` interception — the most
|
|
121
|
+
* local one — wins over a `(...)` that reaches the same page from the root.
|
|
122
|
+
*
|
|
123
|
+
* The grouping itself is `groupByInterceptedAnchor`, shared with the build so
|
|
124
|
+
* that what is walked together is what the collision validator checked together
|
|
125
|
+
* (TIM-1310). Two interceptors of the *same* kind at one anchor — `(.)[a]`
|
|
126
|
+
* beside `(.)[b]` — would otherwise resolve by manifest order here with nothing
|
|
127
|
+
* to say so; the validator rejects them, within the limits of a probe search,
|
|
128
|
+
* because it walks this same group.
|
|
129
|
+
*
|
|
130
|
+
* The matched chain carries the real node, not the identity proxy, so tree
|
|
131
|
+
* paths keep the directory name (`/gallery/@modal/(.)photo/[id]`).
|
|
132
|
+
*/
|
|
133
|
+
export function findInterceptingMatch(
|
|
134
|
+
slotNode: ManifestSegmentNode,
|
|
135
|
+
targetPathname: string
|
|
136
|
+
): SlotMatchResult | null {
|
|
137
|
+
const targetParts = targetPathname === '/' ? [] : targetPathname.slice(1).split('/');
|
|
138
|
+
|
|
139
|
+
// Deepest anchor first, from the grouping the build validates against.
|
|
140
|
+
for (const group of groupByInterceptedAnchor(slotNode.urlPath, slotNode.children)) {
|
|
141
|
+
if (!anchorApplies(group, targetParts)) continue;
|
|
142
|
+
|
|
143
|
+
// Proxies carry the identity the walker matches on; the map back to the
|
|
144
|
+
// real node is what the chain is rebuilt from.
|
|
145
|
+
const entries = group.interceptors.map((real) => ({ proxy: interceptorProxy(real), real }));
|
|
146
|
+
const anchorNode: ManifestSegmentNode = {
|
|
147
|
+
segmentName: '',
|
|
148
|
+
segmentType: 'static',
|
|
149
|
+
urlPath: slotNode.urlPath,
|
|
150
|
+
children: entries.map((e) => e.proxy),
|
|
151
|
+
slots: {},
|
|
152
|
+
};
|
|
153
|
+
const result = matchUrlParts(anchorNode, targetParts.slice(group.anchorIndex));
|
|
154
|
+
if (!result) continue;
|
|
155
|
+
|
|
156
|
+
// result.chain is [anchorNode, matchedProxy, ...descendants]. Drop the
|
|
157
|
+
// synthetic parent and restore the real node in the proxy's place.
|
|
158
|
+
const real = entries.find((e) => e.proxy === result.chain[1])?.real;
|
|
159
|
+
if (!real) continue;
|
|
160
|
+
const chain = [slotNode, real, ...result.chain.slice(2)];
|
|
161
|
+
const leaf = chain[chain.length - 1];
|
|
162
|
+
if (!leaf.page) continue;
|
|
163
|
+
|
|
164
|
+
return { page: leaf.page, chain, slotParams: result.params };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return null;
|
|
168
|
+
}
|