@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
package/src/routing/codegen.ts
CHANGED
|
@@ -12,13 +12,8 @@ import { existsSync } from 'node:fs';
|
|
|
12
12
|
import { join, relative } from 'node:path';
|
|
13
13
|
import type { RouteTree, SegmentNode } from './types.js';
|
|
14
14
|
import type { ParamEntry, RouteEntry } from './codegen-types.js';
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
buildSchemaParamType,
|
|
18
|
-
emitResolveSegmentFieldHelper,
|
|
19
|
-
formatSearchParamsType,
|
|
20
|
-
} from './codegen-shared.js';
|
|
21
|
-
import { fileHasExport } from './export-detect.js';
|
|
15
|
+
import { buildSchemaParamType } from './codegen-shared.js';
|
|
16
|
+
import { effectiveUrlSegment, type UrlSegmentIdentity } from './segment-classify.js';
|
|
22
17
|
import { formatLinkCatchAllOverloads, formatTypedLinkOverloads } from './link-codegen.js';
|
|
23
18
|
|
|
24
19
|
/** Options for route map generation. */
|
|
@@ -49,7 +44,7 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
|
|
|
49
44
|
const hasSchema = options.hasSchema ?? detectSchema(options.appDir);
|
|
50
45
|
|
|
51
46
|
const routes: RouteEntry[] = [];
|
|
52
|
-
collectRoutes(tree.root, [],
|
|
47
|
+
collectRoutes(tree.root, [], '', routes, hasSchema, false);
|
|
53
48
|
|
|
54
49
|
// Sort routes alphabetically for deterministic output
|
|
55
50
|
routes.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
|
|
@@ -80,124 +75,99 @@ function detectSchema(appDir: string | undefined): boolean {
|
|
|
80
75
|
function collectRoutes(
|
|
81
76
|
node: SegmentNode,
|
|
82
77
|
ancestorParams: ParamEntry[],
|
|
83
|
-
ancestorParamsFiles: string[],
|
|
84
78
|
parentTreePath: string,
|
|
85
79
|
routes: RouteEntry[],
|
|
86
80
|
hasSchema: boolean,
|
|
87
|
-
insideSlot: boolean
|
|
81
|
+
insideSlot: boolean,
|
|
82
|
+
insideIntercepting = false
|
|
88
83
|
): void {
|
|
89
84
|
// Build the tree path (includes groups, slots — uniquely identifies this segment).
|
|
90
85
|
// Root node has empty segmentName, producing treePath = ''.
|
|
91
86
|
const treePath = node.segmentName ? `${parentTreePath}/${node.segmentName}` : parentTreePath;
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
: undefined;
|
|
104
|
-
|
|
105
|
-
// Accumulate params from this segment. We attach `codecFilePaths`
|
|
106
|
-
// later (at leaf time) using the FULL chain so descendant overrides
|
|
107
|
-
// are visible. The legacy layout/page fallback is recorded now
|
|
108
|
-
// because it is per-segment (and does not participate in inheritance).
|
|
87
|
+
// Accumulate params from this segment.
|
|
88
|
+
//
|
|
89
|
+
// The segment is read through `effectiveUrlSegment` for the same reason the
|
|
90
|
+
// runtime coercer is: an intercepting node's own `segmentType` is
|
|
91
|
+
// 'intercepting' and its `paramName` is unset — the param it binds lives in
|
|
92
|
+
// the intercepted name (`(.)[albumSlug]` → `[albumSlug]`). Reading the node
|
|
93
|
+
// directly emitted `{}` for a segment the router does bind and coerce, so
|
|
94
|
+
// the types disagreed with the values for every intercepting page with a
|
|
95
|
+
// dynamic intercepted segment, and for its descendants, which lost the
|
|
96
|
+
// ancestor param too.
|
|
97
|
+
const urlSegment = effectiveUrlSegment(node);
|
|
109
98
|
const params = [...ancestorParams];
|
|
110
|
-
if (
|
|
111
|
-
const legacyFallback = ownParamsFile ? undefined : findLegacyParamsExport(node);
|
|
99
|
+
if (urlSegment.paramName) {
|
|
112
100
|
params.push({
|
|
113
|
-
name:
|
|
114
|
-
bracketName: bracketNameForSegment(
|
|
115
|
-
type: paramTypeForSegment(
|
|
116
|
-
// Codec chain populated at leaf time. We carry the per-segment
|
|
117
|
-
// legacy fallback (if any) so leaf-time resolution can fall back
|
|
118
|
-
// to it when no params.ts in the chain declares this key.
|
|
119
|
-
legacyCodecFilePath: legacyFallback,
|
|
101
|
+
name: urlSegment.paramName,
|
|
102
|
+
bracketName: bracketNameForSegment(urlSegment),
|
|
103
|
+
type: paramTypeForSegment(urlSegment.segmentType),
|
|
120
104
|
});
|
|
121
105
|
}
|
|
122
106
|
|
|
123
|
-
// Extend the chain for descendants of this segment.
|
|
124
|
-
const nextAncestorFiles = ownParamsFile
|
|
125
|
-
? [...ancestorParamsFiles, ownParamsFile]
|
|
126
|
-
: ancestorParamsFiles;
|
|
127
|
-
|
|
128
107
|
// Check if this segment is a leaf route (has page or route file)
|
|
129
108
|
const isPage = !!node.page;
|
|
130
109
|
const isApiRoute = !!node.route;
|
|
131
110
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
name: p.name,
|
|
149
|
-
bracketName: p.bracketName,
|
|
150
|
-
type: p.type,
|
|
151
|
-
codecFilePaths,
|
|
152
|
-
};
|
|
153
|
-
});
|
|
154
|
-
|
|
111
|
+
// A segment that hosts code but is not itself addressable — a layout,
|
|
112
|
+
// middleware, or access check above the leaf — still gets a `$segment`
|
|
113
|
+
// module, so `getSegmentParams(SEGMENT_PATH)` is callable from it and needs
|
|
114
|
+
// a matching typed overload. Emitting only leaves left those call sites on
|
|
115
|
+
// the broad `Record<string, string | string[]>` signature, which since
|
|
116
|
+
// TIM-1342 (which deleted `defineSegmentParams`) is their ONLY typed path.
|
|
117
|
+
// design/41-global-params.md's Type Summary promises layouts and middleware
|
|
118
|
+
// exact accumulated params.
|
|
119
|
+
//
|
|
120
|
+
// `isRoutable: false` keeps them out of the urlPath-keyed emissions — the
|
|
121
|
+
// `Routes` interface and `<Link>` variants — where they would publish a URL
|
|
122
|
+
// that no request can reach. They belong only to the segmentPath-keyed
|
|
123
|
+
// APIs: `getSegmentParams`, `useSegmentParams`, `TimberSegmentParams`.
|
|
124
|
+
const hostsCode = !!node.layout || !!node.middleware || !!node.access;
|
|
125
|
+
|
|
126
|
+
if (isPage || isApiRoute || hostsCode) {
|
|
155
127
|
const entry: RouteEntry = {
|
|
156
128
|
urlPath: node.urlPath,
|
|
157
129
|
segmentPath: treePath || '/',
|
|
158
|
-
params
|
|
159
|
-
hasSearchParams: false,
|
|
130
|
+
params,
|
|
160
131
|
isApiRoute,
|
|
132
|
+
isRoutable: isPage || isApiRoute,
|
|
161
133
|
isSlotRoute: insideSlot,
|
|
134
|
+
isInterceptingRoute: insideIntercepting,
|
|
162
135
|
hasSchema,
|
|
163
136
|
};
|
|
164
137
|
|
|
165
|
-
// Detect searchParams export from params.ts (primary) or page.tsx (fallback)
|
|
166
|
-
if (isPage) {
|
|
167
|
-
if (node.params && fileHasExport(node.params.filePath, 'searchParams')) {
|
|
168
|
-
entry.hasSearchParams = true;
|
|
169
|
-
entry.searchParamsPagePath = node.params.filePath;
|
|
170
|
-
} else if (node.page && fileHasExport(node.page.filePath, 'searchParams')) {
|
|
171
|
-
entry.hasSearchParams = true;
|
|
172
|
-
entry.searchParamsPagePath = node.page.filePath;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
138
|
routes.push(entry);
|
|
177
139
|
}
|
|
178
140
|
|
|
179
|
-
// Recurse into children
|
|
141
|
+
// Recurse into children. An intercepting subtree is flagged, and the flag is
|
|
142
|
+
// sticky — the descendants are where the false URLs are. See
|
|
143
|
+
// `RouteEntry.isInterceptingRoute` for what the flag drops and why dedupe
|
|
144
|
+
// alone was not enough.
|
|
180
145
|
for (const child of node.children) {
|
|
181
|
-
|
|
146
|
+
const childIntercepting = insideIntercepting || child.segmentType === 'intercepting';
|
|
147
|
+
collectRoutes(child, params, treePath, routes, hasSchema, insideSlot, childIntercepting);
|
|
182
148
|
}
|
|
183
149
|
|
|
184
150
|
// Recurse into slots (they share the parent's URL path, but may have their own pages)
|
|
185
151
|
for (const slot of Object.values(node.slots)) {
|
|
186
|
-
collectRoutes(slot, params,
|
|
152
|
+
collectRoutes(slot, params, treePath, routes, hasSchema, true, insideIntercepting);
|
|
187
153
|
}
|
|
188
154
|
}
|
|
189
155
|
|
|
190
156
|
/**
|
|
191
157
|
* Dedupe route entries by urlPath for urlPath-keyed emissions (the Routes
|
|
192
|
-
* interface
|
|
158
|
+
* interface and typed Link variants).
|
|
193
159
|
*
|
|
194
160
|
* Parallel-slot pages share their parent's urlPath; emitting one entry per
|
|
195
161
|
* slot page produced duplicate interface keys (TS2300/TS2717 under
|
|
196
162
|
* skipLibCheck:false) and duplicate overloads. The non-slot entry is the
|
|
197
163
|
* canonical one; when only slot entries exist (parent has no page), the
|
|
198
164
|
* lexicographically smallest segmentPath wins so output is independent of
|
|
199
|
-
* slot scan order.
|
|
200
|
-
*
|
|
165
|
+
* slot scan order.
|
|
166
|
+
*
|
|
167
|
+
* The loser is discarded outright. It used to donate its `searchParams`
|
|
168
|
+
* definition to the winner, because a slot could carry one the parent page
|
|
169
|
+
* lacked; since TIM-1343 no route entry carries a searchParams definition at
|
|
170
|
+
* all, there is nothing left to merge.
|
|
201
171
|
*
|
|
202
172
|
* segmentPath-keyed emissions (getSegmentParams, useSegmentParams,
|
|
203
173
|
* TimberSegmentParams) must NOT use this — segmentPaths are already unique
|
|
@@ -212,25 +182,11 @@ function dedupeRoutesByUrlPath(routes: RouteEntry[]): RouteEntry[] {
|
|
|
212
182
|
continue;
|
|
213
183
|
}
|
|
214
184
|
|
|
215
|
-
let winner = existing;
|
|
216
|
-
let loser = route;
|
|
217
185
|
const routeWins =
|
|
218
186
|
(existing.isSlotRoute && !route.isSlotRoute) ||
|
|
219
187
|
(!!existing.isSlotRoute === !!route.isSlotRoute &&
|
|
220
188
|
route.segmentPath.localeCompare(existing.segmentPath) < 0);
|
|
221
|
-
|
|
222
|
-
winner = route;
|
|
223
|
-
loser = existing;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
if (!winner.hasSearchParams && loser.hasSearchParams) {
|
|
227
|
-
winner = {
|
|
228
|
-
...winner,
|
|
229
|
-
hasSearchParams: true,
|
|
230
|
-
searchParamsPagePath: loser.searchParamsPagePath,
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
byPath.set(route.urlPath, winner);
|
|
189
|
+
byPath.set(route.urlPath, routeWins ? route : existing);
|
|
234
190
|
}
|
|
235
191
|
return [...byPath.values()];
|
|
236
192
|
}
|
|
@@ -243,7 +199,7 @@ function dedupeRoutesByUrlPath(routes: RouteEntry[]): RouteEntry[] {
|
|
|
243
199
|
* For bare segments like `[id]` this is the segmentName itself.
|
|
244
200
|
* For affixed segments like `img-[id].png` this is `[id]` — the bare bracket form.
|
|
245
201
|
*/
|
|
246
|
-
function bracketNameForSegment(node:
|
|
202
|
+
function bracketNameForSegment(node: UrlSegmentIdentity): string {
|
|
247
203
|
if (node.paramPrefix || node.paramSuffix) {
|
|
248
204
|
return `[${node.paramName}]`;
|
|
249
205
|
}
|
|
@@ -261,23 +217,6 @@ function paramTypeForSegment(segmentType: string): ParamEntry['type'] {
|
|
|
261
217
|
}
|
|
262
218
|
}
|
|
263
219
|
|
|
264
|
-
/**
|
|
265
|
-
* Find a legacy `segmentParams` export on layout.tsx or page.tsx.
|
|
266
|
-
*
|
|
267
|
-
* Backward-compat shim: TIM-508 made params.ts the canonical location
|
|
268
|
-
* for `segmentParams`. Layout/page exports are still accepted for the
|
|
269
|
-
* OWN segment only (not inherited by descendants — see TIM-834).
|
|
270
|
-
*/
|
|
271
|
-
function findLegacyParamsExport(node: SegmentNode): string | undefined {
|
|
272
|
-
if (node.layout && fileHasExport(node.layout.filePath, 'segmentParams')) {
|
|
273
|
-
return node.layout.filePath;
|
|
274
|
-
}
|
|
275
|
-
if (node.page && fileHasExport(node.page.filePath, 'segmentParams')) {
|
|
276
|
-
return node.page.filePath;
|
|
277
|
-
}
|
|
278
|
-
return undefined;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
220
|
/**
|
|
282
221
|
* Emit the schema-based type exports: TimberSegmentParams, TimberRoute,
|
|
283
222
|
* AllSegmentParams, RoutesWithParams.
|
|
@@ -401,28 +340,30 @@ function formatDeclarationFile(
|
|
|
401
340
|
lines.push('');
|
|
402
341
|
}
|
|
403
342
|
|
|
404
|
-
if (!hasSchema) {
|
|
405
|
-
// TIM-834 P2: emit the shared codec-resolution helper type ONCE so the
|
|
406
|
-
// per-param chain conditionals reference it instead of inlining the
|
|
407
|
-
// fallback in both branches (which grows O(2^N) in chain depth).
|
|
408
|
-
lines.push(emitResolveSegmentFieldHelper());
|
|
409
|
-
lines.push('');
|
|
410
|
-
}
|
|
411
|
-
|
|
412
343
|
// urlPath-keyed emissions use the deduped list (slot pages share their
|
|
413
344
|
// parent's urlPath); segmentPath-keyed emissions below keep all entries.
|
|
414
|
-
|
|
345
|
+
//
|
|
346
|
+
// Intercepting subtrees are dropped outright rather than deduped: their
|
|
347
|
+
// computed urlPath is not a route any request can reach, so a path that
|
|
348
|
+
// happens NOT to collide with a real one would otherwise be published as a
|
|
349
|
+
// real route. See `RouteEntry.isInterceptingRoute`.
|
|
350
|
+
const uniqueByUrlPath = dedupeRoutesByUrlPath(
|
|
351
|
+
routes.filter((r) => r.isRoutable && !r.isInterceptingRoute)
|
|
352
|
+
);
|
|
415
353
|
|
|
416
354
|
lines.push("declare module '@timber-js/app' {");
|
|
417
355
|
lines.push(' interface Routes {');
|
|
418
356
|
|
|
357
|
+
// TIM-1343: no `searchParams` member. With `params.ts` gone there is no
|
|
358
|
+
// convention file to read a definition from, so the framework has nothing
|
|
359
|
+
// to type it with — and an always-`{}` member is a claim that every route
|
|
360
|
+
// has no search params, which is false. Search-param types now come from
|
|
361
|
+
// the definition object itself, wherever the app chooses to keep it.
|
|
419
362
|
for (const route of uniqueByUrlPath) {
|
|
420
|
-
const paramsType = formatParamsType(route.params,
|
|
421
|
-
const searchParamsType = formatSearchParamsType(route, importBase);
|
|
363
|
+
const paramsType = formatParamsType(route.params, hasSchema);
|
|
422
364
|
|
|
423
365
|
lines.push(` '${route.urlPath}': {`);
|
|
424
366
|
lines.push(` segmentParams: ${paramsType}`);
|
|
425
|
-
lines.push(` searchParams: ${searchParamsType}`);
|
|
426
367
|
lines.push(` }`);
|
|
427
368
|
}
|
|
428
369
|
|
|
@@ -453,7 +394,7 @@ function formatDeclarationFile(
|
|
|
453
394
|
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
454
395
|
}
|
|
455
396
|
for (const route of dynamicRoutes) {
|
|
456
|
-
const paramsType = formatParamsType(route.params,
|
|
397
|
+
const paramsType = formatParamsType(route.params, hasSchema);
|
|
457
398
|
lines.push(
|
|
458
399
|
` export function getSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
459
400
|
);
|
|
@@ -471,9 +412,7 @@ function formatDeclarationFile(
|
|
|
471
412
|
|
|
472
413
|
if (dynamicRoutes.length > 0 || pageRoutes.length > 0) {
|
|
473
414
|
lines.push("declare module '@timber-js/app/client' {");
|
|
474
|
-
lines.push(
|
|
475
|
-
" import type { SearchParamsDefinition, SetParams, QueryStatesOptions, SearchParamCodec } from '@timber-js/app/search-params'"
|
|
476
|
-
);
|
|
415
|
+
lines.push(" import type { SearchParamsDefinition } from '@timber-js/app/search-params'");
|
|
477
416
|
if (hasSchema) {
|
|
478
417
|
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
479
418
|
}
|
|
@@ -482,7 +421,7 @@ function formatDeclarationFile(
|
|
|
482
421
|
// useSegmentParams overloads
|
|
483
422
|
if (dynamicRoutes.length > 0) {
|
|
484
423
|
for (const route of dynamicRoutes) {
|
|
485
|
-
const paramsType = formatParamsType(route.params,
|
|
424
|
+
const paramsType = formatParamsType(route.params, hasSchema);
|
|
486
425
|
lines.push(
|
|
487
426
|
` export function useSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
488
427
|
);
|
|
@@ -495,12 +434,6 @@ function formatDeclarationFile(
|
|
|
495
434
|
lines.push('');
|
|
496
435
|
}
|
|
497
436
|
|
|
498
|
-
// useQueryStates overloads
|
|
499
|
-
if (pageRoutes.length > 0) {
|
|
500
|
-
lines.push(...formatUseQueryStatesOverloads(pageRoutes, importBase));
|
|
501
|
-
lines.push('');
|
|
502
|
-
}
|
|
503
|
-
|
|
504
437
|
// Typed Link overloads — per-route with DIRECT types (no conditionals).
|
|
505
438
|
// Direct types preserve TypeScript's excess property checking.
|
|
506
439
|
//
|
|
@@ -515,7 +448,7 @@ function formatDeclarationFile(
|
|
|
515
448
|
// confusing "Type 'string' is not assignable to type 'never'" cascade.
|
|
516
449
|
if (pageRoutes.length > 0) {
|
|
517
450
|
lines.push(' // Typed Link overloads — per-route (block 1 / emitted first)');
|
|
518
|
-
lines.push(...formatTypedLinkOverloads(pageRoutes,
|
|
451
|
+
lines.push(...formatTypedLinkOverloads(pageRoutes, hasSchema));
|
|
519
452
|
lines.push('');
|
|
520
453
|
}
|
|
521
454
|
|
|
@@ -540,48 +473,29 @@ function formatDeclarationFile(
|
|
|
540
473
|
/**
|
|
541
474
|
* Format the params type for a route entry.
|
|
542
475
|
*/
|
|
543
|
-
function formatParamsType(params: ParamEntry[],
|
|
476
|
+
function formatParamsType(params: ParamEntry[], hasSchema?: boolean): string {
|
|
544
477
|
if (params.length === 0) {
|
|
545
478
|
return '{}';
|
|
546
479
|
}
|
|
547
480
|
|
|
481
|
+
// Without a schema a URL segment is an uninterpreted string — that IS
|
|
482
|
+
// its type. Per-segment codec chains used to narrow it here; TIM-1342
|
|
483
|
+
// deleted them along with params.ts.
|
|
548
484
|
const fields = params.map((p) => {
|
|
549
|
-
const codecType = hasSchema
|
|
550
|
-
? buildSchemaParamType(p)
|
|
551
|
-
: buildCodecChainType(p, importBase, p.type);
|
|
485
|
+
const codecType = hasSchema ? buildSchemaParamType(p) : p.type;
|
|
552
486
|
return `${p.name}: ${codecType}`;
|
|
553
487
|
});
|
|
554
488
|
return `{ ${fields.join('; ')} }`;
|
|
555
489
|
}
|
|
556
490
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
*/
|
|
566
|
-
function formatUseQueryStatesOverloads(routes: RouteEntry[], importBase?: string): string[] {
|
|
567
|
-
const lines: string[] = [];
|
|
568
|
-
|
|
569
|
-
for (const route of routes) {
|
|
570
|
-
const searchParamsType = route.hasSearchParams
|
|
571
|
-
? formatSearchParamsType(route, importBase)
|
|
572
|
-
: '{}';
|
|
573
|
-
lines.push(
|
|
574
|
-
` export function useQueryStates<R extends '${route.urlPath}'>(route: R, options?: QueryStatesOptions): [${searchParamsType}, SetParams<${searchParamsType}>]`
|
|
575
|
-
);
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
// Fallback: standalone codecs (existing API)
|
|
579
|
-
lines.push(
|
|
580
|
-
' export function useQueryStates<T extends Record<string, unknown>>(codecs: { [K in keyof T]: SearchParamCodec<T[K]> }, options?: QueryStatesOptions): [T, SetParams<T>]'
|
|
581
|
-
);
|
|
582
|
-
|
|
583
|
-
return lines;
|
|
584
|
-
}
|
|
491
|
+
// TIM-1341: `useQueryStates` no longer has a route-string form, so the
|
|
492
|
+
// generated `.d.ts` emits no overloads for it. Its source signature —
|
|
493
|
+
// `useQueryStates(codecs, options?)` — is fully generic over the codec map
|
|
494
|
+
// and needs no per-route augmentation. Reaching another route's codecs is
|
|
495
|
+
// done by importing that route's `searchParams` definition from its
|
|
496
|
+
// `params.ts` and calling `definition.useQueryStates()`, which is typed by
|
|
497
|
+
// inference and cannot fail at runtime on an unpopulated registry.
|
|
498
|
+
// See design/23-search-params.md §"Client Access".
|
|
585
499
|
|
|
586
500
|
// Link overload formatters and helpers (`formatTypedLinkOverloads`,
|
|
587
501
|
// `formatLinkCatchAllOverloads`, `formatLinkParamsType`,
|