@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
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared codegen helpers — import-path computation
|
|
3
|
-
*
|
|
2
|
+
* Shared codegen helpers — import-path computation and codec chain type
|
|
3
|
+
* builders.
|
|
4
4
|
*
|
|
5
5
|
* Extracted from `codegen.ts` so `link-codegen.ts` can use the same
|
|
6
6
|
* helpers without a cyclic import.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { relative, posix } from 'node:path';
|
|
10
|
-
import type { ParamEntry
|
|
10
|
+
import type { ParamEntry } from './codegen-types.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Compute a relative import specifier for a codec/page file, stripping
|
|
@@ -21,65 +21,6 @@ export function codecImportPath(codecFilePath: string, importBase: string | unde
|
|
|
21
21
|
return './' + posix.basename(absPath);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
/** Name of the shared helper type emitted at the top of the .d.ts. */
|
|
25
|
-
export const RESOLVE_SEGMENT_FIELD_TYPE_NAME = '_TimberResolveSegmentField';
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Helper type emitted once at the top of the generated `.d.ts` and
|
|
29
|
-
* referenced by every codec-chain conditional. Without this shared
|
|
30
|
-
* helper, the inline expansion would duplicate the fallback branch on
|
|
31
|
-
* every step and grow O(2^N) in chain depth (a single deep nested route
|
|
32
|
-
* could blow up the file size and TS performance). With the helper,
|
|
33
|
-
* each step reuses the named type and growth is O(N).
|
|
34
|
-
*
|
|
35
|
-
* The helper is a 2-arg conditional: given a typeof import expression
|
|
36
|
-
* (`Def`), a key (`K`), and a fallback (`F`), it returns `T[K]` if
|
|
37
|
-
* `Def extends ParamsDefinition<T>` and `K extends keyof T`, otherwise
|
|
38
|
-
* `F`. The codec chain composes calls to this helper.
|
|
39
|
-
*/
|
|
40
|
-
export function emitResolveSegmentFieldHelper(): string {
|
|
41
|
-
return [
|
|
42
|
-
`type ${RESOLVE_SEGMENT_FIELD_TYPE_NAME}<Def, K extends string, F> =`,
|
|
43
|
-
` Def extends import('@timber-js/app/segment-params').ParamsDefinition<infer T>`,
|
|
44
|
-
` ? K extends keyof T ? T[K] : F`,
|
|
45
|
-
` : F;`,
|
|
46
|
-
].join('\n');
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Build a TypeScript type expression that resolves a single param's
|
|
51
|
-
* codec by walking a chain of params.ts files in priority order.
|
|
52
|
-
*
|
|
53
|
-
* Each entry in the chain emits one application of the shared
|
|
54
|
-
* `_TimberResolveSegmentField` helper type. Composing N applications
|
|
55
|
-
* grows linearly with chain depth (O(N) characters), unlike an inline
|
|
56
|
-
* conditional that would duplicate the fallback in each branch and
|
|
57
|
-
* grow O(2^N).
|
|
58
|
-
*
|
|
59
|
-
* The closest match (position 0 in the chain) is checked first; if its
|
|
60
|
-
* `segmentParams` definition declares the key, its inferred type wins.
|
|
61
|
-
* Otherwise we fall through to the next entry, and finally to the
|
|
62
|
-
* provided fallback. See TIM-834.
|
|
63
|
-
*/
|
|
64
|
-
export function buildCodecChainType(
|
|
65
|
-
p: ParamEntry,
|
|
66
|
-
importBase: string | undefined,
|
|
67
|
-
fallback: string
|
|
68
|
-
): string {
|
|
69
|
-
const files = p.codecFilePaths;
|
|
70
|
-
if (!files || files.length === 0) return fallback;
|
|
71
|
-
const key = JSON.stringify(p.name);
|
|
72
|
-
// Compose helper applications inside-out so the closest entry
|
|
73
|
-
// (files[0]) ends up as the OUTERMOST application. Each application
|
|
74
|
-
// adds a constant-size wrapper around the running fallback.
|
|
75
|
-
let inner = fallback;
|
|
76
|
-
for (let i = files.length - 1; i >= 0; i--) {
|
|
77
|
-
const importPath = codecImportPath(files[i], importBase);
|
|
78
|
-
inner = `${RESOLVE_SEGMENT_FIELD_TYPE_NAME}<(typeof import('${importPath}'))['segmentParams'], ${key}, ${inner}>`;
|
|
79
|
-
}
|
|
80
|
-
return inner;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
24
|
/**
|
|
84
25
|
* Build a TypeScript type expression for a single param using the global
|
|
85
26
|
* schema's InferCodecType. Falls back to the param's base type when
|
|
@@ -96,20 +37,3 @@ export function buildSchemaParamType(p: ParamEntry, fallback?: string): string {
|
|
|
96
37
|
const fb = fallback ?? p.type;
|
|
97
38
|
return `typeof schema['segmentParams'] extends Record<${key}, infer V> ? InferCodecType<V> : ${fb}`;
|
|
98
39
|
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Format the searchParams type for a route entry.
|
|
102
|
-
*
|
|
103
|
-
* When a page.tsx (or params.ts) exports searchParams, we reference its
|
|
104
|
-
* inferred type via an import type. The import path is relative to
|
|
105
|
-
* `importBase` (the directory where the .d.ts will be written). When
|
|
106
|
-
* importBase is undefined, falls back to a bare relative path.
|
|
107
|
-
*/
|
|
108
|
-
export function formatSearchParamsType(route: RouteEntry, importBase?: string): string {
|
|
109
|
-
if (route.hasSearchParams && route.searchParamsPagePath) {
|
|
110
|
-
const importPath = codecImportPath(route.searchParamsPagePath, importBase);
|
|
111
|
-
// Extract the type from the named 'searchParams' export of the page module.
|
|
112
|
-
return `(typeof import('${importPath}'))['searchParams'] extends import('@timber-js/app/search-params').SearchParamsDefinition<infer T> ? T : never`;
|
|
113
|
-
}
|
|
114
|
-
return '{}';
|
|
115
|
-
}
|
|
@@ -15,16 +15,40 @@ export interface RouteEntry {
|
|
|
15
15
|
segmentPath: string;
|
|
16
16
|
/** Accumulated params from all ancestor dynamic segments */
|
|
17
17
|
params: ParamEntry[];
|
|
18
|
-
/** Whether the page.tsx exports searchParams */
|
|
19
|
-
hasSearchParams: boolean;
|
|
20
|
-
/** Absolute path to the page file that exports searchParams (for import paths) */
|
|
21
|
-
searchParamsPagePath?: string;
|
|
22
18
|
/** Whether this is an API route (route.ts) vs page route */
|
|
23
19
|
isApiRoute: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Whether a request can reach this segment — it has a `page` or `route`.
|
|
22
|
+
*
|
|
23
|
+
* False for a segment that only hosts a layout/middleware/access above the
|
|
24
|
+
* leaf. Those still need typed `getSegmentParams(SEGMENT_PATH)` overloads
|
|
25
|
+
* (they have a `$segment` module), but must NOT appear in urlPath-keyed
|
|
26
|
+
* emissions — the `Routes` interface and `<Link>` — because their urlPath
|
|
27
|
+
* is not an addressable route. See TIM-1342.
|
|
28
|
+
*/
|
|
29
|
+
isRoutable: boolean;
|
|
24
30
|
/** Whether this entry lives inside a parallel slot (@name). Slot entries
|
|
25
31
|
* share their parent's urlPath — urlPath-keyed emissions dedupe them,
|
|
26
32
|
* preferring the non-slot entry. segmentPath-keyed emissions keep all. */
|
|
27
33
|
isSlotRoute?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Whether this entry lives inside an intercepting subtree.
|
|
36
|
+
*
|
|
37
|
+
* Such an entry has **no URL of its own**. Interception adds no URL depth,
|
|
38
|
+
* so the scanner's `urlPath` for the subtree is the owner's path with the
|
|
39
|
+
* descendants' names appended — `(browse)/(...)[artistSlug]/[year]` computes
|
|
40
|
+
* `/[year]`, which is not the route it renders at (that is
|
|
41
|
+
* `/[artistSlug]/[year]`) and is not reachable by any request. It is also
|
|
42
|
+
* soft-navigation-only.
|
|
43
|
+
*
|
|
44
|
+
* So these entries are dropped from every urlPath-keyed emission (`Routes`,
|
|
45
|
+
* `useQueryStates`, typed `<Link>`) rather than deduped against the
|
|
46
|
+
* canonical route: dedupe only helps where the paths happen to collide, and
|
|
47
|
+
* a non-colliding computed path would be published as a real route.
|
|
48
|
+
* segmentPath-keyed emissions keep them, so the intercepting page's own
|
|
49
|
+
* params stay typed.
|
|
50
|
+
*/
|
|
51
|
+
isInterceptingRoute?: boolean;
|
|
28
52
|
/** Whether a global schema (app/schema.ts) exists for this app */
|
|
29
53
|
hasSchema?: boolean;
|
|
30
54
|
}
|
|
@@ -35,31 +59,4 @@ export interface ParamEntry {
|
|
|
35
59
|
* e.g. '[id]', '[...slug]', '[[...slug]]' */
|
|
36
60
|
bracketName: string;
|
|
37
61
|
type: 'string' | 'string[]' | 'string[] | undefined';
|
|
38
|
-
/**
|
|
39
|
-
* Ordered list of params.ts files in the route chain that may declare
|
|
40
|
-
* a codec for this param, in priority order — **closest-to-leaf
|
|
41
|
-
* first**. The generated type emits a chain that picks the first
|
|
42
|
-
* entry whose `segmentParams` definition declares this param key.
|
|
43
|
-
*
|
|
44
|
-
* This array is the SAME for every param in a given route entry
|
|
45
|
-
* (it is the route's full ancestry of params.ts files in leaf-first
|
|
46
|
-
* order); the type-level conditional in `buildCodecChainType`
|
|
47
|
-
* narrows per-key. Sharing the array matches the runtime semantics
|
|
48
|
-
* of `coerceSegmentParams`, which walks segments top-down and lets
|
|
49
|
-
* later (deeper) coercions overwrite earlier ones — closest-to-leaf
|
|
50
|
-
* wins for both types and runtime.
|
|
51
|
-
*
|
|
52
|
-
* See TIM-834.
|
|
53
|
-
*/
|
|
54
|
-
codecFilePaths?: string[];
|
|
55
|
-
/**
|
|
56
|
-
* Per-segment legacy fallback: a layout.tsx or page.tsx that exports
|
|
57
|
-
* `segmentParams` directly (pre-TIM-508 convention). Used only when
|
|
58
|
-
* the chain has no params.ts files at all. Does NOT participate in
|
|
59
|
-
* inheritance — a layout/page export is per-segment only.
|
|
60
|
-
*
|
|
61
|
-
* @internal Set during `collectRoutes`; consumed at leaf time when
|
|
62
|
-
* building the final `codecFilePaths`.
|
|
63
|
-
*/
|
|
64
|
-
legacyCodecFilePath?: string;
|
|
65
62
|
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route-map codegen writer.
|
|
3
|
+
*
|
|
4
|
+
* Materializes the generated route types on disk: `.timber/timber-routes.d.ts`,
|
|
5
|
+
* `.timber/segment-types.d.ts` (via `writeSegmentTypes`), and the root
|
|
6
|
+
* `timber-env.d.ts` that references them.
|
|
7
|
+
*
|
|
8
|
+
* Lives outside `plugins/routing.ts` because it has two callers with two
|
|
9
|
+
* different failure policies: the dev/build plugin starts the write off the hot
|
|
10
|
+
* path and logs failures, while `timber check` awaits it and treats a failure as
|
|
11
|
+
* fatal — a type check run against absent or stale route types reports errors
|
|
12
|
+
* about code that is fine. One implementation, two policies, so the bytes on
|
|
13
|
+
* disk cannot drift between the two commands.
|
|
14
|
+
*
|
|
15
|
+
* Design docs: 09-typescript.md §"Typed Routes", 18-build-system.md
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { generateRouteMap } from './codegen.js';
|
|
21
|
+
import { writeSegmentTypes } from './segment-codegen.js';
|
|
22
|
+
import type { RouteTree } from './types.js';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Path (relative to the project root) of the generated route map declaration
|
|
26
|
+
* file, and the name of the root file that `/// <reference>`s it.
|
|
27
|
+
*
|
|
28
|
+
* Exported because `timber check` has to answer whether the user's tsconfig
|
|
29
|
+
* pulls these into the program — a question about these exact paths. It derives
|
|
30
|
+
* them from here rather than restating them, so a rename cannot leave the check
|
|
31
|
+
* looking for a file nothing writes.
|
|
32
|
+
*/
|
|
33
|
+
export const CODEGEN_OUTPUT = '.timber/timber-routes.d.ts';
|
|
34
|
+
|
|
35
|
+
/** Root-level file that references the generated declarations. */
|
|
36
|
+
export const ENV_DTS_FILENAME = 'timber-env.d.ts';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Content of the timber-env.d.ts file written to the project root.
|
|
40
|
+
*
|
|
41
|
+
* Uses a triple-slash reference so TypeScript auto-discovers the generated
|
|
42
|
+
* route map without the user needing to edit tsconfig.json — same pattern
|
|
43
|
+
* as Next.js's next-env.d.ts.
|
|
44
|
+
*
|
|
45
|
+
* Also references `vite/client` so side-effect imports like
|
|
46
|
+
* `import './globals.css'` type-check without ts(2882), and so
|
|
47
|
+
* `import.meta.env`, `import.meta.hot`, `import.meta.glob`, asset
|
|
48
|
+
* imports (`*.png`, `*.svg`, …), CSS modules, and `?url`/`?raw`/
|
|
49
|
+
* `?inline` query variants all resolve without the user editing
|
|
50
|
+
* tsconfig.json themselves. Next.js's next-env.d.ts plays the same
|
|
51
|
+
* role via `next/types/global`.
|
|
52
|
+
*
|
|
53
|
+
* `vite` is a peer dep of `@timber-js/app`, so the reference always
|
|
54
|
+
* resolves in a correctly-installed project.
|
|
55
|
+
*/
|
|
56
|
+
const TIMBER_ENV_DTS = [
|
|
57
|
+
'// This file is auto-generated by timber.js. Do not edit.',
|
|
58
|
+
'// It ensures TypeScript picks up the generated route types and',
|
|
59
|
+
'// Vite-provided ambient types (CSS, assets, import.meta.env, HMR).',
|
|
60
|
+
'/* eslint-disable @typescript-eslint/triple-slash-reference */',
|
|
61
|
+
'/// <reference path=".timber/timber-routes.d.ts" />',
|
|
62
|
+
'/// <reference types="vite/client" />',
|
|
63
|
+
'',
|
|
64
|
+
].join('\n');
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Codegen writes that have been started but have not yet landed on disk.
|
|
68
|
+
*
|
|
69
|
+
* `writeRouteCodegen` is deliberately unawaited on the dev/build hot path,
|
|
70
|
+
* which leaves that caller no way to know the files exist yet. Anything that
|
|
71
|
+
* tears down the project root — a build process exiting, a test removing its
|
|
72
|
+
* temp root — then races the writes: `rmSync` empties a directory that a
|
|
73
|
+
* pending `mkdir` immediately recreates, and the removal fails with ENOTEMPTY.
|
|
74
|
+
*
|
|
75
|
+
* Every started write registers here and deregisters when it settles, so
|
|
76
|
+
* `flushCodegenWrites()` can await them instead of guessing at a delay.
|
|
77
|
+
*/
|
|
78
|
+
const pendingCodegenWrites = new Set<Promise<void>>();
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Resolve once every codegen write started so far has landed on disk.
|
|
82
|
+
*
|
|
83
|
+
* Safe to call at any time and from anywhere — writes are tracked per process,
|
|
84
|
+
* not per plugin instance, so a caller does not need a handle on the plugin
|
|
85
|
+
* that started them. Never rejects: the tracked copy of each write has its
|
|
86
|
+
* rejection swallowed, so a failing write cannot turn a teardown barrier into
|
|
87
|
+
* an unhandled rejection. Callers that care about failure await the promise
|
|
88
|
+
* `writeRouteCodegen` returned instead.
|
|
89
|
+
*/
|
|
90
|
+
export async function flushCodegenWrites(): Promise<void> {
|
|
91
|
+
// Loop rather than a single Promise.all: a write started while we were
|
|
92
|
+
// awaiting would otherwise be missed, and the set would still be non-empty
|
|
93
|
+
// on return.
|
|
94
|
+
//
|
|
95
|
+
// Each round drops what it awaited rather than trusting the per-write
|
|
96
|
+
// `finally` to have run, so the two removal paths are independent — a
|
|
97
|
+
// deregistration that stopped firing would leak memory in dev, but it can
|
|
98
|
+
// never turn this into a spin.
|
|
99
|
+
while (pendingCodegenWrites.size > 0) {
|
|
100
|
+
const inFlight = [...pendingCodegenWrites];
|
|
101
|
+
await Promise.all(inFlight);
|
|
102
|
+
for (const write of inFlight) pendingCodegenWrites.delete(write);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Write the generated route map, segment types, and the timber-env.d.ts
|
|
108
|
+
* reference file for `tree`.
|
|
109
|
+
*
|
|
110
|
+
* Returns a promise that **rejects** if any write fails. The dev/build plugin
|
|
111
|
+
* does not await it (types are a developer convenience there, not a runtime
|
|
112
|
+
* dependency) and logs instead; `timber check` awaits it and fails the command.
|
|
113
|
+
* Either way the write is registered with `flushCodegenWrites()`.
|
|
114
|
+
*/
|
|
115
|
+
export function writeRouteCodegen(tree: RouteTree, appDir: string, root: string): Promise<void> {
|
|
116
|
+
const timberDir = join(root, '.timber');
|
|
117
|
+
const content = generateRouteMap(tree, { appDir, outputDir: timberDir });
|
|
118
|
+
const routesPath = join(root, CODEGEN_OUTPUT);
|
|
119
|
+
const envPath = join(root, ENV_DTS_FILENAME);
|
|
120
|
+
|
|
121
|
+
const done = mkdir(timberDir, { recursive: true })
|
|
122
|
+
.then(() =>
|
|
123
|
+
Promise.all([
|
|
124
|
+
writeFile(routesPath, content, 'utf-8'),
|
|
125
|
+
writeFile(envPath, TIMBER_ENV_DTS, 'utf-8'),
|
|
126
|
+
writeSegmentTypes(tree, appDir, root),
|
|
127
|
+
])
|
|
128
|
+
)
|
|
129
|
+
.then(() => undefined);
|
|
130
|
+
|
|
131
|
+
// The tracked copy swallows rejection so `flushCodegenWrites` — a teardown
|
|
132
|
+
// barrier — never rejects and never leaves an unhandled rejection behind.
|
|
133
|
+
// The returned promise keeps its rejection for callers that want it.
|
|
134
|
+
const tracked = done.catch(() => undefined);
|
|
135
|
+
pendingCodegenWrites.add(tracked);
|
|
136
|
+
void tracked.finally(() => pendingCodegenWrites.delete(tracked));
|
|
137
|
+
|
|
138
|
+
return done;
|
|
139
|
+
}
|