@timber-js/app 0.2.0-alpha.2 → 0.2.0-alpha.200
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 +346 -0
- package/dist/_chunks/actions-d1hCqnU3.js +345 -0
- package/dist/_chunks/actions-d1hCqnU3.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-DTmSGLRz.js +135 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +1 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js +370 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/cache-api-ByagcC-J.js +1149 -0
- package/dist/_chunks/cache-api-ByagcC-J.js.map +1 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
- package/dist/_chunks/chains-Bpb0W4ax.js +412 -0
- package/dist/_chunks/chains-Bpb0W4ax.js.map +1 -0
- package/dist/_chunks/cli-check-D6VolrDV.js +293 -0
- package/dist/_chunks/cli-check-D6VolrDV.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js +299 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js.map +1 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js +1290 -0
- package/dist/_chunks/cloudflare-BFb__LYG.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-fRkwVwEH.js +893 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js +1050 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.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-Dw6BJPG7.js +458 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.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/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.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/live-graph-D_2D32Ad.js +150 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js.map +1 -0
- package/dist/_chunks/logger-uLBuGKDI.js +1484 -0
- package/dist/_chunks/logger-uLBuGKDI.js.map +1 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js +135 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js +321 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js +101 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.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/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.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/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-AiazgH_f.js +1771 -0
- package/dist/_chunks/scanner-AiazgH_f.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-D9_89u34.js +34 -0
- package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
- package/dist/_chunks/segment-keys-lqtdookO.js +256 -0
- package/dist/_chunks/segment-keys-lqtdookO.js.map +1 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-D6T6Y3ef.js} +3 -31
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
- package/dist/_chunks/state-FippDgxN.js +52 -0
- package/dist/_chunks/state-FippDgxN.js.map +1 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.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/walkers-B6XUtmqK.js +144 -0
- package/dist/_chunks/walkers-B6XUtmqK.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 +74 -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 +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +200 -22
- 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-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +82 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +457 -288
- 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/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +150 -0
- package/dist/analyze/classify.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.d.ts +17 -0
- package/dist/analyze/crawl-entry.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.js +313 -0
- package/dist/analyze/crawl-entry.js.map +1 -0
- package/dist/analyze/crawl.d.ts +134 -0
- package/dist/analyze/crawl.d.ts.map +1 -0
- package/dist/analyze/graph-cache.d.ts +104 -0
- package/dist/analyze/graph-cache.d.ts.map +1 -0
- package/dist/analyze/graph-command.d.ts +43 -0
- package/dist/analyze/graph-command.d.ts.map +1 -0
- package/dist/analyze/graph-command.js +472 -0
- package/dist/analyze/graph-command.js.map +1 -0
- package/dist/analyze/live-graph.d.ts +81 -0
- package/dist/analyze/live-graph.d.ts.map +1 -0
- package/dist/analyze/poison-rules.d.ts +72 -0
- package/dist/analyze/poison-rules.d.ts.map +1 -0
- package/dist/analyze/poison-scan.d.ts +48 -0
- package/dist/analyze/poison-scan.d.ts.map +1 -0
- package/dist/analyze/scan.d.ts +73 -0
- package/dist/analyze/scan.d.ts.map +1 -0
- 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 +27 -0
- package/dist/cache/fast-hash.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +32 -9
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -284
- 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 +141 -9
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +21 -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 +21 -11
- 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 +20 -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 +163 -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 +75 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +175 -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 +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +44 -0
- package/dist/client/browser-entry/action-queue.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 +63 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +46 -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/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +66 -6
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- 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/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +323 -1148
- 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 +818 -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/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- 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 +98 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +51 -31
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +98 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +187 -0
- package/dist/client/navigation-transition.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 +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +44 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +130 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +87 -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 +272 -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 +104 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +161 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -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-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.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 +29 -7
- 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 +19 -8
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- 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 +13 -11
- 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 +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- 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 +322 -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/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -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 +46 -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 +112 -8
- 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/css.d.ts +2 -1
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +5 -3
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +6 -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 +35 -153
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10488 -13975
- 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 +54 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- 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 +32 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -65
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/graph-endpoint.d.ts +112 -0
- package/dist/plugins/graph-endpoint.d.ts.map +1 -0
- package/dist/plugins/mdx.d.ts +24 -5
- 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 +39 -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 +8 -3
- 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 +13 -7
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception-overlap.d.ts +35 -0
- package/dist/routing/interception-overlap.d.ts.map +1 -0
- 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 +14 -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 +14 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- 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 +98 -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 +39 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +29 -35
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +117 -13
- 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/csp-nonce.d.ts +45 -0
- package/dist/server/csp-nonce.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/debug.d.ts +82 -0
- package/dist/server/debug.d.ts.map +1 -0
- 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 +253 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +20 -9
- 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 +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +101 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- 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 +45 -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/form-flash.d.ts +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 +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +18 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +212 -2930
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4034 -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 +71 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +78 -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 +7 -1
- 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 +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +160 -24
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -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 +52 -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 +129 -45
- 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 +26 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +111 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +40 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- 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 +40 -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 +26 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +39 -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 +37 -5
- 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/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +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 +29 -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 +137 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts +54 -0
- package/dist/server/slot-subtree-contain.d.ts.map +1 -0
- package/dist/server/ssr-bridge-types.d.ts +160 -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 +69 -22
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +93 -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 +56 -11
- package/dist/server/tracing.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 +88 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -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 +17 -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/waituntil-bridge.d.ts.map +1 -1
- 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 +16 -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 +52 -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/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.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-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- 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 +236 -0
- package/docs/api/31-api-client.mdx +167 -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 +329 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +192 -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/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +252 -0
- package/docs/learn/11-middleware.mdx +158 -0
- package/docs/learn/12-error-handling.mdx +188 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +117 -29
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +747 -130
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +279 -418
- 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/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +258 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +332 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +162 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +39 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +115 -22
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +69 -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 +180 -48
- 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 +23 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +34 -0
- package/src/cli-check.ts +507 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +262 -55
- package/src/client/browser-dev.ts +157 -2
- package/src/client/browser-entry/action-dispatch.ts +197 -0
- package/src/client/browser-entry/action-queue.ts +90 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +148 -0
- package/src/client/browser-entry/index.ts +131 -0
- package/src/client/browser-entry/post-hydration.ts +123 -0
- package/src/client/browser-entry/router-init.ts +418 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/deny-last-resort.tsx +54 -0
- package/src/client/error-boundary.tsx +316 -40
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +81 -10
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +452 -159
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +347 -0
- package/src/client/navigation-commit.ts +295 -0
- package/src/client/navigation-context.ts +67 -98
- package/src/client/navigation-root.tsx +224 -0
- package/src/client/navigation-transition.ts +327 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +72 -0
- package/src/client/router-effects.ts +228 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +490 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +294 -0
- package/src/client/router.ts +436 -424
- package/src/client/rsc-fetch.ts +512 -73
- package/src/client/segment-cache.ts +327 -40
- package/src/client/segment-context.ts +13 -5
- package/src/client/segment-outlet.tsx +96 -0
- package/src/client/segment-update-context.ts +23 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-content-cache-context.ts +43 -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 +30 -9
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +29 -15
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +36 -29
- package/src/client/unload-guard.ts +35 -3
- package/src/client/use-cookie.ts +70 -18
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +22 -31
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +6 -3
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +322 -0
- package/src/config-validation.ts +347 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- 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 +185 -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 +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +3 -2
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +101 -19
- package/src/fonts/local.ts +13 -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 +486 -344
- 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 +275 -43
- 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 +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +369 -96
- package/src/plugins/entries.ts +148 -18
- package/src/plugins/fonts.ts +251 -524
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +116 -40
- 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 +320 -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 +273 -277
- package/src/plugins/server-bundle.ts +103 -14
- package/src/plugins/shims.ts +259 -97
- package/src/plugins/static-build.ts +708 -66
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +141 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +623 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +393 -219
- 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 +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +19 -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 +196 -57
- package/src/server/action-client.ts +136 -35
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +256 -56
- package/src/server/actions.ts +112 -68
- package/src/server/als-registry.ts +160 -21
- 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/csp-nonce.ts +70 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/debug.ts +137 -0
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +533 -0
- package/src/server/deny-renderer.ts +214 -112
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +181 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +2 -2
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +272 -235
- package/src/server/index.ts +40 -192
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +173 -0
- package/src/server/logger.ts +73 -36
- package/src/server/metadata-collector.ts +174 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +23 -2
- package/src/server/middleware-runner.ts +32 -5
- package/src/server/node-stream-transforms.ts +323 -0
- package/src/server/nuqs-ssr-provider.tsx +8 -7
- package/src/server/param-coercion.ts +198 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +218 -0
- package/src/server/pipeline-phases.ts +606 -0
- package/src/server/pipeline.ts +343 -389
- package/src/server/port-resolution.ts +53 -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 +122 -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 +246 -97
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +35 -0
- package/src/server/request-context.ts +244 -333
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +508 -360
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +40 -13
- package/src/server/route-matcher.ts +165 -272
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +174 -0
- package/src/server/rsc-entry/api-handler.ts +78 -34
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +373 -95
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +405 -323
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +239 -50
- package/src/server/rsc-entry/rsc-stream.ts +160 -30
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +315 -57
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +3 -1
- 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/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +172 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +707 -300
- package/src/server/slot-subtree-contain.ts +255 -0
- package/src/server/ssr-bridge-types.ts +165 -0
- package/src/server/ssr-entry.ts +230 -85
- package/src/server/ssr-render.ts +357 -85
- package/src/server/ssr-wrappers.tsx +162 -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 +292 -0
- package/src/server/tracing.ts +151 -16
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +95 -10
- package/src/server/utils/element-type.ts +88 -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/waituntil-bridge.ts +5 -2
- 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 +16 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +59 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +109 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shared/status-reason-phrase.ts +61 -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-rsc.ts +47 -0
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
- package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
- package/dist/_chunks/format-DNt20Kt8.js +0 -163
- package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
- package/dist/_chunks/interception-DGDIjDbR.js +0 -676
- package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
- package/dist/_chunks/metadata-routes-CQCnF4VK.js +0 -153
- package/dist/_chunks/metadata-routes-CQCnF4VK.js.map +0 -1
- package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
- package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
- package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
- package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
- package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
- package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
- package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js +0 -109
- package/dist/_chunks/use-query-states-DAhgj8Gx.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 +0 -92
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/content/index.d.ts +0 -11
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -2
- 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/server/tree-builder.d.ts +0 -126
- package/dist/server/tree-builder.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 -99
- package/src/client/browser-entry.ts +0 -674
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -345
- package/src/client/stale-reload.ts +0 -89
- package/src/client/transition-root.tsx +0 -160
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/client/use-params.ts +0 -141
- package/src/content/index.ts +0 -13
- 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 -282
- 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/server/tree-builder.ts +0 -382
- package/src/shims/server-only-noop.js +0 -6
- package/src/utils/directive-parser.ts +0 -529
package/src/routing/scanner.ts
CHANGED
|
@@ -17,43 +17,25 @@ import type {
|
|
|
17
17
|
RouteFile,
|
|
18
18
|
ScannerConfig,
|
|
19
19
|
InterceptionMarker,
|
|
20
|
-
} from './types.
|
|
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/;
|
|
20
|
+
} from './types.ts';
|
|
21
|
+
import { classifySegment, effectiveUrlSegment } from './segment-classify.ts';
|
|
22
|
+
import { validateInterceptionPlacement, computeInterceptedBase } from './interception.ts';
|
|
23
|
+
import { validateRouteGroupCollisions } from './collision-spaces.ts';
|
|
24
|
+
import { validateSlotPlacement } from './slot-placement.ts';
|
|
25
|
+
import { DEFAULT_PAGE_EXTENSIONS } from './types.ts';
|
|
26
|
+
import { classifyMetadataRoute, isDynamicMetadataExtension } from '../server/metadata-routes.ts';
|
|
27
|
+
import { swallow } from '../server/logger.ts';
|
|
28
|
+
import { ENCODED_SEPARATOR_RE, NULL_BYTE_RE } from '../server/canonicalize.ts';
|
|
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:
|
|
@@ -62,6 +44,30 @@ const FIXED_CONVENTIONS = new Set(['middleware', 'access', 'route', 'prerender',
|
|
|
62
44
|
*/
|
|
63
45
|
const STATUS_CODE_PATTERN = /^(\d{3}|[45]xx)$/;
|
|
64
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Whether a basename + extension pair is a route-convention file the
|
|
49
|
+
* framework itself imports: page/layout/error/default/denied and
|
|
50
|
+
* global-error on pageExtensions, middleware/access/route/proxy on
|
|
51
|
+
* .ts/.tsx/.js/.jsx only, and status-code files (404, 4xx, …) on
|
|
52
|
+
* pageExtensions or .json — mirroring this scanner's own recognition
|
|
53
|
+
* rules per family.
|
|
54
|
+
*
|
|
55
|
+
* Exported for the analyze classifier so its provisional classification
|
|
56
|
+
* (design/47 §2) derives from the scanner's real conventions instead of
|
|
57
|
+
* a duplicate list that can drift.
|
|
58
|
+
*/
|
|
59
|
+
export function isRouteConventionFile(
|
|
60
|
+
base: string,
|
|
61
|
+
ext: string,
|
|
62
|
+
pageExtensions: readonly string[] = DEFAULT_PAGE_EXTENSIONS
|
|
63
|
+
): boolean {
|
|
64
|
+
const isPageExt = pageExtensions.includes(ext);
|
|
65
|
+
if ((PAGE_EXT_CONVENTIONS.has(base) || base === 'global-error') && isPageExt) return true;
|
|
66
|
+
if ((FIXED_CONVENTIONS.has(base) || base === 'proxy') && /^[jt]sx?$/.test(ext)) return true;
|
|
67
|
+
if (STATUS_CODE_PATTERN.test(base) && (isPageExt || ext === 'json')) return true;
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
|
|
65
71
|
/**
|
|
66
72
|
* Scan the app/ directory and build the route tree.
|
|
67
73
|
*
|
|
@@ -83,15 +89,45 @@ export function scanRoutes(appDir: string, config: ScannerConfig = {}): RouteTre
|
|
|
83
89
|
tree.proxy = proxyFile;
|
|
84
90
|
}
|
|
85
91
|
|
|
92
|
+
// Check for global-error.{tsx,ts,jsx,js} at app root.
|
|
93
|
+
// Tier 2 error page — renders standalone (no layouts) when no segment-level
|
|
94
|
+
// error file is found. See design/10-error-handling.md §"Tier 2".
|
|
95
|
+
const globalErrorFile = findPageExtFile(appDir, 'global-error', extSet);
|
|
96
|
+
if (globalErrorFile) {
|
|
97
|
+
tree.globalError = globalErrorFile;
|
|
98
|
+
}
|
|
99
|
+
|
|
86
100
|
// Scan the root directory's files
|
|
87
101
|
scanSegmentFiles(appDir, tree.root, extSet);
|
|
88
102
|
|
|
89
103
|
// Scan children recursively
|
|
90
104
|
scanChildren(appDir, tree.root, extSet);
|
|
91
105
|
|
|
106
|
+
// Validate: every parallel slot sits where a renderer reaches it. First,
|
|
107
|
+
// because a slot nested inside another slot never renders, and a collision
|
|
108
|
+
// reported from inside one would send the author to fix an ambiguity between
|
|
109
|
+
// two pages that were both already dead.
|
|
110
|
+
validateSlotPlacement(tree.root);
|
|
111
|
+
|
|
92
112
|
// Validate: detect route group collisions (different groups producing pages at the same URL)
|
|
93
113
|
validateRouteGroupCollisions(tree.root);
|
|
94
114
|
|
|
115
|
+
// Validate: detect duplicate param names in nested dynamic segments
|
|
116
|
+
// e.g., /[id]/items/[id] — same param name in ancestor and descendant
|
|
117
|
+
validateDuplicateParamNames(tree.root);
|
|
118
|
+
|
|
119
|
+
// Validate: detect same param name used with different bracket forms
|
|
120
|
+
// e.g., [id] in one route and [...id] in another
|
|
121
|
+
validateUniqueBracketForms(tree.root);
|
|
122
|
+
|
|
123
|
+
// Validate: detect affixed dynamic siblings with equal specificity
|
|
124
|
+
// e.g., a-[id] and [slug]-b both have prefix+suffix length = 2
|
|
125
|
+
validateAffixedSiblingConflicts(tree.root);
|
|
126
|
+
|
|
127
|
+
// Validate: intercepting routes must be direct children of a parallel slot —
|
|
128
|
+
// the slot resolver is the only thing that can render one.
|
|
129
|
+
validateInterceptionPlacement(tree.root);
|
|
130
|
+
|
|
95
131
|
return tree;
|
|
96
132
|
}
|
|
97
133
|
|
|
@@ -104,106 +140,24 @@ function createSegmentNode(
|
|
|
104
140
|
urlPath: string,
|
|
105
141
|
paramName?: string,
|
|
106
142
|
interceptionMarker?: InterceptionMarker,
|
|
107
|
-
interceptedSegmentName?: string
|
|
143
|
+
interceptedSegmentName?: string,
|
|
144
|
+
paramPrefix?: string,
|
|
145
|
+
paramSuffix?: string
|
|
108
146
|
): SegmentNode {
|
|
109
147
|
return {
|
|
110
148
|
segmentName,
|
|
111
149
|
segmentType,
|
|
112
150
|
urlPath,
|
|
113
151
|
paramName,
|
|
152
|
+
paramPrefix,
|
|
153
|
+
paramSuffix,
|
|
114
154
|
interceptionMarker,
|
|
115
155
|
interceptedSegmentName,
|
|
116
156
|
children: [],
|
|
117
|
-
slots:
|
|
157
|
+
slots: {},
|
|
118
158
|
};
|
|
119
159
|
}
|
|
120
160
|
|
|
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
161
|
/**
|
|
208
162
|
* Compute the URL path for a child segment given its parent's URL path.
|
|
209
163
|
* Route groups, slots, and intercepting routes do NOT add URL depth.
|
|
@@ -225,7 +179,8 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
225
179
|
let entries: string[];
|
|
226
180
|
try {
|
|
227
181
|
entries = readdirSync(dirPath);
|
|
228
|
-
} catch {
|
|
182
|
+
} catch (err) {
|
|
183
|
+
swallow(err, `scanSegmentFiles: unreadable directory ${dirPath}`, { level: 'warn' });
|
|
229
184
|
return;
|
|
230
185
|
}
|
|
231
186
|
|
|
@@ -244,47 +199,26 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
244
199
|
|
|
245
200
|
// Page-extension conventions (page, layout, error, default, denied)
|
|
246
201
|
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;
|
|
202
|
+
const key = name as 'page' | 'layout' | 'error' | 'default' | 'denied';
|
|
203
|
+
const existing = node[key];
|
|
204
|
+
if (existing) {
|
|
205
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
264
206
|
}
|
|
207
|
+
node[key] = { filePath: fullPath, extension: ext };
|
|
265
208
|
continue;
|
|
266
209
|
}
|
|
267
210
|
|
|
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;
|
|
211
|
+
// Fixed conventions (middleware, access, route) — only
|
|
212
|
+
// .ts/.tsx/.js/.jsx, never pageExtensions like .mdx. The regex is
|
|
213
|
+
// anchored: mts/cts/mjs/cjs (and stray tail matches like `.foots`)
|
|
214
|
+
// are NOT recognized. See design/07-routing.md §"Page Extensions".
|
|
215
|
+
if (FIXED_CONVENTIONS.has(name) && /^[jt]sx?$/.test(ext)) {
|
|
216
|
+
const key = name as 'middleware' | 'access' | 'route';
|
|
217
|
+
const existing = node[key];
|
|
218
|
+
if (existing) {
|
|
219
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
287
220
|
}
|
|
221
|
+
node[key] = { filePath: fullPath, extension: ext };
|
|
288
222
|
continue;
|
|
289
223
|
}
|
|
290
224
|
|
|
@@ -292,50 +226,56 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
292
226
|
// Recognized regardless of pageExtensions — .json is a data format, not a page extension.
|
|
293
227
|
if (STATUS_CODE_PATTERN.test(name) && ext === 'json') {
|
|
294
228
|
if (!node.jsonStatusFiles) {
|
|
295
|
-
node.jsonStatusFiles =
|
|
229
|
+
node.jsonStatusFiles = {};
|
|
296
230
|
}
|
|
297
|
-
node.jsonStatusFiles
|
|
231
|
+
node.jsonStatusFiles[name] = { filePath: fullPath, extension: ext };
|
|
298
232
|
continue;
|
|
299
233
|
}
|
|
300
234
|
|
|
301
235
|
// Status-code files (401.tsx, 4xx.tsx, 503.tsx, 5xx.tsx)
|
|
302
236
|
if (STATUS_CODE_PATTERN.test(name) && extSet.has(ext)) {
|
|
303
237
|
if (!node.statusFiles) {
|
|
304
|
-
node.statusFiles =
|
|
238
|
+
node.statusFiles = {};
|
|
305
239
|
}
|
|
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();
|
|
240
|
+
const existing = node.statusFiles[name];
|
|
241
|
+
if (existing) {
|
|
242
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
314
243
|
}
|
|
315
|
-
node.
|
|
244
|
+
node.statusFiles[name] = { filePath: fullPath, extension: ext };
|
|
316
245
|
continue;
|
|
317
246
|
}
|
|
318
247
|
|
|
319
248
|
// Metadata route files (sitemap.ts, robots.ts, icon.tsx, opengraph-image.tsx, etc.)
|
|
320
249
|
// Both static (.xml, .txt, .png, .ico, etc.) and dynamic (.ts, .tsx) files are recognized.
|
|
321
250
|
// When both exist for the same base name, dynamic takes precedence.
|
|
251
|
+
// Two files of the SAME kind (static+static or dynamic+dynamic) are a
|
|
252
|
+
// build error — picking one by readdir order is platform-dependent.
|
|
322
253
|
// See design/16-metadata.md §"Metadata Routes"
|
|
323
254
|
const metaInfo = classifyMetadataRoute(entry);
|
|
324
255
|
if (metaInfo) {
|
|
256
|
+
if (!metaInfo.nestable && node.segmentName !== '') {
|
|
257
|
+
throw new Error(
|
|
258
|
+
`Build error: '${name}' is a root-only metadata convention and must be in the app root directory.\n` +
|
|
259
|
+
` File: ${fullPath}\n` +
|
|
260
|
+
` Move this file to the app root (not a route group or nested segment).`
|
|
261
|
+
);
|
|
262
|
+
}
|
|
325
263
|
if (!node.metadataRoutes) {
|
|
326
|
-
node.metadataRoutes =
|
|
264
|
+
node.metadataRoutes = {};
|
|
327
265
|
}
|
|
328
|
-
const existing = node.metadataRoutes
|
|
266
|
+
const existing = node.metadataRoutes[name];
|
|
329
267
|
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
268
|
const existingIsDynamic = isDynamicMetadataExtension(name, existing.extension);
|
|
333
269
|
const newIsDynamic = isDynamicMetadataExtension(name, ext);
|
|
334
|
-
if (
|
|
335
|
-
|
|
270
|
+
if (existingIsDynamic === newIsDynamic) {
|
|
271
|
+
throwDuplicateConvention(name, existing.filePath, fullPath);
|
|
272
|
+
}
|
|
273
|
+
// Dynamic > static precedence: overwrite only when the new file is dynamic.
|
|
274
|
+
if (newIsDynamic) {
|
|
275
|
+
node.metadataRoutes[name] = { filePath: fullPath, extension: ext };
|
|
336
276
|
}
|
|
337
277
|
} else {
|
|
338
|
-
node.metadataRoutes
|
|
278
|
+
node.metadataRoutes[name] = { filePath: fullPath, extension: ext };
|
|
339
279
|
}
|
|
340
280
|
}
|
|
341
281
|
}
|
|
@@ -351,6 +291,26 @@ function scanSegmentFiles(dirPath: string, node: SegmentNode, extSet: Set<string
|
|
|
351
291
|
}
|
|
352
292
|
}
|
|
353
293
|
|
|
294
|
+
/**
|
|
295
|
+
* Throw a build error for two files claiming the same convention slot in
|
|
296
|
+
* one segment (e.g. page.tsx + page.jsx). Which file readdir returns first
|
|
297
|
+
* is platform-dependent (APFS sorts entries, ext4 does not) — silently
|
|
298
|
+
* picking one would let macOS dev and Linux CI serve different
|
|
299
|
+
* implementations of the same route.
|
|
300
|
+
*/
|
|
301
|
+
function throwDuplicateConvention(
|
|
302
|
+
convention: string,
|
|
303
|
+
firstPath: string,
|
|
304
|
+
secondPath: string
|
|
305
|
+
): never {
|
|
306
|
+
throw new Error(
|
|
307
|
+
`Build error: duplicate '${convention}' files in the same route segment.\n` +
|
|
308
|
+
` File 1: ${firstPath}\n` +
|
|
309
|
+
` File 2: ${secondPath}\n` +
|
|
310
|
+
`Each segment may define '${convention}' at most once. Remove one of the files.`
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
|
|
354
314
|
/**
|
|
355
315
|
* Recursively scan child directories and build the segment tree.
|
|
356
316
|
*/
|
|
@@ -358,7 +318,8 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
358
318
|
let entries: string[];
|
|
359
319
|
try {
|
|
360
320
|
entries = readdirSync(dirPath);
|
|
361
|
-
} catch {
|
|
321
|
+
} catch (err) {
|
|
322
|
+
swallow(err, `scanChildren: unreadable directory ${dirPath}`, { level: 'warn' });
|
|
362
323
|
return;
|
|
363
324
|
}
|
|
364
325
|
|
|
@@ -374,24 +335,31 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
374
335
|
// Reject directories with encoded path delimiters or null bytes.
|
|
375
336
|
// These can cause route collisions when decoded at the URL boundary.
|
|
376
337
|
// See design/13-security.md §"Encoded separators rejected" and §"Null bytes rejected".
|
|
377
|
-
if (
|
|
338
|
+
if (ENCODED_SEPARATOR_RE.test(entry)) {
|
|
378
339
|
throw new Error(
|
|
379
|
-
`Build error: directory name contains an encoded path delimiter (
|
|
340
|
+
`Build error: directory name contains an encoded path delimiter (%2F or %5C).\n` +
|
|
380
341
|
` Directory: ${fullPath}\n` +
|
|
381
342
|
`Encoded separators in directory names cause route collisions when decoded. ` +
|
|
382
343
|
`Rename the directory to remove the encoded delimiter.`
|
|
383
344
|
);
|
|
384
345
|
}
|
|
385
|
-
if (
|
|
346
|
+
if (NULL_BYTE_RE.test(entry)) {
|
|
386
347
|
throw new Error(
|
|
387
|
-
`Build error: directory name contains an encoded null byte (
|
|
348
|
+
`Build error: directory name contains an encoded null byte (%00).\n` +
|
|
388
349
|
` Directory: ${fullPath}\n` +
|
|
389
350
|
`Encoded null bytes in directory names are not allowed. ` +
|
|
390
351
|
`Rename the directory to remove the null byte encoding.`
|
|
391
352
|
);
|
|
392
353
|
}
|
|
393
354
|
|
|
394
|
-
const {
|
|
355
|
+
const {
|
|
356
|
+
type,
|
|
357
|
+
paramName,
|
|
358
|
+
paramPrefix,
|
|
359
|
+
paramSuffix,
|
|
360
|
+
interceptionMarker,
|
|
361
|
+
interceptedSegmentName,
|
|
362
|
+
} = classifySegment(entry);
|
|
395
363
|
|
|
396
364
|
// Skip private folders — underscore-prefixed dirs are excluded from routing
|
|
397
365
|
if (type === 'private') continue;
|
|
@@ -403,7 +371,9 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
403
371
|
urlPath,
|
|
404
372
|
paramName,
|
|
405
373
|
interceptionMarker,
|
|
406
|
-
interceptedSegmentName
|
|
374
|
+
interceptedSegmentName,
|
|
375
|
+
paramPrefix,
|
|
376
|
+
paramSuffix
|
|
407
377
|
);
|
|
408
378
|
|
|
409
379
|
// Scan this segment's files
|
|
@@ -412,10 +382,10 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
412
382
|
// Recurse into subdirectories
|
|
413
383
|
scanChildren(fullPath, childNode, extSet);
|
|
414
384
|
|
|
415
|
-
// Attach to parent: slots go into slots
|
|
385
|
+
// Attach to parent: slots go into slots record, everything else is a child
|
|
416
386
|
if (type === 'slot') {
|
|
417
387
|
const slotName = entry.slice(1); // remove @
|
|
418
|
-
parentNode.slots
|
|
388
|
+
parentNode.slots[slotName] = childNode;
|
|
419
389
|
} else {
|
|
420
390
|
parentNode.children.push(childNode);
|
|
421
391
|
}
|
|
@@ -423,63 +393,245 @@ function scanChildren(dirPath: string, parentNode: SegmentNode, extSet: Set<stri
|
|
|
423
393
|
}
|
|
424
394
|
|
|
425
395
|
/**
|
|
426
|
-
* Validate that route
|
|
396
|
+
* Validate that no route chain contains duplicate dynamic param names.
|
|
397
|
+
*
|
|
398
|
+
* Example violation:
|
|
399
|
+
* app/[id]/items/[id]/page.tsx — 'id' appears twice in the ancestor chain.
|
|
427
400
|
*
|
|
428
|
-
*
|
|
429
|
-
*
|
|
401
|
+
* Route groups are transparent — params accumulate through them.
|
|
402
|
+
* Slots are independent — duplicate detection does NOT cross slot boundaries.
|
|
430
403
|
*
|
|
431
|
-
*
|
|
432
|
-
|
|
404
|
+
* See design/07-routing.md §"Duplicate Param Name Detection"
|
|
405
|
+
*/
|
|
406
|
+
function validateDuplicateParamNames(root: SegmentNode): void {
|
|
407
|
+
walkForDuplicateParams(root, new Map());
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Recursively walk the segment tree, tracking seen param names → segment paths.
|
|
412
|
+
* Throws on the first duplicate found.
|
|
433
413
|
*/
|
|
434
|
-
function
|
|
435
|
-
//
|
|
436
|
-
|
|
437
|
-
|
|
414
|
+
function walkForDuplicateParams(node: SegmentNode, seen: Map<string, string>): void {
|
|
415
|
+
// Read through the effective identity so an intercepting directory is seen
|
|
416
|
+
// as the segment it intercepts: the scanner leaves `paramName` unset on
|
|
417
|
+
// `(.)[id]`, so a validator reading the node directly is blind to a param
|
|
418
|
+
// the resolver goes on to bind — `@modal/(.)[id]/[id]` would pass here and
|
|
419
|
+
// then silently overwrite the outer `id` at match time, where the ordinary
|
|
420
|
+
// `/[id]/[id]` is rejected. See TIM-1288.
|
|
421
|
+
const { paramName } = effectiveUrlSegment(node);
|
|
422
|
+
|
|
423
|
+
// If this node introduces a param name, check for duplicates
|
|
424
|
+
if (paramName) {
|
|
425
|
+
const existing = seen.get(paramName);
|
|
426
|
+
if (existing) {
|
|
427
|
+
throw new Error(
|
|
428
|
+
`[timber] Duplicate param name '${paramName}' in route chain.\n` +
|
|
429
|
+
` First defined at: ${existing}\n` +
|
|
430
|
+
` Duplicate at: ${node.urlPath || '/'}\n` +
|
|
431
|
+
` Rename one of the segments to avoid ambiguity.`
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
// Add to seen for descendants (use a new Map to avoid polluting siblings)
|
|
435
|
+
seen = new Map(seen);
|
|
436
|
+
seen.set(paramName, node.urlPath || '/');
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Recurse into children (they inherit the accumulated params)
|
|
440
|
+
for (const child of node.children) {
|
|
441
|
+
walkForDuplicateParams(child, seen);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// A slot INHERITS the ancestor params rather than starting fresh: a slot
|
|
445
|
+
// child may not reuse a name its owner already bound
|
|
446
|
+
// (`app/gallery/[id]/@modal/[id]` is rejected). The copy is so sibling
|
|
447
|
+
// slots don't see each other's names, not so the chain is reset.
|
|
448
|
+
//
|
|
449
|
+
// Whether that rule is right is a separate question — slot params are
|
|
450
|
+
// merged over the main route's at read time, so a collision is defined
|
|
451
|
+
// rather than ambiguous — but changing it would change every slot.
|
|
452
|
+
// Tracked as TIM-1287; do not "fix" this by making the map fresh without
|
|
453
|
+
// deciding that.
|
|
454
|
+
for (const slotNode of Object.values(node.slots)) {
|
|
455
|
+
walkForDuplicateParams(slotNode, new Map(seen));
|
|
456
|
+
}
|
|
438
457
|
}
|
|
439
458
|
|
|
440
459
|
/**
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
*
|
|
460
|
+
* Validate that each param name uses a single bracket form across the entire route tree.
|
|
461
|
+
*
|
|
462
|
+
* Different bracket forms produce different types:
|
|
463
|
+
* [id] → string
|
|
464
|
+
* [...id] → string[]
|
|
465
|
+
* [[...id]] → string[] | undefined
|
|
466
|
+
*
|
|
467
|
+
* If the same param name appears with multiple forms, the no-argument
|
|
468
|
+
* getSegmentParams() / useSegmentParams() return type becomes ambiguous.
|
|
469
|
+
*
|
|
470
|
+
* Same name + same form across different routes is fine and expected.
|
|
444
471
|
*/
|
|
445
|
-
function
|
|
472
|
+
function validateUniqueBracketForms(root: SegmentNode): void {
|
|
473
|
+
const forms = new Map<string, { segmentType: SegmentType; urlPath: string }>();
|
|
474
|
+
collectBracketForms(root, forms);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function collectBracketForms(
|
|
446
478
|
node: SegmentNode,
|
|
447
|
-
|
|
448
|
-
segmentPath: string,
|
|
449
|
-
insideSlot: boolean
|
|
479
|
+
forms: Map<string, { segmentType: SegmentType; urlPath: string }>
|
|
450
480
|
): void {
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
481
|
+
// Effective identity, so `(.)[...rest]` is compared as the catch-all it
|
|
482
|
+
// intercepts rather than skipped as an 'intercepting' node (TIM-1288).
|
|
483
|
+
const { paramName, segmentType } = effectiveUrlSegment(node);
|
|
484
|
+
|
|
485
|
+
if (paramName && segmentType !== 'static' && segmentType !== 'group') {
|
|
486
|
+
const existing = forms.get(paramName);
|
|
487
|
+
if (existing && existing.segmentType !== segmentType) {
|
|
488
|
+
const bracketExamples: Record<string, string> = {
|
|
489
|
+
'dynamic': `[${paramName}]`,
|
|
490
|
+
'catch-all': `[...${paramName}]`,
|
|
491
|
+
'optional-catch-all': `[[...${paramName}]]`,
|
|
492
|
+
};
|
|
493
|
+
throw new Error(
|
|
494
|
+
`[timber] Param name '${paramName}' uses multiple bracket forms.\n` +
|
|
495
|
+
` ${bracketExamples[existing.segmentType] ?? existing.segmentType} at: ${existing.urlPath}\n` +
|
|
496
|
+
` ${bracketExamples[segmentType] ?? segmentType} at: ${node.urlPath || '/'}\n` +
|
|
497
|
+
` Each param name must use a single bracket form across all routes.\n` +
|
|
498
|
+
` Rename one of the segments to fix this (e.g., [${paramName}] → [${paramName}Id]).`
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
if (!existing) {
|
|
502
|
+
forms.set(paramName, {
|
|
503
|
+
segmentType,
|
|
504
|
+
urlPath: node.urlPath || '/',
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
for (const child of node.children) {
|
|
510
|
+
collectBracketForms(child, forms);
|
|
511
|
+
}
|
|
512
|
+
for (const slotNode of Object.values(node.slots)) {
|
|
513
|
+
collectBracketForms(slotNode, forms);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Validate that no sibling affixed dynamic segments have equal specificity.
|
|
519
|
+
*
|
|
520
|
+
* Among affixed siblings, longer combined prefix+suffix length wins. When two
|
|
521
|
+
* siblings tie (same total affix length), the router would fall back to
|
|
522
|
+
* filesystem scan order — which is platform-dependent. This is a build error.
|
|
523
|
+
*
|
|
524
|
+
* Route groups are URL-transparent, so affixed segments inside different groups
|
|
525
|
+
* at the same level still conflict with each other.
|
|
526
|
+
*
|
|
527
|
+
* Ambiguity requires the two segments to be candidates for the *same* URL
|
|
528
|
+
* part, which is narrower than "same parent" once interception is involved:
|
|
529
|
+
*
|
|
530
|
+
* - Plain children and intercepting children never compete. They are resolved
|
|
531
|
+
* by different walks — `findSlotMatch` matches the slot subtree (where
|
|
532
|
+
* `tree-match.ts` ignores intercepting nodes outright) and
|
|
533
|
+
* `findInterceptingMatch` builds a synthetic parent holding only
|
|
534
|
+
* interceptors.
|
|
535
|
+
* - Two interceptors compete only at the same anchor. `(.)a-[id]` and
|
|
536
|
+
* `(..)[slug]-b` in one slot are based at different URL depths, so no
|
|
537
|
+
* pathname reaches both, and `anchorIndex` rejects the one whose base does
|
|
538
|
+
* not match the target. Grouping them together would fail the build for a
|
|
539
|
+
* pair that can never be ambiguous.
|
|
540
|
+
*
|
|
541
|
+
* So candidates are keyed by the position they contend for, then by affix
|
|
542
|
+
* length. See design/07-routing.md §"Priority" and §"Intercepting Routes".
|
|
543
|
+
*/
|
|
544
|
+
function validateAffixedSiblingConflicts(node: SegmentNode): void {
|
|
545
|
+
const affixed = collectEffectiveAffixed(node);
|
|
546
|
+
|
|
547
|
+
if (affixed.length >= 2) {
|
|
548
|
+
const byLength = new Map<string, SegmentNode[]>();
|
|
549
|
+
for (const child of affixed) {
|
|
550
|
+
// `\0` as the separator, written as the escape rather than a literal
|
|
551
|
+
// byte: a raw NUL in the source makes git and grep treat this file as
|
|
552
|
+
// binary. A contention key is a URL path, which cannot contain one, so
|
|
553
|
+
// the two halves of the key can never run together.
|
|
554
|
+
const key = `${contentionKey(node, child)}\0${affixLengthOf(child)}`;
|
|
555
|
+
const group = byLength.get(key);
|
|
556
|
+
if (group) {
|
|
557
|
+
group.push(child);
|
|
558
|
+
} else {
|
|
559
|
+
byLength.set(key, [child]);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
for (const [, group] of byLength) {
|
|
564
|
+
if (group.length >= 2) {
|
|
461
565
|
throw new Error(
|
|
462
|
-
`Build error:
|
|
463
|
-
`
|
|
464
|
-
`
|
|
465
|
-
`
|
|
466
|
-
`
|
|
467
|
-
`Rename
|
|
566
|
+
`Build error: ambiguous affixed dynamic siblings with equal specificity.\n` +
|
|
567
|
+
` Parent: ${node.urlPath || '/'}\n` +
|
|
568
|
+
` Segments: ${group.map((s) => s.segmentName).join(', ')}\n` +
|
|
569
|
+
` Combined prefix+suffix length: ${affixLengthOf(group[0]!)}\n` +
|
|
570
|
+
`The router cannot deterministically choose between these — filesystem scan order is platform-dependent.\n` +
|
|
571
|
+
`Rename one segment to give it a longer or shorter combined affix.`
|
|
468
572
|
);
|
|
469
573
|
}
|
|
470
|
-
seen.set(node.urlPath, { filePath: routableFile.filePath, segmentPath: currentPath });
|
|
471
574
|
}
|
|
472
575
|
}
|
|
473
576
|
|
|
474
|
-
// Recurse into children
|
|
475
577
|
for (const child of node.children) {
|
|
476
|
-
|
|
578
|
+
validateAffixedSiblingConflicts(child);
|
|
477
579
|
}
|
|
580
|
+
for (const slotNode of Object.values(node.slots)) {
|
|
581
|
+
validateAffixedSiblingConflicts(slotNode);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
478
584
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
585
|
+
/**
|
|
586
|
+
* The URL position a child contends for, as a comparable key.
|
|
587
|
+
*
|
|
588
|
+
* Plain children contend for the parent's next part. An intercepting child
|
|
589
|
+
* contends for a part determined by its marker's intercepted base, so two
|
|
590
|
+
* markers of different depth are simply different positions — and two markers
|
|
591
|
+
* that compute the *same* base do contend, which is why the key is the base
|
|
592
|
+
* rather than the marker (`(..)` and `(...)` under `/feed` both base at `/`).
|
|
593
|
+
*
|
|
594
|
+
* `groupByInterceptedAnchor` (`routing/interception.ts`) is the canonical
|
|
595
|
+
* statement of that grouping — it is what the resolver walks and what the
|
|
596
|
+
* collision validator checks. This computes the same key from the same
|
|
597
|
+
* `computeInterceptedBase` rather than calling it, because affix ambiguity is
|
|
598
|
+
* decided per *child* and `collectEffectiveAffixed` looks through route groups,
|
|
599
|
+
* so the two do not partition the same set of nodes.
|
|
600
|
+
*/
|
|
601
|
+
function contentionKey(parent: SegmentNode, child: SegmentNode): string {
|
|
602
|
+
if (child.segmentType !== 'intercepting') return 'child';
|
|
603
|
+
return `intercept:${computeInterceptedBase(parent.urlPath, child.interceptionMarker ?? '(.)')}`;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/** Combined affix length of a node, read through its effective identity. */
|
|
607
|
+
function affixLengthOf(node: SegmentNode): number {
|
|
608
|
+
const { paramPrefix, paramSuffix } = effectiveUrlSegment(node);
|
|
609
|
+
return (paramPrefix?.length ?? 0) + (paramSuffix?.length ?? 0);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Collect affixed dynamic segments that are effective children of a node.
|
|
614
|
+
* Route groups are URL-transparent, so we look through them recursively.
|
|
615
|
+
*
|
|
616
|
+
* Segments are read through `effectiveUrlSegment`, so an intercepting
|
|
617
|
+
* directory counts as the affixed segment it intercepts: `(.)a-[id]` is
|
|
618
|
+
* `a-[id]`. The proxy the slot resolver builds hands those affixes to
|
|
619
|
+
* `matchUrlParts`, whose equal-length sort is not stable across equal
|
|
620
|
+
* specificity — so two intercepting siblings with the same combined affix
|
|
621
|
+
* length would resolve by filesystem enumeration order, which is precisely
|
|
622
|
+
* what this validator exists to prevent for ordinary siblings (TIM-1288).
|
|
623
|
+
*/
|
|
624
|
+
function collectEffectiveAffixed(node: SegmentNode): SegmentNode[] {
|
|
625
|
+
const result: SegmentNode[] = [];
|
|
626
|
+
for (const child of node.children) {
|
|
627
|
+
const { segmentType, paramPrefix, paramSuffix } = effectiveUrlSegment(child);
|
|
628
|
+
if (segmentType === 'dynamic' && (paramPrefix || paramSuffix)) {
|
|
629
|
+
result.push(child);
|
|
630
|
+
} else if (segmentType === 'group') {
|
|
631
|
+
result.push(...collectEffectiveAffixed(child));
|
|
632
|
+
}
|
|
482
633
|
}
|
|
634
|
+
return result;
|
|
483
635
|
}
|
|
484
636
|
|
|
485
637
|
/**
|
|
@@ -498,3 +650,25 @@ function findFixedFile(dirPath: string, name: string): RouteFile | undefined {
|
|
|
498
650
|
}
|
|
499
651
|
return undefined;
|
|
500
652
|
}
|
|
653
|
+
|
|
654
|
+
/**
|
|
655
|
+
* Find a file using the configured page extensions (tsx, ts, jsx, js, mdx, etc.).
|
|
656
|
+
* Used for app-root conventions like global-error that aren't per-segment.
|
|
657
|
+
*/
|
|
658
|
+
function findPageExtFile(
|
|
659
|
+
dirPath: string,
|
|
660
|
+
name: string,
|
|
661
|
+
extSet: Set<string>
|
|
662
|
+
): RouteFile | undefined {
|
|
663
|
+
for (const ext of extSet) {
|
|
664
|
+
const fullPath = join(dirPath, `${name}.${ext}`);
|
|
665
|
+
try {
|
|
666
|
+
if (statSync(fullPath).isFile()) {
|
|
667
|
+
return { filePath: fullPath, extension: ext };
|
|
668
|
+
}
|
|
669
|
+
} catch {
|
|
670
|
+
// File doesn't exist
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
return undefined;
|
|
674
|
+
}
|