@timber-js/app 0.2.0-alpha.20 → 0.2.0-alpha.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/agent-skill.md +346 -0
- package/dist/_chunks/actions-d1hCqnU3.js +345 -0
- package/dist/_chunks/actions-d1hCqnU3.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js +135 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +1 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js +370 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/cache-api-ByagcC-J.js +1149 -0
- package/dist/_chunks/cache-api-ByagcC-J.js.map +1 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
- package/dist/_chunks/chains-Bpb0W4ax.js +412 -0
- package/dist/_chunks/chains-Bpb0W4ax.js.map +1 -0
- package/dist/_chunks/cli-check-D6VolrDV.js +293 -0
- package/dist/_chunks/cli-check-D6VolrDV.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js +299 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js.map +1 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js +1290 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js +893 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js +1050 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js +458 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js +150 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js.map +1 -0
- package/dist/_chunks/logger-uLBuGKDI.js +1484 -0
- package/dist/_chunks/logger-uLBuGKDI.js.map +1 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js +135 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js +321 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js +101 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-AiazgH_f.js +1771 -0
- package/dist/_chunks/scanner-AiazgH_f.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-D9_89u34.js +34 -0
- package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
- package/dist/_chunks/segment-keys-lqtdookO.js +256 -0
- package/dist/_chunks/segment-keys-lqtdookO.js.map +1 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-D6T6Y3ef.js} +3 -31
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
- package/dist/_chunks/state-FippDgxN.js +52 -0
- package/dist/_chunks/state-FippDgxN.js.map +1 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +1 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js +226 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -0
- package/dist/_chunks/walkers-B6XUtmqK.js +144 -0
- package/dist/_chunks/walkers-B6XUtmqK.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +74 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +200 -22
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +17 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +66 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +457 -300
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +62 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +28 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +150 -0
- package/dist/analyze/classify.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.d.ts +17 -0
- package/dist/analyze/crawl-entry.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.js +313 -0
- package/dist/analyze/crawl-entry.js.map +1 -0
- package/dist/analyze/crawl.d.ts +134 -0
- package/dist/analyze/crawl.d.ts.map +1 -0
- package/dist/analyze/graph-cache.d.ts +104 -0
- package/dist/analyze/graph-cache.d.ts.map +1 -0
- package/dist/analyze/graph-command.d.ts +43 -0
- package/dist/analyze/graph-command.d.ts.map +1 -0
- package/dist/analyze/graph-command.js +472 -0
- package/dist/analyze/graph-command.js.map +1 -0
- package/dist/analyze/live-graph.d.ts +81 -0
- package/dist/analyze/live-graph.d.ts.map +1 -0
- package/dist/analyze/poison-rules.d.ts +72 -0
- package/dist/analyze/poison-rules.d.ts.map +1 -0
- package/dist/analyze/poison-scan.d.ts +48 -0
- package/dist/analyze/poison-scan.d.ts.map +1 -0
- package/dist/analyze/scan.d.ts +73 -0
- package/dist/analyze/scan.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +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 +163 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +75 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +175 -47
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +44 -0
- package/dist/client/browser-entry/action-queue.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +63 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +46 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +66 -6
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +323 -1148
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +818 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +63 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +98 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +51 -31
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +98 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +187 -0
- package/dist/client/navigation-transition.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +44 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +130 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +87 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +272 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +104 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +161 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +29 -7
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +19 -8
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +13 -11
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +2 -2
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +322 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +46 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +112 -8
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +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 +10461 -14176
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +276 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +47 -10
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/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/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +39 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +218 -21
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +26 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +61 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen-write.d.ts +51 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +8 -3
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/convention-lint.d.ts +55 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +72 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +13 -7
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception-overlap.d.ts +35 -0
- package/dist/routing/interception-overlap.d.ts.map +1 -0
- package/dist/routing/interception.d.ts +234 -10
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +105 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +26 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +14 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +114 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/segment-keys.d.ts +118 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/types.d.ts +74 -26
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +57 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +14 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- package/dist/schema-bridge.d.ts +145 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +262 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +3 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +179 -360
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +81 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/serialize-equal.d.ts +9 -0
- package/dist/search-params/serialize-equal.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +76 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/server/access-gate.d.ts +98 -10
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +39 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +29 -35
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +117 -13
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +25 -30
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/compress.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csp-nonce.d.ts +45 -0
- package/dist/server/csp-nonce.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +253 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +20 -9
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +101 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +45 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/html-injector-core.d.ts +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +18 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2922
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4034 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +71 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +78 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +77 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +59 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +7 -1
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +153 -20
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +63 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +52 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +79 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +129 -45
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +26 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +111 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +40 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +38 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +59 -42
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +40 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +26 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +33 -3
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +37 -5
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +130 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/skippable-prefix.d.ts +29 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +137 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts +54 -0
- package/dist/server/slot-subtree-contain.d.ts.map +1 -0
- package/dist/server/ssr-bridge-types.d.ts +160 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +1 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +69 -22
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +93 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +44 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +112 -0
- package/dist/server/static-generator.d.ts.map +1 -0
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +26 -15
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +46 -11
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +88 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +17 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +109 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +16 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +52 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/dist/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- package/dist/shims/navigation.d.ts +10 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +236 -0
- package/docs/api/31-api-client.mdx +167 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +329 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +192 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +252 -0
- package/docs/learn/11-middleware.mdx +158 -0
- package/docs/learn/12-error-handling.mdx +188 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +117 -30
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +747 -130
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +249 -426
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +274 -0
- package/src/adapters/types.ts +28 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +258 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +332 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +162 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +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 +75 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +69 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +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 +507 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +262 -55
- package/src/client/browser-dev.ts +157 -2
- package/src/client/browser-entry/action-dispatch.ts +197 -0
- package/src/client/browser-entry/action-queue.ts +90 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +148 -0
- package/src/client/browser-entry/index.ts +131 -0
- package/src/client/browser-entry/post-hydration.ts +123 -0
- package/src/client/browser-entry/router-init.ts +418 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/deny-last-resort.tsx +54 -0
- package/src/client/error-boundary.tsx +316 -40
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +81 -10
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +439 -151
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +347 -0
- package/src/client/navigation-commit.ts +295 -0
- package/src/client/navigation-context.ts +67 -98
- package/src/client/navigation-root.tsx +224 -0
- package/src/client/navigation-transition.ts +327 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +72 -0
- package/src/client/router-effects.ts +228 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +490 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +294 -0
- package/src/client/router.ts +435 -421
- package/src/client/rsc-fetch.ts +512 -73
- package/src/client/segment-cache.ts +327 -40
- 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 +30 -9
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +29 -15
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +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 +6 -3
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +322 -0
- package/src/config-validation.ts +347 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +185 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +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 +486 -377
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +503 -0
- package/src/plugins/adapter-build.ts +229 -7
- package/src/plugins/build-manifest.ts +201 -26
- package/src/plugins/build-report.ts +259 -47
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +369 -96
- package/src/plugins/entries.ts +141 -16
- package/src/plugins/fonts.ts +234 -659
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +107 -35
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +320 -0
- package/src/plugins/request-dep/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +273 -277
- package/src/plugins/server-bundle.ts +99 -14
- package/src/plugins/shims.ts +259 -97
- package/src/plugins/static-build.ts +708 -66
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +141 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +623 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +393 -219
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +75 -26
- package/src/routing/walkers.ts +98 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +19 -0
- package/src/schema-bridge.ts +380 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +194 -56
- package/src/server/action-client.ts +122 -31
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +256 -56
- package/src/server/actions.ts +112 -68
- package/src/server/als-registry.ts +160 -21
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +33 -57
- package/src/server/canonicalize.ts +6 -3
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +115 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csp-nonce.ts +70 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +533 -0
- package/src/server/deny-renderer.ts +213 -112
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +181 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +2 -2
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +272 -255
- package/src/server/index.ts +40 -192
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +173 -0
- package/src/server/logger.ts +73 -37
- package/src/server/metadata-collector.ts +174 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +23 -2
- package/src/server/middleware-runner.ts +32 -5
- package/src/server/node-stream-transforms.ts +323 -0
- package/src/server/nuqs-ssr-provider.tsx +8 -7
- package/src/server/param-coercion.ts +198 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +218 -0
- package/src/server/pipeline-phases.ts +606 -0
- package/src/server/pipeline.ts +324 -384
- package/src/server/port-resolution.ts +53 -0
- package/src/server/prebuilt/cache-key.ts +299 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +122 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +202 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +122 -0
- package/src/server/prebuilt-builder.ts +804 -0
- package/src/server/prebuilt-runtime.ts +817 -0
- package/src/server/primitives.ts +245 -97
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +35 -0
- package/src/server/request-context.ts +244 -334
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +508 -355
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +40 -13
- package/src/server/route-matcher.ts +165 -272
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +174 -0
- package/src/server/rsc-entry/api-handler.ts +78 -34
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +373 -95
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +370 -331
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +209 -55
- package/src/server/rsc-entry/rsc-stream.ts +151 -26
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +311 -60
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +1 -1
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +172 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +707 -300
- package/src/server/slot-subtree-contain.ts +255 -0
- package/src/server/ssr-bridge-types.ts +165 -0
- package/src/server/ssr-entry.ts +230 -85
- package/src/server/ssr-render.ts +357 -85
- package/src/server/ssr-wrappers.tsx +162 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +715 -0
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +107 -148
- package/src/server/stream-utils.ts +292 -0
- package/src/server/tracing.ts +128 -16
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +95 -10
- package/src/server/utils/element-type.ts +88 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +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/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/param-value.ts +281 -0
- package/src/shared/payload-root.ts +152 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +16 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +59 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +109 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shared/status-reason-phrase.ts +61 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +36 -32
- package/src/shims/navigation-rsc.ts +47 -0
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js +0 -109
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/error-boundary.js.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts +0 -92
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/content/index.d.ts +0 -11
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -2
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/tree-builder.d.ts +0 -126
- package/dist/server/tree-builder.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/client/use-params.ts +0 -141
- package/src/content/index.ts +0 -13
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/search-params/registry.ts +0 -31
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -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
|
@@ -0,0 +1,893 @@
|
|
|
1
|
+
import { h as swallow } from "./logger-uLBuGKDI.js";
|
|
2
|
+
import { n as generateRouteMap, t as readFileCached } from "./file-cache-Dw6BJPG7.js";
|
|
3
|
+
import { parseAst } from "vite";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
6
|
+
import { styleText } from "node:util";
|
|
7
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
8
|
+
//#region src/server/utils/mdx-file.ts
|
|
9
|
+
/**
|
|
10
|
+
* MDX file-path detection shared by error/deny rendering paths.
|
|
11
|
+
*
|
|
12
|
+
* MDX status and error files are server components — they cannot be passed
|
|
13
|
+
* as function props across the RSC→client boundary (e.g. to
|
|
14
|
+
* TimberErrorBoundary or ErrorReconstituter) and must be pre-rendered as
|
|
15
|
+
* elements with plain props instead.
|
|
16
|
+
*
|
|
17
|
+
* See design/10-error-handling.md §"Status-Code File Variants".
|
|
18
|
+
*/
|
|
19
|
+
/** MDX/markdown extensions (dotted) — the canonical list, also used by plugins/mdx.ts. */
|
|
20
|
+
var MDX_EXTENSIONS = /* @__PURE__ */ new Set([".mdx", ".md"]);
|
|
21
|
+
/**
|
|
22
|
+
* Check if a file path ends with an MDX/markdown extension.
|
|
23
|
+
*/
|
|
24
|
+
function isMdxFilePath(filePath) {
|
|
25
|
+
const dotIndex = filePath.lastIndexOf(".");
|
|
26
|
+
if (dotIndex === -1) return false;
|
|
27
|
+
return MDX_EXTENSIONS.has(filePath.slice(dotIndex));
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/routing/segment-codegen.ts
|
|
31
|
+
/**
|
|
32
|
+
* $segment type generation and directory-to-route mapping.
|
|
33
|
+
*
|
|
34
|
+
* Generates per-route $segment.d.ts files in .timber/types/ that mirror
|
|
35
|
+
* the app/ directory structure. TypeScript's rootDirs feature makes these
|
|
36
|
+
* importable as './$segment' from route files.
|
|
37
|
+
*
|
|
38
|
+
* Design doc: design/41-global-params.md §The $segment Module
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Build a map of absolute filesystem directory → segment info.
|
|
42
|
+
* Used by resolveId to map a $segment import's importer to the correct route,
|
|
43
|
+
* and by writeSegmentTypes to generate per-route $segment.d.ts files.
|
|
44
|
+
*
|
|
45
|
+
* Walks every segment (not just leaves) so layouts and middleware
|
|
46
|
+
* at any depth can import $segment.
|
|
47
|
+
*/
|
|
48
|
+
function buildDirToRouteMap(tree, appDir) {
|
|
49
|
+
const map = /* @__PURE__ */ new Map();
|
|
50
|
+
function walk(node, fsPath, treePath) {
|
|
51
|
+
map.set(fsPath, {
|
|
52
|
+
route: node.urlPath || "/",
|
|
53
|
+
segmentPath: treePath || "/"
|
|
54
|
+
});
|
|
55
|
+
for (const child of node.children) walk(child, join(fsPath, child.segmentName), `${treePath}/${child.segmentName}`);
|
|
56
|
+
for (const [slotName, slotNode] of Object.entries(node.slots)) walk(slotNode, join(fsPath, `@${slotName}`), `${treePath}/@${slotName}`);
|
|
57
|
+
}
|
|
58
|
+
walk(tree.root, appDir, "");
|
|
59
|
+
return map;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Generate the full $segment.d.ts content for a segment.
|
|
63
|
+
*/
|
|
64
|
+
function generateSegmentDts(info) {
|
|
65
|
+
return [
|
|
66
|
+
`export const ROUTE: '${info.route}';`,
|
|
67
|
+
`export const SEGMENT_PATH: '${info.segmentPath}';`,
|
|
68
|
+
""
|
|
69
|
+
].join("\n");
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate per-route $segment.d.ts files in .timber/types/ mirroring
|
|
73
|
+
* the app/ directory structure. These files are importable via TypeScript's
|
|
74
|
+
* rootDirs feature.
|
|
75
|
+
*/
|
|
76
|
+
async function writeSegmentTypes(routeTree, appDir, root) {
|
|
77
|
+
const relative = appDir.slice(root.length + 1);
|
|
78
|
+
const typesBase = join(root, ".timber", "types", relative);
|
|
79
|
+
const map = buildDirToRouteMap(routeTree, appDir);
|
|
80
|
+
const writes = [];
|
|
81
|
+
for (const [fsDir, info] of map) {
|
|
82
|
+
const relDir = fsDir.slice(appDir.length);
|
|
83
|
+
const segmentDir = join(typesBase, relDir);
|
|
84
|
+
const segmentFile = join(segmentDir, "$segment.d.ts");
|
|
85
|
+
const content = generateSegmentDts(info);
|
|
86
|
+
writes.push(mkdir(segmentDir, { recursive: true }).then(() => writeFile(segmentFile, content, "utf-8")));
|
|
87
|
+
}
|
|
88
|
+
await Promise.all(writes);
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
//#region src/routing/codegen-write.ts
|
|
92
|
+
/**
|
|
93
|
+
* Route-map codegen writer.
|
|
94
|
+
*
|
|
95
|
+
* Materializes the generated route types on disk: `.timber/timber-routes.d.ts`,
|
|
96
|
+
* `.timber/segment-types.d.ts` (via `writeSegmentTypes`), and the root
|
|
97
|
+
* `timber-env.d.ts` that references them.
|
|
98
|
+
*
|
|
99
|
+
* Lives outside `plugins/routing.ts` because it has two callers with two
|
|
100
|
+
* different failure policies: the dev/build plugin starts the write off the hot
|
|
101
|
+
* path and logs failures, while `timber check` awaits it and treats a failure as
|
|
102
|
+
* fatal — a type check run against absent or stale route types reports errors
|
|
103
|
+
* about code that is fine. One implementation, two policies, so the bytes on
|
|
104
|
+
* disk cannot drift between the two commands.
|
|
105
|
+
*
|
|
106
|
+
* Design docs: 09-typescript.md §"Typed Routes", 18-build-system.md
|
|
107
|
+
*/
|
|
108
|
+
/**
|
|
109
|
+
* Path (relative to the project root) of the generated route map declaration
|
|
110
|
+
* file, and the name of the root file that `/// <reference>`s it.
|
|
111
|
+
*
|
|
112
|
+
* Exported because `timber check` has to answer whether the user's tsconfig
|
|
113
|
+
* pulls these into the program — a question about these exact paths. It derives
|
|
114
|
+
* them from here rather than restating them, so a rename cannot leave the check
|
|
115
|
+
* looking for a file nothing writes.
|
|
116
|
+
*/
|
|
117
|
+
var CODEGEN_OUTPUT = ".timber/timber-routes.d.ts";
|
|
118
|
+
/** Root-level file that references the generated declarations. */
|
|
119
|
+
var ENV_DTS_FILENAME = "timber-env.d.ts";
|
|
120
|
+
/**
|
|
121
|
+
* Content of the timber-env.d.ts file written to the project root.
|
|
122
|
+
*
|
|
123
|
+
* Uses a triple-slash reference so TypeScript auto-discovers the generated
|
|
124
|
+
* route map without the user needing to edit tsconfig.json — same pattern
|
|
125
|
+
* as Next.js's next-env.d.ts.
|
|
126
|
+
*
|
|
127
|
+
* Also references `vite/client` so side-effect imports like
|
|
128
|
+
* `import './globals.css'` type-check without ts(2882), and so
|
|
129
|
+
* `import.meta.env`, `import.meta.hot`, `import.meta.glob`, asset
|
|
130
|
+
* imports (`*.png`, `*.svg`, …), CSS modules, and `?url`/`?raw`/
|
|
131
|
+
* `?inline` query variants all resolve without the user editing
|
|
132
|
+
* tsconfig.json themselves. Next.js's next-env.d.ts plays the same
|
|
133
|
+
* role via `next/types/global`.
|
|
134
|
+
*
|
|
135
|
+
* `vite` is a peer dep of `@timber-js/app`, so the reference always
|
|
136
|
+
* resolves in a correctly-installed project.
|
|
137
|
+
*/
|
|
138
|
+
var TIMBER_ENV_DTS = [
|
|
139
|
+
"// This file is auto-generated by timber.js. Do not edit.",
|
|
140
|
+
"// It ensures TypeScript picks up the generated route types and",
|
|
141
|
+
"// Vite-provided ambient types (CSS, assets, import.meta.env, HMR).",
|
|
142
|
+
"/* eslint-disable @typescript-eslint/triple-slash-reference */",
|
|
143
|
+
"/// <reference path=\".timber/timber-routes.d.ts\" />",
|
|
144
|
+
"/// <reference types=\"vite/client\" />",
|
|
145
|
+
"/// <reference types=\"react/canary\" />",
|
|
146
|
+
"/// <reference types=\"react-dom/canary\" />",
|
|
147
|
+
""
|
|
148
|
+
].join("\n");
|
|
149
|
+
/**
|
|
150
|
+
* Codegen writes that have been started but have not yet landed on disk.
|
|
151
|
+
*
|
|
152
|
+
* `writeRouteCodegen` is deliberately unawaited on the dev/build hot path,
|
|
153
|
+
* which leaves that caller no way to know the files exist yet. Anything that
|
|
154
|
+
* tears down the project root — a build process exiting, a test removing its
|
|
155
|
+
* temp root — then races the writes: `rmSync` empties a directory that a
|
|
156
|
+
* pending `mkdir` immediately recreates, and the removal fails with ENOTEMPTY.
|
|
157
|
+
*
|
|
158
|
+
* Every started write registers here and deregisters when it settles, so
|
|
159
|
+
* `flushCodegenWrites()` can await them instead of guessing at a delay.
|
|
160
|
+
*/
|
|
161
|
+
var pendingCodegenWrites = /* @__PURE__ */ new Set();
|
|
162
|
+
/**
|
|
163
|
+
* Resolve once every codegen write started so far has landed on disk.
|
|
164
|
+
*
|
|
165
|
+
* Safe to call at any time and from anywhere — writes are tracked per process,
|
|
166
|
+
* not per plugin instance, so a caller does not need a handle on the plugin
|
|
167
|
+
* that started them. Never rejects: the tracked copy of each write has its
|
|
168
|
+
* rejection swallowed, so a failing write cannot turn a teardown barrier into
|
|
169
|
+
* an unhandled rejection. Callers that care about failure await the promise
|
|
170
|
+
* `writeRouteCodegen` returned instead.
|
|
171
|
+
*/
|
|
172
|
+
async function flushCodegenWrites() {
|
|
173
|
+
while (pendingCodegenWrites.size > 0) {
|
|
174
|
+
const inFlight = [...pendingCodegenWrites];
|
|
175
|
+
await Promise.all(inFlight);
|
|
176
|
+
for (const write of inFlight) pendingCodegenWrites.delete(write);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Write the generated route map, segment types, and the timber-env.d.ts
|
|
181
|
+
* reference file for `tree`.
|
|
182
|
+
*
|
|
183
|
+
* Returns a promise that **rejects** if any write fails. The dev/build plugin
|
|
184
|
+
* does not await it (types are a developer convenience there, not a runtime
|
|
185
|
+
* dependency) and logs instead; `timber check` awaits it and fails the command.
|
|
186
|
+
* Either way the write is registered with `flushCodegenWrites()`.
|
|
187
|
+
*/
|
|
188
|
+
function writeRouteCodegen(tree, appDir, root) {
|
|
189
|
+
const timberDir = join(root, ".timber");
|
|
190
|
+
const content = generateRouteMap(tree, {
|
|
191
|
+
appDir,
|
|
192
|
+
outputDir: timberDir
|
|
193
|
+
});
|
|
194
|
+
const routesPath = join(root, CODEGEN_OUTPUT);
|
|
195
|
+
const envPath = join(root, ENV_DTS_FILENAME);
|
|
196
|
+
const done = mkdir(timberDir, { recursive: true }).then(() => Promise.all([
|
|
197
|
+
writeFile(routesPath, content, "utf-8"),
|
|
198
|
+
writeFile(envPath, TIMBER_ENV_DTS, "utf-8"),
|
|
199
|
+
writeSegmentTypes(tree, appDir, root)
|
|
200
|
+
])).then(() => void 0);
|
|
201
|
+
const tracked = done.catch(() => void 0);
|
|
202
|
+
pendingCodegenWrites.add(tracked);
|
|
203
|
+
tracked.finally(() => pendingCodegenWrites.delete(tracked));
|
|
204
|
+
return done;
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
//#region src/routing/export-detect.ts
|
|
208
|
+
/**
|
|
209
|
+
* AST-based export detection for route files.
|
|
210
|
+
*
|
|
211
|
+
* Uses Vite's `parseAst` (backed by oxc) to precisely detect named and
|
|
212
|
+
* default exports, replacing the regex-based approach that was fragile
|
|
213
|
+
* with TypeScript syntax (type exports, `as` aliases, comments, etc.).
|
|
214
|
+
*/
|
|
215
|
+
function tryParse(source) {
|
|
216
|
+
try {
|
|
217
|
+
return parseAst(source, { lang: "tsx" });
|
|
218
|
+
} catch {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Collect all named export identifiers from a parsed program.
|
|
224
|
+
* Handles: `export function X`, `export const X`, `export { X }`,
|
|
225
|
+
* `export { X } from '...'`, `export { Y as X }`.
|
|
226
|
+
*/
|
|
227
|
+
function collectNamedExports(program) {
|
|
228
|
+
const names = /* @__PURE__ */ new Set();
|
|
229
|
+
for (const stmt of program.body) {
|
|
230
|
+
if (stmt.type !== "ExportNamedDeclaration") continue;
|
|
231
|
+
if (stmt.exportKind === "type") continue;
|
|
232
|
+
if (stmt.declaration) {
|
|
233
|
+
if (stmt.declaration.id?.name) names.add(stmt.declaration.id.name);
|
|
234
|
+
if (stmt.declaration.declarations) {
|
|
235
|
+
for (const decl of stmt.declaration.declarations) if (decl.id?.name) names.add(decl.id.name);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (stmt.specifiers) for (const spec of stmt.specifiers) {
|
|
239
|
+
if (spec.exportKind === "type") continue;
|
|
240
|
+
if (spec.exported?.name && spec.exported.name !== "default") names.add(spec.exported.name);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return names;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* The specifier exporting a *runtime* default from this statement, if any.
|
|
247
|
+
*
|
|
248
|
+
* Type-only exports erase, so they are not default exports at runtime — and
|
|
249
|
+
* TypeScript spells that two ways, on two different nodes: `export type { X as
|
|
250
|
+
* default }` marks the **statement**, `export { type X as default }` marks the
|
|
251
|
+
* **specifier**. Both have to be checked, or a type alias reads as a component:
|
|
252
|
+
* a status file whose only default is a type has nothing for the error boundary
|
|
253
|
+
* to receive (the renderer's `mod?.default` skips it), so treating it as one
|
|
254
|
+
* would fail a build over a file that cannot break anything.
|
|
255
|
+
*
|
|
256
|
+
* One implementation because two callers must agree on what "has a default
|
|
257
|
+
* export" means: `hasDefaultExport` decides whether to warn that a page has
|
|
258
|
+
* none, and `fileDefaultExportIsLocalValue` decides whether to fail the build.
|
|
259
|
+
*/
|
|
260
|
+
function defaultSpecifier(stmt) {
|
|
261
|
+
if (stmt.type !== "ExportNamedDeclaration" || !stmt.specifiers) return null;
|
|
262
|
+
if (stmt.exportKind === "type") return null;
|
|
263
|
+
for (const spec of stmt.specifiers) {
|
|
264
|
+
if (spec.exportKind === "type") continue;
|
|
265
|
+
if (spec.exported?.name === "default") return spec;
|
|
266
|
+
}
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Check whether a program has a default export.
|
|
271
|
+
* Handles: `export default ...`, `export { X as default }`,
|
|
272
|
+
* `export { default } from '...'`. Type-only defaults do not count —
|
|
273
|
+
* see `defaultSpecifier`.
|
|
274
|
+
*/
|
|
275
|
+
function hasDefaultExport(program) {
|
|
276
|
+
for (const stmt of program.body) {
|
|
277
|
+
if (stmt.type === "ExportDefaultDeclaration") return true;
|
|
278
|
+
if (defaultSpecifier(stmt)) return true;
|
|
279
|
+
}
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Check whether a program has any bare `export * from '...'` declarations.
|
|
284
|
+
* Excludes `export * as X from '...'` (namespace re-exports) since those
|
|
285
|
+
* create a namespace object, not individual top-level exports.
|
|
286
|
+
*/
|
|
287
|
+
function hasStarExport(program) {
|
|
288
|
+
return program.body.some((stmt) => stmt.type === "ExportAllDeclaration" && !stmt.exported && stmt.exportKind !== "type");
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Check if a file has any of the given named exports.
|
|
292
|
+
* Returns the set of matching export names.
|
|
293
|
+
*/
|
|
294
|
+
function fileHasAnyExport(filePath, exportNames) {
|
|
295
|
+
const matches = /* @__PURE__ */ new Set();
|
|
296
|
+
try {
|
|
297
|
+
const program = tryParse(readFileCached(filePath));
|
|
298
|
+
if (!program) return matches;
|
|
299
|
+
const exports = collectNamedExports(program);
|
|
300
|
+
for (const name of exportNames) if (exports.has(name)) matches.add(name);
|
|
301
|
+
} catch {}
|
|
302
|
+
return matches;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Check if a file has a default export.
|
|
306
|
+
* Returns false if the file doesn't exist or can't be parsed.
|
|
307
|
+
*/
|
|
308
|
+
function fileHasDefaultExport(filePath) {
|
|
309
|
+
if (!existsSync(filePath)) return false;
|
|
310
|
+
try {
|
|
311
|
+
const program = tryParse(readFileCached(filePath));
|
|
312
|
+
if (!program) return false;
|
|
313
|
+
return hasDefaultExport(program);
|
|
314
|
+
} catch {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/** Node types whose value is unambiguously constructed by this module. */
|
|
319
|
+
var FUNCTION_LIKE = /* @__PURE__ */ new Set([
|
|
320
|
+
"FunctionDeclaration",
|
|
321
|
+
"FunctionExpression",
|
|
322
|
+
"ArrowFunctionExpression",
|
|
323
|
+
"ClassDeclaration",
|
|
324
|
+
"ClassExpression"
|
|
325
|
+
]);
|
|
326
|
+
/**
|
|
327
|
+
* Expression wrappers that erase at runtime and so cannot change where a value
|
|
328
|
+
* was constructed: `X as T`, `X satisfies T`, `<T>X`, `X!`, `X<T>`, `(X)`.
|
|
329
|
+
*/
|
|
330
|
+
var TRANSPARENT_WRAPPERS = /* @__PURE__ */ new Set([
|
|
331
|
+
"TSAsExpression",
|
|
332
|
+
"TSSatisfiesExpression",
|
|
333
|
+
"TSTypeAssertion",
|
|
334
|
+
"TSNonNullExpression",
|
|
335
|
+
"TSInstantiationExpression",
|
|
336
|
+
"ParenthesizedExpression"
|
|
337
|
+
]);
|
|
338
|
+
/**
|
|
339
|
+
* Strip runtime-transparent wrappers so the node underneath can be classified.
|
|
340
|
+
*
|
|
341
|
+
* Without this, `(() => <h1 />) satisfies React.FC` reads as a
|
|
342
|
+
* `TSSatisfiesExpression` rather than the arrow function it compiles to, and a
|
|
343
|
+
* provably-local component is misread as one whose origin cannot be
|
|
344
|
+
* determined — turning a build error into a warning.
|
|
345
|
+
*/
|
|
346
|
+
function unwrapTransparent(node) {
|
|
347
|
+
let current = node;
|
|
348
|
+
while (TRANSPARENT_WRAPPERS.has(current.type) && current.expression) current = current.expression;
|
|
349
|
+
return current;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Whether `name` is bound at module top level to a function or class written
|
|
353
|
+
* in this file. An imported binding can never match: imports are
|
|
354
|
+
* `ImportDeclaration` specifiers, not function/class/variable declarations,
|
|
355
|
+
* and a module-level name cannot be both.
|
|
356
|
+
*/
|
|
357
|
+
function bindsLocalFunction(program, name) {
|
|
358
|
+
for (const stmt of program.body) {
|
|
359
|
+
const decl = stmt.type === "ExportNamedDeclaration" ? stmt.declaration : stmt;
|
|
360
|
+
if (!decl) continue;
|
|
361
|
+
if ((decl.type === "FunctionDeclaration" || decl.type === "ClassDeclaration") && decl.id?.name === name) return true;
|
|
362
|
+
if (decl.type === "VariableDeclaration") {
|
|
363
|
+
for (const d of decl.declarations ?? []) if (d.id?.name === name && d.init && FUNCTION_LIKE.has(unwrapTransparent(d.init).type)) return true;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Whether the default export is *provably* a value constructed by this module:
|
|
370
|
+
* `export default function/class/() => {}`, or a name bound to a function or
|
|
371
|
+
* class declared here — whether it leaves via `export default Name` or
|
|
372
|
+
* `export { Name as default }`. Both spellings are the same fact about where
|
|
373
|
+
* the value was built, so both must answer the same way.
|
|
374
|
+
*
|
|
375
|
+
* This is the sound half of "is this a server component?". A file with no
|
|
376
|
+
* `'use client'` directive whose default export is built here is a server
|
|
377
|
+
* component, full stop. Everything else — `export { default } from
|
|
378
|
+
* './client-thing'`, `export default Imported`, `export default memo(X)`,
|
|
379
|
+
* an unparseable file — returns false, because the exported value may have
|
|
380
|
+
* been minted in a module that *does* carry the directive. Callers must not
|
|
381
|
+
* infer "server component" from a missing directive alone.
|
|
382
|
+
*/
|
|
383
|
+
function fileDefaultExportIsLocalValue(filePath) {
|
|
384
|
+
if (!existsSync(filePath)) return false;
|
|
385
|
+
try {
|
|
386
|
+
const program = tryParse(readFileCached(filePath));
|
|
387
|
+
if (!program) return false;
|
|
388
|
+
for (const stmt of program.body) {
|
|
389
|
+
if (stmt.type === "ExportDefaultDeclaration") {
|
|
390
|
+
const decl = stmt.declaration && unwrapTransparent(stmt.declaration);
|
|
391
|
+
if (!decl) return false;
|
|
392
|
+
if (FUNCTION_LIKE.has(decl.type)) return true;
|
|
393
|
+
if (decl.type === "Identifier" && decl.name) return bindsLocalFunction(program, decl.name);
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
const spec = defaultSpecifier(stmt);
|
|
397
|
+
if (spec) {
|
|
398
|
+
if (stmt.source) return false;
|
|
399
|
+
return spec.local?.name ? bindsLocalFunction(program, spec.local.name) : false;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return false;
|
|
403
|
+
} catch {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Check if a file has any `export * from '...'` declarations.
|
|
409
|
+
* Returns false if the file doesn't exist or can't be parsed.
|
|
410
|
+
*/
|
|
411
|
+
function fileHasStarExport(filePath) {
|
|
412
|
+
if (!existsSync(filePath)) return false;
|
|
413
|
+
try {
|
|
414
|
+
const program = tryParse(readFileCached(filePath));
|
|
415
|
+
if (!program) return false;
|
|
416
|
+
return hasStarExport(program);
|
|
417
|
+
} catch {
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
function extractLiteralValue(node) {
|
|
422
|
+
if (!node) return void 0;
|
|
423
|
+
const n = node;
|
|
424
|
+
if (n.type === "Literal") return n.value;
|
|
425
|
+
if (n.type === "UnaryExpression" && n.operator === "-" && n.argument?.type === "Literal") return -n.argument.value;
|
|
426
|
+
if (n.type === "ArrayExpression") {
|
|
427
|
+
const elements = n.elements;
|
|
428
|
+
if (!elements) return void 0;
|
|
429
|
+
const result = [];
|
|
430
|
+
for (const el of elements) {
|
|
431
|
+
const v = extractLiteralValue(el);
|
|
432
|
+
if (v === void 0) return void 0;
|
|
433
|
+
result.push(v);
|
|
434
|
+
}
|
|
435
|
+
return result;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
function extractObjectLiteral(node) {
|
|
439
|
+
if (node.type !== "ObjectExpression") return void 0;
|
|
440
|
+
const props = node.properties;
|
|
441
|
+
if (!props) return void 0;
|
|
442
|
+
const result = {};
|
|
443
|
+
for (const prop of props) {
|
|
444
|
+
const p = prop;
|
|
445
|
+
if (p.type === "SpreadElement") return void 0;
|
|
446
|
+
if (p.type !== "Property" || p.computed) return void 0;
|
|
447
|
+
const key = p.key?.type === "Identifier" ? p.key.name : p.key?.type === "Literal" ? String(p.key.value) : void 0;
|
|
448
|
+
if (!key) return void 0;
|
|
449
|
+
const value = extractLiteralValue(p.value);
|
|
450
|
+
if (value === void 0) return void 0;
|
|
451
|
+
result[key] = value;
|
|
452
|
+
}
|
|
453
|
+
return result;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Extract the value of `export const prerender` from a file.
|
|
457
|
+
* Returns undefined if the file doesn't export `prerender` or can't be parsed.
|
|
458
|
+
*
|
|
459
|
+
* Supports:
|
|
460
|
+
* export const prerender = true;
|
|
461
|
+
* export const prerender = false;
|
|
462
|
+
* export const prerender = { ttl: 3600, tags: ['docs'] };
|
|
463
|
+
*/
|
|
464
|
+
function getPrerenderExport(filePath) {
|
|
465
|
+
if (!existsSync(filePath)) return void 0;
|
|
466
|
+
try {
|
|
467
|
+
const program = tryParse(readFileCached(filePath));
|
|
468
|
+
if (!program) return void 0;
|
|
469
|
+
for (const stmt of program.body) {
|
|
470
|
+
if (stmt.type !== "ExportNamedDeclaration") continue;
|
|
471
|
+
if (stmt.exportKind === "type") continue;
|
|
472
|
+
if (!stmt.declaration) continue;
|
|
473
|
+
const decl = stmt.declaration;
|
|
474
|
+
if (decl.type !== "VariableDeclaration") continue;
|
|
475
|
+
const declarations = decl.declarations;
|
|
476
|
+
if (!declarations) continue;
|
|
477
|
+
for (const d of declarations) {
|
|
478
|
+
if (d.id?.name !== "prerender" || !d.init) continue;
|
|
479
|
+
const init = d.init;
|
|
480
|
+
if (init.type === "Literal" && typeof init.value === "boolean") return init.value;
|
|
481
|
+
if (init.type === "ObjectExpression") {
|
|
482
|
+
const obj = extractObjectLiteral(init);
|
|
483
|
+
if (!obj) return void 0;
|
|
484
|
+
const result = {};
|
|
485
|
+
if ("ttl" in obj && typeof obj.ttl === "number") result.ttl = obj.ttl;
|
|
486
|
+
if ("tags" in obj && Array.isArray(obj.tags) && obj.tags.every((t) => typeof t === "string")) result.tags = obj.tags;
|
|
487
|
+
return result;
|
|
488
|
+
}
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
return;
|
|
493
|
+
} catch {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Check if a file starts with a specific directive (e.g. "use client").
|
|
499
|
+
* Directives are string literal expression statements at the top of the file.
|
|
500
|
+
*/
|
|
501
|
+
function fileHasDirective(filePath, directive) {
|
|
502
|
+
if (!existsSync(filePath)) return false;
|
|
503
|
+
try {
|
|
504
|
+
const program = tryParse(readFileCached(filePath));
|
|
505
|
+
if (!program) return false;
|
|
506
|
+
for (const stmt of program.body) {
|
|
507
|
+
if (stmt.type !== "ExpressionStatement") break;
|
|
508
|
+
const expr = stmt.expression;
|
|
509
|
+
if (expr?.type !== "Literal" || typeof expr.value !== "string") break;
|
|
510
|
+
if (expr.value === directive) return true;
|
|
511
|
+
}
|
|
512
|
+
return false;
|
|
513
|
+
} catch {
|
|
514
|
+
return false;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
//#endregion
|
|
518
|
+
//#region src/routing/convention-lint.ts
|
|
519
|
+
/**
|
|
520
|
+
* Convention linter — validates common misconfigurations in the route tree.
|
|
521
|
+
*
|
|
522
|
+
* Runs at scan time (build and dev startup). Each check produces a warning
|
|
523
|
+
* with the file path, what's wrong, and what to do about it.
|
|
524
|
+
*
|
|
525
|
+
* Most checks are warnings — they don't block the build. The goal is to catch
|
|
526
|
+
* issues that would otherwise produce cryptic runtime behavior (silent 404s,
|
|
527
|
+
* empty pages, confusing React errors).
|
|
528
|
+
*
|
|
529
|
+
* A check emits `level: 'error'` only when the misconfiguration is *proven*
|
|
530
|
+
* (never inferred from an absence the analysis cannot see through) and fatal
|
|
531
|
+
* to rendering. `plugins/routing.ts` turns those into a thrown build error,
|
|
532
|
+
* so a false positive there refuses a working app — see
|
|
533
|
+
* `classifyClientBoundaryFile` for how that bar is met.
|
|
534
|
+
*
|
|
535
|
+
* Design doc: 07-routing.md, 10-error-handling.md
|
|
536
|
+
*/
|
|
537
|
+
/**
|
|
538
|
+
* Run all convention lint checks on a route tree.
|
|
539
|
+
*
|
|
540
|
+
* Returns an array of warnings. Empty array means everything looks good.
|
|
541
|
+
*/
|
|
542
|
+
function lintConventions(tree, appDir) {
|
|
543
|
+
const warnings = [];
|
|
544
|
+
checkEmptyApp(tree.root, appDir, warnings);
|
|
545
|
+
checkRouteExports(tree.root, warnings);
|
|
546
|
+
checkRootLayout(tree.root, warnings);
|
|
547
|
+
checkDefaultExports(tree.root, warnings);
|
|
548
|
+
checkClientLayouts(tree.root, warnings);
|
|
549
|
+
checkClientBoundaryFiles(tree.root, warnings);
|
|
550
|
+
if (tree.globalError) checkFileUseClientDirective(tree.globalError, "global-error", warnings);
|
|
551
|
+
checkWildcardMdxProps(tree.root, warnings);
|
|
552
|
+
return warnings;
|
|
553
|
+
}
|
|
554
|
+
function checkClientLayouts(node, warnings) {
|
|
555
|
+
if (node.layout && isScriptExtension(node.layout.extension)) try {
|
|
556
|
+
const isClient = fileHasDirective(node.layout.filePath, "use client");
|
|
557
|
+
const isProvablyServer = fileDefaultExportIsLocalValue(node.layout.filePath);
|
|
558
|
+
if (isClient || !isProvablyServer) {
|
|
559
|
+
const certainty = isClient ? `This layout is a client component.` : `Timber cannot prove this layout is a server component because its default export comes from another module or an opaque expression.`;
|
|
560
|
+
warnings.push({
|
|
561
|
+
id: `CLIENT_LAYOUT_NOT_AUTH_BOUNDARY:${node.layout.filePath}`,
|
|
562
|
+
summary: isClient ? `Client layout cannot securely suppress server children: ${node.layout.filePath}` : `Layout may resolve to a client component and cannot be trusted as an auth boundary: ${node.layout.filePath}`,
|
|
563
|
+
details: ` File: ${node.layout.filePath}\n\n ${certainty}\n React Flight resolves server content passed to a client layout before the layout runs in the browser.\n Conditionally omitting children here does not prevent descendant server components from executing or being serialized.\n\n To fix: Put authorization in access.ts or a provably server layout with a locally defined default component, and keep client components inside that boundary.\n`,
|
|
564
|
+
level: "warn"
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
} catch (err) {
|
|
568
|
+
swallow(err, `convention-lint: unreadable layout file ${node.layout.filePath}`);
|
|
569
|
+
}
|
|
570
|
+
for (const child of node.children) checkClientLayouts(child, warnings);
|
|
571
|
+
for (const slot of Object.values(node.slots)) checkClientLayouts(slot, warnings);
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Warn when the app/ directory has no routable files at all.
|
|
575
|
+
*
|
|
576
|
+
* This catches the "I created app/ but didn't add any pages" case where
|
|
577
|
+
* every request silently 404s with no guidance.
|
|
578
|
+
*/
|
|
579
|
+
function checkEmptyApp(root, appDir, warnings) {
|
|
580
|
+
if (hasAnyRoutable(root)) return;
|
|
581
|
+
warnings.push({
|
|
582
|
+
id: "EMPTY_APP",
|
|
583
|
+
summary: "No pages or route handlers found in app/",
|
|
584
|
+
details: ` Directory: ${appDir}\n\n Your app/ directory has no page.tsx or route.ts files.
|
|
585
|
+
Every request will return 404.
|
|
586
|
+
|
|
587
|
+
To fix: Create app/page.tsx with a default export:
|
|
588
|
+
|
|
589
|
+
export default function Home() {
|
|
590
|
+
return <h1>Hello</h1>;
|
|
591
|
+
}
|
|
592
|
+
`,
|
|
593
|
+
level: "warn"
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Check if a segment tree has any routable files (page or route) anywhere.
|
|
598
|
+
*/
|
|
599
|
+
function hasAnyRoutable(node) {
|
|
600
|
+
if (node.page || node.route) return true;
|
|
601
|
+
for (const child of node.children) if (hasAnyRoutable(child)) return true;
|
|
602
|
+
for (const slot of Object.values(node.slots)) if (hasAnyRoutable(slot)) return true;
|
|
603
|
+
return false;
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Check if a segment tree has any page files (not just route handlers).
|
|
607
|
+
* Used by checkRootLayout to avoid false positives for API-only apps (TIM-794).
|
|
608
|
+
* API-only apps (just route.ts handlers) don't need a root layout.
|
|
609
|
+
*/
|
|
610
|
+
function hasAnyPage(node) {
|
|
611
|
+
if (node.page) return true;
|
|
612
|
+
for (const child of node.children) if (hasAnyPage(child)) return true;
|
|
613
|
+
for (const slot of Object.values(node.slots)) if (hasAnyPage(slot)) return true;
|
|
614
|
+
return false;
|
|
615
|
+
}
|
|
616
|
+
/** HTTP methods that route.ts can export. */
|
|
617
|
+
var HTTP_METHODS = [
|
|
618
|
+
"GET",
|
|
619
|
+
"POST",
|
|
620
|
+
"PUT",
|
|
621
|
+
"PATCH",
|
|
622
|
+
"DELETE",
|
|
623
|
+
"HEAD",
|
|
624
|
+
"OPTIONS"
|
|
625
|
+
];
|
|
626
|
+
/**
|
|
627
|
+
* Warn when a route.ts file doesn't appear to export any recognized HTTP methods.
|
|
628
|
+
*
|
|
629
|
+
* Uses AST-based detection via parseAst for precise matching.
|
|
630
|
+
* Falls back silently when the file can't be parsed (syntax errors produce
|
|
631
|
+
* no spurious warning — the TS compiler will catch those).
|
|
632
|
+
*/
|
|
633
|
+
function checkRouteExports(node, warnings) {
|
|
634
|
+
if (node.route) {
|
|
635
|
+
const filePath = node.route.filePath;
|
|
636
|
+
try {
|
|
637
|
+
if (fileHasAnyExport(filePath, HTTP_METHODS).size === 0 && !fileHasStarExport(filePath)) {
|
|
638
|
+
const hint = fileHasDefaultExport(filePath) ? " It looks like you have a default export. route.ts uses named exports\n for HTTP methods (GET, POST, etc.), not a default export.\n" : "";
|
|
639
|
+
warnings.push({
|
|
640
|
+
id: "ROUTE_NO_METHODS",
|
|
641
|
+
summary: `route.ts has no HTTP method exports: ${filePath}`,
|
|
642
|
+
details: ` File: ${filePath}\n\n route.ts files must export named HTTP method handlers.
|
|
643
|
+
Without them, the route matches but returns 405 Method Not Allowed.
|
|
644
|
+
|
|
645
|
+
` + hint + " Example:\n\n export function GET(ctx: RouteContext) {\n return Response.json({ hello: 'world' });\n }\n",
|
|
646
|
+
level: "warn"
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
} catch (err) {
|
|
650
|
+
swallow(err, `convention-lint: unreadable route.ts ${filePath}`);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
for (const child of node.children) checkRouteExports(child, warnings);
|
|
654
|
+
for (const slot of Object.values(node.slots)) checkRouteExports(slot, warnings);
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Warn when the root segment has no layout.tsx.
|
|
658
|
+
*
|
|
659
|
+
* Without a root layout, there's no HTML shell (<html>, <body>).
|
|
660
|
+
* The page will render but may have hydration issues or no proper document structure.
|
|
661
|
+
*/
|
|
662
|
+
function checkRootLayout(root, warnings) {
|
|
663
|
+
if (root.layout) return;
|
|
664
|
+
if (!hasAnyPage(root)) return;
|
|
665
|
+
warnings.push({
|
|
666
|
+
id: "NO_ROOT_LAYOUT",
|
|
667
|
+
summary: "No root layout.tsx found",
|
|
668
|
+
details: " Your app has pages but no root layout.\n Without app/layout.tsx, pages have no <html> or <body> wrapper.\n\n To fix: Create app/layout.tsx:\n\n export default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n );\n }\n",
|
|
669
|
+
level: "warn"
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Warn when page.tsx or layout.tsx files don't have a default export.
|
|
674
|
+
*
|
|
675
|
+
* Without a default export:
|
|
676
|
+
* - page.tsx: the page renders nothing (empty content)
|
|
677
|
+
* - layout.tsx: the layout module loads but has no component to render
|
|
678
|
+
*
|
|
679
|
+
* Uses AST-based detection via parseAst for precise matching. Falls back
|
|
680
|
+
* silently when the file can't be parsed (no spurious warning on syntax errors).
|
|
681
|
+
*/
|
|
682
|
+
function checkDefaultExports(node, warnings) {
|
|
683
|
+
if (node.page && isScriptExtension(node.page.extension)) checkFileDefaultExport(node.page.filePath, "page", warnings);
|
|
684
|
+
if (node.layout && isScriptExtension(node.layout.extension)) checkFileDefaultExport(node.layout.filePath, "layout", warnings);
|
|
685
|
+
for (const child of node.children) checkDefaultExports(child, warnings);
|
|
686
|
+
for (const slot of Object.values(node.slots)) checkDefaultExports(slot, warnings);
|
|
687
|
+
}
|
|
688
|
+
function isScriptExtension(ext) {
|
|
689
|
+
return ext === "tsx" || ext === "ts" || ext === "jsx" || ext === "js";
|
|
690
|
+
}
|
|
691
|
+
function checkFileDefaultExport(filePath, fileType, warnings) {
|
|
692
|
+
try {
|
|
693
|
+
if (!fileHasDefaultExport(filePath)) warnings.push({
|
|
694
|
+
id: `NO_DEFAULT_EXPORT:${filePath}`,
|
|
695
|
+
summary: `${fileType}.tsx has no default export: ${filePath}`,
|
|
696
|
+
details: ` File: ${filePath}\n\n ${fileType}.tsx files must export a default React component.\n Without a default export, the ${fileType === "page" ? "page renders nothing" : "layout has no component to wrap children"}.\n\n To fix: Add a default export:\n\n export default function My${fileType === "page" ? "Page" : "Layout"}(${fileType === "layout" ? "{ children }" : ""}) {\n return ${fileType === "layout" ? "<div>{children}</div>" : "<h1>Hello</h1>"};\n }\n`,
|
|
697
|
+
level: "warn"
|
|
698
|
+
});
|
|
699
|
+
} catch (err) {
|
|
700
|
+
swallow(err, `convention-lint: unreadable ${fileType} file ${filePath}`);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
* Check every file the renderer hands to `TimberErrorBoundary` as a component
|
|
705
|
+
* prop: `error.tsx`, `global-error.tsx`, and the status-code family
|
|
706
|
+
* (`404.tsx`, `4xx.tsx`, `503.tsx`, …).
|
|
707
|
+
*
|
|
708
|
+
* `TimberErrorBoundary` is a client component, so a server component passed as
|
|
709
|
+
* `fallbackComponent` is a function crossing the RSC → client boundary. React
|
|
710
|
+
* Flight refuses to serialize it, and because the boundary wraps the segment's
|
|
711
|
+
* *children*, the failure hits every page under that segment — not just the
|
|
712
|
+
* error path. The raw message ("Functions cannot be passed directly to Client
|
|
713
|
+
* Components") names neither the file nor the fix (TIM-1329).
|
|
714
|
+
*
|
|
715
|
+
* MDX status files are exempt: they are server components by design and the
|
|
716
|
+
* renderer pre-renders them into `fallbackElement` instead. See TIM-503 and
|
|
717
|
+
* `server/error-boundary-wrapper.ts`.
|
|
718
|
+
*
|
|
719
|
+
* `.json` status files never reach React at all, and are not in `statusFiles`.
|
|
720
|
+
*/
|
|
721
|
+
function checkClientBoundaryFiles(node, warnings) {
|
|
722
|
+
if (node.error) checkFileUseClientDirective(node.error, "error", warnings);
|
|
723
|
+
for (const [key, file] of Object.entries(node.statusFiles ?? {})) checkFileUseClientDirective(file, key, warnings);
|
|
724
|
+
for (const child of node.children) checkClientBoundaryFiles(child, warnings);
|
|
725
|
+
for (const slot of Object.values(node.slots)) checkClientBoundaryFiles(slot, warnings);
|
|
726
|
+
}
|
|
727
|
+
function classifyClientBoundaryFile(filePath) {
|
|
728
|
+
if (fileHasDirective(filePath, "use client")) return "client";
|
|
729
|
+
if (fileDefaultExportIsLocalValue(filePath)) return "server";
|
|
730
|
+
return "unknown";
|
|
731
|
+
}
|
|
732
|
+
/** Example component name for the fix snippet, keyed by convention name. */
|
|
733
|
+
function exampleComponentName(convention) {
|
|
734
|
+
if (convention === "global-error") return "GlobalError";
|
|
735
|
+
if (convention === "error") return "ErrorBoundary";
|
|
736
|
+
if (convention === "404") return "NotFound";
|
|
737
|
+
return "StatusPage";
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* @param file the route file (its extension decides whether the check applies)
|
|
741
|
+
* @param convention the convention name — `error`, `global-error`, `404`, `4xx`, …
|
|
742
|
+
*/
|
|
743
|
+
function checkFileUseClientDirective(file, convention, warnings) {
|
|
744
|
+
if (isMdxFilePath(file.filePath)) return;
|
|
745
|
+
const filePath = file.filePath;
|
|
746
|
+
const label = `${convention}.${file.extension}`;
|
|
747
|
+
let verdict;
|
|
748
|
+
try {
|
|
749
|
+
verdict = classifyClientBoundaryFile(filePath);
|
|
750
|
+
} catch (err) {
|
|
751
|
+
swallow(err, `convention-lint: unreadable ${label} file ${filePath}`);
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
if (verdict === "client") return;
|
|
755
|
+
const isError = verdict === "server";
|
|
756
|
+
const name = exampleComponentName(convention);
|
|
757
|
+
const props = convention === "error" || convention === "global-error" ? "{ error, reset }" : "{ status }";
|
|
758
|
+
warnings.push({
|
|
759
|
+
id: `NEEDS_USE_CLIENT:${filePath}`,
|
|
760
|
+
summary: isError ? `${label} is a server component and must be a client component: ${filePath}` : `${label} may be missing 'use client': ${filePath}`,
|
|
761
|
+
details: ` File: ${filePath}\n\n ${label} is handed to timber's error boundary — a client\n component — as a prop. A server component cannot cross that boundary:
|
|
762
|
+
React fails with "Functions cannot be passed directly to Client
|
|
763
|
+
Components", and every page under this segment fails to render.
|
|
764
|
+
|
|
765
|
+
` + (isError ? ` To fix: Add 'use client' as the first line of the file:
|
|
766
|
+
|
|
767
|
+
'use client';
|
|
768
|
+
|
|
769
|
+
export default function ${name}(${props}) {\n return <h1>…</h1>;
|
|
770
|
+
}
|
|
771
|
+
` : " This file has no 'use client' directive, and its default export\n comes from elsewhere, so timber cannot tell which it is. If the\n module it re-exports starts with 'use client', nothing is wrong\n and you can ignore this. Otherwise add the directive there.\n"),
|
|
772
|
+
level: isError ? "error" : "warn"
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Wildcard status file keys in `statusFiles` whose props differ by path.
|
|
777
|
+
* `error` is not here — the scanner stores it in `node.error`, not
|
|
778
|
+
* `node.statusFiles`, and the check handles it separately below.
|
|
779
|
+
*/
|
|
780
|
+
var WILDCARD_MDX_STATUS_KEYS = /* @__PURE__ */ new Set(["4xx", "5xx"]);
|
|
781
|
+
/**
|
|
782
|
+
* Warn when a wildcard MDX status file (`4xx.mdx`, `5xx.mdx`, `error.mdx`)
|
|
783
|
+
* appears to reference `props` in its source.
|
|
784
|
+
*
|
|
785
|
+
* These files are pre-rendered into `fallbackElement` on the error-boundary
|
|
786
|
+
* path, before the error happens, so they receive empty or partial props.
|
|
787
|
+
* On the deny and error-renderer paths they receive the real props. An author
|
|
788
|
+
* writing `{props.status}` gets the number on some paths and `undefined` on
|
|
789
|
+
* others — same source, different output.
|
|
790
|
+
*
|
|
791
|
+
* A text scan for `props` is acceptable here because the check is `level:
|
|
792
|
+
* 'warn'` — a false positive costs a printed line, not a refused build. A
|
|
793
|
+
* sound check would need the MDX compiler, which is optional, async, and
|
|
794
|
+
* scoped to the RSC environment. See TIM-1333.
|
|
795
|
+
*
|
|
796
|
+
* Exact-code MDX files (e.g. `503.mdx`) are unaffected — all four paths
|
|
797
|
+
* agree on their status.
|
|
798
|
+
*/
|
|
799
|
+
function checkWildcardMdxProps(node, warnings) {
|
|
800
|
+
if (node.statusFiles) {
|
|
801
|
+
for (const [key, file] of Object.entries(node.statusFiles)) if (WILDCARD_MDX_STATUS_KEYS.has(key) && isMdxFilePath(file.filePath)) checkMdxFileForProps(file.filePath, key, warnings);
|
|
802
|
+
}
|
|
803
|
+
if (node.error && isMdxFilePath(node.error.filePath)) checkMdxFileForProps(node.error.filePath, "error", warnings);
|
|
804
|
+
for (const child of node.children) checkWildcardMdxProps(child, warnings);
|
|
805
|
+
for (const slot of Object.values(node.slots)) checkWildcardMdxProps(slot, warnings);
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Check if an MDX file's source appears to reference `props`.
|
|
809
|
+
*
|
|
810
|
+
* MDX passes a `props` object to the default export function. A reference to
|
|
811
|
+
* `props.status` or `props.dangerouslyPassData` in a wildcard file works on
|
|
812
|
+
* the deny/throw paths but renders `undefined` on the boundary path.
|
|
813
|
+
*/
|
|
814
|
+
function checkMdxFileForProps(filePath, convention, warnings) {
|
|
815
|
+
let source;
|
|
816
|
+
try {
|
|
817
|
+
source = readFileSync(filePath, "utf-8");
|
|
818
|
+
} catch {
|
|
819
|
+
return;
|
|
820
|
+
}
|
|
821
|
+
if (!/\bprops\b/.test(source)) return;
|
|
822
|
+
const label = `${convention}.${filePath.endsWith(".md") ? "md" : "mdx"}`;
|
|
823
|
+
warnings.push({
|
|
824
|
+
id: `MDX_WILDCARD_PROPS:${filePath}`,
|
|
825
|
+
summary: `${label} references props, which are empty on the error boundary path: ${filePath}`,
|
|
826
|
+
details: ` File: ${filePath}\n\n Wildcard MDX status files (${convention}.mdx) are pre-rendered into\n fallbackElement before the error occurs. On that path, props are
|
|
827
|
+
empty${convention === "error" ? "" : " (no status, no dangerouslyPassData)"}. On the deny() and error-renderer\n paths, props.status resolves correctly.
|
|
828
|
+
|
|
829
|
+
If this file uses only static content and "props" appears in prose,
|
|
830
|
+
this warning is a false positive — ignore it.
|
|
831
|
+
|
|
832
|
+
To fix: Use only static content in wildcard MDX status files, or
|
|
833
|
+
use an exact-code file (e.g. 404.mdx) where all paths agree.
|
|
834
|
+
`,
|
|
835
|
+
level: "warn"
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* Check if the app/ directory exists. Called before scanning.
|
|
840
|
+
* Returns a warning if missing, or null if the directory exists.
|
|
841
|
+
*/
|
|
842
|
+
function checkAppDirExists(appDir) {
|
|
843
|
+
if (existsSync(appDir)) return null;
|
|
844
|
+
return {
|
|
845
|
+
id: "NO_APP_DIR",
|
|
846
|
+
summary: "No app/ directory found",
|
|
847
|
+
details: ` Expected: ${appDir}\n\n timber.js requires an app/ directory for file-system routing.
|
|
848
|
+
Every request will return 404 until you create it.
|
|
849
|
+
|
|
850
|
+
To fix: Create the app/ directory with a page:
|
|
851
|
+
|
|
852
|
+
mkdir -p app
|
|
853
|
+
# Create app/layout.tsx and app/page.tsx
|
|
854
|
+
`,
|
|
855
|
+
level: "error"
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
var noValidate = { validateStream: false };
|
|
859
|
+
/**
|
|
860
|
+
* Format warnings for terminal output.
|
|
861
|
+
*
|
|
862
|
+
* Groups by severity, uses colors, and includes fix suggestions.
|
|
863
|
+
*/
|
|
864
|
+
function formatConventionWarnings(warnings, options = {}) {
|
|
865
|
+
const { color = true } = options;
|
|
866
|
+
const style = (fmt, text) => color ? styleText(fmt, text, noValidate) : text;
|
|
867
|
+
if (warnings.length === 0) return "";
|
|
868
|
+
const errors = warnings.filter((w) => w.level === "error");
|
|
869
|
+
const warns = warnings.filter((w) => w.level === "warn");
|
|
870
|
+
const lines = [];
|
|
871
|
+
if (errors.length > 0) {
|
|
872
|
+
lines.push(`${style(["red", "bold"], "[timber]")} ${style("red", `${errors.length} configuration error${errors.length !== 1 ? "s" : ""}:`)}`);
|
|
873
|
+
for (const e of errors) {
|
|
874
|
+
lines.push("");
|
|
875
|
+
lines.push(` ${style("red", "✗")} ${e.summary}`);
|
|
876
|
+
lines.push(style("dim", e.details));
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
if (warns.length > 0) {
|
|
880
|
+
if (errors.length > 0) lines.push("");
|
|
881
|
+
lines.push(`${style(["yellow", "bold"], "[timber]")} ${style("yellow", `${warns.length} configuration warning${warns.length !== 1 ? "s" : ""}:`)}`);
|
|
882
|
+
for (const w of warns) {
|
|
883
|
+
lines.push("");
|
|
884
|
+
lines.push(` ${style("yellow", "⚠")} ${w.summary}`);
|
|
885
|
+
lines.push(style("dim", w.details));
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
return lines.join("\n");
|
|
889
|
+
}
|
|
890
|
+
//#endregion
|
|
891
|
+
export { CODEGEN_OUTPUT as a, writeRouteCodegen as c, getPrerenderExport as i, buildDirToRouteMap as l, formatConventionWarnings as n, ENV_DTS_FILENAME as o, lintConventions as r, flushCodegenWrites as s, checkAppDirExists as t, MDX_EXTENSIONS as u };
|
|
892
|
+
|
|
893
|
+
//# sourceMappingURL=convention-lint-fRkwVwEH.js.map
|