@timber-js/app 0.2.0-alpha.9 → 0.2.0-alpha.90
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-DLnUaR65.js +421 -0
- package/dist/_chunks/actions-DLnUaR65.js.map +1 -0
- package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
- package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
- package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
- package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
- package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
- package/dist/_chunks/define-C77ScO0m.js +106 -0
- package/dist/_chunks/define-C77ScO0m.js.map +1 -0
- package/dist/_chunks/define-Itxvcd7F.js +199 -0
- package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
- package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
- package/dist/_chunks/format-CYBGxKtc.js +14 -0
- package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
- package/dist/_chunks/{interception-BOoWmLUA.js → interception-DRlhJWbu.js} +219 -97
- package/dist/_chunks/interception-DRlhJWbu.js.map +1 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
- package/dist/_chunks/request-context-CK5tZqIP.js +478 -0
- package/dist/_chunks/request-context-CK5tZqIP.js.map +1 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
- package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
- package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
- package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
- package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
- package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
- package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
- package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-BiV5GJgm.js} +7 -4
- package/dist/_chunks/use-query-states-BiV5GJgm.js.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 +135 -11
- 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 +56 -13
- package/dist/adapters/nitro.js.map +1 -1
- 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 +142 -80
- 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.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +27 -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 +10 -4
- 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 +6 -3
- 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 -21
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +229 -1018
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +18 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +890 -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/top-loader.d.ts +5 -5
- package/dist/client/top-loader.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-params.d.ts +6 -4
- package/dist/client/use-params.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/codec.d.ts +33 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/config-types.d.ts +266 -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 +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -83
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +138 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +72 -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 +59 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +45 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4294 -2453
- package/dist/index.js.map +1 -1
- 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 +3 -3
- 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-404-page.d.ts +56 -0
- package/dist/plugins/dev-404-page.d.ts.map +1 -0
- package/dist/plugins/dev-browser-logs.d.ts +84 -0
- package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
- package/dist/plugins/dev-error-overlay.d.ts +49 -9
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-error-page.d.ts +58 -0
- package/dist/plugins/dev-error-page.d.ts.map +1 -0
- package/dist/plugins/dev-logs.d.ts +1 -1
- package/dist/plugins/dev-logs.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/dev-terminal-error.d.ts +28 -0
- package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
- 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 +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +2 -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 +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +46 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +16 -4
- package/dist/routing/types.d.ts.map +1 -1
- 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 +139 -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 +32 -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 +78 -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 +4 -0
- 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 +7 -0
- 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 +32 -4
- package/dist/server/als-registry.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/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-page-resolver.d.ts +52 -0
- package/dist/server/deny-page-resolver.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-holding-server.d.ts +52 -0
- package/dist/server/dev-holding-server.d.ts.map +1 -0
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/dev-warnings.d.ts +1 -21
- package/dist/server/dev-warnings.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-injectors.d.ts +51 -11
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +5 -43
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2800
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +46 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2900 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +25 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +113 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/page-deny-boundary.d.ts +31 -0
- package/dist/server/page-deny-boundary.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.d.ts +52 -10
- package/dist/server/pipeline.d.ts.map +1 -1
- 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 +112 -43
- 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 +16 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- 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 +48 -5
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +20 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- 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 +14 -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/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 +23 -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/status-code-resolver.d.ts +1 -1
- 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 +4 -4
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +22 -19
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -4
- package/dist/server/types.d.ts.map +1 -1
- 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 +1 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +3 -2
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +5 -2
- package/dist/utils/directive-parser.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 +51 -16
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +342 -28
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +52 -8
- 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 +31 -0
- package/src/cache/timber-cache.ts +24 -20
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +128 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -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 +143 -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 +48 -16
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +14 -7
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +65 -38
- package/src/client/internal.ts +57 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +342 -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 +299 -72
- package/src/client/rsc-fetch.ts +97 -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/top-loader.tsx +18 -6
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-params.ts +7 -5
- 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/codec.ts +49 -0
- package/src/config-types.ts +264 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +78 -25
- package/src/cookies/index.ts +8 -0
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/pipeline.ts +275 -0
- package/src/fonts/transform.ts +353 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +159 -0
- package/src/index.ts +314 -355
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +9 -3
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +3 -3
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-404-page.ts +418 -0
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +286 -42
- package/src/plugins/dev-error-page.ts +536 -0
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +146 -19
- package/src/plugins/dev-terminal-error.ts +217 -0
- package/src/plugins/entries.ts +111 -10
- package/src/plugins/fonts.ts +133 -638
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +213 -31
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen.ts +273 -105
- package/src/routing/convention-lint.ts +356 -0
- package/src/routing/index.ts +2 -0
- package/src/routing/scanner.ts +93 -23
- package/src/routing/segment-classify.ts +89 -0
- package/src/routing/status-file-lint.ts +3 -2
- package/src/routing/types.ts +17 -4
- 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 +482 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +85 -0
- package/src/segment-params/define.ts +279 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +53 -6
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +34 -6
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-page-resolver.ts +154 -0
- package/src/server/deny-renderer.ts +24 -38
- package/src/server/dev-holding-server.ts +185 -0
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/dev-warnings.ts +4 -49
- 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-injectors.ts +280 -120
- package/src/server/index.ts +25 -177
- package/src/server/internal.ts +169 -0
- package/src/server/logger.ts +44 -36
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +509 -0
- package/src/server/page-deny-boundary.tsx +56 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline.ts +261 -66
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +293 -132
- package/src/server/route-element-builder.ts +283 -191
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +31 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +304 -111
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +81 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +171 -38
- 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 +244 -229
- package/src/server/ssr-entry.ts +215 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +20 -9
- package/src/server/tree-builder.ts +92 -58
- package/src/server/types.ts +3 -6
- 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 +1 -1
- package/src/shims/navigation.ts +7 -2
- package/src/utils/directive-parser.ts +5 -2
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- 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/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/cookies/index.js.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/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.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/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/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/dynamic-transform.ts +0 -161
- 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/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { t as classifyUrlSegment } from "./segment-classify-BDNn6EzD.js";
|
|
2
|
+
import { a as isDynamicMetadataExtension, n as classifyMetadataRoute } from "./metadata-routes-DS3eKNmf.js";
|
|
3
3
|
import { basename, extname, join, posix, relative } from "node:path";
|
|
4
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
4
5
|
//#region src/routing/types.ts
|
|
5
6
|
/** All recognized interception markers, ordered longest-first for parsing. */
|
|
6
7
|
var INTERCEPTION_MARKERS = [
|
|
@@ -65,8 +66,7 @@ var FIXED_CONVENTIONS = new Set([
|
|
|
65
66
|
"middleware",
|
|
66
67
|
"access",
|
|
67
68
|
"route",
|
|
68
|
-
"
|
|
69
|
-
"search-params"
|
|
69
|
+
"params"
|
|
70
70
|
]);
|
|
71
71
|
/**
|
|
72
72
|
* Status-code file patterns:
|
|
@@ -87,9 +87,12 @@ function scanRoutes(appDir, config = {}) {
|
|
|
87
87
|
const tree = { root: createSegmentNode("", "static", "/") };
|
|
88
88
|
const proxyFile = findFixedFile(appDir, "proxy");
|
|
89
89
|
if (proxyFile) tree.proxy = proxyFile;
|
|
90
|
+
const globalErrorFile = findPageExtFile(appDir, "global-error", extSet);
|
|
91
|
+
if (globalErrorFile) tree.globalError = globalErrorFile;
|
|
90
92
|
scanSegmentFiles(appDir, tree.root, extSet);
|
|
91
93
|
scanChildren(appDir, tree.root, extSet);
|
|
92
94
|
validateRouteGroupCollisions(tree.root);
|
|
95
|
+
validateDuplicateParamNames(tree.root);
|
|
93
96
|
return tree;
|
|
94
97
|
}
|
|
95
98
|
/**
|
|
@@ -120,17 +123,10 @@ function classifySegment(dirName) {
|
|
|
120
123
|
interceptedSegmentName: interception.segmentName
|
|
121
124
|
};
|
|
122
125
|
if (dirName.startsWith("(") && dirName.endsWith(")")) return { type: "group" };
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (dirName.startsWith("[...") && dirName.endsWith("]")) return {
|
|
128
|
-
type: "catch-all",
|
|
129
|
-
paramName: dirName.slice(4, -1)
|
|
130
|
-
};
|
|
131
|
-
if (dirName.startsWith("[") && dirName.endsWith("]")) return {
|
|
132
|
-
type: "dynamic",
|
|
133
|
-
paramName: dirName.slice(1, -1)
|
|
126
|
+
const urlSeg = classifyUrlSegment(dirName);
|
|
127
|
+
if (urlSeg.kind !== "static") return {
|
|
128
|
+
type: urlSeg.kind,
|
|
129
|
+
paramName: urlSeg.name
|
|
134
130
|
};
|
|
135
131
|
return { type: "static" };
|
|
136
132
|
}
|
|
@@ -224,11 +220,8 @@ function scanSegmentFiles(dirPath, node, extSet) {
|
|
|
224
220
|
case "route":
|
|
225
221
|
node.route = file;
|
|
226
222
|
break;
|
|
227
|
-
case "
|
|
228
|
-
node.
|
|
229
|
-
break;
|
|
230
|
-
case "search-params":
|
|
231
|
-
node.searchParams = file;
|
|
223
|
+
case "params":
|
|
224
|
+
node.params = file;
|
|
232
225
|
break;
|
|
233
226
|
}
|
|
234
227
|
continue;
|
|
@@ -338,6 +331,34 @@ function collectRoutableLeaves(node, seen, segmentPath, insideSlot) {
|
|
|
338
331
|
for (const [, slotNode] of node.slots) collectRoutableLeaves(slotNode, seen, currentPath, true);
|
|
339
332
|
}
|
|
340
333
|
/**
|
|
334
|
+
* Validate that no route chain contains duplicate dynamic param names.
|
|
335
|
+
*
|
|
336
|
+
* Example violation:
|
|
337
|
+
* app/[id]/items/[id]/page.tsx — 'id' appears twice in the ancestor chain.
|
|
338
|
+
*
|
|
339
|
+
* Route groups are transparent — params accumulate through them.
|
|
340
|
+
* Slots are independent — duplicate detection does NOT cross slot boundaries.
|
|
341
|
+
*
|
|
342
|
+
* See design/07-routing.md §"Duplicate Param Name Detection"
|
|
343
|
+
*/
|
|
344
|
+
function validateDuplicateParamNames(root) {
|
|
345
|
+
walkForDuplicateParams(root, /* @__PURE__ */ new Map());
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Recursively walk the segment tree, tracking seen param names → segment paths.
|
|
349
|
+
* Throws on the first duplicate found.
|
|
350
|
+
*/
|
|
351
|
+
function walkForDuplicateParams(node, seen) {
|
|
352
|
+
if (node.paramName) {
|
|
353
|
+
const existing = seen.get(node.paramName);
|
|
354
|
+
if (existing) throw new Error(`[timber] Duplicate param name '${node.paramName}' in route chain.\n First defined at: ${existing}\n Duplicate at: ${node.urlPath || "/"}\n Rename one of the segments to avoid ambiguity.`);
|
|
355
|
+
seen = new Map(seen);
|
|
356
|
+
seen.set(node.paramName, node.urlPath || "/");
|
|
357
|
+
}
|
|
358
|
+
for (const child of node.children) walkForDuplicateParams(child, seen);
|
|
359
|
+
for (const [, slotNode] of node.slots) walkForDuplicateParams(slotNode, new Map(seen));
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
341
362
|
* Find a fixed-extension file (proxy.ts) in a directory.
|
|
342
363
|
*/
|
|
343
364
|
function findFixedFile(dirPath, name) {
|
|
@@ -351,6 +372,21 @@ function findFixedFile(dirPath, name) {
|
|
|
351
372
|
} catch {}
|
|
352
373
|
}
|
|
353
374
|
}
|
|
375
|
+
/**
|
|
376
|
+
* Find a file using the configured page extensions (tsx, ts, jsx, js, mdx, etc.).
|
|
377
|
+
* Used for app-root conventions like global-error that aren't per-segment.
|
|
378
|
+
*/
|
|
379
|
+
function findPageExtFile(dirPath, name, extSet) {
|
|
380
|
+
for (const ext of extSet) {
|
|
381
|
+
const fullPath = join(dirPath, `${name}.${ext}`);
|
|
382
|
+
try {
|
|
383
|
+
if (statSync(fullPath).isFile()) return {
|
|
384
|
+
filePath: fullPath,
|
|
385
|
+
extension: ext
|
|
386
|
+
};
|
|
387
|
+
} catch {}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
354
390
|
//#endregion
|
|
355
391
|
//#region src/routing/codegen.ts
|
|
356
392
|
/**
|
|
@@ -370,7 +406,7 @@ function findFixedFile(dirPath, name) {
|
|
|
370
406
|
*/
|
|
371
407
|
function generateRouteMap(tree, options = {}) {
|
|
372
408
|
const routes = [];
|
|
373
|
-
collectRoutes(tree.root, [],
|
|
409
|
+
collectRoutes(tree.root, [], routes);
|
|
374
410
|
routes.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
|
|
375
411
|
return formatDeclarationFile(routes, options.outputDir ?? options.appDir);
|
|
376
412
|
}
|
|
@@ -380,12 +416,16 @@ function generateRouteMap(tree, options = {}) {
|
|
|
380
416
|
* A route entry is created for any segment that has a `page` or `route` file.
|
|
381
417
|
* Params accumulate from ancestor dynamic segments.
|
|
382
418
|
*/
|
|
383
|
-
function collectRoutes(node, ancestorParams,
|
|
419
|
+
function collectRoutes(node, ancestorParams, routes) {
|
|
384
420
|
const params = [...ancestorParams];
|
|
385
|
-
if (node.paramName)
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
421
|
+
if (node.paramName) {
|
|
422
|
+
const codecFile = findParamsExport(node);
|
|
423
|
+
params.push({
|
|
424
|
+
name: node.paramName,
|
|
425
|
+
type: paramTypeForSegment(node.segmentType),
|
|
426
|
+
codecFilePath: codecFile
|
|
427
|
+
});
|
|
428
|
+
}
|
|
389
429
|
const isPage = !!node.page;
|
|
390
430
|
const isApiRoute = !!node.route;
|
|
391
431
|
if (isPage || isApiRoute) {
|
|
@@ -395,17 +435,19 @@ function collectRoutes(node, ancestorParams, appDir, routes) {
|
|
|
395
435
|
hasSearchParams: false,
|
|
396
436
|
isApiRoute
|
|
397
437
|
};
|
|
398
|
-
if (
|
|
399
|
-
|
|
400
|
-
|
|
438
|
+
if (isPage) {
|
|
439
|
+
if (node.params && fileHasExport(node.params.filePath, "searchParams")) {
|
|
440
|
+
entry.hasSearchParams = true;
|
|
441
|
+
entry.searchParamsPagePath = node.params.filePath;
|
|
442
|
+
} else if (node.page && fileHasExport(node.page.filePath, "searchParams")) {
|
|
401
443
|
entry.hasSearchParams = true;
|
|
402
|
-
entry.
|
|
444
|
+
entry.searchParamsPagePath = node.page.filePath;
|
|
403
445
|
}
|
|
404
446
|
}
|
|
405
447
|
routes.push(entry);
|
|
406
448
|
}
|
|
407
|
-
for (const child of node.children) collectRoutes(child, params,
|
|
408
|
-
for (const [, slot] of node.slots) collectRoutes(slot, params,
|
|
449
|
+
for (const child of node.children) collectRoutes(child, params, routes);
|
|
450
|
+
for (const [, slot] of node.slots) collectRoutes(slot, params, routes);
|
|
409
451
|
}
|
|
410
452
|
/**
|
|
411
453
|
* Determine the TypeScript type for a segment's param.
|
|
@@ -418,28 +460,32 @@ function paramTypeForSegment(segmentType) {
|
|
|
418
460
|
}
|
|
419
461
|
}
|
|
420
462
|
/**
|
|
421
|
-
*
|
|
463
|
+
* Check if a file exports a specific named export.
|
|
422
464
|
*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
*/
|
|
426
|
-
function
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
const
|
|
430
|
-
|
|
431
|
-
return
|
|
465
|
+
* Uses a lightweight regex check — not full AST parsing. The actual type
|
|
466
|
+
* extraction happens via the TypeScript compiler in the generated .d.ts.
|
|
467
|
+
*/
|
|
468
|
+
function fileHasExport(filePath, exportName) {
|
|
469
|
+
if (!existsSync(filePath)) return false;
|
|
470
|
+
try {
|
|
471
|
+
const content = readFileSync(filePath, "utf-8");
|
|
472
|
+
const e = exportName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
473
|
+
return new RegExp(`export\\s+(const|let|var)\\s+${e}\\b`).test(content) || new RegExp(`export\\s*\\{[^}]*\\b${e}\\b[^}]*\\}`).test(content);
|
|
474
|
+
} catch {
|
|
475
|
+
return false;
|
|
432
476
|
}
|
|
433
|
-
return appDir;
|
|
434
477
|
}
|
|
435
478
|
/**
|
|
436
|
-
* Find
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
479
|
+
* Find which file exports `segmentParams` for a dynamic segment.
|
|
480
|
+
*
|
|
481
|
+
* Priority: params.ts (convention file) > layout > page.
|
|
482
|
+
* params.ts is the canonical location (TIM-508). Layout/page fallback
|
|
483
|
+
* exists for backward compat during migration.
|
|
484
|
+
*/
|
|
485
|
+
function findParamsExport(node) {
|
|
486
|
+
if (node.params && fileHasExport(node.params.filePath, "segmentParams")) return node.params.filePath;
|
|
487
|
+
if (node.layout && fileHasExport(node.layout.filePath, "segmentParams")) return node.layout.filePath;
|
|
488
|
+
if (node.page && fileHasExport(node.page.filePath, "segmentParams")) return node.page.filePath;
|
|
443
489
|
}
|
|
444
490
|
/**
|
|
445
491
|
* Format the collected routes into a TypeScript declaration file.
|
|
@@ -454,10 +500,10 @@ function formatDeclarationFile(routes, importBase) {
|
|
|
454
500
|
lines.push("declare module '@timber-js/app' {");
|
|
455
501
|
lines.push(" interface Routes {");
|
|
456
502
|
for (const route of routes) {
|
|
457
|
-
const paramsType = formatParamsType(route.params);
|
|
503
|
+
const paramsType = formatParamsType(route.params, importBase);
|
|
458
504
|
const searchParamsType = formatSearchParamsType(route, importBase);
|
|
459
505
|
lines.push(` '${route.urlPath}': {`);
|
|
460
|
-
lines.push(`
|
|
506
|
+
lines.push(` segmentParams: ${paramsType}`);
|
|
461
507
|
lines.push(` searchParams: ${searchParamsType}`);
|
|
462
508
|
lines.push(` }`);
|
|
463
509
|
}
|
|
@@ -465,13 +511,6 @@ function formatDeclarationFile(routes, importBase) {
|
|
|
465
511
|
lines.push("}");
|
|
466
512
|
lines.push("");
|
|
467
513
|
const pageRoutes = routes.filter((r) => !r.isApiRoute);
|
|
468
|
-
if (pageRoutes.length > 0) {
|
|
469
|
-
lines.push("declare module '@timber-js/app/server' {");
|
|
470
|
-
lines.push(" import type { Routes } from '@timber-js/app'");
|
|
471
|
-
lines.push(" export function searchParams<R extends keyof Routes>(): Promise<Routes[R]['searchParams']>");
|
|
472
|
-
lines.push("}");
|
|
473
|
-
lines.push("");
|
|
474
|
-
}
|
|
475
514
|
const dynamicRoutes = routes.filter((r) => r.params.length > 0);
|
|
476
515
|
if (dynamicRoutes.length > 0 || pageRoutes.length > 0) {
|
|
477
516
|
lines.push("declare module '@timber-js/app/client' {");
|
|
@@ -479,10 +518,10 @@ function formatDeclarationFile(routes, importBase) {
|
|
|
479
518
|
lines.push("");
|
|
480
519
|
if (dynamicRoutes.length > 0) {
|
|
481
520
|
for (const route of dynamicRoutes) {
|
|
482
|
-
const paramsType = formatParamsType(route.params);
|
|
483
|
-
lines.push(` export function
|
|
521
|
+
const paramsType = formatParamsType(route.params, importBase);
|
|
522
|
+
lines.push(` export function useSegmentParams(route: '${route.urlPath}'): ${paramsType}`);
|
|
484
523
|
}
|
|
485
|
-
lines.push(" export function
|
|
524
|
+
lines.push(" export function useSegmentParams(): Record<string, string | string[]>");
|
|
486
525
|
lines.push("");
|
|
487
526
|
}
|
|
488
527
|
if (pageRoutes.length > 0) {
|
|
@@ -490,33 +529,58 @@ function formatDeclarationFile(routes, importBase) {
|
|
|
490
529
|
lines.push("");
|
|
491
530
|
}
|
|
492
531
|
if (pageRoutes.length > 0) {
|
|
493
|
-
lines.push(" // Typed Link
|
|
532
|
+
lines.push(" // Typed Link overloads — per-route (block 1 / emitted first)");
|
|
494
533
|
lines.push(...formatTypedLinkOverloads(pageRoutes, importBase));
|
|
534
|
+
lines.push("");
|
|
495
535
|
}
|
|
496
536
|
lines.push("}");
|
|
497
537
|
lines.push("");
|
|
498
538
|
}
|
|
539
|
+
lines.push("declare module '@timber-js/app/client' {");
|
|
540
|
+
lines.push(" import type { SearchParamsDefinition } from '@timber-js/app/search-params'");
|
|
541
|
+
lines.push("");
|
|
542
|
+
lines.push(...formatLinkCatchAllOverloads());
|
|
543
|
+
lines.push("}");
|
|
544
|
+
lines.push("");
|
|
499
545
|
return lines.join("\n");
|
|
500
546
|
}
|
|
501
547
|
/**
|
|
502
548
|
* Format the params type for a route entry.
|
|
503
549
|
*/
|
|
504
|
-
function formatParamsType(params) {
|
|
550
|
+
function formatParamsType(params, importBase) {
|
|
505
551
|
if (params.length === 0) return "{}";
|
|
506
|
-
return `{ ${params.map((p) =>
|
|
552
|
+
return `{ ${params.map((p) => {
|
|
553
|
+
if (p.codecFilePath) {
|
|
554
|
+
const absPath = p.codecFilePath.replace(/\.(ts|tsx)$/, "");
|
|
555
|
+
let importPath;
|
|
556
|
+
if (importBase) importPath = "./" + relative(importBase, absPath).replace(/\\/g, "/");
|
|
557
|
+
else importPath = "./" + posix.basename(absPath);
|
|
558
|
+
const codecType = `(typeof import('${importPath}'))['segmentParams'] extends import('@timber-js/app/segment-params').ParamsDefinition<infer T> ? T[${JSON.stringify(p.name)}] : ${p.type}`;
|
|
559
|
+
return `${p.name}: ${codecType}`;
|
|
560
|
+
}
|
|
561
|
+
return `${p.name}: ${p.type}`;
|
|
562
|
+
}).join("; ")} }`;
|
|
507
563
|
}
|
|
508
564
|
/**
|
|
509
|
-
* Format the params type for Link
|
|
565
|
+
* Format the params type for Link overloads.
|
|
510
566
|
*
|
|
511
567
|
* Link params accept `string | number` for single dynamic segments
|
|
512
568
|
* (convenience — values are stringified at runtime). Catch-all and
|
|
513
569
|
* optional catch-all remain `string[]` / `string[] | undefined`.
|
|
514
570
|
*
|
|
515
|
-
*
|
|
571
|
+
* Uses DIRECT types (not conditional) to preserve excess property checking.
|
|
516
572
|
*/
|
|
517
|
-
function formatLinkParamsType(params) {
|
|
573
|
+
function formatLinkParamsType(params, importBase) {
|
|
518
574
|
if (params.length === 0) return "{}";
|
|
519
575
|
return `{ ${params.map((p) => {
|
|
576
|
+
if (p.codecFilePath) {
|
|
577
|
+
const absPath = p.codecFilePath.replace(/\.(ts|tsx)$/, "");
|
|
578
|
+
let importPath;
|
|
579
|
+
if (importBase) importPath = "./" + relative(importBase, absPath).replace(/\\/g, "/");
|
|
580
|
+
else importPath = "./" + posix.basename(absPath);
|
|
581
|
+
const codecType = `(typeof import('${importPath}'))['segmentParams'] extends import('@timber-js/app/segment-params').ParamsDefinition<infer T> ? T[${JSON.stringify(p.name)}] : ${p.type}`;
|
|
582
|
+
return `${p.name}: ${codecType}`;
|
|
583
|
+
}
|
|
520
584
|
const type = p.type === "string" ? "string | number" : p.type;
|
|
521
585
|
return `${p.name}: ${type}`;
|
|
522
586
|
}).join("; ")} }`;
|
|
@@ -524,17 +588,17 @@ function formatLinkParamsType(params) {
|
|
|
524
588
|
/**
|
|
525
589
|
* Format the searchParams type for a route entry.
|
|
526
590
|
*
|
|
527
|
-
* When a
|
|
591
|
+
* When a page.tsx exports searchParams, we reference its inferred type via an import type.
|
|
528
592
|
* The import path is relative to `importBase` (the directory where the .d.ts will be
|
|
529
593
|
* written). When importBase is undefined, falls back to a bare relative path.
|
|
530
594
|
*/
|
|
531
595
|
function formatSearchParamsType(route, importBase) {
|
|
532
|
-
if (route.hasSearchParams && route.
|
|
533
|
-
const absPath = route.
|
|
596
|
+
if (route.hasSearchParams && route.searchParamsPagePath) {
|
|
597
|
+
const absPath = route.searchParamsPagePath.replace(/\.(ts|tsx)$/, "");
|
|
534
598
|
let importPath;
|
|
535
599
|
if (importBase) importPath = "./" + relative(importBase, absPath).replace(/\\/g, "/");
|
|
536
600
|
else importPath = "./" + posix.basename(absPath);
|
|
537
|
-
return `(typeof import('${importPath}'))['
|
|
601
|
+
return `(typeof import('${importPath}'))['searchParams'] extends import('@timber-js/app/search-params').SearchParamsDefinition<infer T> ? T : never`;
|
|
538
602
|
}
|
|
539
603
|
return "{}";
|
|
540
604
|
}
|
|
@@ -557,41 +621,99 @@ function formatUseQueryStatesOverloads(routes, importBase) {
|
|
|
557
621
|
return lines;
|
|
558
622
|
}
|
|
559
623
|
/**
|
|
560
|
-
*
|
|
624
|
+
* Build a TypeScript template literal pattern for a dynamic route.
|
|
625
|
+
* e.g. '/products/[id]' → '/products/${string}'
|
|
626
|
+
* '/blog/[...slug]' → '/blog/${string}'
|
|
627
|
+
* '/docs/[[...path]]' → '/docs/${string}' (also matches /docs)
|
|
628
|
+
* '/[org]/[repo]' → '/${string}/${string}'
|
|
629
|
+
*/
|
|
630
|
+
function buildResolvedPattern(route) {
|
|
631
|
+
return route.urlPath.split("/").map((part) => {
|
|
632
|
+
if (part.startsWith("[[...") && part.endsWith("]]")) return "${string}";
|
|
633
|
+
if (part.startsWith("[...") && part.endsWith("]")) return "${string}";
|
|
634
|
+
if (part.startsWith("[") && part.endsWith("]")) return "${string}";
|
|
635
|
+
return part;
|
|
636
|
+
}).join("/");
|
|
637
|
+
}
|
|
638
|
+
/** Shared Link base-props type literal used in every emitted call signature. */
|
|
639
|
+
var LINK_BASE_PROPS_TYPE = "Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & { prefetch?: boolean; scroll?: boolean; preserveSearchParams?: true | string[]; onNavigate?: import('./client/link.js').OnNavigateHandler; children?: import('react').ReactNode }";
|
|
640
|
+
/**
|
|
641
|
+
* TIM-832: Catch-all call signatures for `<Link>` — external hrefs and
|
|
642
|
+
* computed `string` variables. Emitted from codegen in a SEPARATE
|
|
643
|
+
* `declare module` block (declared AFTER the per-route block) so the TS
|
|
644
|
+
* "later overload set ordered first" rule places these catch-all
|
|
645
|
+
* signatures ahead of per-route in resolution order, leaving per-route
|
|
646
|
+
* as the final overload whose error message is reported on failure.
|
|
561
647
|
*
|
|
562
|
-
*
|
|
563
|
-
* -
|
|
564
|
-
* -
|
|
565
|
-
|
|
648
|
+
* The conditional `string extends H ? ... : never` protection preserves
|
|
649
|
+
* TIM-624's guarantee that unknown internal path literals don't match
|
|
650
|
+
* the catch-all — typos like `<Link href="/typo" />` still error.
|
|
651
|
+
*/
|
|
652
|
+
function formatLinkCatchAllOverloads() {
|
|
653
|
+
const lines = [];
|
|
654
|
+
const baseProps = LINK_BASE_PROPS_TYPE;
|
|
655
|
+
const catchAllSearchParams = "{ definition: SearchParamsDefinition<Record<string, unknown>>; values: Record<string, unknown> } | Record<string, unknown>";
|
|
656
|
+
const externalHref = "`http://${string}` | `https://${string}` | `mailto:${string}` | `tel:${string}` | `ftp://${string}` | `//${string}` | `#${string}` | `?${string}`";
|
|
657
|
+
lines.push(" // Typed Link overloads — catch-all (block 2 / emitted second)");
|
|
658
|
+
lines.push(" interface LinkFunction {");
|
|
659
|
+
lines.push(` (props: ${baseProps} & {`);
|
|
660
|
+
lines.push(` href: ${externalHref}`);
|
|
661
|
+
lines.push(` segmentParams?: never`);
|
|
662
|
+
lines.push(` searchParams?: ${catchAllSearchParams}`);
|
|
663
|
+
lines.push(` }): import('react').JSX.Element`);
|
|
664
|
+
lines.push(` <H extends string>(`);
|
|
665
|
+
lines.push(` props: string extends H`);
|
|
666
|
+
lines.push(` ? ${baseProps} & {`);
|
|
667
|
+
lines.push(` href: H`);
|
|
668
|
+
lines.push(` segmentParams?: Record<string, string | number | string[]>`);
|
|
669
|
+
lines.push(` searchParams?: ${catchAllSearchParams}`);
|
|
670
|
+
lines.push(` }`);
|
|
671
|
+
lines.push(` : never`);
|
|
672
|
+
lines.push(` ): import('react').JSX.Element`);
|
|
673
|
+
lines.push(" }");
|
|
674
|
+
return lines;
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Generate typed per-route Link call signatures via LinkFunction
|
|
678
|
+
* interface merging.
|
|
566
679
|
*
|
|
567
|
-
*
|
|
568
|
-
*
|
|
680
|
+
* Each call signature uses DIRECT types (not conditional types) for
|
|
681
|
+
* segmentParams, preserving TypeScript's excess property checking.
|
|
682
|
+
* Interface merging is the only reliable way to add "overloads" via
|
|
683
|
+
* module augmentation — function overloads can't be augmented.
|
|
684
|
+
*
|
|
685
|
+
* TIM-832: this function emits ONLY the per-route block. The catch-all
|
|
686
|
+
* block is emitted separately by `formatLinkCatchAllOverloads` inside a
|
|
687
|
+
* second `declare module` so TS overload ordering reports per-route
|
|
688
|
+
* errors (see `formatDeclarationFile`).
|
|
569
689
|
*/
|
|
570
690
|
function formatTypedLinkOverloads(routes, importBase) {
|
|
571
691
|
const lines = [];
|
|
692
|
+
const baseProps = LINK_BASE_PROPS_TYPE;
|
|
693
|
+
lines.push(" interface LinkFunction {");
|
|
572
694
|
for (const route of routes) {
|
|
573
695
|
const hasDynamicParams = route.params.length > 0;
|
|
574
|
-
const
|
|
696
|
+
const paramsProp = hasDynamicParams ? `segmentParams: ${formatLinkParamsType(route.params, importBase)}` : "segmentParams?: never";
|
|
575
697
|
const searchParamsType = route.hasSearchParams ? formatSearchParamsType(route, importBase) : null;
|
|
698
|
+
const patternSearchParamsProp = searchParamsType ? `searchParams?: Partial<${searchParamsType}>` : "searchParams?: never";
|
|
576
699
|
if (hasDynamicParams) {
|
|
577
|
-
const
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
lines.push(` export function Link(props: Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {`);
|
|
587
|
-
lines.push(` href: '${route.urlPath}'`);
|
|
588
|
-
lines.push(` params?: never`);
|
|
589
|
-
lines.push(` ${spProp}`);
|
|
590
|
-
lines.push(` prefetch?: boolean; scroll?: boolean; children?: import('react').ReactNode`);
|
|
591
|
-
lines.push(` }): import('react').JSX.Element`);
|
|
700
|
+
const templatePattern = buildResolvedPattern(route);
|
|
701
|
+
if (templatePattern) {
|
|
702
|
+
const resolvedSearchParamsProp = searchParamsType ? `searchParams?: { definition: SearchParamsDefinition<${searchParamsType}>; values: Partial<${searchParamsType}> }` : "searchParams?: never";
|
|
703
|
+
lines.push(` (props: ${baseProps} & {`);
|
|
704
|
+
lines.push(` href: \`${templatePattern}\``);
|
|
705
|
+
lines.push(` segmentParams?: never`);
|
|
706
|
+
lines.push(` ${resolvedSearchParamsProp}`);
|
|
707
|
+
lines.push(` }): import('react').JSX.Element`);
|
|
708
|
+
}
|
|
592
709
|
}
|
|
710
|
+
lines.push(` (props: ${baseProps} & {`);
|
|
711
|
+
lines.push(` href: '${route.urlPath}'`);
|
|
712
|
+
lines.push(` ${paramsProp}`);
|
|
713
|
+
lines.push(` ${patternSearchParamsProp}`);
|
|
714
|
+
lines.push(` }): import('react').JSX.Element`);
|
|
593
715
|
}
|
|
594
|
-
lines.push(
|
|
716
|
+
lines.push(" }");
|
|
595
717
|
return lines;
|
|
596
718
|
}
|
|
597
719
|
//#endregion
|
|
@@ -673,4 +795,4 @@ function computeInterceptedBase(parentUrlPath, marker) {
|
|
|
673
795
|
//#endregion
|
|
674
796
|
export { DEFAULT_PAGE_EXTENSIONS as a, scanRoutes as i, generateRouteMap as n, INTERCEPTION_MARKERS as o, classifySegment as r, collectInterceptionRewrites as t };
|
|
675
797
|
|
|
676
|
-
//# sourceMappingURL=interception-
|
|
798
|
+
//# sourceMappingURL=interception-DRlhJWbu.js.map
|