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