@timber-js/app 0.2.0-alpha.185 → 0.2.0-alpha.187
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-35jnMdeJ.js} +4 -3
- package/dist/_chunks/{actions-O_LsyCE4.js.map → actions-35jnMdeJ.js.map} +1 -1
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.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-DjNrIWRR.js} +8 -14
- package/dist/_chunks/cache-api-DjNrIWRR.js.map +1 -0
- package/dist/_chunks/cli-check-CpmN7Nh-.js +256 -0
- package/dist/_chunks/cli-check-CpmN7Nh-.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-CGMp_Psg.js +298 -0
- package/dist/_chunks/cli-schema-sync-CGMp_Psg.js.map +1 -0
- package/dist/_chunks/{cloudflare-CnT5Lr7U.js → cloudflare-CGP6BZKO.js} +92 -14
- package/dist/_chunks/{cloudflare-CnT5Lr7U.js.map → cloudflare-CGP6BZKO.js.map} +1 -1
- package/dist/_chunks/convention-lint-kXsgc_-7.js +784 -0
- package/dist/_chunks/convention-lint-kXsgc_-7.js.map +1 -0
- package/dist/_chunks/error-boundary-D-ODYX41.js +353 -0
- package/dist/_chunks/error-boundary-D-ODYX41.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/file-cache-DmX7OqZP.js +454 -0
- package/dist/_chunks/file-cache-DmX7OqZP.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-D8xJZXIN.js} +34 -51
- package/dist/_chunks/logger-D8xJZXIN.js.map +1 -0
- package/dist/_chunks/mdx-file-C005ay-P.js +25 -0
- package/dist/_chunks/mdx-file-C005ay-P.js.map +1 -0
- package/dist/_chunks/{plugin-context---kTF5v8.js → plugin-context-rCinWLiE.js} +8 -2
- package/dist/_chunks/plugin-context-rCinWLiE.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/{resolve-schema-Dz3fcFUo.js → resolve-schema-5ma5pp1b.js} +2 -2
- package/dist/_chunks/{resolve-schema-Dz3fcFUo.js.map → resolve-schema-5ma5pp1b.js.map} +1 -1
- 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-media-type-DRqE_lD_.js +46 -0
- package/dist/_chunks/rsc-media-type-DRqE_lD_.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/scanner-C8b0Gcw3.js +1564 -0
- package/dist/_chunks/scanner-C8b0Gcw3.js.map +1 -0
- package/dist/_chunks/schema-bridge-Cc2Gngu1.js +199 -0
- package/dist/_chunks/schema-bridge-Cc2Gngu1.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/segment-context-CjOlyB8Y.js +97 -0
- package/dist/_chunks/segment-context-CjOlyB8Y.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-query-states-DFvWd-EA.js → use-query-states-BbU5Ge1V.js} +74 -26
- package/dist/_chunks/use-query-states-BbU5Ge1V.js.map +1 -0
- package/dist/_chunks/use-segment-params-C4r4BD9T.js +398 -0
- package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -0
- package/dist/_chunks/walkers-RzN6AFjr.js +141 -0
- package/dist/_chunks/walkers-RzN6AFjr.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/compress-module.d.ts +12 -0
- package/dist/adapters/compress-module.d.ts.map +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 +56 -5
- 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/cdn/cloudflare-purge.js +30 -0
- package/dist/cdn/cloudflare-purge.js.map +1 -0
- package/dist/cdn/fastly-purge.js +33 -0
- package/dist/cdn/fastly-purge.js.map +1 -0
- package/dist/cdn/index.js +94 -0
- package/dist/cdn/index.js.map +1 -0
- package/dist/cdn/workers-cache-purge.js +35 -0
- package/dist/cdn/workers-cache-purge.js.map +1 -0
- package/dist/cli-check.d.ts +153 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli.d.ts +34 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +46 -21
- package/dist/cli.js.map +1 -1
- 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/index.d.ts +1 -1
- package/dist/client/browser-entry/index.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 +7 -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.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +42 -41
- 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 +877 -311
- package/dist/client/internal.js.map +1 -1
- package/dist/client/link.d.ts +1 -7
- 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 +87 -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 +47 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +87 -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-query-states.d.ts +9 -3
- package/dist/client/use-query-states.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/codec.js +1 -1
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +5 -5
- package/dist/cookies/index.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1009 -759
- package/dist/index.js.map +1 -1
- package/dist/params/index.js +1 -1
- package/dist/plugin-context.d.ts +46 -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.map +1 -1
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +160 -8
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +3 -44
- package/dist/routing/codegen-shared.d.ts.map +1 -1
- package/dist/routing/codegen-types.d.ts +28 -31
- package/dist/routing/codegen-types.d.ts.map +1 -1
- package/dist/routing/codegen-write.d.ts +51 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- 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/convention-lint.d.ts +18 -4
- package/dist/routing/convention-lint.d.ts.map +1 -1
- package/dist/routing/export-detect.d.ts +16 -0
- package/dist/routing/export-detect.d.ts.map +1 -1
- package/dist/routing/index.js +4 -3
- package/dist/routing/interception.d.ts +235 -6
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +19 -4
- package/dist/routing/link-codegen.d.ts.map +1 -1
- package/dist/routing/manifest-codegen.d.ts +1 -7
- 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 +0 -6
- 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/schema-bridge.d.ts +60 -9
- package/dist/schema-bridge.d.ts.map +1 -1
- package/dist/search-params/define.d.ts +62 -14
- package/dist/search-params/define.d.ts.map +1 -1
- package/dist/search-params/index.d.ts +0 -1
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +221 -10
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +70 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +26 -3
- package/dist/search-params/wrappers.d.ts.map +1 -1
- package/dist/server/access-gate.d.ts +19 -8
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -3
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +18 -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/compress.d.ts.map +1 -1
- 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 +148 -15
- package/dist/server/deny-boundary.d.ts.map +1 -1
- package/dist/server/deny-renderer.d.ts +15 -4
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +85 -15
- package/dist/server/error-boundary-wrapper.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.d.ts +0 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +3 -1
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +712 -418
- package/dist/server/internal.js.map +1 -1
- package/dist/server/metadata-collector.d.ts +52 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +22 -6
- 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/primitives.d.ts +23 -0
- 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 +22 -3
- 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/deny-fallback.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +15 -3
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +2 -17
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +0 -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/revalidate-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts +1 -2
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +15 -2
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- 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 +17 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +0 -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 +8 -1
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +28 -36
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +12 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +40 -0
- package/dist/server/utils/element-type.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-media-type.d.ts +40 -0
- package/dist/shared/rsc-media-type.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/30-api-server.mdx +1 -1
- package/docs/api/31-api-client.mdx +4 -2
- package/docs/api/33-api-search-params.mdx +38 -16
- package/docs/api/35-api-typescript.mdx +3 -3
- package/docs/api/36-cli.mdx +34 -7
- package/docs/learn/00-introduction.mdx +1 -1
- package/docs/learn/02-pages-and-layouts.mdx +2 -2
- package/docs/learn/05-typed-params.mdx +8 -8
- package/docs/learn/07-typed-routes.mdx +12 -7
- package/docs/learn/11-error-handling.mdx +18 -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 +173 -3
- package/docs/more/03-coming-from-nextjs.mdx +2 -2
- package/docs/more/04-metadata-and-fonts.mdx +1 -1
- package/docs/more/50-ai-agent-instructions.mdx +6 -4
- package/package.json +9 -6
- package/src/adapters/build-output-helper.ts +116 -3
- package/src/adapters/cloudflare.ts +90 -12
- package/src/adapters/compress-module.ts +79 -1
- 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/cli-check.ts +458 -0
- package/src/cli.ts +59 -24
- package/src/client/browser-entry/action-dispatch.ts +11 -5
- package/src/client/browser-entry/hydrate.ts +40 -29
- package/src/client/browser-entry/index.ts +15 -6
- 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 +85 -16
- package/src/client/history.ts +13 -6
- package/src/client/index.ts +14 -3
- package/src/client/internal.ts +4 -3
- package/src/client/link.tsx +120 -72
- package/src/client/navigation-api.ts +3 -3
- package/src/client/navigation-commit.ts +197 -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 +393 -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 +243 -707
- package/src/client/rsc-fetch.ts +183 -106
- package/src/client/segment-cache.ts +129 -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-query-states.ts +102 -39
- package/src/client/use-router.ts +1 -1
- package/src/client/use-segment-params.ts +41 -18
- package/src/cookies/define-cookie.ts +6 -1
- package/src/index.ts +25 -4
- package/src/plugin-context.ts +58 -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 +97 -102
- package/src/plugins/shims.ts +0 -1
- package/src/plugins/static-build.ts +391 -95
- package/src/routing/codegen-shared.ts +3 -79
- package/src/routing/codegen-types.ts +28 -31
- package/src/routing/codegen-write.ts +139 -0
- package/src/routing/codegen.ts +86 -172
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +139 -40
- package/src/routing/export-detect.ts +151 -7
- package/src/routing/interception.ts +896 -50
- package/src/routing/link-codegen.ts +32 -65
- package/src/routing/manifest-codegen.ts +6 -62
- package/src/routing/scanner.ts +117 -92
- 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 +0 -6
- package/src/routing/walkers.ts +8 -0
- package/src/schema-bridge.ts +180 -58
- package/src/search-params/define.ts +108 -66
- package/src/search-params/index.ts +0 -1
- package/src/search-params/parse-total.ts +78 -0
- package/src/search-params/wrappers.ts +60 -11
- package/src/server/access-gate.tsx +60 -40
- package/src/server/action-handler.ts +4 -5
- package/src/server/actions.ts +6 -3
- package/src/server/als-registry.ts +18 -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/compress.ts +9 -1
- package/src/server/default-status-page.ts +127 -0
- package/src/server/deny-boundary.ts +269 -41
- package/src/server/deny-renderer.ts +111 -39
- package/src/server/error-boundary-wrapper.ts +166 -79
- package/src/server/head-response.ts +54 -0
- package/src/server/index.ts +1 -3
- package/src/server/internal.ts +2 -2
- package/src/server/metadata-collector.ts +115 -0
- package/src/server/param-coercion.ts +51 -69
- package/src/server/pipeline-helpers.ts +2 -47
- package/src/server/pipeline-interception.ts +81 -32
- package/src/server/pipeline-outcome.ts +4 -5
- package/src/server/pipeline-phases.ts +77 -25
- package/src/server/pipeline.ts +57 -10
- package/src/server/prebuilt-runtime.ts +4 -4
- package/src/server/primitives.ts +25 -0
- package/src/server/publish-params.ts +42 -0
- package/src/server/request-context.ts +97 -18
- package/src/server/route-element-builder.ts +241 -253
- package/src/server/route-handler.ts +8 -8
- package/src/server/route-matcher.ts +21 -9
- package/src/server/rsc-cache-key-guard.ts +164 -0
- package/src/server/rsc-entry/api-handler.ts +6 -8
- package/src/server/rsc-entry/deny-fallback.ts +3 -2
- package/src/server/rsc-entry/error-renderer.ts +94 -35
- package/src/server/rsc-entry/helpers.ts +33 -28
- package/src/server/rsc-entry/index.ts +36 -33
- package/src/server/rsc-entry/render-route.ts +18 -10
- package/src/server/rsc-entry/revalidate-renderer.ts +3 -2
- package/src/server/rsc-entry/rsc-payload.ts +113 -40
- package/src/server/rsc-entry/rsc-stream.ts +29 -5
- package/src/server/rsc-entry/ssr-renderer.ts +38 -22
- package/src/server/skippable-prefix.ts +92 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +263 -158
- package/src/server/ssr-bridge-types.ts +18 -0
- package/src/server/ssr-entry.ts +20 -10
- package/src/server/ssr-wrappers.tsx +33 -32
- package/src/server/state-tree-diff.ts +14 -55
- package/src/server/static-generator.ts +68 -29
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +28 -11
- package/src/server/tree-builder.ts +35 -218
- package/src/server/types.ts +12 -7
- package/src/server/utils/element-type.ts +72 -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-media-type.ts +43 -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/cache-api-B-lhk9p4.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/registry-DbJPKoBp.js +0 -20
- package/dist/_chunks/registry-DbJPKoBp.js.map +0 -1
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +0 -1
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +0 -119
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +0 -1
- package/dist/_chunks/segment-classify-Byy425ng.js.map +0 -1
- package/dist/_chunks/segment-context-ZDnXDkbz.js +0 -34
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +0 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +0 -1
- package/dist/_chunks/use-query-states-DFvWd-EA.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 +0 -1002
- 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/dist/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.d.ts.map +0 -1
- package/dist/segment-params/define.d.ts +0 -89
- package/dist/segment-params/define.d.ts.map +0 -1
- package/dist/segment-params/index.d.ts +0 -3
- package/dist/segment-params/index.d.ts.map +0 -1
- package/dist/segment-params/index.js +0 -2
- package/src/plugins/request-dep.ts +0 -499
- package/src/search-params/registry.ts +0 -31
- package/src/segment-params/define.ts +0 -249
- package/src/segment-params/index.ts +0 -9
|
@@ -16,26 +16,255 @@
|
|
|
16
16
|
*
|
|
17
17
|
* See design/07-routing.md §"Intercepting Routes"
|
|
18
18
|
*/
|
|
19
|
-
import type { SegmentNode } from './types.js';
|
|
20
|
-
/**
|
|
21
|
-
|
|
19
|
+
import type { SegmentNode, InterceptionMarker } from './types.js';
|
|
20
|
+
/** Fields shared by both interception shapes. */
|
|
21
|
+
interface InterceptionRewriteBase {
|
|
22
22
|
/**
|
|
23
23
|
* The URL pattern that this rewrite intercepts (the target of navigation).
|
|
24
24
|
* E.g., "/photo/[id]" for a (.)photo/[id] interception.
|
|
25
25
|
*/
|
|
26
26
|
interceptedPattern: string;
|
|
27
27
|
/**
|
|
28
|
-
* The
|
|
29
|
-
*
|
|
30
|
-
*
|
|
28
|
+
* The tree path of the segment that OWNS the slot holding this
|
|
29
|
+
* intercepting route (`computeSegmentTreePaths`, e.g. "/feed",
|
|
30
|
+
* "/(browse)", "/(browse)/feed", or "/" at the app root).
|
|
31
|
+
*
|
|
32
|
+
* The rewrite only applies when the source route — the page the user is
|
|
33
|
+
* navigating FROM — passes through that directory, because only then
|
|
34
|
+
* does the slot holding the intercepting page exist in the rendered
|
|
35
|
+
* tree. The server checks this by matching X-Timber-URL and testing its
|
|
36
|
+
* segment chain's tree paths for this value.
|
|
37
|
+
*
|
|
38
|
+
* Neither of the identities already in the codebase works here:
|
|
39
|
+
*
|
|
40
|
+
* - A **URL prefix** cannot express it. Route groups contribute nothing
|
|
41
|
+
* to `urlPath`, so `(browse)/@detail/(...)x` and a genuinely
|
|
42
|
+
* root-level `@modal/(...)x` both have prefix "/" while meaning very
|
|
43
|
+
* different things.
|
|
44
|
+
* - A **state-tree key** (`computeSegmentKeys`) cannot either. It
|
|
45
|
+
* qualifies a group with its ancestry but resets to `urlPath` at the
|
|
46
|
+
* next URL-visible segment, so `(browse)/feed` and `(landing)/feed`
|
|
47
|
+
* both key as "/feed" — and a navigation inside `(landing)/feed/…`
|
|
48
|
+
* would reach `(browse)/feed`'s slot.
|
|
49
|
+
*
|
|
50
|
+
* Tree paths never reset, so two directories that render different
|
|
51
|
+
* layouts never share one. "/" as a scope means the app root, which
|
|
52
|
+
* every route passes through — preserving the intentional
|
|
53
|
+
* match-from-anywhere behavior of a root-level `(...)` interception
|
|
54
|
+
* (TIM-1006) without an exemption. See TIM-1279.
|
|
55
|
+
*/
|
|
56
|
+
interceptingScope: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A conditional rewrite rule generated from an intercepting route.
|
|
60
|
+
*
|
|
61
|
+
* `mode` records which of the two shapes the directory expresses, because the
|
|
62
|
+
* two render through entirely different mechanisms and the fields they need
|
|
63
|
+
* are not the same. It is a union rather than a flag so a reader cannot
|
|
64
|
+
* re-match `interceptingPrefix` on the shape that has no such pathname.
|
|
65
|
+
*
|
|
66
|
+
* See design/07-routing.md §"Intercepting Routes".
|
|
67
|
+
*/
|
|
68
|
+
export type InterceptionRewrite = SlotInterceptionRewrite | ChildrenInterceptionRewrite;
|
|
69
|
+
/**
|
|
70
|
+
* A **modal overlay** interception — the intercepting directory is a direct
|
|
71
|
+
* child of a parallel slot (`feed/@modal/(.)photo/[id]`).
|
|
72
|
+
*
|
|
73
|
+
* The server re-matches the *source* route and the slot resolver finds the
|
|
74
|
+
* intercepting child inside the slot, so the intercepting page layers over
|
|
75
|
+
* the page the user was already on.
|
|
76
|
+
*/
|
|
77
|
+
export interface SlotInterceptionRewrite extends InterceptionRewriteBase {
|
|
78
|
+
mode: 'slot';
|
|
79
|
+
/**
|
|
80
|
+
* The pathname the server re-matches when this rewrite applies — the
|
|
81
|
+
* intercepting slot owner's URL path. E.g., "/feed" for a (.)photo/[id]
|
|
82
|
+
* inside /feed/@modal/.
|
|
83
|
+
*
|
|
84
|
+
* This is a build-time constant, never a client-supplied value: the
|
|
85
|
+
* X-Timber-URL header selects a rewrite but never becomes the rendered
|
|
86
|
+
* pathname.
|
|
31
87
|
*/
|
|
32
88
|
interceptingPrefix: string;
|
|
33
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* A **sibling layout swap** interception — the intercepting directory is a
|
|
92
|
+
* direct child of an ordinary segment or route group
|
|
93
|
+
* (`(browse)/(...)[artistSlug]/…`).
|
|
94
|
+
*
|
|
95
|
+
* There is no overlay, no slot and no `default.tsx`: the intercepting page
|
|
96
|
+
* *replaces* `children` for the owner's layout chain. Nothing is re-matched
|
|
97
|
+
* either. The server resolves the owner by `interceptingScope` — a tree path,
|
|
98
|
+
* which identifies exactly one directory — and builds the rendered chain as
|
|
99
|
+
* `[…owner ancestors, interceptingNode, …its matched descendants]`. That is an
|
|
100
|
+
* ordinary segment chain, so `tree-builder.ts` renders it with no knowledge
|
|
101
|
+
* that interception happened.
|
|
102
|
+
*
|
|
103
|
+
* Resolving the owner from the tree rather than from a URL is what makes this
|
|
104
|
+
* shape work where the modal shape cannot: `interceptingPrefix` is
|
|
105
|
+
* URL-derived, and a route group contributes nothing to `urlPath`, so an owner
|
|
106
|
+
* like `app/(browse)/` serializes to "/" and re-matching it lands in whichever
|
|
107
|
+
* group owns the canonical page. A tree path never collapses (TIM-1280).
|
|
108
|
+
*/
|
|
109
|
+
export interface ChildrenInterceptionRewrite extends InterceptionRewriteBase {
|
|
110
|
+
mode: 'children';
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A set of sibling interceptors that compete for one URL position.
|
|
114
|
+
*
|
|
115
|
+
* `base` is the intercepted base they share — the URL their own segments sit
|
|
116
|
+
* directly under — and `anchorIndex` is how many URL parts that base spans,
|
|
117
|
+
* which is the index in a target pathname their segments are matched at.
|
|
118
|
+
* Deeper anchors are more local and are tried first.
|
|
119
|
+
*/
|
|
120
|
+
export interface InterceptorAnchorGroup<TFile> {
|
|
121
|
+
base: string;
|
|
122
|
+
anchorIndex: number;
|
|
123
|
+
interceptors: SegmentNode<TFile>[];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Group an owner's intercepting children by the URL position they contend for.
|
|
127
|
+
*
|
|
128
|
+
* This is the definition of *which interceptors compete*, and it has exactly
|
|
129
|
+
* one caller shape on each side of the build: `findInterceptingMatch` resolves
|
|
130
|
+
* a group with one `matchUrlParts` walk, and
|
|
131
|
+
* `assertNoInterceptedPatternCollisions` validates the same group as one
|
|
132
|
+
* collision space. Written twice, the two would be free to disagree about what
|
|
133
|
+
* competes — and a resolver that walks a wider set than the validator checked
|
|
134
|
+
* is precisely the order-dependence the validator exists to reject (TIM-1310).
|
|
135
|
+
*
|
|
136
|
+
* Contention is keyed by the computed intercepted **base**, not by the marker:
|
|
137
|
+
* under an owner at `/feed`, `(..)` and `(...)` both base at `/` and are both
|
|
138
|
+
* matched at index 0, so they are one group. Different bases are different
|
|
139
|
+
* positions — a `(.)` interceptor can never claim a target that belongs to a
|
|
140
|
+
* `(..)` one beside it, because the base must also match the target's leading
|
|
141
|
+
* parts.
|
|
142
|
+
*
|
|
143
|
+
* The base is a URL *pattern*, so its length is its part count only because
|
|
144
|
+
* every pattern part stands for exactly one URL part. A catch-all in the base
|
|
145
|
+
* breaks that, and `assertInterceptedBaseIsCountable` rejects the shape at
|
|
146
|
+
* build time.
|
|
147
|
+
*
|
|
148
|
+
* A node missing either marker field is skipped, which `classifySegment` never
|
|
149
|
+
* produces — it sets both whenever it reports `'intercepting'`. Stating the
|
|
150
|
+
* filter here rather than defaulting the marker is what makes the validator and
|
|
151
|
+
* the resolver see the same set: such a node renders nothing either way, and a
|
|
152
|
+
* validator more permissive than the resolver would be checking a candidate
|
|
153
|
+
* that never competes while the resolver walks one nobody checked.
|
|
154
|
+
*
|
|
155
|
+
* `children` is read directly rather than flattened through route groups,
|
|
156
|
+
* matching both resolvers: the slot resolver reads `slotNode.children`, and an
|
|
157
|
+
* interceptor deeper inside a slot subtree is rejected by
|
|
158
|
+
* `validateInterceptionPlacement`. On the children path an interceptor under a
|
|
159
|
+
* route group is legal and the *group* is its owner, so it is grouped with that
|
|
160
|
+
* group's other interceptors — which is again exactly what the resolver walks,
|
|
161
|
+
* since it resolves the owner by tree path.
|
|
162
|
+
*/
|
|
163
|
+
export declare function groupByInterceptedAnchor<TFile>(ownerUrlPath: string, children: readonly SegmentNode<TFile>[]): InterceptorAnchorGroup<TFile>[];
|
|
34
164
|
/**
|
|
35
165
|
* Collect all interception rewrite rules from the route tree.
|
|
36
166
|
*
|
|
37
167
|
* Walks the tree recursively. For each intercepting segment, computes the
|
|
38
168
|
* intercepted URL based on the marker and the segment's position.
|
|
169
|
+
*
|
|
170
|
+
* The list is returned **deepest scope first**, which is what makes
|
|
171
|
+
* `findInterceptionMatch`'s first-match rule deterministic; see
|
|
172
|
+
* `sortByScopeDepth`.
|
|
39
173
|
*/
|
|
40
174
|
export declare function collectInterceptionRewrites(root: SegmentNode): InterceptionRewrite[];
|
|
175
|
+
/**
|
|
176
|
+
* Validate that every intercepting segment sits where it can actually render.
|
|
177
|
+
*
|
|
178
|
+
* There are exactly two positions a renderer exists for, and they are the two
|
|
179
|
+
* shapes interception has:
|
|
180
|
+
*
|
|
181
|
+
* 1. **Direct child of a parallel slot** — the modal overlay. The slot
|
|
182
|
+
* resolver scans a slot node's *direct children* for an intercepting
|
|
183
|
+
* segment (`server/slot-interception.ts`). Nothing between the slot and
|
|
184
|
+
* the intercepting directory is allowed, because nothing walks it.
|
|
185
|
+
* 2. **Direct child of an ordinary segment or route group** — the sibling
|
|
186
|
+
* layout swap (TIM-1280). The pipeline resolves the owner by tree path and
|
|
187
|
+
* builds the rendered chain through the intercepting node itself
|
|
188
|
+
* (`server/children-interception.ts`).
|
|
189
|
+
*
|
|
190
|
+
* Everywhere else, rewrite generation still emits a rewrite and nothing
|
|
191
|
+
* renders it: the rewrite matches the soft navigation, and the user is served
|
|
192
|
+
* the page they were already on under a changed URL (TIM-1278). The rejected
|
|
193
|
+
* positions are:
|
|
194
|
+
*
|
|
195
|
+
* - **Inside a slot subtree but not directly under the slot**
|
|
196
|
+
* (`@modal/(inner)/(.)photo`). Neither renderer applies: the slot resolver
|
|
197
|
+
* only reads direct children, and the children-path resolver builds a
|
|
198
|
+
* *chain*, which cannot express a descent through a slot.
|
|
199
|
+
* - **Inside another intercepting subtree** (`(.)a/(.)b`). Left unvalidated
|
|
200
|
+
* `collectLeavesWithRewrites` walks the inner one as an ordinary URL
|
|
201
|
+
* segment and emits a pattern containing a literal "(.)b".
|
|
202
|
+
*
|
|
203
|
+
* Two further shapes are rejected here (TIM-1288). Both are about a catch-all,
|
|
204
|
+
* and both are specific to interception: elsewhere in the tree the same
|
|
205
|
+
* shapes are inert or fail safely, and the general "nothing below a catch-all
|
|
206
|
+
* is reachable" rule is tracked as TIM-1286.
|
|
207
|
+
*
|
|
208
|
+
* And one is specific to the children path: an owner chain that binds params
|
|
209
|
+
* (see `assertOwnerChainBindsNoParams`).
|
|
210
|
+
*/
|
|
211
|
+
export declare function validateInterceptionPlacement(root: SegmentNode): void;
|
|
212
|
+
/**
|
|
213
|
+
* The URL-matching identity of an intercepting node, as a node.
|
|
214
|
+
*
|
|
215
|
+
* `matchUrlParts` reads `segmentType` directly and knows nothing about
|
|
216
|
+
* interception, so a marker'd directory has to be handed to it under the
|
|
217
|
+
* identity of the segment it intercepts — `(.)[id]` as `[id]`. Priority
|
|
218
|
+
* ordering, affix stripping and catch-all handling then come from the shared
|
|
219
|
+
* walker rather than from a second classifier here.
|
|
220
|
+
*
|
|
221
|
+
* Shared with `findInterceptingMatch` for the same reason the grouping is: the
|
|
222
|
+
* collision space is the resolver's synthetic anchor parent, so its children
|
|
223
|
+
* have to carry the identity the resolver gives them or the validator would be
|
|
224
|
+
* probing a tree that does not match the one served. The caller keeps its own
|
|
225
|
+
* map back to the real node — the proxy is a matching identity, not a
|
|
226
|
+
* replacement (tree paths still need the directory name).
|
|
227
|
+
*/
|
|
228
|
+
export declare function interceptorProxy<TFile>(node: SegmentNode<TFile>): SegmentNode<TFile>;
|
|
229
|
+
/**
|
|
230
|
+
* Compute the base URL that an intercepting route intercepts, given the
|
|
231
|
+
* parent's URL path and the interception marker.
|
|
232
|
+
*
|
|
233
|
+
* - (.) — same level: parent's URL path
|
|
234
|
+
* - (..) — one level up: parent's parent URL path
|
|
235
|
+
* - (...) — root level: /
|
|
236
|
+
* - (..)(..) — two levels up: parent's grandparent URL path
|
|
237
|
+
*
|
|
238
|
+
* The result is a URL **pattern**, not a URL — `parentUrlPath` carries the
|
|
239
|
+
* directory names, so a dynamic ancestor appears as `/docs/[...path]`.
|
|
240
|
+
* Rewrite generation wants exactly that. The slot resolver imports this to
|
|
241
|
+
* locate the intercepted segment in a concrete target pathname, and must
|
|
242
|
+
* therefore account for a bracket part standing for a different number of
|
|
243
|
+
* URL parts than itself (TIM-1281).
|
|
244
|
+
*
|
|
245
|
+
* Climbing past the root clamps to `/` rather than erroring, so generation
|
|
246
|
+
* and resolution never disagree about what an over-reaching marker
|
|
247
|
+
* intercepts.
|
|
248
|
+
*/
|
|
249
|
+
/**
|
|
250
|
+
* The URL pattern an intercepting directory's own page sits at — its
|
|
251
|
+
* `computeInterceptedBase` joined with the segment it intercepts.
|
|
252
|
+
*
|
|
253
|
+
* The root case is why this is a function rather than a template literal at
|
|
254
|
+
* each caller: a base of `/` must not produce `//photo`. Rewrite generation
|
|
255
|
+
* and the collision validator both start their walk from this value, so the
|
|
256
|
+
* two describe the same URLs by construction.
|
|
257
|
+
*/
|
|
258
|
+
export declare function computeInterceptedUrlBase(parentUrlPath: string, marker: InterceptionMarker, interceptedSegmentName: string): string;
|
|
259
|
+
/**
|
|
260
|
+
* An intercepted base joined with one segment beneath it.
|
|
261
|
+
*
|
|
262
|
+
* The whole content of the "function rather than a template literal" rule
|
|
263
|
+
* above: a base of `/` must not produce `//photo`. The collision validator has
|
|
264
|
+
* the base in hand already (it groups by it) and joins through this rather than
|
|
265
|
+
* re-deriving it from an owner path, so both callers spell the root case once.
|
|
266
|
+
*/
|
|
267
|
+
export declare function joinInterceptedBase(base: string, segmentName: string): string;
|
|
268
|
+
export declare function computeInterceptedBase(parentUrlPath: string, marker: InterceptionMarker): string;
|
|
269
|
+
export {};
|
|
41
270
|
//# sourceMappingURL=interception.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interception.d.ts","sourceRoot":"","sources":["../../src/routing/interception.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"interception.d.ts","sourceRoot":"","sources":["../../src/routing/interception.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAa,MAAM,YAAY,CAAC;AAQ7E,iDAAiD;AACjD,UAAU,uBAAuB;IAC/B;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAAG,uBAAuB,GAAG,2BAA2B,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,2BAA4B,SAAQ,uBAAuB;IAC1E,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB,CAAC,KAAK;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAC5C,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,SAAS,WAAW,CAAC,KAAK,CAAC,EAAE,GACtC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAuBjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,EAAE,CAIpF;AAqDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAOrE;AAwPD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAEpF;AA4WD;;;;;;;;;;;;;;;;;;;GAmBG;AACH;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,kBAAkB,EAC1B,sBAAsB,EAAE,MAAM,GAC7B,MAAM,CAER;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAOhG"}
|
|
@@ -23,6 +23,20 @@
|
|
|
23
23
|
* overload TS reports against on failure.
|
|
24
24
|
*/
|
|
25
25
|
import type { ParamEntry, RouteEntry } from './codegen-types.js';
|
|
26
|
+
/**
|
|
27
|
+
* The `searchParams` prop type, emitted identically on every Link variant
|
|
28
|
+
* — per-route pattern, resolved template, and catch-all.
|
|
29
|
+
*
|
|
30
|
+
* TIM-1343: there is no per-route narrowing any more. `params.ts` is gone,
|
|
31
|
+
* so codegen has no definition to read a `SearchParamsDefinition<T>` from.
|
|
32
|
+
* Type safety moved to the value's construction site instead: callers write
|
|
33
|
+
* `definition.buildSearchParams({ ... })`, which checks `Partial<T>` there
|
|
34
|
+
* and returns a query STRING — the only shape that survives the RSC Flight
|
|
35
|
+
* boundary. A plain record is the uncodec'd escape hatch. See `client/link.tsx` §"searchParams prop shapes".
|
|
36
|
+
*
|
|
37
|
+
* Declared once so the three emission sites cannot drift apart.
|
|
38
|
+
*/
|
|
39
|
+
export declare const SEARCH_PARAMS_PROP_TYPE = "string | Record<string, unknown>";
|
|
26
40
|
/** Shared Link base-props type literal used in every emitted call signature. */
|
|
27
41
|
export declare const LINK_BASE_PROPS_TYPE = "Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & { prefetch?: boolean; scroll?: boolean; preserveSearchParams?: true | string[]; onNavigate?: import('./client/link.js').OnNavigateHandler; children?: import('react').ReactNode }";
|
|
28
42
|
/**
|
|
@@ -40,10 +54,11 @@ export declare function buildResolvedPattern(route: RouteEntry): string | null;
|
|
|
40
54
|
* (convenience — values are stringified at runtime). Catch-all and
|
|
41
55
|
* optional catch-all remain `string[]` / `string[] | undefined`.
|
|
42
56
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
57
|
+
* With a global schema, the schema codec's inferred type wins. Without
|
|
58
|
+
* one, a URL segment is a raw string (widened to string | number for
|
|
59
|
+
* Link convenience) — per-segment codec chains were deleted in TIM-1342.
|
|
45
60
|
*/
|
|
46
|
-
export declare function formatLinkParamsType(params: ParamEntry[],
|
|
61
|
+
export declare function formatLinkParamsType(params: ParamEntry[], hasSchema?: boolean): string;
|
|
47
62
|
/**
|
|
48
63
|
* Catch-all call signatures for `<Link>` — external hrefs and computed
|
|
49
64
|
* `string` variables. Emitted from codegen in a SEPARATE
|
|
@@ -86,5 +101,5 @@ export declare function formatLinkCatchAllOverloads(): string[];
|
|
|
86
101
|
* so the resolved-template-vs-pattern ordering reduces to placing the
|
|
87
102
|
* pattern variant before the resolved-template variant inside the union.
|
|
88
103
|
*/
|
|
89
|
-
export declare function formatTypedLinkOverloads(routes: RouteEntry[],
|
|
104
|
+
export declare function formatTypedLinkOverloads(routes: RouteEntry[], hasSchema?: boolean): string[];
|
|
90
105
|
//# sourceMappingURL=link-codegen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-codegen.d.ts","sourceRoot":"","sources":["../../src/routing/link-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"link-codegen.d.ts","sourceRoot":"","sources":["../../src/routing/link-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIjE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,qCAAqC,CAAC;AAE1E,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,8PAC4N,CAAC;AAE9P;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAoBrE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAWtF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CA+DtD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAwE5F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Route manifest codegen — generates virtual module source for the route
|
|
3
|
-
* manifest
|
|
3
|
+
* manifest and the global schema loader.
|
|
4
4
|
*
|
|
5
5
|
* Extracted from plugins/routing.ts to keep it under the 500-line budget.
|
|
6
6
|
* See design/18-build-system.md §"Virtual Modules".
|
|
@@ -15,12 +15,6 @@ import type { RouteTree } from './types.js';
|
|
|
15
15
|
* All file references use absolute paths (required for virtual modules).
|
|
16
16
|
*/
|
|
17
17
|
export declare function generateManifestModule(tree: RouteTree, viteRoot: string): string;
|
|
18
|
-
/**
|
|
19
|
-
* Walk the route tree and collect every page that exports a
|
|
20
|
-
* `searchParams` definition, then emit a module that statically imports
|
|
21
|
-
* each export and registers it into the shared search-params registry.
|
|
22
|
-
*/
|
|
23
|
-
export declare function generateSearchParamsRegistryModule(tree: RouteTree): string;
|
|
24
18
|
/**
|
|
25
19
|
* Generate the virtual:timber-schema module.
|
|
26
20
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-codegen.d.ts","sourceRoot":"","sources":["../../src/routing/manifest-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"manifest-codegen.d.ts","sourceRoot":"","sources":["../../src/routing/manifest-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,SAAS,EAA0B,MAAM,YAAY,CAAC;AAwBpE;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6IhF;AAID;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA8B3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/routing/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,SAAS,EAIT,aAAa,EAEd,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/routing/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,SAAS,EAIT,aAAa,EAEd,MAAM,YAAY,CAAC;AA2BpB;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB,GAAG,SAAS,CAsDhF"}
|
|
@@ -78,4 +78,37 @@ export interface SegmentClassification {
|
|
|
78
78
|
* If you change the directory-prefix conventions, update this function.
|
|
79
79
|
*/
|
|
80
80
|
export declare function classifySegment(dirName: string): SegmentClassification;
|
|
81
|
+
/**
|
|
82
|
+
* The URL-matching identity of a segment node.
|
|
83
|
+
*
|
|
84
|
+
* For every node except an intercepting one this is the node itself. An
|
|
85
|
+
* intercepting node is different: its directory name carries a marker
|
|
86
|
+
* (`(.)photo`, `(.)[id]`), so the node's own `segmentType` is
|
|
87
|
+
* `'intercepting'` and the bracket syntax of the segment it intercepts was
|
|
88
|
+
* never classified. Everything that has to reason about *the URL part this
|
|
89
|
+
* node stands for* — matching it, and keying its param for codec coercion —
|
|
90
|
+
* needs that classification.
|
|
91
|
+
*
|
|
92
|
+
* Deriving it here, from `interceptedSegmentName`, keeps interception out
|
|
93
|
+
* of `classifySegment`'s output and out of the serialized manifest: there
|
|
94
|
+
* is no second copy of the classification to drift from this one. The
|
|
95
|
+
* returned `segmentName` is the intercepted name (`photo`, `[id]`), NOT the
|
|
96
|
+
* node's directory name — callers that need the directory name for tree
|
|
97
|
+
* paths must keep reading the node. See TIM-1281.
|
|
98
|
+
*/
|
|
99
|
+
export interface UrlSegmentIdentity {
|
|
100
|
+
segmentName: string;
|
|
101
|
+
segmentType: SegmentType;
|
|
102
|
+
paramName?: string;
|
|
103
|
+
paramPrefix?: string;
|
|
104
|
+
paramSuffix?: string;
|
|
105
|
+
}
|
|
106
|
+
export declare function effectiveUrlSegment(node: {
|
|
107
|
+
segmentName: string;
|
|
108
|
+
segmentType: SegmentType;
|
|
109
|
+
paramName?: string;
|
|
110
|
+
paramPrefix?: string;
|
|
111
|
+
paramSuffix?: string;
|
|
112
|
+
interceptedSegmentName?: string;
|
|
113
|
+
}): UrlSegmentIdentity;
|
|
81
114
|
//# sourceMappingURL=segment-classify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segment-classify.d.ts","sourceRoot":"","sources":["../../src/routing/segment-classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGlE,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA4E5D;AAID,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAuCtE"}
|
|
1
|
+
{"version":3,"file":"segment-classify.d.ts","sourceRoot":"","sources":["../../src/routing/segment-classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGlE,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA4E5D;AAID,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAuCtE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,GAAG,kBAAkB,CAsBrB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Segment key computation — the stable identity of a segment in the route tree.
|
|
3
|
+
*
|
|
4
|
+
* A segment key is the string that names a segment across the RSC/SSR/client
|
|
5
|
+
* boundary: it appears in the X-Timber-State-Tree header, the X-Timber-Segments
|
|
6
|
+
* header, SegmentOutlet props, the client segment cache, and (since TIM-1279)
|
|
7
|
+
* interception scoping.
|
|
8
|
+
*
|
|
9
|
+
* This module lives in `routing/` rather than `server/` because the keys are a
|
|
10
|
+
* property of the route tree itself — both the build-time scanner tree and the
|
|
11
|
+
* runtime manifest tree produce identical keys for the same directory, which is
|
|
12
|
+
* what lets a build-time value (an interception scope) be compared against a
|
|
13
|
+
* request-time matched chain.
|
|
14
|
+
*
|
|
15
|
+
* See design/19-client-navigation.md §"X-Timber-State-Tree Header"
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Segment node shape expected by computeSegmentKeys.
|
|
19
|
+
*
|
|
20
|
+
* Structurally satisfied by both `SegmentNode` (build time) and
|
|
21
|
+
* `ManifestSegmentNode` (request time) — keys depend only on the
|
|
22
|
+
* URL path and the segment classification, never on file payloads.
|
|
23
|
+
*/
|
|
24
|
+
export interface SegmentKeyInput {
|
|
25
|
+
urlPath: string;
|
|
26
|
+
segmentName?: string;
|
|
27
|
+
segmentType?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compute state-tree keys for a segment chain.
|
|
31
|
+
*
|
|
32
|
+
* Non-group segments use their urlPath as-is. Route groups accumulate
|
|
33
|
+
* ancestor group names to produce globally unique keys:
|
|
34
|
+
* app/(a)/(shared)/dashboard → keys: ['/', '/(a)', '/(a)/(shared)', '/dashboard']
|
|
35
|
+
*
|
|
36
|
+
* **An intercepting segment switches the chain to name accumulation for good.**
|
|
37
|
+
* A children-path interception (TIM-1280) puts an intercepting node and its
|
|
38
|
+
* descendants into the *main* rendered chain, and their `urlPath`s are not
|
|
39
|
+
* URLs: interception adds no URL depth, so `app/(browse)/(...)[artistSlug]/[year]`
|
|
40
|
+
* carries `/` and `/[year]`. Keyed by urlPath the intercepting node would
|
|
41
|
+
* collide with its own owner, and `[year]` with any top-level `[year]` route —
|
|
42
|
+
* so a client that had one mounted would reuse the wrong cached layout. The
|
|
43
|
+
* switch is sticky rather than per-node because the *descendants* are where
|
|
44
|
+
* the false URLs are; the intercepting node alone is not the problem.
|
|
45
|
+
*
|
|
46
|
+
* This is the single source of truth for segment keys — used by the
|
|
47
|
+
* element builder (skip decisions, SegmentOutlet props), segment info
|
|
48
|
+
* (X-Timber-Segments header), the client cache/state tree, and
|
|
49
|
+
* interception scoping (`routing/interception.ts`).
|
|
50
|
+
*/
|
|
51
|
+
export declare function computeSegmentKeys(segments: SegmentKeyInput[]): string[];
|
|
52
|
+
/**
|
|
53
|
+
* Compute tree paths for a segment chain — the directory path of each segment
|
|
54
|
+
* with slots elided, e.g. `app/(browse)/feed` → `/(browse)/feed`.
|
|
55
|
+
*
|
|
56
|
+
* This is `computeSegmentKeys` with the group branch applied to *every*
|
|
57
|
+
* segment rather than only to groups. That one difference is the whole point:
|
|
58
|
+
* `computeSegmentKeys` resets to `urlPath` at each URL-visible segment, so
|
|
59
|
+
* `(browse)/feed` and `(landing)/feed` both key as `/feed`. Two directories
|
|
60
|
+
* that render different layouts must not share an identity.
|
|
61
|
+
*
|
|
62
|
+
* Used for interception scoping (`routing/interception.ts`), where the
|
|
63
|
+
* question is "does this route pass through *that* directory?" — not "does it
|
|
64
|
+
* render this URL?". Not interchangeable with `computeSegmentKeys`: the state
|
|
65
|
+
* tree is keyed by URL on purpose, because the client caches by URL.
|
|
66
|
+
*/
|
|
67
|
+
export declare function computeSegmentTreePaths(segments: SegmentKeyInput[]): string[];
|
|
68
|
+
/**
|
|
69
|
+
* The directory names a tree path is built from — `/` is none, `/feed/(a)` is
|
|
70
|
+
* `['feed', '(a)']`.
|
|
71
|
+
*
|
|
72
|
+
* The inverse of the walk above, and it lives beside it so the format is
|
|
73
|
+
* stated once: `findChainByTreePath` (`server/children-interception.ts`) walks
|
|
74
|
+
* these names back down the tree to the directory the path addresses, and
|
|
75
|
+
* `treePathDepth` counts them. Both are readings of the same string, and a
|
|
76
|
+
* reader that disagreed with the producer about what separates two names
|
|
77
|
+
* resolves an interception to the wrong node or to none.
|
|
78
|
+
*/
|
|
79
|
+
export declare function treePathNames(treePath: string): string[];
|
|
80
|
+
/**
|
|
81
|
+
* How many directories a tree path names — `/` is 0, `/feed` is 1,
|
|
82
|
+
* `/feed/(a)` is 2.
|
|
83
|
+
*
|
|
84
|
+
* Two tree paths on a single rendered chain are strictly nested, so on that
|
|
85
|
+
* chain depth orders them totally — which is what makes it usable as "the
|
|
86
|
+
* deeper of these two directories" wherever a route passes through both
|
|
87
|
+
* (`routing/interception.ts`).
|
|
88
|
+
*/
|
|
89
|
+
export declare function treePathDepth(treePath: string): number;
|
|
90
|
+
/**
|
|
91
|
+
* Compute a unique key for a parallel route slot.
|
|
92
|
+
* Format: `{parentSegmentId}/@{slotName}`, e.g. `/@sidebar` or `/dashboard/@modal`.
|
|
93
|
+
*/
|
|
94
|
+
export declare function computeSlotKey(parentSegmentId: string, slotName: string): string;
|
|
95
|
+
//# sourceMappingURL=segment-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segment-keys.d.ts","sourceRoot":"","sources":["../../src/routing/segment-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAmBxE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAmB7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIhF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel slot placement.
|
|
3
|
+
*
|
|
4
|
+
* One rule: a slot is resolved only for a segment on the **matched route
|
|
5
|
+
* chain**, and a slot's own subtree is never on that chain. So a slot declared
|
|
6
|
+
* anywhere inside another slot's subtree can never render, and is rejected at
|
|
7
|
+
* build time rather than left as a directory the author will keep editing.
|
|
8
|
+
*
|
|
9
|
+
* See design/07-routing.md §"Parallel Routes".
|
|
10
|
+
*/
|
|
11
|
+
import type { SegmentNode } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Reject every parallel slot that no renderer reaches.
|
|
14
|
+
*
|
|
15
|
+
* **Where slots are resolved.** Two places read `segment.slots`, and both walk
|
|
16
|
+
* the main route chain: `route-element-builder.ts` (the RSC render) and
|
|
17
|
+
* `tree-builder.ts`. Neither is reachable from inside a slot. The slot's own
|
|
18
|
+
* subtree is rendered by `slot-resolver.ts`, which walks the slot's matched
|
|
19
|
+
* chain to apply that chain's layouts, error boundaries and access gates
|
|
20
|
+
* (`wrapWithIntermediateSegments`, `wrapWithLayout`) and never reads `.slots`
|
|
21
|
+
* on any of those nodes. So `app/feed/@modal/photo/@side/page.tsx` and
|
|
22
|
+
* everything below it is dead: the file is scanned, typed, code-split and
|
|
23
|
+
* shipped, and no request can render it.
|
|
24
|
+
*
|
|
25
|
+
* That is the TIM-1278 failure — a directory that silently never renders —
|
|
26
|
+
* and the reason it is a build error rather than a documented limit is that
|
|
27
|
+
* nothing at request time can report it. A slot that does not match renders
|
|
28
|
+
* `default.tsx` or `null`, which is exactly what a slot the resolver never
|
|
29
|
+
* looked at also produces, so the author sees the *designed* behaviour of a
|
|
30
|
+
* non-matching slot and has no signal to distinguish it from a slot that
|
|
31
|
+
* cannot match at all.
|
|
32
|
+
*
|
|
33
|
+
* **Interception is incidental.** TIM-1311 arrived as
|
|
34
|
+
* `feed/@modal/(.)photo/@side`, and the interception contributes nothing: the
|
|
35
|
+
* identical `feed/@modal/photo/@side` never renders either, for the same
|
|
36
|
+
* reason and with no marker anywhere. Rejecting only the intercepting spelling
|
|
37
|
+
* would have drawn a line the author cannot see from the directory names.
|
|
38
|
+
*
|
|
39
|
+
* The children-path interception shape is **not** affected and must not be:
|
|
40
|
+
* its intercepting node joins the main chain (`server/children-interception.ts`
|
|
41
|
+
* splices `[…owner ancestors, interceptingNode, …descendants]` into an ordinary
|
|
42
|
+
* `RouteMatch`), so `route-element-builder.ts` resolves slots on it and below
|
|
43
|
+
* it exactly as it does for any other chain segment. `(browse)/(...)photo/[id]/@side`
|
|
44
|
+
* renders; `feed/@modal/(.)photo/@side` does not. The discriminator is the slot
|
|
45
|
+
* boundary, which is what this walk tracks — not the marker.
|
|
46
|
+
*/
|
|
47
|
+
export declare function validateSlotPlacement(root: SegmentNode): void;
|
|
48
|
+
//# sourceMappingURL=slot-placement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-placement.d.ts","sourceRoot":"","sources":["../../src/routing/slot-placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAE7D"}
|
package/dist/routing/types.d.ts
CHANGED
|
@@ -81,12 +81,6 @@ export interface SegmentNode<TFile = RouteFile> {
|
|
|
81
81
|
middleware?: TFile;
|
|
82
82
|
access?: TFile;
|
|
83
83
|
route?: TFile;
|
|
84
|
-
/**
|
|
85
|
-
* params.ts — isomorphic convention file exporting segmentParams and/or searchParams.
|
|
86
|
-
* Discovered by the scanner like middleware.ts and access.ts.
|
|
87
|
-
* See design/07-routing.md §"params.ts Convention File"
|
|
88
|
-
*/
|
|
89
|
-
params?: TFile;
|
|
90
84
|
error?: TFile;
|
|
91
85
|
default?: TFile;
|
|
92
86
|
/** Status-code files: 4xx.tsx, 5xx.tsx, {status}.tsx (component format) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routing/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,kCAAkC;AAClC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,oBAAoB,GACpB,OAAO,GACP,MAAM,GACN,cAAc,GACd,SAAS,CAAC;AAEd;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EAAyC,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,SAAS;IAC5C,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAGhC,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routing/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,kCAAkC;AAClC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,oBAAoB,GACpB,OAAO,GACP,MAAM,GACN,cAAc,GACd,SAAS,CAAC;AAEd;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EAAyC,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,SAAS;IAC5C,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAGhC,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,KAAK,CAAC;IAEf,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAGvC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;CAC3C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS,CAAC,KAAK,GAAG,SAAS;IAC1C,gDAAgD;IAChD,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IACzB,qEAAqE;IACrE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB;AAED,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,8BAA8B;AAC9B,eAAO,MAAM,uBAAuB,UAA6B,CAAC"}
|
|
@@ -45,6 +45,12 @@ export interface CollectLeafRoutesOptions {
|
|
|
45
45
|
* entries (the build report deduplicates by URL afterward).
|
|
46
46
|
* - Parallel slots are skipped unless `includeSlots: true` (slots
|
|
47
47
|
* share their parent's URL and are not addressable on their own).
|
|
48
|
+
* - Intercepting subtrees are skipped unconditionally. They render only
|
|
49
|
+
* on soft navigation and add no URL depth, so their computed `urlPath`s
|
|
50
|
+
* are not addresses — listing them would advertise routes (`/[year]`)
|
|
51
|
+
* that no request can reach. This matches every other consumer of the
|
|
52
|
+
* tree that produces URLs: the sitemap generator, the static generator,
|
|
53
|
+
* prerendering and the prebuilt-payload builder all skip them too.
|
|
48
54
|
* - Result is sorted by `urlPath` for deterministic output.
|
|
49
55
|
*/
|
|
50
56
|
export declare function collectLeafRoutes<TFile>(root: SegmentNode<TFile>, options?: CollectLeafRoutesOptions): LeafRoute<TFile>[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walkers.d.ts","sourceRoot":"","sources":["../../src/routing/walkers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,WAAW,SAAS,CAAC,KAAK;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,mDAAmD;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,uCAAuC;AACvC,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED
|
|
1
|
+
{"version":3,"file":"walkers.d.ts","sourceRoot":"","sources":["../../src/routing/walkers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,WAAW,SAAS,CAAC,KAAK;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,mDAAmD;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,uCAAuC;AACvC,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EACrC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,EACxB,OAAO,GAAE,wBAA6B,GACrC,SAAS,CAAC,KAAK,CAAC,EAAE,CAMpB"}
|