@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.121
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-Dy8vOjFt.js +1101 -0
- package/dist/_chunks/actions-Dy8vOjFt.js.map +1 -0
- package/dist/_chunks/build-output-helper-B1n0sUqj.js +61 -0
- package/dist/_chunks/build-output-helper-B1n0sUqj.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-ByZPGGmS.js +724 -0
- package/dist/_chunks/cli-schema-sync-ByZPGGmS.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DHQLjFu3.js +2 -0
- package/dist/_chunks/codec-registry-G9hD5LOq.js +21 -0
- package/dist/_chunks/codec-registry-G9hD5LOq.js.map +1 -0
- package/dist/_chunks/define-CPVQaWbx.js +124 -0
- package/dist/_chunks/define-CPVQaWbx.js.map +1 -0
- package/dist/_chunks/define-jeHDXZGq.js +195 -0
- package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
- package/dist/_chunks/format-BjN9HLu9.js +14 -0
- package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
- package/dist/_chunks/handler-store-CcwNX-gk.js +54 -0
- package/dist/_chunks/handler-store-CcwNX-gk.js.map +1 -0
- package/dist/_chunks/logger-DDmK5skc.js +291 -0
- package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
- package/dist/_chunks/merge-search-params-az6ZiBeU.js +41 -0
- package/dist/_chunks/merge-search-params-az6ZiBeU.js.map +1 -0
- package/dist/_chunks/navigation-root-DoRTeBm5.js +96 -0
- package/dist/_chunks/navigation-root-DoRTeBm5.js.map +1 -0
- package/dist/_chunks/registry-BI9cgCt7.js +20 -0
- package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
- package/dist/_chunks/resolve-schema-Bf8eC6q6.js +73 -0
- package/dist/_chunks/resolve-schema-Bf8eC6q6.js.map +1 -0
- package/dist/_chunks/router-ref-CpvjBqdu.js +28 -0
- package/dist/_chunks/router-ref-CpvjBqdu.js.map +1 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
- package/dist/_chunks/segment-context-EsfQpS--.js +34 -0
- package/dist/_chunks/segment-context-EsfQpS--.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-m9-cNEIw.js} +1 -1
- package/dist/_chunks/ssr-data-m9-cNEIw.js.map +1 -0
- package/dist/_chunks/stale-reload-BN2kcE06.js +64 -0
- package/dist/_chunks/stale-reload-BN2kcE06.js.map +1 -0
- package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
- package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
- package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
- package/dist/_chunks/use-segment-params-CtIAjqK0.js +185 -0
- package/dist/_chunks/use-segment-params-CtIAjqK0.js.map +1 -0
- package/dist/_chunks/validation-BMU5MPzP.js +84 -0
- package/dist/_chunks/validation-BMU5MPzP.js.map +1 -0
- package/dist/_chunks/walkers-DNp9tHyV.js +719 -0
- package/dist/_chunks/walkers-DNp9tHyV.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
- package/dist/_chunks/warnings-B30wpfaS.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 +143 -45
- 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 +151 -81
- 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 +37 -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 +42 -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 +23 -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 +9 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +172 -1100
- 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 +964 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +62 -55
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -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 +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- 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 +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.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-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- 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-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 +46 -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 +167 -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 +45 -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 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4807 -12729
- 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 +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- 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/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.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 +63 -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 +95 -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 +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +53 -5
- 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/build-manifest.d.ts +2 -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/debug.d.ts +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.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 -5
- 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 +155 -2905
- 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 +2947 -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/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 +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +118 -23
- 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 +69 -18
- 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 +27 -1
- 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 +21 -34
- 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 +2 -2
- 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 +49 -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/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 +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -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-entry.d.ts +30 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -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.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 +41 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +49 -4
- 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/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/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 +62 -21
- package/src/adapters/build-output-helper.ts +77 -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 +142 -59
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -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 +25 -20
- package/src/cli-schema-sync.ts +207 -0
- package/src/cli.ts +65 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +126 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +149 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -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 +69 -44
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +366 -113
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +31 -6
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +300 -73
- package/src/client/rsc-fetch.ts +112 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -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 +18 -6
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/{use-params.ts → use-segment-params.ts} +8 -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 +134 -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 +506 -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 +142 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +1 -1
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +233 -0
- package/src/index.ts +409 -357
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +114 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +101 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +175 -35
- package/src/plugins/entries.ts +111 -9
- package/src/plugins/fonts.ts +157 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +371 -45
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +109 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +316 -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 +308 -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} +57 -20
- 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 +336 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +55 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +31 -50
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +36 -15
- 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 +76 -0
- package/src/server/html-injector-core.ts +417 -0
- package/src/server/html-injectors.ts +235 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -36
- 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 +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +176 -0
- package/src/server/pipeline-phases.ts +460 -0
- package/src/server/pipeline.ts +154 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -333
- package/src/server/route-element-builder.ts +309 -195
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +50 -231
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +137 -12
- package/src/server/rsc-entry/index.ts +316 -352
- package/src/server/rsc-entry/render-route.ts +307 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +187 -38
- 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 +126 -0
- package/src/server/slot-resolver.ts +228 -246
- package/src/server/ssr-entry.ts +229 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- 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 +202 -90
- package/src/server/tree-match.ts +198 -0
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -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-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.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/transition-root.d.ts.map +0 -1
- 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/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.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/transition-root.tsx +0 -166
- 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/server/response-cache.ts +0 -410
- 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,131 @@ 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
|
+
lines.push('');
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (!hasSchema) {
|
|
357
|
+
// TIM-834 P2: emit the shared codec-resolution helper type ONCE so the
|
|
358
|
+
// per-param chain conditionals reference it instead of inlining the
|
|
359
|
+
// fallback in both branches (which grows O(2^N) in chain depth).
|
|
360
|
+
lines.push(emitResolveSegmentFieldHelper());
|
|
361
|
+
lines.push('');
|
|
362
|
+
}
|
|
363
|
+
|
|
183
364
|
lines.push("declare module '@timber-js/app' {");
|
|
184
365
|
lines.push(' interface Routes {');
|
|
185
366
|
|
|
186
367
|
for (const route of routes) {
|
|
187
|
-
const paramsType = formatParamsType(route.params);
|
|
368
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
188
369
|
const searchParamsType = formatSearchParamsType(route, importBase);
|
|
189
370
|
|
|
190
371
|
lines.push(` '${route.urlPath}': {`);
|
|
191
|
-
lines.push(`
|
|
372
|
+
lines.push(` segmentParams: ${paramsType}`);
|
|
192
373
|
lines.push(` searchParams: ${searchParamsType}`);
|
|
193
374
|
lines.push(` }`);
|
|
194
375
|
}
|
|
195
376
|
|
|
196
377
|
lines.push(' }');
|
|
378
|
+
|
|
379
|
+
// When a global schema exists, emit segment param types inside the
|
|
380
|
+
// @timber-js/app module augmentation so that declare module blocks
|
|
381
|
+
// for @timber-js/app/server and @timber-js/app/client can reference
|
|
382
|
+
// AllSegmentParams via `import type { AllSegmentParams } from '@timber-js/app'`.
|
|
383
|
+
if (hasSchema) {
|
|
384
|
+
lines.push('');
|
|
385
|
+
lines.push(...formatSchemaTypes(routes).map((l) => ` ${l}`));
|
|
386
|
+
}
|
|
387
|
+
|
|
197
388
|
lines.push('}');
|
|
198
389
|
lines.push('');
|
|
199
390
|
|
|
200
|
-
// Generate @timber-js/app/server augmentation — typed searchParams() generic
|
|
201
391
|
const pageRoutes = routes.filter((r) => !r.isApiRoute);
|
|
392
|
+
const dynamicRoutes = routes.filter((r) => r.params.length > 0);
|
|
202
393
|
|
|
203
|
-
|
|
394
|
+
// Generate @timber-js/app/server augmentation — typed getSegmentParams
|
|
395
|
+
if (dynamicRoutes.length > 0) {
|
|
204
396
|
lines.push("declare module '@timber-js/app/server' {");
|
|
205
|
-
|
|
397
|
+
if (hasSchema) {
|
|
398
|
+
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
399
|
+
}
|
|
400
|
+
for (const route of dynamicRoutes) {
|
|
401
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
402
|
+
lines.push(
|
|
403
|
+
` export function getSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
404
|
+
);
|
|
405
|
+
}
|
|
206
406
|
lines.push(
|
|
207
|
-
|
|
407
|
+
hasSchema
|
|
408
|
+
? ' export function getSegmentParams(): Partial<AllSegmentParams>'
|
|
409
|
+
: ' export function getSegmentParams(): Record<string, string | string[]>'
|
|
208
410
|
);
|
|
209
411
|
lines.push('}');
|
|
210
412
|
lines.push('');
|
|
211
413
|
}
|
|
212
414
|
|
|
213
415
|
// Generate overloads for @timber-js/app/client
|
|
214
|
-
const dynamicRoutes = routes.filter((r) => r.params.length > 0);
|
|
215
416
|
|
|
216
417
|
if (dynamicRoutes.length > 0 || pageRoutes.length > 0) {
|
|
217
418
|
lines.push("declare module '@timber-js/app/client' {");
|
|
218
419
|
lines.push(
|
|
219
420
|
" import type { SearchParamsDefinition, SetParams, QueryStatesOptions, SearchParamCodec } from '@timber-js/app/search-params'"
|
|
220
421
|
);
|
|
422
|
+
if (hasSchema) {
|
|
423
|
+
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
424
|
+
}
|
|
221
425
|
lines.push('');
|
|
222
426
|
|
|
223
|
-
//
|
|
427
|
+
// useSegmentParams overloads
|
|
224
428
|
if (dynamicRoutes.length > 0) {
|
|
225
429
|
for (const route of dynamicRoutes) {
|
|
226
|
-
const paramsType = formatParamsType(route.params);
|
|
227
|
-
lines.push(
|
|
430
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
431
|
+
lines.push(
|
|
432
|
+
` export function useSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
433
|
+
);
|
|
228
434
|
}
|
|
229
|
-
lines.push(
|
|
435
|
+
lines.push(
|
|
436
|
+
hasSchema
|
|
437
|
+
? ' export function useSegmentParams(): Partial<AllSegmentParams>'
|
|
438
|
+
: ' export function useSegmentParams(): Record<string, string | string[]>'
|
|
439
|
+
);
|
|
230
440
|
lines.push('');
|
|
231
441
|
}
|
|
232
442
|
|
|
@@ -236,78 +446,59 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
|
|
|
236
446
|
lines.push('');
|
|
237
447
|
}
|
|
238
448
|
|
|
239
|
-
// Typed Link overloads
|
|
449
|
+
// Typed Link overloads — per-route with DIRECT types (no conditionals).
|
|
450
|
+
// Direct types preserve TypeScript's excess property checking.
|
|
451
|
+
//
|
|
452
|
+
// TIM-832: per-route and catch-all are emitted as TWO separate
|
|
453
|
+
// augmentation blocks. Per TS's merging rule "later overload sets
|
|
454
|
+
// ordered first", the catch-all block (declared SECOND in this file)
|
|
455
|
+
// ends up FIRST in the merged call-signature list at resolution time,
|
|
456
|
+
// which puts the per-route block LAST — so its error message is the
|
|
457
|
+
// one TypeScript reports when no overload matches. This gives users a
|
|
458
|
+
// clear prop-mismatch error (e.g. "'string | undefined' is not
|
|
459
|
+
// assignable to 'string | number' on id") instead of the old
|
|
460
|
+
// confusing "Type 'string' is not assignable to type 'never'" cascade.
|
|
240
461
|
if (pageRoutes.length > 0) {
|
|
241
|
-
lines.push(' // Typed Link
|
|
242
|
-
lines.push(...formatTypedLinkOverloads(pageRoutes, importBase));
|
|
462
|
+
lines.push(' // Typed Link overloads — per-route (block 1 / emitted first)');
|
|
463
|
+
lines.push(...formatTypedLinkOverloads(pageRoutes, importBase, hasSchema));
|
|
464
|
+
lines.push('');
|
|
243
465
|
}
|
|
244
466
|
|
|
245
467
|
lines.push('}');
|
|
246
468
|
lines.push('');
|
|
247
469
|
}
|
|
248
470
|
|
|
471
|
+
// TIM-832: catch-all block — emitted as a SEPARATE `declare module`
|
|
472
|
+
// augmentation so TS's "later overload set first" rule orders it ahead
|
|
473
|
+
// of the per-route block above at resolution time, leaving per-route as
|
|
474
|
+
// the "last overload" whose error TypeScript reports.
|
|
475
|
+
lines.push("declare module '@timber-js/app/client' {");
|
|
476
|
+
lines.push(" import type { SearchParamsDefinition } from '@timber-js/app/search-params'");
|
|
477
|
+
lines.push('');
|
|
478
|
+
lines.push(...formatLinkCatchAllOverloads());
|
|
479
|
+
lines.push('}');
|
|
480
|
+
lines.push('');
|
|
481
|
+
|
|
249
482
|
return lines.join('\n');
|
|
250
483
|
}
|
|
251
484
|
|
|
252
485
|
/**
|
|
253
486
|
* Format the params type for a route entry.
|
|
254
487
|
*/
|
|
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 {
|
|
488
|
+
function formatParamsType(params: ParamEntry[], importBase?: string, hasSchema?: boolean): string {
|
|
274
489
|
if (params.length === 0) {
|
|
275
490
|
return '{}';
|
|
276
491
|
}
|
|
277
492
|
|
|
278
493
|
const fields = params.map((p) => {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
494
|
+
const codecType = hasSchema
|
|
495
|
+
? buildSchemaParamType(p)
|
|
496
|
+
: buildCodecChainType(p, importBase, p.type);
|
|
497
|
+
return `${p.name}: ${codecType}`;
|
|
282
498
|
});
|
|
283
499
|
return `{ ${fields.join('; ')} }`;
|
|
284
500
|
}
|
|
285
501
|
|
|
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
502
|
/**
|
|
312
503
|
* Generate useQueryStates overloads.
|
|
313
504
|
*
|
|
@@ -337,60 +528,8 @@ function formatUseQueryStatesOverloads(routes: RouteEntry[], importBase?: string
|
|
|
337
528
|
return lines;
|
|
338
529
|
}
|
|
339
530
|
|
|
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
|
-
}
|
|
531
|
+
// Link overload formatters and helpers (`formatTypedLinkOverloads`,
|
|
532
|
+
// `formatLinkCatchAllOverloads`, `formatLinkParamsType`,
|
|
533
|
+
// `buildResolvedPattern`, `LINK_BASE_PROPS_TYPE`) were extracted to
|
|
534
|
+
// `./link-codegen.ts` (TIM-835) to keep this file under the 500-line
|
|
535
|
+
// cap. They are imported at the top of this file.
|