@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.141
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-DzFMnUAR.js +1147 -0
- package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-C3RvHQPK.js +195 -0
- package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
- package/dist/_chunks/define-DMVhsipD.js +112 -0
- package/dist/_chunks/define-DMVhsipD.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
- package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
- package/dist/_chunks/href-validation-EZktELp8.js +124 -0
- package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
- package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
- package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
- package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/tracing-M_zKubhk.js +358 -0
- package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/validation-taUkvA4Q.js +113 -0
- package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
- package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
- package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
- package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
- package/dist/_chunks/warnings-CNPXaypM.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +154 -48
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +165 -117
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +39 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +183 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +925 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +65 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +27 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +14 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +79 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +7 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +172 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5315 -12687
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +114 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +31 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/client-chunks.d.ts +39 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +18 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +8 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +1 -1
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3126 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +111 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +74 -20
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +28 -2
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +50 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +38 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +63 -22
- package/src/adapters/build-output-helper.ts +139 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +147 -60
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +39 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +52 -24
- package/src/cli-schema-sync.ts +295 -0
- package/src/cli.ts +76 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +125 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +153 -0
- package/src/client/browser-entry/index.ts +151 -0
- package/src/client/browser-entry/post-hydration.ts +113 -0
- package/src/client/browser-entry/router-init.ts +219 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +116 -0
- package/src/client/link.tsx +343 -150
- package/src/client/nav-link-store.ts +37 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +338 -0
- package/src/client/navigation-context.ts +35 -7
- package/src/client/navigation-root.tsx +347 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +418 -128
- package/src/client/rsc-fetch.ts +208 -10
- package/src/client/segment-cache.ts +6 -3
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +26 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +507 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +131 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +3 -3
- package/src/fonts/pipeline.ts +337 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +235 -0
- package/src/index.ts +415 -345
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +116 -0
- package/src/plugin-context.ts +247 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/cache.ts +180 -0
- package/src/plugins/client-chunks.ts +113 -0
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +179 -37
- package/src/plugins/entries.ts +110 -8
- package/src/plugins/fonts.ts +167 -655
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +386 -47
- package/src/plugins/server-bundle.ts +59 -3
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +321 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +309 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +34 -26
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +17 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +473 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +32 -52
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +35 -27
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +101 -5
- package/src/server/html-injector-core.ts +418 -0
- package/src/server/html-injectors.ts +238 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +182 -0
- package/src/server/logger.ts +67 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +527 -0
- package/src/server/pipeline.ts +201 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +130 -46
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +437 -208
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +128 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/error-renderer.ts +316 -89
- package/src/server/rsc-entry/helpers.ts +155 -26
- package/src/server/rsc-entry/index.ts +283 -329
- package/src/server/rsc-entry/render-route.ts +313 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -22
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +271 -41
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +148 -0
- package/src/server/slot-resolver.ts +234 -246
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +217 -78
- package/src/server/ssr-render.ts +344 -71
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +210 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/href-validation.ts +127 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/LICENSE +0 -8
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
package/src/routing/codegen.ts
CHANGED
|
@@ -8,39 +8,33 @@
|
|
|
8
8
|
* No runtime overhead — purely static type generation.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { existsSync } from 'node:fs';
|
|
12
|
-
import { join, relative
|
|
11
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
12
|
+
import { join, relative } from 'node:path';
|
|
13
13
|
import type { RouteTree, SegmentNode } from './types.js';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
hasSearchParams: boolean;
|
|
23
|
-
/** Absolute path to search-params.ts (for computing relative import paths) */
|
|
24
|
-
searchParamsAbsPath?: string;
|
|
25
|
-
/** Whether this is an API route (route.ts) vs page route */
|
|
26
|
-
isApiRoute: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface ParamEntry {
|
|
30
|
-
name: string;
|
|
31
|
-
type: 'string' | 'string[]' | 'string[] | undefined';
|
|
32
|
-
}
|
|
14
|
+
import type { ParamEntry, RouteEntry } from './codegen-types.js';
|
|
15
|
+
import {
|
|
16
|
+
buildCodecChainType,
|
|
17
|
+
buildSchemaParamType,
|
|
18
|
+
emitResolveSegmentFieldHelper,
|
|
19
|
+
formatSearchParamsType,
|
|
20
|
+
} from './codegen-shared.js';
|
|
21
|
+
import { formatLinkCatchAllOverloads, formatTypedLinkOverloads } from './link-codegen.js';
|
|
33
22
|
|
|
34
23
|
/** Options for route map generation. */
|
|
35
24
|
export interface CodegenOptions {
|
|
36
|
-
/** Absolute path to the app/ directory. Required for
|
|
25
|
+
/** Absolute path to the app/ directory. Required for page searchParams detection. */
|
|
37
26
|
appDir?: string;
|
|
38
27
|
/**
|
|
39
28
|
* Absolute path to the directory where the .d.ts file will be written.
|
|
40
|
-
* Used to compute correct relative import paths for
|
|
29
|
+
* Used to compute correct relative import paths for page files.
|
|
41
30
|
* Defaults to appDir when not provided (preserves backward compat for tests).
|
|
42
31
|
*/
|
|
43
32
|
outputDir?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Whether a global schema (app/schema.ts) exists.
|
|
35
|
+
* Auto-detected from appDir when not explicitly set.
|
|
36
|
+
*/
|
|
37
|
+
hasSchema?: boolean;
|
|
44
38
|
}
|
|
45
39
|
|
|
46
40
|
/**
|
|
@@ -50,8 +44,11 @@ export interface CodegenOptions {
|
|
|
50
44
|
* interface that maps every route path to its params and searchParams shape.
|
|
51
45
|
*/
|
|
52
46
|
export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}): string {
|
|
47
|
+
// Auto-detect schema from appDir when not explicitly set
|
|
48
|
+
const hasSchema = options.hasSchema ?? detectSchema(options.appDir);
|
|
49
|
+
|
|
53
50
|
const routes: RouteEntry[] = [];
|
|
54
|
-
collectRoutes(tree.root, [],
|
|
51
|
+
collectRoutes(tree.root, [], [], '', routes, hasSchema);
|
|
55
52
|
|
|
56
53
|
// Sort routes alphabetically for deterministic output
|
|
57
54
|
routes.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
|
|
@@ -59,7 +56,18 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
|
|
|
59
56
|
// When outputDir differs from appDir, import paths must be relative to outputDir
|
|
60
57
|
const importBase = options.outputDir ?? options.appDir;
|
|
61
58
|
|
|
62
|
-
return formatDeclarationFile(routes, importBase);
|
|
59
|
+
return formatDeclarationFile(routes, importBase, hasSchema, options.appDir);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Schema file extensions to check, in priority order. */
|
|
63
|
+
const SCHEMA_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Detect whether app/schema.{ts,tsx,js,jsx} exists.
|
|
67
|
+
*/
|
|
68
|
+
function detectSchema(appDir: string | undefined): boolean {
|
|
69
|
+
if (!appDir) return false;
|
|
70
|
+
return SCHEMA_EXTENSIONS.some((ext) => existsSync(join(appDir, `schema${ext}`)));
|
|
63
71
|
}
|
|
64
72
|
|
|
65
73
|
/**
|
|
@@ -71,37 +79,94 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
|
|
|
71
79
|
function collectRoutes(
|
|
72
80
|
node: SegmentNode,
|
|
73
81
|
ancestorParams: ParamEntry[],
|
|
74
|
-
|
|
75
|
-
|
|
82
|
+
ancestorParamsFiles: string[],
|
|
83
|
+
parentTreePath: string,
|
|
84
|
+
routes: RouteEntry[],
|
|
85
|
+
hasSchema: boolean
|
|
76
86
|
): void {
|
|
77
|
-
//
|
|
87
|
+
// Build the tree path (includes groups, slots — uniquely identifies this segment).
|
|
88
|
+
// Root node has empty segmentName, producing treePath = ''.
|
|
89
|
+
const treePath = node.segmentName ? `${parentTreePath}/${node.segmentName}` : parentTreePath;
|
|
90
|
+
// TIM-834: Identify this segment's own params.ts (if it has a
|
|
91
|
+
// segmentParams export). The full chain of params.ts files in the
|
|
92
|
+
// route ancestry is threaded down via `ancestorParamsFiles`; codec
|
|
93
|
+
// resolution for each ParamEntry is deferred until leaf time so that
|
|
94
|
+
// descendant params.ts files can override ancestor codecs (closest-
|
|
95
|
+
// to-leaf wins, matching the runtime semantics of
|
|
96
|
+
// coerceSegmentParams which walks segments top-down and overwrites
|
|
97
|
+
// earlier coercions).
|
|
98
|
+
const ownParamsFile =
|
|
99
|
+
node.params && fileHasExport(node.params.filePath, 'segmentParams')
|
|
100
|
+
? node.params.filePath
|
|
101
|
+
: undefined;
|
|
102
|
+
|
|
103
|
+
// Accumulate params from this segment. We attach `codecFilePaths`
|
|
104
|
+
// later (at leaf time) using the FULL chain so descendant overrides
|
|
105
|
+
// are visible. The legacy layout/page fallback is recorded now
|
|
106
|
+
// because it is per-segment (and does not participate in inheritance).
|
|
78
107
|
const params = [...ancestorParams];
|
|
79
108
|
if (node.paramName) {
|
|
109
|
+
const legacyFallback = ownParamsFile ? undefined : findLegacyParamsExport(node);
|
|
80
110
|
params.push({
|
|
81
111
|
name: node.paramName,
|
|
112
|
+
bracketName: node.segmentName,
|
|
82
113
|
type: paramTypeForSegment(node.segmentType),
|
|
114
|
+
// Codec chain populated at leaf time. We carry the per-segment
|
|
115
|
+
// legacy fallback (if any) so leaf-time resolution can fall back
|
|
116
|
+
// to it when no params.ts in the chain declares this key.
|
|
117
|
+
legacyCodecFilePath: legacyFallback,
|
|
83
118
|
});
|
|
84
119
|
}
|
|
85
120
|
|
|
121
|
+
// Extend the chain for descendants of this segment.
|
|
122
|
+
const nextAncestorFiles = ownParamsFile
|
|
123
|
+
? [...ancestorParamsFiles, ownParamsFile]
|
|
124
|
+
: ancestorParamsFiles;
|
|
125
|
+
|
|
86
126
|
// Check if this segment is a leaf route (has page or route file)
|
|
87
127
|
const isPage = !!node.page;
|
|
88
128
|
const isApiRoute = !!node.route;
|
|
89
129
|
|
|
90
130
|
if (isPage || isApiRoute) {
|
|
131
|
+
// TIM-834 P1 fix: at LEAF time, the full chain of params.ts files
|
|
132
|
+
// (root-to-leaf) is known. Resolve every ParamEntry's
|
|
133
|
+
// `codecFilePaths` to the chain in LEAF-FIRST order so the
|
|
134
|
+
// closest-to-leaf entry is checked first — matching runtime
|
|
135
|
+
// closest-wins semantics. The chain is shared by all params in the
|
|
136
|
+
// route, so we compute it once.
|
|
137
|
+
const leafFirstChain = nextAncestorFiles.length > 0 ? [...nextAncestorFiles].reverse() : [];
|
|
138
|
+
const resolvedParams: ParamEntry[] = params.map((p) => {
|
|
139
|
+
const codecFilePaths =
|
|
140
|
+
leafFirstChain.length > 0
|
|
141
|
+
? leafFirstChain
|
|
142
|
+
: p.legacyCodecFilePath
|
|
143
|
+
? [p.legacyCodecFilePath]
|
|
144
|
+
: undefined;
|
|
145
|
+
return {
|
|
146
|
+
name: p.name,
|
|
147
|
+
bracketName: p.bracketName,
|
|
148
|
+
type: p.type,
|
|
149
|
+
codecFilePaths,
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
|
|
91
153
|
const entry: RouteEntry = {
|
|
92
154
|
urlPath: node.urlPath,
|
|
93
|
-
|
|
155
|
+
segmentPath: treePath || '/',
|
|
156
|
+
params: resolvedParams,
|
|
94
157
|
hasSearchParams: false,
|
|
95
158
|
isApiRoute,
|
|
159
|
+
hasSchema,
|
|
96
160
|
};
|
|
97
161
|
|
|
98
|
-
// Detect
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
162
|
+
// Detect searchParams export from params.ts (primary) or page.tsx (fallback)
|
|
163
|
+
if (isPage) {
|
|
164
|
+
if (node.params && fileHasExport(node.params.filePath, 'searchParams')) {
|
|
165
|
+
entry.hasSearchParams = true;
|
|
166
|
+
entry.searchParamsPagePath = node.params.filePath;
|
|
167
|
+
} else if (node.page && fileHasExport(node.page.filePath, 'searchParams')) {
|
|
103
168
|
entry.hasSearchParams = true;
|
|
104
|
-
entry.
|
|
169
|
+
entry.searchParamsPagePath = node.page.filePath;
|
|
105
170
|
}
|
|
106
171
|
}
|
|
107
172
|
|
|
@@ -110,12 +175,12 @@ function collectRoutes(
|
|
|
110
175
|
|
|
111
176
|
// Recurse into children
|
|
112
177
|
for (const child of node.children) {
|
|
113
|
-
collectRoutes(child, params,
|
|
178
|
+
collectRoutes(child, params, nextAncestorFiles, treePath, routes, hasSchema);
|
|
114
179
|
}
|
|
115
180
|
|
|
116
181
|
// Recurse into slots (they share the parent's URL path, but may have their own pages)
|
|
117
|
-
for (const
|
|
118
|
-
collectRoutes(slot, params,
|
|
182
|
+
for (const slot of Object.values(node.slots)) {
|
|
183
|
+
collectRoutes(slot, params, nextAncestorFiles, treePath, routes, hasSchema);
|
|
119
184
|
}
|
|
120
185
|
}
|
|
121
186
|
|
|
@@ -134,41 +199,108 @@ function paramTypeForSegment(segmentType: string): ParamEntry['type'] {
|
|
|
134
199
|
}
|
|
135
200
|
|
|
136
201
|
/**
|
|
137
|
-
*
|
|
202
|
+
* Check if a file exports a specific named export.
|
|
138
203
|
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
204
|
+
* Uses a lightweight regex check — not full AST parsing. The actual type
|
|
205
|
+
* extraction happens via the TypeScript compiler in the generated .d.ts.
|
|
141
206
|
*/
|
|
142
|
-
function
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
207
|
+
function fileHasExport(filePath: string, exportName: string): boolean {
|
|
208
|
+
if (!existsSync(filePath)) return false;
|
|
209
|
+
try {
|
|
210
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
211
|
+
const e = exportName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
212
|
+
return (
|
|
213
|
+
new RegExp(`export\\s+(const|let|var)\\s+${e}\\b`).test(content) ||
|
|
214
|
+
new RegExp(`export\\s*\\{[^}]*\\b${e}\\b[^}]*\\}`).test(content)
|
|
215
|
+
);
|
|
216
|
+
} catch {
|
|
217
|
+
return false;
|
|
150
218
|
}
|
|
151
|
-
// Fallback: construct from urlPath (imprecise for groups, but acceptable)
|
|
152
|
-
return appDir;
|
|
153
219
|
}
|
|
154
220
|
|
|
155
221
|
/**
|
|
156
|
-
* Find a
|
|
222
|
+
* Find a legacy `segmentParams` export on layout.tsx or page.tsx.
|
|
223
|
+
*
|
|
224
|
+
* Backward-compat shim: TIM-508 made params.ts the canonical location
|
|
225
|
+
* for `segmentParams`. Layout/page exports are still accepted for the
|
|
226
|
+
* OWN segment only (not inherited by descendants — see TIM-834).
|
|
157
227
|
*/
|
|
158
|
-
function
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
228
|
+
function findLegacyParamsExport(node: SegmentNode): string | undefined {
|
|
229
|
+
if (node.layout && fileHasExport(node.layout.filePath, 'segmentParams')) {
|
|
230
|
+
return node.layout.filePath;
|
|
231
|
+
}
|
|
232
|
+
if (node.page && fileHasExport(node.page.filePath, 'segmentParams')) {
|
|
233
|
+
return node.page.filePath;
|
|
164
234
|
}
|
|
165
235
|
return undefined;
|
|
166
236
|
}
|
|
167
237
|
|
|
238
|
+
/**
|
|
239
|
+
* Emit the schema-based type exports: TimberSegmentParams, TimberRoute,
|
|
240
|
+
* AllSegmentParams, RoutesWithParams.
|
|
241
|
+
*
|
|
242
|
+
* These types use InferCodecType references so they stay in sync with
|
|
243
|
+
* the schema without hardcoding resolved types.
|
|
244
|
+
*
|
|
245
|
+
* Design doc: design/41-global-params.md §Codegen Output
|
|
246
|
+
*/
|
|
247
|
+
function formatSchemaTypes(routes: RouteEntry[]): string[] {
|
|
248
|
+
const lines: string[] = [];
|
|
249
|
+
|
|
250
|
+
lines.push('/** Union of all valid route patterns. */');
|
|
251
|
+
lines.push('export type TimberRoute = keyof TimberSegmentParams;');
|
|
252
|
+
lines.push('');
|
|
253
|
+
lines.push('/** Maps each segment path to its accumulated segment params. */');
|
|
254
|
+
lines.push('export interface TimberSegmentParams {');
|
|
255
|
+
|
|
256
|
+
for (const route of routes) {
|
|
257
|
+
if (route.params.length === 0) {
|
|
258
|
+
lines.push(` '${route.segmentPath}': {};`);
|
|
259
|
+
} else {
|
|
260
|
+
lines.push(` '${route.segmentPath}': {`);
|
|
261
|
+
for (const p of route.params) {
|
|
262
|
+
lines.push(` ${p.name}: ${buildSchemaParamType(p)};`);
|
|
263
|
+
}
|
|
264
|
+
lines.push(' };');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
lines.push('}');
|
|
269
|
+
lines.push('');
|
|
270
|
+
|
|
271
|
+
// AllSegmentParams — flat union of all param types across all routes
|
|
272
|
+
lines.push('/** All segment params (union of all route params). */');
|
|
273
|
+
lines.push('export type AllSegmentParams = {');
|
|
274
|
+
lines.push(
|
|
275
|
+
' [K in keyof TimberSegmentParams as TimberSegmentParams[K] extends Record<string, never>'
|
|
276
|
+
);
|
|
277
|
+
lines.push(' ? never');
|
|
278
|
+
lines.push(' : K]: TimberSegmentParams[K];');
|
|
279
|
+
lines.push('} extends infer U');
|
|
280
|
+
lines.push(' ? { [K in keyof U[keyof U]]: U[keyof U][K] }');
|
|
281
|
+
lines.push(' : never;');
|
|
282
|
+
lines.push('');
|
|
283
|
+
|
|
284
|
+
// RoutesWithParams — filter routes by required param keys
|
|
285
|
+
lines.push(
|
|
286
|
+
'/** Filters TimberRoute to routes whose accumulated params include all listed keys. */'
|
|
287
|
+
);
|
|
288
|
+
lines.push('export type RoutesWithParams<K extends keyof AllSegmentParams> = {');
|
|
289
|
+
lines.push(' [R in TimberRoute]: K extends keyof TimberSegmentParams[R] ? R : never;');
|
|
290
|
+
lines.push('}[TimberRoute];');
|
|
291
|
+
|
|
292
|
+
return lines;
|
|
293
|
+
}
|
|
294
|
+
|
|
168
295
|
/**
|
|
169
296
|
* Format the collected routes into a TypeScript declaration file.
|
|
170
297
|
*/
|
|
171
|
-
function formatDeclarationFile(
|
|
298
|
+
function formatDeclarationFile(
|
|
299
|
+
routes: RouteEntry[],
|
|
300
|
+
importBase?: string,
|
|
301
|
+
hasSchema?: boolean,
|
|
302
|
+
appDir?: string
|
|
303
|
+
): string {
|
|
172
304
|
const lines: string[] = [];
|
|
173
305
|
|
|
174
306
|
lines.push('// This file is auto-generated by timber.js route map codegen.');
|
|
@@ -180,53 +312,136 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
|
|
|
180
312
|
// (removing exports like bindUseQueryStates that aren't listed here).
|
|
181
313
|
lines.push('export {};');
|
|
182
314
|
lines.push('');
|
|
315
|
+
|
|
316
|
+
if (hasSchema) {
|
|
317
|
+
// Schema-based codegen: import schema and InferCodecType
|
|
318
|
+
// Compute the schema import path relative to the output directory
|
|
319
|
+
const schemaImport =
|
|
320
|
+
appDir && importBase
|
|
321
|
+
? './' + relative(importBase, join(appDir, 'schema')).replace(/\\/g, '/')
|
|
322
|
+
: '../app/schema';
|
|
323
|
+
lines.push(`import type schema from '${schemaImport}';`);
|
|
324
|
+
lines.push("import type { InferCodecType, SegmentParamCodec } from '@timber-js/app/params';");
|
|
325
|
+
lines.push('');
|
|
326
|
+
// Collect all unique bracket keys from routes for key validation
|
|
327
|
+
const allBracketKeys = new Set<string>();
|
|
328
|
+
for (const route of routes) {
|
|
329
|
+
for (const p of route.params) {
|
|
330
|
+
allBracketKeys.add(p.bracketName);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Augment the ValidDynamicSegmentKeysRegistry so defineSchema constrains keys
|
|
335
|
+
// to known filesystem segments. Unknown keys produce inline TS errors.
|
|
336
|
+
if (allBracketKeys.size > 0) {
|
|
337
|
+
lines.push("declare module '@timber-js/app/params' {");
|
|
338
|
+
lines.push(' interface ValidDynamicSegmentKeysRegistry {');
|
|
339
|
+
for (const key of [...allBracketKeys].sort()) {
|
|
340
|
+
lines.push(` ${JSON.stringify(key)}: true;`);
|
|
341
|
+
}
|
|
342
|
+
lines.push(' }');
|
|
343
|
+
lines.push('}');
|
|
344
|
+
lines.push('');
|
|
345
|
+
}
|
|
346
|
+
// Type-level validation: each schema value must be a Codec or Standard Schema.
|
|
347
|
+
// Running `pnpm run typecheck` will surface errors for invalid values.
|
|
348
|
+
lines.push('type _AssertSchemaValues = {');
|
|
349
|
+
lines.push(
|
|
350
|
+
" [K in keyof typeof schema['segmentParams']]: typeof schema['segmentParams'][K] extends SegmentParamCodec ? true : ['Error: value for', K, 'is not a valid Codec or Standard Schema'];"
|
|
351
|
+
);
|
|
352
|
+
lines.push('};');
|
|
353
|
+
// Generic constraint enforces that all values are `true` — if any value is
|
|
354
|
+
// an error tuple, TS reports a real diagnostic instead of silently computing it.
|
|
355
|
+
lines.push(
|
|
356
|
+
'type _EnforceSchemaValues<_T extends Record<string, true> = _AssertSchemaValues> = true;'
|
|
357
|
+
);
|
|
358
|
+
lines.push('');
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (!hasSchema) {
|
|
362
|
+
// TIM-834 P2: emit the shared codec-resolution helper type ONCE so the
|
|
363
|
+
// per-param chain conditionals reference it instead of inlining the
|
|
364
|
+
// fallback in both branches (which grows O(2^N) in chain depth).
|
|
365
|
+
lines.push(emitResolveSegmentFieldHelper());
|
|
366
|
+
lines.push('');
|
|
367
|
+
}
|
|
368
|
+
|
|
183
369
|
lines.push("declare module '@timber-js/app' {");
|
|
184
370
|
lines.push(' interface Routes {');
|
|
185
371
|
|
|
186
372
|
for (const route of routes) {
|
|
187
|
-
const paramsType = formatParamsType(route.params);
|
|
373
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
188
374
|
const searchParamsType = formatSearchParamsType(route, importBase);
|
|
189
375
|
|
|
190
376
|
lines.push(` '${route.urlPath}': {`);
|
|
191
|
-
lines.push(`
|
|
377
|
+
lines.push(` segmentParams: ${paramsType}`);
|
|
192
378
|
lines.push(` searchParams: ${searchParamsType}`);
|
|
193
379
|
lines.push(` }`);
|
|
194
380
|
}
|
|
195
381
|
|
|
196
382
|
lines.push(' }');
|
|
383
|
+
|
|
384
|
+
// When a global schema exists, emit segment param types inside the
|
|
385
|
+
// @timber-js/app module augmentation so that declare module blocks
|
|
386
|
+
// for @timber-js/app/server and @timber-js/app/client can reference
|
|
387
|
+
// AllSegmentParams via `import type { AllSegmentParams } from '@timber-js/app'`.
|
|
388
|
+
if (hasSchema) {
|
|
389
|
+
lines.push('');
|
|
390
|
+
lines.push(...formatSchemaTypes(routes).map((l) => ` ${l}`));
|
|
391
|
+
}
|
|
392
|
+
|
|
197
393
|
lines.push('}');
|
|
198
394
|
lines.push('');
|
|
199
395
|
|
|
200
|
-
// Generate @timber-js/app/server augmentation — typed searchParams() generic
|
|
201
396
|
const pageRoutes = routes.filter((r) => !r.isApiRoute);
|
|
397
|
+
const dynamicRoutes = routes.filter((r) => r.params.length > 0);
|
|
202
398
|
|
|
203
|
-
|
|
399
|
+
// Generate @timber-js/app/server augmentation — typed getSegmentParams
|
|
400
|
+
if (dynamicRoutes.length > 0) {
|
|
204
401
|
lines.push("declare module '@timber-js/app/server' {");
|
|
205
|
-
|
|
402
|
+
if (hasSchema) {
|
|
403
|
+
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
404
|
+
}
|
|
405
|
+
for (const route of dynamicRoutes) {
|
|
406
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
407
|
+
lines.push(
|
|
408
|
+
` export function getSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
409
|
+
);
|
|
410
|
+
}
|
|
206
411
|
lines.push(
|
|
207
|
-
|
|
412
|
+
hasSchema
|
|
413
|
+
? ' export function getSegmentParams(): Partial<AllSegmentParams>'
|
|
414
|
+
: ' export function getSegmentParams(): Record<string, string | string[]>'
|
|
208
415
|
);
|
|
209
416
|
lines.push('}');
|
|
210
417
|
lines.push('');
|
|
211
418
|
}
|
|
212
419
|
|
|
213
420
|
// Generate overloads for @timber-js/app/client
|
|
214
|
-
const dynamicRoutes = routes.filter((r) => r.params.length > 0);
|
|
215
421
|
|
|
216
422
|
if (dynamicRoutes.length > 0 || pageRoutes.length > 0) {
|
|
217
423
|
lines.push("declare module '@timber-js/app/client' {");
|
|
218
424
|
lines.push(
|
|
219
425
|
" import type { SearchParamsDefinition, SetParams, QueryStatesOptions, SearchParamCodec } from '@timber-js/app/search-params'"
|
|
220
426
|
);
|
|
427
|
+
if (hasSchema) {
|
|
428
|
+
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
429
|
+
}
|
|
221
430
|
lines.push('');
|
|
222
431
|
|
|
223
|
-
//
|
|
432
|
+
// useSegmentParams overloads
|
|
224
433
|
if (dynamicRoutes.length > 0) {
|
|
225
434
|
for (const route of dynamicRoutes) {
|
|
226
|
-
const paramsType = formatParamsType(route.params);
|
|
227
|
-
lines.push(
|
|
435
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
436
|
+
lines.push(
|
|
437
|
+
` export function useSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
438
|
+
);
|
|
228
439
|
}
|
|
229
|
-
lines.push(
|
|
440
|
+
lines.push(
|
|
441
|
+
hasSchema
|
|
442
|
+
? ' export function useSegmentParams(): Partial<AllSegmentParams>'
|
|
443
|
+
: ' export function useSegmentParams(): Record<string, string | string[]>'
|
|
444
|
+
);
|
|
230
445
|
lines.push('');
|
|
231
446
|
}
|
|
232
447
|
|
|
@@ -236,78 +451,59 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
|
|
|
236
451
|
lines.push('');
|
|
237
452
|
}
|
|
238
453
|
|
|
239
|
-
// Typed Link overloads
|
|
454
|
+
// Typed Link overloads — per-route with DIRECT types (no conditionals).
|
|
455
|
+
// Direct types preserve TypeScript's excess property checking.
|
|
456
|
+
//
|
|
457
|
+
// TIM-832: per-route and catch-all are emitted as TWO separate
|
|
458
|
+
// augmentation blocks. Per TS's merging rule "later overload sets
|
|
459
|
+
// ordered first", the catch-all block (declared SECOND in this file)
|
|
460
|
+
// ends up FIRST in the merged call-signature list at resolution time,
|
|
461
|
+
// which puts the per-route block LAST — so its error message is the
|
|
462
|
+
// one TypeScript reports when no overload matches. This gives users a
|
|
463
|
+
// clear prop-mismatch error (e.g. "'string | undefined' is not
|
|
464
|
+
// assignable to 'string | number' on id") instead of the old
|
|
465
|
+
// confusing "Type 'string' is not assignable to type 'never'" cascade.
|
|
240
466
|
if (pageRoutes.length > 0) {
|
|
241
|
-
lines.push(' // Typed Link
|
|
242
|
-
lines.push(...formatTypedLinkOverloads(pageRoutes, importBase));
|
|
467
|
+
lines.push(' // Typed Link overloads — per-route (block 1 / emitted first)');
|
|
468
|
+
lines.push(...formatTypedLinkOverloads(pageRoutes, importBase, hasSchema));
|
|
469
|
+
lines.push('');
|
|
243
470
|
}
|
|
244
471
|
|
|
245
472
|
lines.push('}');
|
|
246
473
|
lines.push('');
|
|
247
474
|
}
|
|
248
475
|
|
|
476
|
+
// TIM-832: catch-all block — emitted as a SEPARATE `declare module`
|
|
477
|
+
// augmentation so TS's "later overload set first" rule orders it ahead
|
|
478
|
+
// of the per-route block above at resolution time, leaving per-route as
|
|
479
|
+
// the "last overload" whose error TypeScript reports.
|
|
480
|
+
lines.push("declare module '@timber-js/app/client' {");
|
|
481
|
+
lines.push(" import type { SearchParamsDefinition } from '@timber-js/app/search-params'");
|
|
482
|
+
lines.push('');
|
|
483
|
+
lines.push(...formatLinkCatchAllOverloads());
|
|
484
|
+
lines.push('}');
|
|
485
|
+
lines.push('');
|
|
486
|
+
|
|
249
487
|
return lines.join('\n');
|
|
250
488
|
}
|
|
251
489
|
|
|
252
490
|
/**
|
|
253
491
|
* Format the params type for a route entry.
|
|
254
492
|
*/
|
|
255
|
-
function formatParamsType(params: ParamEntry[]): string {
|
|
256
|
-
if (params.length === 0) {
|
|
257
|
-
return '{}';
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
const fields = params.map((p) => `${p.name}: ${p.type}`);
|
|
261
|
-
return `{ ${fields.join('; ')} }`;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Format the params type for Link props.
|
|
266
|
-
*
|
|
267
|
-
* Link params accept `string | number` for single dynamic segments
|
|
268
|
-
* (convenience — values are stringified at runtime). Catch-all and
|
|
269
|
-
* optional catch-all remain `string[]` / `string[] | undefined`.
|
|
270
|
-
*
|
|
271
|
-
* See design/07-routing.md §"Typed params and searchParams on <Link>"
|
|
272
|
-
*/
|
|
273
|
-
function formatLinkParamsType(params: ParamEntry[]): string {
|
|
493
|
+
function formatParamsType(params: ParamEntry[], importBase?: string, hasSchema?: boolean): string {
|
|
274
494
|
if (params.length === 0) {
|
|
275
495
|
return '{}';
|
|
276
496
|
}
|
|
277
497
|
|
|
278
498
|
const fields = params.map((p) => {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
499
|
+
const codecType = hasSchema
|
|
500
|
+
? buildSchemaParamType(p)
|
|
501
|
+
: buildCodecChainType(p, importBase, p.type);
|
|
502
|
+
return `${p.name}: ${codecType}`;
|
|
282
503
|
});
|
|
283
504
|
return `{ ${fields.join('; ')} }`;
|
|
284
505
|
}
|
|
285
506
|
|
|
286
|
-
/**
|
|
287
|
-
* Format the searchParams type for a route entry.
|
|
288
|
-
*
|
|
289
|
-
* When a search-params.ts exists, we reference its inferred type via an import type.
|
|
290
|
-
* The import path is relative to `importBase` (the directory where the .d.ts will be
|
|
291
|
-
* written). When importBase is undefined, falls back to a bare relative path.
|
|
292
|
-
*/
|
|
293
|
-
function formatSearchParamsType(route: RouteEntry, importBase?: string): string {
|
|
294
|
-
if (route.hasSearchParams && route.searchParamsAbsPath) {
|
|
295
|
-
const absPath = route.searchParamsAbsPath.replace(/\.(ts|tsx)$/, '');
|
|
296
|
-
let importPath: string;
|
|
297
|
-
if (importBase) {
|
|
298
|
-
// Make the path relative to the output directory, converted to posix separators
|
|
299
|
-
importPath = './' + relative(importBase, absPath).replace(/\\/g, '/');
|
|
300
|
-
} else {
|
|
301
|
-
importPath = './' + posix.basename(absPath);
|
|
302
|
-
}
|
|
303
|
-
// Use (typeof import('...'))[' default'] instead of import('...').default
|
|
304
|
-
// because with moduleResolution:"bundler", import('...').default is treated as
|
|
305
|
-
// a namespace member access which doesn't work for default exports.
|
|
306
|
-
return `(typeof import('${importPath}'))['default'] extends import('@timber-js/app/search-params').SearchParamsDefinition<infer T> ? T : never`;
|
|
307
|
-
}
|
|
308
|
-
return '{}';
|
|
309
|
-
}
|
|
310
|
-
|
|
311
507
|
/**
|
|
312
508
|
* Generate useQueryStates overloads.
|
|
313
509
|
*
|
|
@@ -337,60 +533,8 @@ function formatUseQueryStatesOverloads(routes: RouteEntry[], importBase?: string
|
|
|
337
533
|
return lines;
|
|
338
534
|
}
|
|
339
535
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
* - Types the params prop based on dynamic segments
|
|
346
|
-
* - Types the searchParams prop based on search-params.ts (if present)
|
|
347
|
-
*
|
|
348
|
-
* Routes without dynamic segments accept href as a literal string with no params.
|
|
349
|
-
* Routes with dynamic segments require a params prop.
|
|
350
|
-
*/
|
|
351
|
-
function formatTypedLinkOverloads(routes: RouteEntry[], importBase?: string): string[] {
|
|
352
|
-
const lines: string[] = [];
|
|
353
|
-
|
|
354
|
-
for (const route of routes) {
|
|
355
|
-
const hasDynamicParams = route.params.length > 0;
|
|
356
|
-
const paramsType = formatLinkParamsType(route.params);
|
|
357
|
-
const searchParamsType = route.hasSearchParams
|
|
358
|
-
? formatSearchParamsType(route, importBase)
|
|
359
|
-
: null;
|
|
360
|
-
|
|
361
|
-
if (hasDynamicParams) {
|
|
362
|
-
// Route with dynamic segments — params prop required
|
|
363
|
-
const spProp = searchParamsType
|
|
364
|
-
? `searchParams?: { definition: SearchParamsDefinition<${searchParamsType}>; values: Partial<${searchParamsType}> }`
|
|
365
|
-
: `searchParams?: never`;
|
|
366
|
-
lines.push(
|
|
367
|
-
` export function Link(props: Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {`
|
|
368
|
-
);
|
|
369
|
-
lines.push(` href: '${route.urlPath}'`);
|
|
370
|
-
lines.push(` params: ${paramsType}`);
|
|
371
|
-
lines.push(` ${spProp}`);
|
|
372
|
-
lines.push(` prefetch?: boolean; scroll?: boolean; children?: import('react').ReactNode`);
|
|
373
|
-
lines.push(` }): import('react').JSX.Element`);
|
|
374
|
-
} else {
|
|
375
|
-
// Static route — no params needed
|
|
376
|
-
const spProp = searchParamsType
|
|
377
|
-
? `searchParams?: { definition: SearchParamsDefinition<${searchParamsType}>; values: Partial<${searchParamsType}> }`
|
|
378
|
-
: `searchParams?: never`;
|
|
379
|
-
lines.push(
|
|
380
|
-
` export function Link(props: Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {`
|
|
381
|
-
);
|
|
382
|
-
lines.push(` href: '${route.urlPath}'`);
|
|
383
|
-
lines.push(` params?: never`);
|
|
384
|
-
lines.push(` ${spProp}`);
|
|
385
|
-
lines.push(` prefetch?: boolean; scroll?: boolean; children?: import('react').ReactNode`);
|
|
386
|
-
lines.push(` }): import('react').JSX.Element`);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// Fallback overload for arbitrary string hrefs (escape hatch)
|
|
391
|
-
lines.push(
|
|
392
|
-
` export function Link(props: import('./client/link.js').LinkProps): import('react').JSX.Element`
|
|
393
|
-
);
|
|
394
|
-
|
|
395
|
-
return lines;
|
|
396
|
-
}
|
|
536
|
+
// Link overload formatters and helpers (`formatTypedLinkOverloads`,
|
|
537
|
+
// `formatLinkCatchAllOverloads`, `formatLinkParamsType`,
|
|
538
|
+
// `buildResolvedPattern`, `LINK_BASE_PROPS_TYPE`) were extracted to
|
|
539
|
+
// `./link-codegen.ts` (TIM-835) to keep this file under the 500-line
|
|
540
|
+
// cap. They are imported at the top of this file.
|