@timber-js/app 0.2.0-alpha.19 → 0.2.0-alpha.191
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-BjbbNRFN.js +318 -0
- package/dist/_chunks/actions-BjbbNRFN.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
- package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
- package/dist/_chunks/cache-api-DllJ-Lyw.js +1196 -0
- package/dist/_chunks/cache-api-DllJ-Lyw.js.map +1 -0
- package/dist/_chunks/cli-check-DJZDc22E.js +256 -0
- package/dist/_chunks/cli-check-DJZDc22E.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D4_AZVUb.js +298 -0
- package/dist/_chunks/cli-schema-sync-D4_AZVUb.js.map +1 -0
- package/dist/_chunks/cloudflare-CGP6BZKO.js +1284 -0
- package/dist/_chunks/cloudflare-CGP6BZKO.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/convention-lint-CpteIpTm.js +784 -0
- package/dist/_chunks/convention-lint-CpteIpTm.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/error-boundary-D-ODYX41.js +353 -0
- package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/file-cache-DmX7OqZP.js +454 -0
- package/dist/_chunks/file-cache-DmX7OqZP.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/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-CH7IcMmg.js +1436 -0
- package/dist/_chunks/logger-CH7IcMmg.js.map +1 -0
- package/dist/_chunks/mdx-file-C005ay-P.js +25 -0
- package/dist/_chunks/mdx-file-C005ay-P.js.map +1 -0
- package/dist/_chunks/plugin-context-rCinWLiE.js +321 -0
- package/dist/_chunks/plugin-context-rCinWLiE.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/router-ref-DuYuV_0Q.js +28 -0
- package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
- package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
- package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
- package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
- package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DRqE_lD_.js +46 -0
- package/dist/_chunks/rsc-media-type-DRqE_lD_.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/scanner-CAietmj4.js +1564 -0
- package/dist/_chunks/scanner-CAietmj4.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-CjOlyB8Y.js +97 -0
- package/dist/_chunks/segment-context-CjOlyB8Y.js.map +1 -0
- package/dist/_chunks/segment-keys-BawYuNFO.js +307 -0
- package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
- package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-14MXm7Pj.js} +17 -2
- package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js +226 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -0
- package/dist/_chunks/use-segment-params-C4r4BD9T.js +398 -0
- package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -0
- package/dist/_chunks/walkers-BsVLmD1S.js +141 -0
- package/dist/_chunks/walkers-BsVLmD1S.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -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 +199 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +17 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +55 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +287 -171
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +62 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +28 -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/fast-hash.d.ts +5 -0
- package/dist/cache/fast-hash.d.ts.map +1 -1
- 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/cloudflare-purge.js +30 -0
- package/dist/cdn/cloudflare-purge.js.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/fastly-purge.js +33 -0
- package/dist/cdn/fastly-purge.js.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/index.js +94 -0
- package/dist/cdn/index.js.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/cdn/workers-cache-purge.js +35 -0
- package/dist/cdn/workers-cache-purge.js.map +1 -0
- package/dist/cli-check.d.ts +153 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +66 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +151 -47
- 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 +57 -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 +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +30 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -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 +19 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +1 -125
- 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 +29 -7
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +11 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +186 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +1624 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +63 -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-commit.d.ts +87 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +38 -20
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +159 -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/params-context.d.ts +82 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +129 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +55 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +84 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +207 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +113 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +107 -25
- 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 +21 -5
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +14 -4
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +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 +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +2 -2
- 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} +29 -16
- 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 +50 -181
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9805 -14134
- 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 +276 -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 +47 -10
- 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/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +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 +218 -21
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +26 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +61 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen-write.d.ts +51 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/convention-lint.d.ts +55 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +72 -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 +5 -2
- package/dist/routing/interception.d.ts +234 -10
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +105 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +26 -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 +114 -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/segment-keys.d.ts +118 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/types.d.ts +74 -26
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +57 -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 +145 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +262 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +3 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +179 -360
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +81 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/serialize-equal.d.ts +9 -0
- package/dist/search-params/serialize-equal.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +76 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/server/access-gate.d.ts +26 -10
- 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 +12 -33
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +115 -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 +25 -30
- 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/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/compress.d.ts.map +1 -1
- 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/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +247 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +16 -5
- 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 +86 -10
- 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/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- 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 +183 -2906
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +51 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4154 -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-collector.d.ts +74 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- 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 +71 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +77 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +59 -9
- 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 +152 -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 +63 -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 +79 -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 +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -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 +100 -44
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/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 +110 -106
- 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 +74 -27
- 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 +38 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/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 +38 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +59 -42
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +39 -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 +5 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +40 -3
- 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 +130 -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/skippable-prefix.d.ts +26 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +139 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +140 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +1 -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 +61 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +44 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +112 -0
- package/dist/server/static-generator.d.ts.map +1 -0
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +26 -15
- 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 +66 -42
- 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 +77 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +40 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/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/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/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/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +109 -0
- package/dist/shared/payload-root.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/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +25 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +40 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/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 +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +10 -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 +163 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +176 -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 +170 -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 +132 -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 +173 -0
- package/docs/learn/12-client-navigation.mdx +176 -0
- package/docs/learn/13-configuration.mdx +166 -0
- package/docs/learn/14-deploying.mdx +287 -0
- package/docs/more/01-advanced-routing.mdx +343 -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 +171 -0
- package/llms.txt +55 -0
- package/package.json +108 -26
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +204 -0
- package/src/adapters/cloudflare.ts +740 -129
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro.ts +320 -120
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +274 -0
- package/src/adapters/types.ts +28 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +5 -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-check.ts +458 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +221 -53
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +130 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +198 -0
- package/src/client/browser-entry/index.ts +121 -0
- package/src/client/browser-entry/post-hydration.ts +122 -0
- package/src/client/browser-entry/router-init.ts +342 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +210 -36
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +29 -7
- package/src/client/index.ts +78 -45
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +397 -150
- package/src/client/navigation-api.ts +345 -0
- package/src/client/navigation-commit.ts +197 -0
- package/src/client/navigation-context.ts +43 -62
- package/src/client/navigation-root.tsx +580 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/params-context.ts +192 -0
- package/src/client/router-effects.ts +231 -0
- package/src/client/router-lifecycle.ts +288 -0
- package/src/client/router-pipeline.ts +393 -0
- package/src/client/router-ref.ts +2 -2
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +230 -0
- package/src/client/router.ts +339 -410
- package/src/client/rsc-fetch.ts +530 -73
- package/src/client/segment-cache.ts +224 -38
- 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 +21 -6
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +19 -5
- package/src/client/top-loader.tsx +13 -10
- package/src/client/unload-guard.ts +34 -2
- package/src/client/use-cookie.ts +69 -17
- 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 +206 -36
- package/src/client/use-router.ts +5 -2
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +52 -25
- 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 +222 -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 +468 -353
- 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 +503 -0
- package/src/plugins/adapter-build.ts +229 -7
- package/src/plugins/build-manifest.ts +201 -26
- package/src/plugins/build-report.ts +259 -47
- 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 +138 -16
- package/src/plugins/fonts.ts +228 -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/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +268 -277
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +240 -64
- package/src/plugins/static-build.ts +704 -66
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +139 -0
- package/src/routing/codegen.ts +339 -231
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +493 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +894 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +368 -218
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +75 -26
- package/src/routing/walkers.ts +98 -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 +380 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +121 -51
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +230 -43
- package/src/server/actions.ts +54 -57
- package/src/server/als-registry.ts +159 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +33 -57
- package/src/server/canonicalize.ts +6 -3
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +115 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- 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/default-status-page.ts +127 -0
- package/src/server/deny-boundary.ts +516 -0
- package/src/server/deny-renderer.ts +181 -101
- 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 +170 -44
- 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/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +32 -184
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-collector.ts +189 -0
- 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 +189 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +196 -0
- package/src/server/pipeline-phases.ts +599 -0
- package/src/server/pipeline.ts +322 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +299 -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 +202 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +122 -0
- package/src/server/prebuilt-builder.ts +804 -0
- package/src/server/prebuilt-runtime.ts +817 -0
- package/src/server/primitives.ts +174 -90
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +243 -333
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +666 -308
- package/src/server/route-handler.ts +39 -12
- package/src/server/route-matcher.ts +162 -269
- package/src/server/rsc-cache-key-guard.ts +164 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +67 -32
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +370 -94
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +357 -330
- package/src/server/rsc-entry/render-route.ts +308 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +188 -55
- package/src/server/rsc-entry/rsc-stream.ts +122 -18
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +299 -80
- 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 +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +74 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +678 -294
- package/src/server/ssr-bridge-types.ts +145 -0
- package/src/server/ssr-entry.ts +216 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +142 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +715 -0
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +107 -148
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +99 -168
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +84 -9
- package/src/server/utils/element-type.ts +72 -0
- 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/als-slots.ts +74 -0
- package/src/shared/base-path.ts +80 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/param-value.ts +281 -0
- package/src/shared/payload-root.ts +152 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +31 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +43 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +110 -0
- package/src/shared/static-platform-files.ts +75 -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 +36 -32
- package/src/shims/navigation.ts +10 -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 +0 -109
- 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/error-boundary.js.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/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.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/search-params/registry.ts +0 -31
- 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/scanner.ts
CHANGED
|
@@ -18,42 +18,24 @@ import type {
|
|
|
18
18
|
ScannerConfig,
|
|
19
19
|
InterceptionMarker,
|
|
20
20
|
} from './types.js';
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const ENCODED_SEPARATOR_PATTERN = /%(?:2[fF]|5[cC])/;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Pattern matching encoded null bytes (%00) that must be rejected.
|
|
33
|
-
* See design/13-security.md §"Null bytes rejected".
|
|
34
|
-
*/
|
|
35
|
-
const ENCODED_NULL_PATTERN = /%00/;
|
|
21
|
+
import { classifySegment, effectiveUrlSegment } from './segment-classify.js';
|
|
22
|
+
import { validateInterceptionPlacement, computeInterceptedBase } from './interception.js';
|
|
23
|
+
import { validateRouteGroupCollisions } from './collision-spaces.js';
|
|
24
|
+
import { validateSlotPlacement } from './slot-placement.js';
|
|
25
|
+
import { DEFAULT_PAGE_EXTENSIONS } from './types.js';
|
|
26
|
+
import { classifyMetadataRoute, isDynamicMetadataExtension } from '../server/metadata-routes.js';
|
|
27
|
+
import { swallow } from '../server/logger.js';
|
|
28
|
+
import { ENCODED_SEPARATOR_RE, NULL_BYTE_RE } from '../server/canonicalize.js';
|
|
36
29
|
|
|
37
30
|
/**
|
|
38
31
|
* File convention names that use pageExtensions (can be .tsx, .ts, .jsx, .js, .mdx, etc.)
|
|
39
32
|
*/
|
|
40
33
|
const PAGE_EXT_CONVENTIONS = new Set(['page', 'layout', 'error', 'default', 'denied']);
|
|
41
34
|
|
|
42
|
-
/**
|
|
43
|
-
* Legacy compat status-code files.
|
|
44
|
-
* Maps legacy file name → HTTP status code for the fallback chain.
|
|
45
|
-
* See design/10-error-handling.md §"Fallback Chain".
|
|
46
|
-
*/
|
|
47
|
-
const LEGACY_STATUS_FILES: Record<string, number> = {
|
|
48
|
-
'not-found': 404,
|
|
49
|
-
'forbidden': 403,
|
|
50
|
-
'unauthorized': 401,
|
|
51
|
-
};
|
|
52
|
-
|
|
53
35
|
/**
|
|
54
36
|
* File convention names that are always .ts/.tsx (never .mdx etc.)
|
|
55
37
|
*/
|
|
56
|
-
const FIXED_CONVENTIONS = new Set(['middleware', 'access', 'route'
|
|
38
|
+
const FIXED_CONVENTIONS = new Set(['middleware', 'access', 'route']);
|
|
57
39
|
|
|
58
40
|
/**
|
|
59
41
|
* Status-code file patterns:
|
|
@@ -83,15 +65,45 @@ export function scanRoutes(appDir: string, config: ScannerConfig = {}): RouteTre
|
|
|
83
65
|
tree.proxy = proxyFile;
|
|
84
66
|
}
|
|
85
67
|
|
|
68
|
+
// Check for global-error.{tsx,ts,jsx,js} at app root.
|
|
69
|
+
// Tier 2 error page — renders standalone (no layouts) when no segment-level
|
|
70
|
+
// error file is found. See design/10-error-handling.md §"Tier 2".
|
|
71
|
+
const globalErrorFile = findPageExtFile(appDir, 'global-error', extSet);
|
|
72
|
+
if (globalErrorFile) {
|
|
73
|
+
tree.globalError = globalErrorFile;
|
|
74
|
+
}
|
|
75
|
+
|
|
86
76
|
// Scan the root directory's files
|
|
87
77
|
scanSegmentFiles(appDir, tree.root, extSet);
|
|
88
78
|
|
|
89
79
|
// Scan children recursively
|
|
90
80
|
scanChildren(appDir, tree.root, extSet);
|
|
91
81
|
|
|
82
|
+
// Validate: every parallel slot sits where a renderer reaches it. First,
|
|
83
|
+
// because a slot nested inside another slot never renders, and a collision
|
|
84
|
+
// reported from inside one would send the author to fix an ambiguity between
|
|
85
|
+
// two pages that were both already dead.
|
|
86
|
+
validateSlotPlacement(tree.root);
|
|
87
|
+
|
|
92
88
|
// Validate: detect route group collisions (different groups producing pages at the same URL)
|
|
93
89
|
validateRouteGroupCollisions(tree.root);
|
|
94
90
|
|
|
91
|
+
// Validate: detect duplicate param names in nested dynamic segments
|
|
92
|
+
// e.g., /[id]/items/[id] — same param name in ancestor and descendant
|
|
93
|
+
validateDuplicateParamNames(tree.root);
|
|
94
|
+
|
|
95
|
+
// Validate: detect same param name used with different bracket forms
|
|
96
|
+
// e.g., [id] in one route and [...id] in another
|
|
97
|
+
validateUniqueBracketForms(tree.root);
|
|
98
|
+
|
|
99
|
+
// Validate: detect affixed dynamic siblings with equal specificity
|
|
100
|
+
// e.g., a-[id] and [slug]-b both have prefix+suffix length = 2
|
|
101
|
+
validateAffixedSiblingConflicts(tree.root);
|
|
102
|
+
|
|
103
|
+
// Validate: intercepting routes must be direct children of a parallel slot —
|
|
104
|
+
// the slot resolver is the only thing that can render one.
|
|
105
|
+
validateInterceptionPlacement(tree.root);
|
|
106
|
+
|
|
95
107
|
return tree;
|
|
96
108
|
}
|
|
97
109
|
|
|
@@ -104,106 +116,24 @@ function createSegmentNode(
|
|
|
104
116
|
urlPath: string,
|
|
105
117
|
paramName?: string,
|
|
106
118
|
interceptionMarker?: InterceptionMarker,
|
|
107
|
-
interceptedSegmentName?: string
|
|
119
|
+
interceptedSegmentName?: string,
|
|
120
|
+
paramPrefix?: string,
|
|
121
|
+
paramSuffix?: string
|
|
108
122
|
): SegmentNode {
|
|
109
123
|
return {
|
|
110
124
|
segmentName,
|
|
111
125
|
segmentType,
|
|
112
126
|
urlPath,
|
|
113
127
|
paramName,
|
|
128
|
+
paramPrefix,
|
|
129
|
+
paramSuffix,
|
|
114
130
|
interceptionMarker,
|
|
115
131
|
interceptedSegmentName,
|
|
116
132
|
children: [],
|
|
117
|
-
slots:
|
|
133
|
+
slots: {},
|
|
118
134
|
};
|
|
119
135
|
}
|
|
120
136
|
|
|
121
|
-
/**
|
|
122
|
-
* Classify a directory name into its segment type.
|
|
123
|
-
*/
|
|
124
|
-
export function classifySegment(dirName: string): {
|
|
125
|
-
type: SegmentType;
|
|
126
|
-
paramName?: string;
|
|
127
|
-
interceptionMarker?: InterceptionMarker;
|
|
128
|
-
interceptedSegmentName?: string;
|
|
129
|
-
} {
|
|
130
|
-
// Private folder: _name (excluded from routing)
|
|
131
|
-
if (dirName.startsWith('_')) {
|
|
132
|
-
return { type: 'private' };
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Parallel route slot: @name
|
|
136
|
-
if (dirName.startsWith('@')) {
|
|
137
|
-
return { type: 'slot' };
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Intercepting routes: (.)name, (..)name, (...)name, (..)(..)name
|
|
141
|
-
// Check before route groups since intercepting markers also start with (
|
|
142
|
-
const interception = parseInterceptionMarker(dirName);
|
|
143
|
-
if (interception) {
|
|
144
|
-
return {
|
|
145
|
-
type: 'intercepting',
|
|
146
|
-
interceptionMarker: interception.marker,
|
|
147
|
-
interceptedSegmentName: interception.segmentName,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Route group: (name)
|
|
152
|
-
if (dirName.startsWith('(') && dirName.endsWith(')')) {
|
|
153
|
-
return { type: 'group' };
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Optional catch-all: [[...name]]
|
|
157
|
-
if (dirName.startsWith('[[...') && dirName.endsWith(']]')) {
|
|
158
|
-
const paramName = dirName.slice(5, -2);
|
|
159
|
-
return { type: 'optional-catch-all', paramName };
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Catch-all: [...name]
|
|
163
|
-
if (dirName.startsWith('[...') && dirName.endsWith(']')) {
|
|
164
|
-
const paramName = dirName.slice(4, -1);
|
|
165
|
-
return { type: 'catch-all', paramName };
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Dynamic: [name]
|
|
169
|
-
if (dirName.startsWith('[') && dirName.endsWith(']')) {
|
|
170
|
-
const paramName = dirName.slice(1, -1);
|
|
171
|
-
return { type: 'dynamic', paramName };
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return { type: 'static' };
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Parse an interception marker from a directory name.
|
|
179
|
-
*
|
|
180
|
-
* Returns the marker and the remaining segment name, or null if not an
|
|
181
|
-
* intercepting route. Markers are checked longest-first to avoid (..)
|
|
182
|
-
* matching before (..)(..).
|
|
183
|
-
*
|
|
184
|
-
* Examples:
|
|
185
|
-
* "(.)photo" → { marker: "(.)", segmentName: "photo" }
|
|
186
|
-
* "(..)feed" → { marker: "(..)", segmentName: "feed" }
|
|
187
|
-
* "(...)photos" → { marker: "(...)", segmentName: "photos" }
|
|
188
|
-
* "(..)(..)admin" → { marker: "(..)(..)", segmentName: "admin" }
|
|
189
|
-
* "(marketing)" → null (route group, not interception)
|
|
190
|
-
*/
|
|
191
|
-
function parseInterceptionMarker(
|
|
192
|
-
dirName: string
|
|
193
|
-
): { marker: InterceptionMarker; segmentName: string } | null {
|
|
194
|
-
for (const marker of INTERCEPTION_MARKERS) {
|
|
195
|
-
if (dirName.startsWith(marker)) {
|
|
196
|
-
const rest = dirName.slice(marker.length);
|
|
197
|
-
// Must have a segment name after the marker, and the rest must not
|
|
198
|
-
// be empty or end with ) (which would be a route group like "(auth)")
|
|
199
|
-
if (rest.length > 0 && !rest.endsWith(')')) {
|
|
200
|
-
return { marker, segmentName: rest };
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
137
|
/**
|
|
208
138
|
* Compute the URL path for a child segment given its parent's URL path.
|
|
209
139
|
* Route groups, slots, and intercepting routes do NOT add URL depth.
|
|
@@ -225,7 +155,8 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
225
155
|
let entries: string[];
|
|
226
156
|
try {
|
|
227
157
|
entries = readdirSync(dirPath);
|
|
228
|
-
} catch {
|
|
158
|
+
} catch (err) {
|
|
159
|
+
swallow(err, `scanSegmentFiles: unreadable directory ${dirPath}`, { level: 'warn' });
|
|
229
160
|
return;
|
|
230
161
|
}
|
|
231
162
|
|
|
@@ -244,47 +175,26 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
244
175
|
|
|
245
176
|
// Page-extension conventions (page, layout, error, default, denied)
|
|
246
177
|
if (PAGE_EXT_CONVENTIONS.has(name) && extSet.has(ext)) {
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
break;
|
|
252
|
-
case 'layout':
|
|
253
|
-
node.layout = file;
|
|
254
|
-
break;
|
|
255
|
-
case 'error':
|
|
256
|
-
node.error = file;
|
|
257
|
-
break;
|
|
258
|
-
case 'default':
|
|
259
|
-
node.default = file;
|
|
260
|
-
break;
|
|
261
|
-
case 'denied':
|
|
262
|
-
node.denied = file;
|
|
263
|
-
break;
|
|
178
|
+
const key = name as 'page' | 'layout' | 'error' | 'default' | 'denied';
|
|
179
|
+
const existing = node[key];
|
|
180
|
+
if (existing) {
|
|
181
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
264
182
|
}
|
|
183
|
+
node[key] = { filePath: fullPath, extension: ext };
|
|
265
184
|
continue;
|
|
266
185
|
}
|
|
267
186
|
|
|
268
|
-
// Fixed conventions (middleware, access, route) —
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
break;
|
|
278
|
-
case 'route':
|
|
279
|
-
node.route = file;
|
|
280
|
-
break;
|
|
281
|
-
case 'prerender':
|
|
282
|
-
node.prerender = file;
|
|
283
|
-
break;
|
|
284
|
-
case 'search-params':
|
|
285
|
-
node.searchParams = file;
|
|
286
|
-
break;
|
|
187
|
+
// Fixed conventions (middleware, access, route) — only
|
|
188
|
+
// .ts/.tsx/.js/.jsx, never pageExtensions like .mdx. The regex is
|
|
189
|
+
// anchored: mts/cts/mjs/cjs (and stray tail matches like `.foots`)
|
|
190
|
+
// are NOT recognized. See design/07-routing.md §"Page Extensions".
|
|
191
|
+
if (FIXED_CONVENTIONS.has(name) && /^[jt]sx?$/.test(ext)) {
|
|
192
|
+
const key = name as 'middleware' | 'access' | 'route';
|
|
193
|
+
const existing = node[key];
|
|
194
|
+
if (existing) {
|
|
195
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
287
196
|
}
|
|
197
|
+
node[key] = { filePath: fullPath, extension: ext };
|
|
288
198
|
continue;
|
|
289
199
|
}
|
|
290
200
|
|
|
@@ -292,50 +202,56 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
292
202
|
// Recognized regardless of pageExtensions — .json is a data format, not a page extension.
|
|
293
203
|
if (STATUS_CODE_PATTERN.test(name) && ext === 'json') {
|
|
294
204
|
if (!node.jsonStatusFiles) {
|
|
295
|
-
node.jsonStatusFiles =
|
|
205
|
+
node.jsonStatusFiles = {};
|
|
296
206
|
}
|
|
297
|
-
node.jsonStatusFiles
|
|
207
|
+
node.jsonStatusFiles[name] = { filePath: fullPath, extension: ext };
|
|
298
208
|
continue;
|
|
299
209
|
}
|
|
300
210
|
|
|
301
211
|
// Status-code files (401.tsx, 4xx.tsx, 503.tsx, 5xx.tsx)
|
|
302
212
|
if (STATUS_CODE_PATTERN.test(name) && extSet.has(ext)) {
|
|
303
213
|
if (!node.statusFiles) {
|
|
304
|
-
node.statusFiles =
|
|
214
|
+
node.statusFiles = {};
|
|
305
215
|
}
|
|
306
|
-
node.statusFiles
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
// Legacy compat files (not-found.tsx, forbidden.tsx, unauthorized.tsx)
|
|
311
|
-
if (name in LEGACY_STATUS_FILES && extSet.has(ext)) {
|
|
312
|
-
if (!node.legacyStatusFiles) {
|
|
313
|
-
node.legacyStatusFiles = new Map();
|
|
216
|
+
const existing = node.statusFiles[name];
|
|
217
|
+
if (existing) {
|
|
218
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
314
219
|
}
|
|
315
|
-
node.
|
|
220
|
+
node.statusFiles[name] = { filePath: fullPath, extension: ext };
|
|
316
221
|
continue;
|
|
317
222
|
}
|
|
318
223
|
|
|
319
224
|
// Metadata route files (sitemap.ts, robots.ts, icon.tsx, opengraph-image.tsx, etc.)
|
|
320
225
|
// Both static (.xml, .txt, .png, .ico, etc.) and dynamic (.ts, .tsx) files are recognized.
|
|
321
226
|
// When both exist for the same base name, dynamic takes precedence.
|
|
227
|
+
// Two files of the SAME kind (static+static or dynamic+dynamic) are a
|
|
228
|
+
// build error — picking one by readdir order is platform-dependent.
|
|
322
229
|
// See design/16-metadata.md §"Metadata Routes"
|
|
323
230
|
const metaInfo = classifyMetadataRoute(entry);
|
|
324
231
|
if (metaInfo) {
|
|
232
|
+
if (!metaInfo.nestable && node.segmentName !== '') {
|
|
233
|
+
throw new Error(
|
|
234
|
+
`Build error: '${name}' is a root-only metadata convention and must be in the app root directory.\n` +
|
|
235
|
+
` File: ${fullPath}\n` +
|
|
236
|
+
` Move this file to the app root (not a route group or nested segment).`
|
|
237
|
+
);
|
|
238
|
+
}
|
|
325
239
|
if (!node.metadataRoutes) {
|
|
326
|
-
node.metadataRoutes =
|
|
240
|
+
node.metadataRoutes = {};
|
|
327
241
|
}
|
|
328
|
-
const existing = node.metadataRoutes
|
|
242
|
+
const existing = node.metadataRoutes[name];
|
|
329
243
|
if (existing) {
|
|
330
|
-
// Dynamic > static precedence: only overwrite if the new file is dynamic
|
|
331
|
-
// or the existing file is static (dynamic always wins).
|
|
332
244
|
const existingIsDynamic = isDynamicMetadataExtension(name, existing.extension);
|
|
333
245
|
const newIsDynamic = isDynamicMetadataExtension(name, ext);
|
|
334
|
-
if (
|
|
335
|
-
|
|
246
|
+
if (existingIsDynamic === newIsDynamic) {
|
|
247
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
248
|
+
}
|
|
249
|
+
// Dynamic > static precedence: overwrite only when the new file is dynamic.
|
|
250
|
+
if (newIsDynamic) {
|
|
251
|
+
node.metadataRoutes[name] = { filePath: fullPath, extension: ext };
|
|
336
252
|
}
|
|
337
253
|
} else {
|
|
338
|
-
node.metadataRoutes
|
|
254
|
+
node.metadataRoutes[name] = { filePath: fullPath, extension: ext };
|
|
339
255
|
}
|
|
340
256
|
}
|
|
341
257
|
}
|
|
@@ -351,6 +267,26 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
351
267
|
}
|
|
352
268
|
}
|
|
353
269
|
|
|
270
|
+
/**
|
|
271
|
+
* Throw a build error for two files claiming the same convention slot in
|
|
272
|
+
* one segment (e.g. page.tsx + page.jsx). Which file readdir returns first
|
|
273
|
+
* is platform-dependent (APFS sorts entries, ext4 does not) — silently
|
|
274
|
+
* picking one would let macOS dev and Linux CI serve different
|
|
275
|
+
* implementations of the same route.
|
|
276
|
+
*/
|
|
277
|
+
function throwDuplicateConvention(
|
|
278
|
+
convention: string,
|
|
279
|
+
firstPath: string,
|
|
280
|
+
secondPath: string
|
|
281
|
+
): never {
|
|
282
|
+
throw new Error(
|
|
283
|
+
`Build error: duplicate '${convention}' files in the same route segment.\n` +
|
|
284
|
+
` File 1: ${firstPath}\n` +
|
|
285
|
+
` File 2: ${secondPath}\n` +
|
|
286
|
+
`Each segment may define '${convention}' at most once. Remove one of the files.`
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
|
|
354
290
|
/**
|
|
355
291
|
* Recursively scan child directories and build the segment tree.
|
|
356
292
|
*/
|
|
@@ -358,7 +294,8 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
358
294
|
let entries: string[];
|
|
359
295
|
try {
|
|
360
296
|
entries = readdirSync(dirPath);
|
|
361
|
-
} catch {
|
|
297
|
+
} catch (err) {
|
|
298
|
+
swallow(err, `scanChildren: unreadable directory ${dirPath}`, { level: 'warn' });
|
|
362
299
|
return;
|
|
363
300
|
}
|
|
364
301
|
|
|
@@ -374,24 +311,31 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
374
311
|
// Reject directories with encoded path delimiters or null bytes.
|
|
375
312
|
// These can cause route collisions when decoded at the URL boundary.
|
|
376
313
|
// See design/13-security.md §"Encoded separators rejected" and §"Null bytes rejected".
|
|
377
|
-
if (
|
|
314
|
+
if (ENCODED_SEPARATOR_RE.test(entry)) {
|
|
378
315
|
throw new Error(
|
|
379
|
-
`Build error: directory name contains an encoded path delimiter (
|
|
316
|
+
`Build error: directory name contains an encoded path delimiter (%2F or %5C).\n` +
|
|
380
317
|
` Directory: ${fullPath}\n` +
|
|
381
318
|
`Encoded separators in directory names cause route collisions when decoded. ` +
|
|
382
319
|
`Rename the directory to remove the encoded delimiter.`
|
|
383
320
|
);
|
|
384
321
|
}
|
|
385
|
-
if (
|
|
322
|
+
if (NULL_BYTE_RE.test(entry)) {
|
|
386
323
|
throw new Error(
|
|
387
|
-
`Build error: directory name contains an encoded null byte (
|
|
324
|
+
`Build error: directory name contains an encoded null byte (%00).\n` +
|
|
388
325
|
` Directory: ${fullPath}\n` +
|
|
389
326
|
`Encoded null bytes in directory names are not allowed. ` +
|
|
390
327
|
`Rename the directory to remove the null byte encoding.`
|
|
391
328
|
);
|
|
392
329
|
}
|
|
393
330
|
|
|
394
|
-
const {
|
|
331
|
+
const {
|
|
332
|
+
type,
|
|
333
|
+
paramName,
|
|
334
|
+
paramPrefix,
|
|
335
|
+
paramSuffix,
|
|
336
|
+
interceptionMarker,
|
|
337
|
+
interceptedSegmentName,
|
|
338
|
+
} = classifySegment(entry);
|
|
395
339
|
|
|
396
340
|
// Skip private folders — underscore-prefixed dirs are excluded from routing
|
|
397
341
|
if (type === 'private') continue;
|
|
@@ -403,7 +347,9 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
403
347
|
urlPath,
|
|
404
348
|
paramName,
|
|
405
349
|
interceptionMarker,
|
|
406
|
-
interceptedSegmentName
|
|
350
|
+
interceptedSegmentName,
|
|
351
|
+
paramPrefix,
|
|
352
|
+
paramSuffix
|
|
407
353
|
);
|
|
408
354
|
|
|
409
355
|
// Scan this segment's files
|
|
@@ -412,10 +358,10 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
412
358
|
// Recurse into subdirectories
|
|
413
359
|
scanChildren(fullPath, childNode, extSet);
|
|
414
360
|
|
|
415
|
-
// Attach to parent: slots go into slots
|
|
361
|
+
// Attach to parent: slots go into slots record, everything else is a child
|
|
416
362
|
if (type === 'slot') {
|
|
417
363
|
const slotName = entry.slice(1); // remove @
|
|
418
|
-
parentNode.slots
|
|
364
|
+
parentNode.slots[slotName] = childNode;
|
|
419
365
|
} else {
|
|
420
366
|
parentNode.children.push(childNode);
|
|
421
367
|
}
|
|
@@ -423,63 +369,245 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
423
369
|
}
|
|
424
370
|
|
|
425
371
|
/**
|
|
426
|
-
* Validate that route
|
|
372
|
+
* Validate that no route chain contains duplicate dynamic param names.
|
|
427
373
|
*
|
|
428
|
-
*
|
|
429
|
-
*
|
|
374
|
+
* Example violation:
|
|
375
|
+
* app/[id]/items/[id]/page.tsx — 'id' appears twice in the ancestor chain.
|
|
430
376
|
*
|
|
431
|
-
*
|
|
432
|
-
*
|
|
377
|
+
* Route groups are transparent — params accumulate through them.
|
|
378
|
+
* Slots are independent — duplicate detection does NOT cross slot boundaries.
|
|
379
|
+
*
|
|
380
|
+
* See design/07-routing.md §"Duplicate Param Name Detection"
|
|
433
381
|
*/
|
|
434
|
-
function
|
|
435
|
-
|
|
436
|
-
const seen = new Map<string, { filePath: string; segmentPath: string }>();
|
|
437
|
-
collectRoutableLeaves(root, seen, '', false);
|
|
382
|
+
function validateDuplicateParamNames(root: SegmentNode): void {
|
|
383
|
+
walkForDuplicateParams(root, new Map());
|
|
438
384
|
}
|
|
439
385
|
|
|
440
386
|
/**
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
* they are parallel routes that intentionally share URL paths with their parent.
|
|
387
|
+
* Recursively walk the segment tree, tracking seen param names → segment paths.
|
|
388
|
+
* Throws on the first duplicate found.
|
|
444
389
|
*/
|
|
445
|
-
function
|
|
390
|
+
function walkForDuplicateParams(node: SegmentNode, seen: Map<string, string>): void {
|
|
391
|
+
// Read through the effective identity so an intercepting directory is seen
|
|
392
|
+
// as the segment it intercepts: the scanner leaves `paramName` unset on
|
|
393
|
+
// `(.)[id]`, so a validator reading the node directly is blind to a param
|
|
394
|
+
// the resolver goes on to bind — `@modal/(.)[id]/[id]` would pass here and
|
|
395
|
+
// then silently overwrite the outer `id` at match time, where the ordinary
|
|
396
|
+
// `/[id]/[id]` is rejected. See TIM-1288.
|
|
397
|
+
const { paramName } = effectiveUrlSegment(node);
|
|
398
|
+
|
|
399
|
+
// If this node introduces a param name, check for duplicates
|
|
400
|
+
if (paramName) {
|
|
401
|
+
const existing = seen.get(paramName);
|
|
402
|
+
if (existing) {
|
|
403
|
+
throw new Error(
|
|
404
|
+
`[timber] Duplicate param name '${paramName}' in route chain.\n` +
|
|
405
|
+
` First defined at: ${existing}\n` +
|
|
406
|
+
` Duplicate at: ${node.urlPath || '/'}\n` +
|
|
407
|
+
` Rename one of the segments to avoid ambiguity.`
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
// Add to seen for descendants (use a new Map to avoid polluting siblings)
|
|
411
|
+
seen = new Map(seen);
|
|
412
|
+
seen.set(paramName, node.urlPath || '/');
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Recurse into children (they inherit the accumulated params)
|
|
416
|
+
for (const child of node.children) {
|
|
417
|
+
walkForDuplicateParams(child, seen);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// A slot INHERITS the ancestor params rather than starting fresh: a slot
|
|
421
|
+
// child may not reuse a name its owner already bound
|
|
422
|
+
// (`app/gallery/[id]/@modal/[id]` is rejected). The copy is so sibling
|
|
423
|
+
// slots don't see each other's names, not so the chain is reset.
|
|
424
|
+
//
|
|
425
|
+
// Whether that rule is right is a separate question — slot params are
|
|
426
|
+
// merged over the main route's at read time, so a collision is defined
|
|
427
|
+
// rather than ambiguous — but changing it would change every slot.
|
|
428
|
+
// Tracked as TIM-1287; do not "fix" this by making the map fresh without
|
|
429
|
+
// deciding that.
|
|
430
|
+
for (const slotNode of Object.values(node.slots)) {
|
|
431
|
+
walkForDuplicateParams(slotNode, new Map(seen));
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Validate that each param name uses a single bracket form across the entire route tree.
|
|
437
|
+
*
|
|
438
|
+
* Different bracket forms produce different types:
|
|
439
|
+
* [id] → string
|
|
440
|
+
* [...id] → string[]
|
|
441
|
+
* [[...id]] → string[] | undefined
|
|
442
|
+
*
|
|
443
|
+
* If the same param name appears with multiple forms, the no-argument
|
|
444
|
+
* getSegmentParams() / useSegmentParams() return type becomes ambiguous.
|
|
445
|
+
*
|
|
446
|
+
* Same name + same form across different routes is fine and expected.
|
|
447
|
+
*/
|
|
448
|
+
function validateUniqueBracketForms(root: SegmentNode): void {
|
|
449
|
+
const forms = new Map<string, { segmentType: SegmentType; urlPath: string }>();
|
|
450
|
+
collectBracketForms(root, forms);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function collectBracketForms(
|
|
446
454
|
node: SegmentNode,
|
|
447
|
-
|
|
448
|
-
segmentPath: string,
|
|
449
|
-
insideSlot: boolean
|
|
455
|
+
forms: Map<string, { segmentType: SegmentType; urlPath: string }>
|
|
450
456
|
): void {
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
457
|
+
// Effective identity, so `(.)[...rest]` is compared as the catch-all it
|
|
458
|
+
// intercepts rather than skipped as an 'intercepting' node (TIM-1288).
|
|
459
|
+
const { paramName, segmentType } = effectiveUrlSegment(node);
|
|
460
|
+
|
|
461
|
+
if (paramName && segmentType !== 'static' && segmentType !== 'group') {
|
|
462
|
+
const existing = forms.get(paramName);
|
|
463
|
+
if (existing && existing.segmentType !== segmentType) {
|
|
464
|
+
const bracketExamples: Record<string, string> = {
|
|
465
|
+
'dynamic': `[${paramName}]`,
|
|
466
|
+
'catch-all': `[...${paramName}]`,
|
|
467
|
+
'optional-catch-all': `[[...${paramName}]]`,
|
|
468
|
+
};
|
|
469
|
+
throw new Error(
|
|
470
|
+
`[timber] Param name '${paramName}' uses multiple bracket forms.\n` +
|
|
471
|
+
` ${bracketExamples[existing.segmentType] ?? existing.segmentType} at: ${existing.urlPath}\n` +
|
|
472
|
+
` ${bracketExamples[segmentType] ?? segmentType} at: ${node.urlPath || '/'}\n` +
|
|
473
|
+
` Each param name must use a single bracket form across all routes.\n` +
|
|
474
|
+
` Rename one of the segments to fix this (e.g., [${paramName}] → [${paramName}Id]).`
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
if (!existing) {
|
|
478
|
+
forms.set(paramName, {
|
|
479
|
+
segmentType,
|
|
480
|
+
urlPath: node.urlPath || '/',
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
for (const child of node.children) {
|
|
486
|
+
collectBracketForms(child, forms);
|
|
487
|
+
}
|
|
488
|
+
for (const slotNode of Object.values(node.slots)) {
|
|
489
|
+
collectBracketForms(slotNode, forms);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Validate that no sibling affixed dynamic segments have equal specificity.
|
|
495
|
+
*
|
|
496
|
+
* Among affixed siblings, longer combined prefix+suffix length wins. When two
|
|
497
|
+
* siblings tie (same total affix length), the router would fall back to
|
|
498
|
+
* filesystem scan order — which is platform-dependent. This is a build error.
|
|
499
|
+
*
|
|
500
|
+
* Route groups are URL-transparent, so affixed segments inside different groups
|
|
501
|
+
* at the same level still conflict with each other.
|
|
502
|
+
*
|
|
503
|
+
* Ambiguity requires the two segments to be candidates for the *same* URL
|
|
504
|
+
* part, which is narrower than "same parent" once interception is involved:
|
|
505
|
+
*
|
|
506
|
+
* - Plain children and intercepting children never compete. They are resolved
|
|
507
|
+
* by different walks — `findSlotMatch` matches the slot subtree (where
|
|
508
|
+
* `tree-match.ts` ignores intercepting nodes outright) and
|
|
509
|
+
* `findInterceptingMatch` builds a synthetic parent holding only
|
|
510
|
+
* interceptors.
|
|
511
|
+
* - Two interceptors compete only at the same anchor. `(.)a-[id]` and
|
|
512
|
+
* `(..)[slug]-b` in one slot are based at different URL depths, so no
|
|
513
|
+
* pathname reaches both, and `anchorIndex` rejects the one whose base does
|
|
514
|
+
* not match the target. Grouping them together would fail the build for a
|
|
515
|
+
* pair that can never be ambiguous.
|
|
516
|
+
*
|
|
517
|
+
* So candidates are keyed by the position they contend for, then by affix
|
|
518
|
+
* length. See design/07-routing.md §"Priority" and §"Intercepting Routes".
|
|
519
|
+
*/
|
|
520
|
+
function validateAffixedSiblingConflicts(node: SegmentNode): void {
|
|
521
|
+
const affixed = collectEffectiveAffixed(node);
|
|
522
|
+
|
|
523
|
+
if (affixed.length >= 2) {
|
|
524
|
+
const byLength = new Map<string, SegmentNode[]>();
|
|
525
|
+
for (const child of affixed) {
|
|
526
|
+
// `\0` as the separator, written as the escape rather than a literal
|
|
527
|
+
// byte: a raw NUL in the source makes git and grep treat this file as
|
|
528
|
+
// binary. A contention key is a URL path, which cannot contain one, so
|
|
529
|
+
// the two halves of the key can never run together.
|
|
530
|
+
const key = `${contentionKey(node, child)}\0${affixLengthOf(child)}`;
|
|
531
|
+
const group = byLength.get(key);
|
|
532
|
+
if (group) {
|
|
533
|
+
group.push(child);
|
|
534
|
+
} else {
|
|
535
|
+
byLength.set(key, [child]);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
for (const [, group] of byLength) {
|
|
540
|
+
if (group.length >= 2) {
|
|
461
541
|
throw new Error(
|
|
462
|
-
`Build error:
|
|
463
|
-
`
|
|
464
|
-
`
|
|
465
|
-
`
|
|
466
|
-
`
|
|
467
|
-
`Rename
|
|
542
|
+
`Build error: ambiguous affixed dynamic siblings with equal specificity.\n` +
|
|
543
|
+
` Parent: ${node.urlPath || '/'}\n` +
|
|
544
|
+
` Segments: ${group.map((s) => s.segmentName).join(', ')}\n` +
|
|
545
|
+
` Combined prefix+suffix length: ${affixLengthOf(group[0]!)}\n` +
|
|
546
|
+
`The router cannot deterministically choose between these — filesystem scan order is platform-dependent.\n` +
|
|
547
|
+
`Rename one segment to give it a longer or shorter combined affix.`
|
|
468
548
|
);
|
|
469
549
|
}
|
|
470
|
-
seen.set(node.urlPath, { filePath: routableFile.filePath, segmentPath: currentPath });
|
|
471
550
|
}
|
|
472
551
|
}
|
|
473
552
|
|
|
474
|
-
// Recurse into children
|
|
475
553
|
for (const child of node.children) {
|
|
476
|
-
|
|
554
|
+
validateAffixedSiblingConflicts(child);
|
|
555
|
+
}
|
|
556
|
+
for (const slotNode of Object.values(node.slots)) {
|
|
557
|
+
validateAffixedSiblingConflicts(slotNode);
|
|
477
558
|
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* The URL position a child contends for, as a comparable key.
|
|
563
|
+
*
|
|
564
|
+
* Plain children contend for the parent's next part. An intercepting child
|
|
565
|
+
* contends for a part determined by its marker's intercepted base, so two
|
|
566
|
+
* markers of different depth are simply different positions — and two markers
|
|
567
|
+
* that compute the *same* base do contend, which is why the key is the base
|
|
568
|
+
* rather than the marker (`(..)` and `(...)` under `/feed` both base at `/`).
|
|
569
|
+
*
|
|
570
|
+
* `groupByInterceptedAnchor` (`routing/interception.ts`) is the canonical
|
|
571
|
+
* statement of that grouping — it is what the resolver walks and what the
|
|
572
|
+
* collision validator checks. This computes the same key from the same
|
|
573
|
+
* `computeInterceptedBase` rather than calling it, because affix ambiguity is
|
|
574
|
+
* decided per *child* and `collectEffectiveAffixed` looks through route groups,
|
|
575
|
+
* so the two do not partition the same set of nodes.
|
|
576
|
+
*/
|
|
577
|
+
function contentionKey(parent: SegmentNode, child: SegmentNode): string {
|
|
578
|
+
if (child.segmentType !== 'intercepting') return 'child';
|
|
579
|
+
return `intercept:${computeInterceptedBase(parent.urlPath, child.interceptionMarker ?? '(.)')}`;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/** Combined affix length of a node, read through its effective identity. */
|
|
583
|
+
function affixLengthOf(node: SegmentNode): number {
|
|
584
|
+
const { paramPrefix, paramSuffix } = effectiveUrlSegment(node);
|
|
585
|
+
return (paramPrefix?.length ?? 0) + (paramSuffix?.length ?? 0);
|
|
586
|
+
}
|
|
478
587
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
588
|
+
/**
|
|
589
|
+
* Collect affixed dynamic segments that are effective children of a node.
|
|
590
|
+
* Route groups are URL-transparent, so we look through them recursively.
|
|
591
|
+
*
|
|
592
|
+
* Segments are read through `effectiveUrlSegment`, so an intercepting
|
|
593
|
+
* directory counts as the affixed segment it intercepts: `(.)a-[id]` is
|
|
594
|
+
* `a-[id]`. The proxy the slot resolver builds hands those affixes to
|
|
595
|
+
* `matchUrlParts`, whose equal-length sort is not stable across equal
|
|
596
|
+
* specificity — so two intercepting siblings with the same combined affix
|
|
597
|
+
* length would resolve by filesystem enumeration order, which is precisely
|
|
598
|
+
* what this validator exists to prevent for ordinary siblings (TIM-1288).
|
|
599
|
+
*/
|
|
600
|
+
function collectEffectiveAffixed(node: SegmentNode): SegmentNode[] {
|
|
601
|
+
const result: SegmentNode[] = [];
|
|
602
|
+
for (const child of node.children) {
|
|
603
|
+
const { segmentType, paramPrefix, paramSuffix } = effectiveUrlSegment(child);
|
|
604
|
+
if (segmentType === 'dynamic' && (paramPrefix || paramSuffix)) {
|
|
605
|
+
result.push(child);
|
|
606
|
+
} else if (segmentType === 'group') {
|
|
607
|
+
result.push(...collectEffectiveAffixed(child));
|
|
608
|
+
}
|
|
482
609
|
}
|
|
610
|
+
return result;
|
|
483
611
|
}
|
|
484
612
|
|
|
485
613
|
/**
|
|
@@ -498,3 +626,25 @@ function findFixedFile(dirPath: string, name: string): RouteFile | undefined {
|
|
|
498
626
|
}
|
|
499
627
|
return undefined;
|
|
500
628
|
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* Find a file using the configured page extensions (tsx, ts, jsx, js, mdx, etc.).
|
|
632
|
+
* Used for app-root conventions like global-error that aren't per-segment.
|
|
633
|
+
*/
|
|
634
|
+
function findPageExtFile(
|
|
635
|
+
dirPath: string,
|
|
636
|
+
name: string,
|
|
637
|
+
extSet: Set<string>
|
|
638
|
+
): RouteFile | undefined {
|
|
639
|
+
for (const ext of extSet) {
|
|
640
|
+
const fullPath = join(dirPath, `${name}.${ext}`);
|
|
641
|
+
try {
|
|
642
|
+
if (statSync(fullPath).isFile()) {
|
|
643
|
+
return { filePath: fullPath, extension: ext };
|
|
644
|
+
}
|
|
645
|
+
} catch {
|
|
646
|
+
// File doesn't exist
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
return undefined;
|
|
650
|
+
}
|