@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.180
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/LICENSE +8 -0
- package/agent-skill.md +344 -0
- package/dist/_chunks/actions-O_LsyCE4.js +317 -0
- package/dist/_chunks/actions-O_LsyCE4.js.map +1 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js +1202 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js +248 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js +688 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +1 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-COtkxMRT.js +191 -0
- package/dist/_chunks/define-COtkxMRT.js.map +1 -0
- package/dist/_chunks/define-c4au4I9R.js +82 -0
- package/dist/_chunks/define-c4au4I9R.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/logger-AWfuX-KJ.js +1468 -0
- package/dist/_chunks/logger-AWfuX-KJ.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context---kTF5v8.js +315 -0
- package/dist/_chunks/plugin-context---kTF5v8.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js +50 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +119 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
- package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
- package/dist/_chunks/segment-classify-Byy425ng.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
- package/dist/_chunks/use-query-states-DFvWd-EA.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/walkers-BtTlKviE.js +1002 -0
- package/dist/_chunks/walkers-BtTlKviE.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -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 +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +124 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +189 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +41 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -172
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +2 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +31 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +140 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- 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/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +35 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +113 -34
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -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 +29 -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 +27 -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 +28 -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 +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -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 +21 -6
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +185 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +887 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- 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 +99 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +48 -15
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +26 -7
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +57 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.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/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +12 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +284 -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 +257 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -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/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.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/dev-tools/instrumentation.d.ts +59 -0
- 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} +17 -3
- 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/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -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/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9243 -14093
- 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 +217 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +43 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -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/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep.d.ts +21 -0
- package/dist/plugins/request-dep.d.ts.map +1 -0
- 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 +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +64 -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/export-detect.d.ts +56 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.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/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-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 +81 -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 +81 -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 +91 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +188 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +93 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +12 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.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 +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +117 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +242 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +182 -2906
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3892 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata.d.ts +8 -0
- package/dist/server/metadata.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 +119 -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 +59 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +140 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +62 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +23 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +78 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +88 -43
- 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/render-utils.d.ts +25 -0
- package/dist/server/render-utils.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/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +53 -25
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- 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 +69 -37
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +28 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +6 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +25 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +36 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -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 +66 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +72 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +22 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +69 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.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/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.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 +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +35 -11
- 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/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +154 -0
- package/docs/api/34-api-config.mdx +325 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +252 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +176 -0
- package/docs/learn/13-configuration.mdx +162 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +173 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +105 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +204 -0
- package/src/adapters/cloudflare.ts +620 -129
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +266 -122
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +2 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +114 -21
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +197 -19
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +161 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +167 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +113 -0
- package/src/client/browser-entry/post-hydration.ts +110 -0
- package/src/client/browser-entry/router-init.ts +286 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +21 -6
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +349 -150
- package/src/client/navigation-api.ts +345 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +565 -212
- package/src/client/rsc-fetch.ts +215 -34
- package/src/client/segment-cache.ts +91 -17
- package/src/client/segment-outlet.tsx +141 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +60 -15
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +108 -10
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +149 -0
- package/src/config-types.ts +282 -0
- package/src/config-validation.ts +330 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +100 -18
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +446 -352
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +432 -0
- package/src/plugins/adapter-build.ts +220 -7
- package/src/plugins/build-manifest.ts +177 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +284 -94
- package/src/plugins/entries.ts +134 -16
- package/src/plugins/fonts.ts +225 -660
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +328 -0
- package/src/plugins/request-dep.ts +458 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +241 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +372 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +313 -0
- package/src/routing/manifest-codegen.ts +287 -0
- package/src/routing/scanner.ts +338 -189
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +223 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +82 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +253 -0
- package/src/search-params/define.ts +576 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +101 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +111 -34
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +48 -54
- package/src/server/als-registry.ts +137 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +19 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +314 -0
- package/src/server/deny-renderer.ts +85 -77
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/html-injector-core.ts +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +31 -185
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata.ts +21 -0
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +336 -0
- package/src/server/param-coercion.ts +207 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +45 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +545 -0
- package/src/server/pipeline.ts +274 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +298 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +53 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +201 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +809 -0
- package/src/server/prebuilt-runtime.ts +815 -0
- package/src/server/primitives.ts +160 -83
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +170 -337
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +699 -295
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +158 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/deny-fallback.ts +92 -0
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +210 -85
- package/src/server/rsc-entry/index.ts +332 -332
- package/src/server/rsc-entry/render-route.ts +300 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +102 -42
- package/src/server/rsc-entry/rsc-stream.ts +93 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +275 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +345 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +574 -250
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -86
- package/src/server/ssr-render.ts +345 -86
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +177 -30
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +214 -90
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.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/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.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 +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
package/src/routing/codegen.ts
CHANGED
|
@@ -9,38 +9,33 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { existsSync } from 'node:fs';
|
|
12
|
-
import { join, relative
|
|
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
|
-
|
|
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 { fileHasExport } from './export-detect.js';
|
|
22
|
+
import { formatLinkCatchAllOverloads, formatTypedLinkOverloads } from './link-codegen.js';
|
|
33
23
|
|
|
34
24
|
/** Options for route map generation. */
|
|
35
25
|
export interface CodegenOptions {
|
|
36
|
-
/** Absolute path to the app/ directory. Required for
|
|
26
|
+
/** Absolute path to the app/ directory. Required for page searchParams detection. */
|
|
37
27
|
appDir?: string;
|
|
38
28
|
/**
|
|
39
29
|
* Absolute path to the directory where the .d.ts file will be written.
|
|
40
|
-
* Used to compute correct relative import paths for
|
|
30
|
+
* Used to compute correct relative import paths for page files.
|
|
41
31
|
* Defaults to appDir when not provided (preserves backward compat for tests).
|
|
42
32
|
*/
|
|
43
33
|
outputDir?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Whether a global schema (app/schema.ts) exists.
|
|
36
|
+
* Auto-detected from appDir when not explicitly set.
|
|
37
|
+
*/
|
|
38
|
+
hasSchema?: boolean;
|
|
44
39
|
}
|
|
45
40
|
|
|
46
41
|
/**
|
|
@@ -50,8 +45,11 @@ export interface CodegenOptions {
|
|
|
50
45
|
* interface that maps every route path to its params and searchParams shape.
|
|
51
46
|
*/
|
|
52
47
|
export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}): string {
|
|
48
|
+
// Auto-detect schema from appDir when not explicitly set
|
|
49
|
+
const hasSchema = options.hasSchema ?? detectSchema(options.appDir);
|
|
50
|
+
|
|
53
51
|
const routes: RouteEntry[] = [];
|
|
54
|
-
collectRoutes(tree.root, [],
|
|
52
|
+
collectRoutes(tree.root, [], [], '', routes, hasSchema, false);
|
|
55
53
|
|
|
56
54
|
// Sort routes alphabetically for deterministic output
|
|
57
55
|
routes.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
|
|
@@ -59,7 +57,18 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
|
|
|
59
57
|
// When outputDir differs from appDir, import paths must be relative to outputDir
|
|
60
58
|
const importBase = options.outputDir ?? options.appDir;
|
|
61
59
|
|
|
62
|
-
return formatDeclarationFile(routes, importBase);
|
|
60
|
+
return formatDeclarationFile(routes, importBase, hasSchema, options.appDir);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Schema file extensions to check, in priority order. */
|
|
64
|
+
const SCHEMA_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Detect whether app/schema.{ts,tsx,js,jsx} exists.
|
|
68
|
+
*/
|
|
69
|
+
function detectSchema(appDir: string | undefined): boolean {
|
|
70
|
+
if (!appDir) return false;
|
|
71
|
+
return SCHEMA_EXTENSIONS.some((ext) => existsSync(join(appDir, `schema${ext}`)));
|
|
63
72
|
}
|
|
64
73
|
|
|
65
74
|
/**
|
|
@@ -71,37 +80,96 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
|
|
|
71
80
|
function collectRoutes(
|
|
72
81
|
node: SegmentNode,
|
|
73
82
|
ancestorParams: ParamEntry[],
|
|
74
|
-
|
|
75
|
-
|
|
83
|
+
ancestorParamsFiles: string[],
|
|
84
|
+
parentTreePath: string,
|
|
85
|
+
routes: RouteEntry[],
|
|
86
|
+
hasSchema: boolean,
|
|
87
|
+
insideSlot: boolean
|
|
76
88
|
): void {
|
|
77
|
-
//
|
|
89
|
+
// Build the tree path (includes groups, slots — uniquely identifies this segment).
|
|
90
|
+
// Root node has empty segmentName, producing treePath = ''.
|
|
91
|
+
const treePath = node.segmentName ? `${parentTreePath}/${node.segmentName}` : parentTreePath;
|
|
92
|
+
// TIM-834: Identify this segment's own params.ts (if it has a
|
|
93
|
+
// segmentParams export). The full chain of params.ts files in the
|
|
94
|
+
// route ancestry is threaded down via `ancestorParamsFiles`; codec
|
|
95
|
+
// resolution for each ParamEntry is deferred until leaf time so that
|
|
96
|
+
// descendant params.ts files can override ancestor codecs (closest-
|
|
97
|
+
// to-leaf wins, matching the runtime semantics of
|
|
98
|
+
// coerceSegmentParams which walks segments top-down and overwrites
|
|
99
|
+
// earlier coercions).
|
|
100
|
+
const ownParamsFile =
|
|
101
|
+
node.params && fileHasExport(node.params.filePath, 'segmentParams')
|
|
102
|
+
? node.params.filePath
|
|
103
|
+
: undefined;
|
|
104
|
+
|
|
105
|
+
// Accumulate params from this segment. We attach `codecFilePaths`
|
|
106
|
+
// later (at leaf time) using the FULL chain so descendant overrides
|
|
107
|
+
// are visible. The legacy layout/page fallback is recorded now
|
|
108
|
+
// because it is per-segment (and does not participate in inheritance).
|
|
78
109
|
const params = [...ancestorParams];
|
|
79
110
|
if (node.paramName) {
|
|
111
|
+
const legacyFallback = ownParamsFile ? undefined : findLegacyParamsExport(node);
|
|
80
112
|
params.push({
|
|
81
113
|
name: node.paramName,
|
|
114
|
+
bracketName: bracketNameForSegment(node),
|
|
82
115
|
type: paramTypeForSegment(node.segmentType),
|
|
116
|
+
// Codec chain populated at leaf time. We carry the per-segment
|
|
117
|
+
// legacy fallback (if any) so leaf-time resolution can fall back
|
|
118
|
+
// to it when no params.ts in the chain declares this key.
|
|
119
|
+
legacyCodecFilePath: legacyFallback,
|
|
83
120
|
});
|
|
84
121
|
}
|
|
85
122
|
|
|
123
|
+
// Extend the chain for descendants of this segment.
|
|
124
|
+
const nextAncestorFiles = ownParamsFile
|
|
125
|
+
? [...ancestorParamsFiles, ownParamsFile]
|
|
126
|
+
: ancestorParamsFiles;
|
|
127
|
+
|
|
86
128
|
// Check if this segment is a leaf route (has page or route file)
|
|
87
129
|
const isPage = !!node.page;
|
|
88
130
|
const isApiRoute = !!node.route;
|
|
89
131
|
|
|
90
132
|
if (isPage || isApiRoute) {
|
|
133
|
+
// TIM-834 P1 fix: at LEAF time, the full chain of params.ts files
|
|
134
|
+
// (root-to-leaf) is known. Resolve every ParamEntry's
|
|
135
|
+
// `codecFilePaths` to the chain in LEAF-FIRST order so the
|
|
136
|
+
// closest-to-leaf entry is checked first — matching runtime
|
|
137
|
+
// closest-wins semantics. The chain is shared by all params in the
|
|
138
|
+
// route, so we compute it once.
|
|
139
|
+
const leafFirstChain = nextAncestorFiles.length > 0 ? [...nextAncestorFiles].reverse() : [];
|
|
140
|
+
const resolvedParams: ParamEntry[] = params.map((p) => {
|
|
141
|
+
const codecFilePaths =
|
|
142
|
+
leafFirstChain.length > 0
|
|
143
|
+
? leafFirstChain
|
|
144
|
+
: p.legacyCodecFilePath
|
|
145
|
+
? [p.legacyCodecFilePath]
|
|
146
|
+
: undefined;
|
|
147
|
+
return {
|
|
148
|
+
name: p.name,
|
|
149
|
+
bracketName: p.bracketName,
|
|
150
|
+
type: p.type,
|
|
151
|
+
codecFilePaths,
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
|
|
91
155
|
const entry: RouteEntry = {
|
|
92
156
|
urlPath: node.urlPath,
|
|
93
|
-
|
|
157
|
+
segmentPath: treePath || '/',
|
|
158
|
+
params: resolvedParams,
|
|
94
159
|
hasSearchParams: false,
|
|
95
160
|
isApiRoute,
|
|
161
|
+
isSlotRoute: insideSlot,
|
|
162
|
+
hasSchema,
|
|
96
163
|
};
|
|
97
164
|
|
|
98
|
-
// Detect
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
165
|
+
// Detect searchParams export from params.ts (primary) or page.tsx (fallback)
|
|
166
|
+
if (isPage) {
|
|
167
|
+
if (node.params && fileHasExport(node.params.filePath, 'searchParams')) {
|
|
168
|
+
entry.hasSearchParams = true;
|
|
169
|
+
entry.searchParamsPagePath = node.params.filePath;
|
|
170
|
+
} else if (node.page && fileHasExport(node.page.filePath, 'searchParams')) {
|
|
103
171
|
entry.hasSearchParams = true;
|
|
104
|
-
entry.
|
|
172
|
+
entry.searchParamsPagePath = node.page.filePath;
|
|
105
173
|
}
|
|
106
174
|
}
|
|
107
175
|
|
|
@@ -110,18 +178,78 @@ function collectRoutes(
|
|
|
110
178
|
|
|
111
179
|
// Recurse into children
|
|
112
180
|
for (const child of node.children) {
|
|
113
|
-
collectRoutes(child, params,
|
|
181
|
+
collectRoutes(child, params, nextAncestorFiles, treePath, routes, hasSchema, insideSlot);
|
|
114
182
|
}
|
|
115
183
|
|
|
116
184
|
// Recurse into slots (they share the parent's URL path, but may have their own pages)
|
|
117
|
-
for (const
|
|
118
|
-
collectRoutes(slot, params,
|
|
185
|
+
for (const slot of Object.values(node.slots)) {
|
|
186
|
+
collectRoutes(slot, params, nextAncestorFiles, treePath, routes, hasSchema, true);
|
|
119
187
|
}
|
|
120
188
|
}
|
|
121
189
|
|
|
190
|
+
/**
|
|
191
|
+
* Dedupe route entries by urlPath for urlPath-keyed emissions (the Routes
|
|
192
|
+
* interface, useQueryStates overloads, and typed Link variants).
|
|
193
|
+
*
|
|
194
|
+
* Parallel-slot pages share their parent's urlPath; emitting one entry per
|
|
195
|
+
* slot page produced duplicate interface keys (TS2300/TS2717 under
|
|
196
|
+
* skipLibCheck:false) and duplicate overloads. The non-slot entry is the
|
|
197
|
+
* canonical one; when only slot entries exist (parent has no page), the
|
|
198
|
+
* lexicographically smallest segmentPath wins so output is independent of
|
|
199
|
+
* slot scan order. A slot's searchParams definition is carried onto the
|
|
200
|
+
* merged entry when the canonical entry has none — never silently dropped.
|
|
201
|
+
*
|
|
202
|
+
* segmentPath-keyed emissions (getSegmentParams, useSegmentParams,
|
|
203
|
+
* TimberSegmentParams) must NOT use this — segmentPaths are already unique
|
|
204
|
+
* and slot entries feed those APIs directly.
|
|
205
|
+
*/
|
|
206
|
+
function dedupeRoutesByUrlPath(routes: RouteEntry[]): RouteEntry[] {
|
|
207
|
+
const byPath = new Map<string, RouteEntry>();
|
|
208
|
+
for (const route of routes) {
|
|
209
|
+
const existing = byPath.get(route.urlPath);
|
|
210
|
+
if (!existing) {
|
|
211
|
+
byPath.set(route.urlPath, route);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
let winner = existing;
|
|
216
|
+
let loser = route;
|
|
217
|
+
const routeWins =
|
|
218
|
+
(existing.isSlotRoute && !route.isSlotRoute) ||
|
|
219
|
+
(!!existing.isSlotRoute === !!route.isSlotRoute &&
|
|
220
|
+
route.segmentPath.localeCompare(existing.segmentPath) < 0);
|
|
221
|
+
if (routeWins) {
|
|
222
|
+
winner = route;
|
|
223
|
+
loser = existing;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (!winner.hasSearchParams && loser.hasSearchParams) {
|
|
227
|
+
winner = {
|
|
228
|
+
...winner,
|
|
229
|
+
hasSearchParams: true,
|
|
230
|
+
searchParamsPagePath: loser.searchParamsPagePath,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
byPath.set(route.urlPath, winner);
|
|
234
|
+
}
|
|
235
|
+
return [...byPath.values()];
|
|
236
|
+
}
|
|
237
|
+
|
|
122
238
|
/**
|
|
123
239
|
* Determine the TypeScript type for a segment's param.
|
|
124
240
|
*/
|
|
241
|
+
/**
|
|
242
|
+
* Derive the bracket key for schema/codegen lookup.
|
|
243
|
+
* For bare segments like `[id]` this is the segmentName itself.
|
|
244
|
+
* For affixed segments like `img-[id].png` this is `[id]` — the bare bracket form.
|
|
245
|
+
*/
|
|
246
|
+
function bracketNameForSegment(node: SegmentNode): string {
|
|
247
|
+
if (node.paramPrefix || node.paramSuffix) {
|
|
248
|
+
return `[${node.paramName}]`;
|
|
249
|
+
}
|
|
250
|
+
return node.segmentName;
|
|
251
|
+
}
|
|
252
|
+
|
|
125
253
|
function paramTypeForSegment(segmentType: string): ParamEntry['type'] {
|
|
126
254
|
switch (segmentType) {
|
|
127
255
|
case 'catch-all':
|
|
@@ -134,41 +262,88 @@ function paramTypeForSegment(segmentType: string): ParamEntry['type'] {
|
|
|
134
262
|
}
|
|
135
263
|
|
|
136
264
|
/**
|
|
137
|
-
*
|
|
265
|
+
* Find a legacy `segmentParams` export on layout.tsx or page.tsx.
|
|
138
266
|
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
267
|
+
* Backward-compat shim: TIM-508 made params.ts the canonical location
|
|
268
|
+
* for `segmentParams`. Layout/page exports are still accepted for the
|
|
269
|
+
* OWN segment only (not inherited by descendants — see TIM-834).
|
|
141
270
|
*/
|
|
142
|
-
function
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
parts.pop(); // remove filename
|
|
149
|
-
return parts.join('/');
|
|
271
|
+
function findLegacyParamsExport(node: SegmentNode): string | undefined {
|
|
272
|
+
if (node.layout && fileHasExport(node.layout.filePath, 'segmentParams')) {
|
|
273
|
+
return node.layout.filePath;
|
|
274
|
+
}
|
|
275
|
+
if (node.page && fileHasExport(node.page.filePath, 'segmentParams')) {
|
|
276
|
+
return node.page.filePath;
|
|
150
277
|
}
|
|
151
|
-
|
|
152
|
-
return appDir;
|
|
278
|
+
return undefined;
|
|
153
279
|
}
|
|
154
280
|
|
|
155
281
|
/**
|
|
156
|
-
*
|
|
282
|
+
* Emit the schema-based type exports: TimberSegmentParams, TimberRoute,
|
|
283
|
+
* AllSegmentParams, RoutesWithParams.
|
|
284
|
+
*
|
|
285
|
+
* These types use InferCodecType references so they stay in sync with
|
|
286
|
+
* the schema without hardcoding resolved types.
|
|
287
|
+
*
|
|
288
|
+
* Design doc: design/41-global-params.md §Codegen Output
|
|
157
289
|
*/
|
|
158
|
-
function
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
290
|
+
function formatSchemaTypes(routes: RouteEntry[]): string[] {
|
|
291
|
+
const lines: string[] = [];
|
|
292
|
+
|
|
293
|
+
lines.push('/** Union of all valid route patterns. */');
|
|
294
|
+
lines.push('export type TimberRoute = keyof TimberSegmentParams;');
|
|
295
|
+
lines.push('');
|
|
296
|
+
lines.push('/** Maps each segment path to its accumulated segment params. */');
|
|
297
|
+
lines.push('export interface TimberSegmentParams {');
|
|
298
|
+
|
|
299
|
+
for (const route of routes) {
|
|
300
|
+
if (route.params.length === 0) {
|
|
301
|
+
lines.push(` '${route.segmentPath}': {};`);
|
|
302
|
+
} else {
|
|
303
|
+
lines.push(` '${route.segmentPath}': {`);
|
|
304
|
+
for (const p of route.params) {
|
|
305
|
+
lines.push(` ${p.name}: ${buildSchemaParamType(p)};`);
|
|
306
|
+
}
|
|
307
|
+
lines.push(' };');
|
|
163
308
|
}
|
|
164
309
|
}
|
|
165
|
-
|
|
310
|
+
|
|
311
|
+
lines.push('}');
|
|
312
|
+
lines.push('');
|
|
313
|
+
|
|
314
|
+
// AllSegmentParams — flat union of all param types across all routes
|
|
315
|
+
lines.push('/** All segment params (union of all route params). */');
|
|
316
|
+
lines.push('export type AllSegmentParams = {');
|
|
317
|
+
lines.push(
|
|
318
|
+
' [K in keyof TimberSegmentParams as TimberSegmentParams[K] extends Record<string, never>'
|
|
319
|
+
);
|
|
320
|
+
lines.push(' ? never');
|
|
321
|
+
lines.push(' : K]: TimberSegmentParams[K];');
|
|
322
|
+
lines.push('} extends infer U');
|
|
323
|
+
lines.push(' ? { [K in keyof U[keyof U]]: U[keyof U][K] }');
|
|
324
|
+
lines.push(' : never;');
|
|
325
|
+
lines.push('');
|
|
326
|
+
|
|
327
|
+
// RoutesWithParams — filter routes by required param keys
|
|
328
|
+
lines.push(
|
|
329
|
+
'/** Filters TimberRoute to routes whose accumulated params include all listed keys. */'
|
|
330
|
+
);
|
|
331
|
+
lines.push('export type RoutesWithParams<K extends keyof AllSegmentParams> = {');
|
|
332
|
+
lines.push(' [R in TimberRoute]: K extends keyof TimberSegmentParams[R] ? R : never;');
|
|
333
|
+
lines.push('}[TimberRoute];');
|
|
334
|
+
|
|
335
|
+
return lines;
|
|
166
336
|
}
|
|
167
337
|
|
|
168
338
|
/**
|
|
169
339
|
* Format the collected routes into a TypeScript declaration file.
|
|
170
340
|
*/
|
|
171
|
-
function formatDeclarationFile(
|
|
341
|
+
function formatDeclarationFile(
|
|
342
|
+
routes: RouteEntry[],
|
|
343
|
+
importBase?: string,
|
|
344
|
+
hasSchema?: boolean,
|
|
345
|
+
appDir?: string
|
|
346
|
+
): string {
|
|
172
347
|
const lines: string[] = [];
|
|
173
348
|
|
|
174
349
|
lines.push('// This file is auto-generated by timber.js route map codegen.');
|
|
@@ -180,53 +355,143 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
|
|
|
180
355
|
// (removing exports like bindUseQueryStates that aren't listed here).
|
|
181
356
|
lines.push('export {};');
|
|
182
357
|
lines.push('');
|
|
358
|
+
|
|
359
|
+
if (hasSchema) {
|
|
360
|
+
// Schema-based codegen: import schema and InferCodecType
|
|
361
|
+
// Compute the schema import path relative to the output directory
|
|
362
|
+
const schemaImport =
|
|
363
|
+
appDir && importBase
|
|
364
|
+
? './' + relative(importBase, join(appDir, 'schema')).replace(/\\/g, '/')
|
|
365
|
+
: '../app/schema';
|
|
366
|
+
lines.push(`import type schema from '${schemaImport}';`);
|
|
367
|
+
lines.push("import type { InferCodecType, SegmentParamCodec } from '@timber-js/app/params';");
|
|
368
|
+
lines.push('');
|
|
369
|
+
// Collect all unique bracket keys from routes for key validation
|
|
370
|
+
const allBracketKeys = new Set<string>();
|
|
371
|
+
for (const route of routes) {
|
|
372
|
+
for (const p of route.params) {
|
|
373
|
+
allBracketKeys.add(p.bracketName);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Augment the ValidDynamicSegmentKeysRegistry so defineSchema constrains keys
|
|
378
|
+
// to known filesystem segments. Unknown keys produce inline TS errors.
|
|
379
|
+
if (allBracketKeys.size > 0) {
|
|
380
|
+
lines.push("declare module '@timber-js/app/params' {");
|
|
381
|
+
lines.push(' interface ValidDynamicSegmentKeysRegistry {');
|
|
382
|
+
for (const key of [...allBracketKeys].sort()) {
|
|
383
|
+
lines.push(` ${JSON.stringify(key)}: true;`);
|
|
384
|
+
}
|
|
385
|
+
lines.push(' }');
|
|
386
|
+
lines.push('}');
|
|
387
|
+
lines.push('');
|
|
388
|
+
}
|
|
389
|
+
// Type-level validation: each schema value must be a Codec or Standard Schema.
|
|
390
|
+
// Running `pnpm run typecheck` will surface errors for invalid values.
|
|
391
|
+
lines.push('type _AssertSchemaValues = {');
|
|
392
|
+
lines.push(
|
|
393
|
+
" [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'];"
|
|
394
|
+
);
|
|
395
|
+
lines.push('};');
|
|
396
|
+
// Generic constraint enforces that all values are `true` — if any value is
|
|
397
|
+
// an error tuple, TS reports a real diagnostic instead of silently computing it.
|
|
398
|
+
lines.push(
|
|
399
|
+
'type _EnforceSchemaValues<_T extends Record<string, true> = _AssertSchemaValues> = true;'
|
|
400
|
+
);
|
|
401
|
+
lines.push('');
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
if (!hasSchema) {
|
|
405
|
+
// TIM-834 P2: emit the shared codec-resolution helper type ONCE so the
|
|
406
|
+
// per-param chain conditionals reference it instead of inlining the
|
|
407
|
+
// fallback in both branches (which grows O(2^N) in chain depth).
|
|
408
|
+
lines.push(emitResolveSegmentFieldHelper());
|
|
409
|
+
lines.push('');
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// urlPath-keyed emissions use the deduped list (slot pages share their
|
|
413
|
+
// parent's urlPath); segmentPath-keyed emissions below keep all entries.
|
|
414
|
+
const uniqueByUrlPath = dedupeRoutesByUrlPath(routes);
|
|
415
|
+
|
|
183
416
|
lines.push("declare module '@timber-js/app' {");
|
|
184
417
|
lines.push(' interface Routes {');
|
|
185
418
|
|
|
186
|
-
for (const route of
|
|
187
|
-
const paramsType = formatParamsType(route.params);
|
|
419
|
+
for (const route of uniqueByUrlPath) {
|
|
420
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
188
421
|
const searchParamsType = formatSearchParamsType(route, importBase);
|
|
189
422
|
|
|
190
423
|
lines.push(` '${route.urlPath}': {`);
|
|
191
|
-
lines.push(`
|
|
424
|
+
lines.push(` segmentParams: ${paramsType}`);
|
|
192
425
|
lines.push(` searchParams: ${searchParamsType}`);
|
|
193
426
|
lines.push(` }`);
|
|
194
427
|
}
|
|
195
428
|
|
|
196
429
|
lines.push(' }');
|
|
430
|
+
|
|
431
|
+
// When a global schema exists, emit segment param types inside the
|
|
432
|
+
// @timber-js/app module augmentation so that declare module blocks
|
|
433
|
+
// for @timber-js/app/server and @timber-js/app/client can reference
|
|
434
|
+
// AllSegmentParams via `import type { AllSegmentParams } from '@timber-js/app'`.
|
|
435
|
+
if (hasSchema) {
|
|
436
|
+
lines.push('');
|
|
437
|
+
lines.push(...formatSchemaTypes(routes).map((l) => ` ${l}`));
|
|
438
|
+
}
|
|
439
|
+
|
|
197
440
|
lines.push('}');
|
|
198
441
|
lines.push('');
|
|
199
442
|
|
|
200
|
-
//
|
|
201
|
-
const pageRoutes =
|
|
443
|
+
// useQueryStates + typed Link are urlPath-keyed → deduped list.
|
|
444
|
+
const pageRoutes = uniqueByUrlPath.filter((r) => !r.isApiRoute);
|
|
445
|
+
// getSegmentParams / useSegmentParams are segmentPath-keyed → full list,
|
|
446
|
+
// so slot segments keep their own typed overloads.
|
|
447
|
+
const dynamicRoutes = routes.filter((r) => r.params.length > 0);
|
|
202
448
|
|
|
203
|
-
|
|
449
|
+
// Generate @timber-js/app/server augmentation — typed getSegmentParams
|
|
450
|
+
if (dynamicRoutes.length > 0) {
|
|
204
451
|
lines.push("declare module '@timber-js/app/server' {");
|
|
205
|
-
|
|
452
|
+
if (hasSchema) {
|
|
453
|
+
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
454
|
+
}
|
|
455
|
+
for (const route of dynamicRoutes) {
|
|
456
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
457
|
+
lines.push(
|
|
458
|
+
` export function getSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
459
|
+
);
|
|
460
|
+
}
|
|
206
461
|
lines.push(
|
|
207
|
-
|
|
462
|
+
hasSchema
|
|
463
|
+
? ' export function getSegmentParams(): Partial<AllSegmentParams>'
|
|
464
|
+
: ' export function getSegmentParams(): Record<string, string | string[]>'
|
|
208
465
|
);
|
|
209
466
|
lines.push('}');
|
|
210
467
|
lines.push('');
|
|
211
468
|
}
|
|
212
469
|
|
|
213
470
|
// Generate overloads for @timber-js/app/client
|
|
214
|
-
const dynamicRoutes = routes.filter((r) => r.params.length > 0);
|
|
215
471
|
|
|
216
472
|
if (dynamicRoutes.length > 0 || pageRoutes.length > 0) {
|
|
217
473
|
lines.push("declare module '@timber-js/app/client' {");
|
|
218
474
|
lines.push(
|
|
219
475
|
" import type { SearchParamsDefinition, SetParams, QueryStatesOptions, SearchParamCodec } from '@timber-js/app/search-params'"
|
|
220
476
|
);
|
|
477
|
+
if (hasSchema) {
|
|
478
|
+
lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
|
|
479
|
+
}
|
|
221
480
|
lines.push('');
|
|
222
481
|
|
|
223
|
-
//
|
|
482
|
+
// useSegmentParams overloads
|
|
224
483
|
if (dynamicRoutes.length > 0) {
|
|
225
484
|
for (const route of dynamicRoutes) {
|
|
226
|
-
const paramsType = formatParamsType(route.params);
|
|
227
|
-
lines.push(
|
|
485
|
+
const paramsType = formatParamsType(route.params, importBase, hasSchema);
|
|
486
|
+
lines.push(
|
|
487
|
+
` export function useSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
|
|
488
|
+
);
|
|
228
489
|
}
|
|
229
|
-
lines.push(
|
|
490
|
+
lines.push(
|
|
491
|
+
hasSchema
|
|
492
|
+
? ' export function useSegmentParams(): Partial<AllSegmentParams>'
|
|
493
|
+
: ' export function useSegmentParams(): Record<string, string | string[]>'
|
|
494
|
+
);
|
|
230
495
|
lines.push('');
|
|
231
496
|
}
|
|
232
497
|
|
|
@@ -236,78 +501,59 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
|
|
|
236
501
|
lines.push('');
|
|
237
502
|
}
|
|
238
503
|
|
|
239
|
-
// Typed Link overloads
|
|
504
|
+
// Typed Link overloads — per-route with DIRECT types (no conditionals).
|
|
505
|
+
// Direct types preserve TypeScript's excess property checking.
|
|
506
|
+
//
|
|
507
|
+
// TIM-832: per-route and catch-all are emitted as TWO separate
|
|
508
|
+
// augmentation blocks. Per TS's merging rule "later overload sets
|
|
509
|
+
// ordered first", the catch-all block (declared SECOND in this file)
|
|
510
|
+
// ends up FIRST in the merged call-signature list at resolution time,
|
|
511
|
+
// which puts the per-route block LAST — so its error message is the
|
|
512
|
+
// one TypeScript reports when no overload matches. This gives users a
|
|
513
|
+
// clear prop-mismatch error (e.g. "'string | undefined' is not
|
|
514
|
+
// assignable to 'string | number' on id") instead of the old
|
|
515
|
+
// confusing "Type 'string' is not assignable to type 'never'" cascade.
|
|
240
516
|
if (pageRoutes.length > 0) {
|
|
241
|
-
lines.push(' // Typed Link
|
|
242
|
-
lines.push(...formatTypedLinkOverloads(pageRoutes, importBase));
|
|
517
|
+
lines.push(' // Typed Link overloads — per-route (block 1 / emitted first)');
|
|
518
|
+
lines.push(...formatTypedLinkOverloads(pageRoutes, importBase, hasSchema));
|
|
519
|
+
lines.push('');
|
|
243
520
|
}
|
|
244
521
|
|
|
245
522
|
lines.push('}');
|
|
246
523
|
lines.push('');
|
|
247
524
|
}
|
|
248
525
|
|
|
526
|
+
// TIM-832: catch-all block — emitted as a SEPARATE `declare module`
|
|
527
|
+
// augmentation so TS's "later overload set first" rule orders it ahead
|
|
528
|
+
// of the per-route block above at resolution time, leaving per-route as
|
|
529
|
+
// the "last overload" whose error TypeScript reports.
|
|
530
|
+
lines.push("declare module '@timber-js/app/client' {");
|
|
531
|
+
lines.push(" import type { SearchParamsDefinition } from '@timber-js/app/search-params'");
|
|
532
|
+
lines.push('');
|
|
533
|
+
lines.push(...formatLinkCatchAllOverloads());
|
|
534
|
+
lines.push('}');
|
|
535
|
+
lines.push('');
|
|
536
|
+
|
|
249
537
|
return lines.join('\n');
|
|
250
538
|
}
|
|
251
539
|
|
|
252
540
|
/**
|
|
253
541
|
* Format the params type for a route entry.
|
|
254
542
|
*/
|
|
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 {
|
|
543
|
+
function formatParamsType(params: ParamEntry[], importBase?: string, hasSchema?: boolean): string {
|
|
274
544
|
if (params.length === 0) {
|
|
275
545
|
return '{}';
|
|
276
546
|
}
|
|
277
547
|
|
|
278
548
|
const fields = params.map((p) => {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
549
|
+
const codecType = hasSchema
|
|
550
|
+
? buildSchemaParamType(p)
|
|
551
|
+
: buildCodecChainType(p, importBase, p.type);
|
|
552
|
+
return `${p.name}: ${codecType}`;
|
|
282
553
|
});
|
|
283
554
|
return `{ ${fields.join('; ')} }`;
|
|
284
555
|
}
|
|
285
556
|
|
|
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
557
|
/**
|
|
312
558
|
* Generate useQueryStates overloads.
|
|
313
559
|
*
|
|
@@ -337,60 +583,8 @@ function formatUseQueryStatesOverloads(routes: RouteEntry[], importBase?: string
|
|
|
337
583
|
return lines;
|
|
338
584
|
}
|
|
339
585
|
|
|
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
|
-
}
|
|
586
|
+
// Link overload formatters and helpers (`formatTypedLinkOverloads`,
|
|
587
|
+
// `formatLinkCatchAllOverloads`, `formatLinkParamsType`,
|
|
588
|
+
// `buildResolvedPattern`, `LINK_BASE_PROPS_TYPE`) were extracted to
|
|
589
|
+
// `./link-codegen.ts` (TIM-835) to keep this file under the 500-line
|
|
590
|
+
// cap. They are imported at the top of this file.
|