@timber-js/app 0.2.0-alpha.21 → 0.2.0-alpha.210
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/agent-skill.md +346 -0
- package/bin/timber.mjs +15 -1
- package/dist/_chunks/actions-Rjk4htmA.js +1199 -0
- package/dist/_chunks/actions-Rjk4htmA.js.map +1 -0
- package/dist/_chunks/als-registry-DaxkVjt5.js +45 -0
- package/dist/_chunks/als-registry-DaxkVjt5.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/build-output-helper-RV_BRcF1.js +367 -0
- package/dist/_chunks/build-output-helper-RV_BRcF1.js.map +1 -0
- package/dist/_chunks/cache-api-DGdYfNJn.js +1182 -0
- package/dist/_chunks/cache-api-DGdYfNJn.js.map +1 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
- package/dist/_chunks/chains-BoO51joc.js +413 -0
- package/dist/_chunks/chains-BoO51joc.js.map +1 -0
- package/dist/_chunks/cli-check-ajNY3B2e.js +252 -0
- package/dist/_chunks/cli-check-ajNY3B2e.js.map +1 -0
- package/dist/_chunks/cli-context-By7k2xVo.js +70 -0
- package/dist/_chunks/cli-context-By7k2xVo.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D2eI8jEg.js +299 -0
- package/dist/_chunks/cli-schema-sync-D2eI8jEg.js.map +1 -0
- package/dist/_chunks/cloudflare-Byxl8FWP.js +1333 -0
- package/dist/_chunks/cloudflare-Byxl8FWP.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/codegen-Bps1sLKJ.js +432 -0
- package/dist/_chunks/codegen-Bps1sLKJ.js.map +1 -0
- package/dist/_chunks/convention-lint-DLmhGsRS.js +590 -0
- package/dist/_chunks/convention-lint-DLmhGsRS.js.map +1 -0
- package/dist/_chunks/dev-server-v97rQH4b.js +2039 -0
- package/dist/_chunks/dev-server-v97rQH4b.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-DsNScGRM.js +1024 -0
- package/dist/_chunks/error-boundary-DsNScGRM.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.js.map +1 -0
- package/dist/_chunks/fs-identity-BRKuL215.js +207 -0
- package/dist/_chunks/fs-identity-BRKuL215.js.map +1 -0
- package/dist/_chunks/graph-cache-CYiUS2aS.js +303 -0
- package/dist/_chunks/graph-cache-CYiUS2aS.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.js.map +1 -0
- package/dist/_chunks/json-lossy-check-CVuRs2hG.js +66 -0
- package/dist/_chunks/json-lossy-check-CVuRs2hG.js.map +1 -0
- package/dist/_chunks/live-graph-9cSnn_h9.js +150 -0
- package/dist/_chunks/live-graph-9cSnn_h9.js.map +1 -0
- package/dist/_chunks/logger-BP0LN6vP.js +662 -0
- package/dist/_chunks/logger-BP0LN6vP.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DSDjM_hJ.js} +71 -27
- package/dist/_chunks/metadata-routes-DSDjM_hJ.js.map +1 -0
- package/dist/_chunks/navigation-root-BQfo1-kG.js +126 -0
- package/dist/_chunks/navigation-root-BQfo1-kG.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-BPBPc3lL.js +345 -0
- package/dist/_chunks/plugin-context-BPBPc3lL.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-vGV7Re0B.js +101 -0
- package/dist/_chunks/poison-scan-vGV7Re0B.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/render-timeout-DOf_BBcO.js +46 -0
- package/dist/_chunks/render-timeout-DOf_BBcO.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-dffcs4jp.js +54 -0
- package/dist/_chunks/rsc-payload-path-dffcs4jp.js.map +1 -0
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-DmqdxzbW.js +2056 -0
- package/dist/_chunks/scanner-DmqdxzbW.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-xtPUGfdq.js +137 -0
- package/dist/_chunks/segment-context-xtPUGfdq.js.map +1 -0
- package/dist/_chunks/segment-keys-D5hu1hz4.js +62 -0
- package/dist/_chunks/segment-keys-D5hu1hz4.js.map +1 -0
- package/dist/_chunks/singleflight-BeVMMKi0.js +55 -0
- package/dist/_chunks/singleflight-BeVMMKi0.js.map +1 -0
- package/dist/_chunks/sizeof-BM1409x2.js +36 -0
- package/dist/_chunks/sizeof-BM1409x2.js.map +1 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js +49 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js.map +1 -0
- package/dist/_chunks/state-BhNGPsdi.js +50 -0
- package/dist/_chunks/state-BhNGPsdi.js.map +1 -0
- package/dist/_chunks/status-page-marker-BRX9Ib-d.js +564 -0
- package/dist/_chunks/status-page-marker-BRX9Ib-d.js.map +1 -0
- package/dist/_chunks/tree-match-6yihorhk.js +169 -0
- package/dist/_chunks/tree-match-6yihorhk.js.map +1 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js +226 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -0
- package/dist/_chunks/walkers-Czu2jXFq.js +144 -0
- package/dist/_chunks/walkers-Czu2jXFq.js.map +1 -0
- package/dist/_chunks/write-file-atomic-D1qWqHb4.js +32 -0
- package/dist/_chunks/write-file-atomic-D1qWqHb4.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/canonicalize-module.d.ts +8 -0
- package/dist/adapters/canonicalize-module.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +74 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +224 -24
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +25 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +63 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro-presets.d.ts +31 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +64 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +54 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +631 -359
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +67 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +122 -16
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js +0 -0
- package/dist/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +151 -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 +133 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-context.d.ts +54 -0
- package/dist/cli-context.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +85 -13
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +224 -63
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +42 -2
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +63 -0
- package/dist/client/browser-entry/action-queue.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +53 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +41 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +58 -9
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- package/dist/client/error-reconstituter.d.ts +55 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +330 -1150
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +792 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +85 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +133 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +111 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +54 -36
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +106 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +192 -0
- package/dist/client/navigation-transition.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +45 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +137 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +84 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +334 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router-url.d.ts +24 -0
- package/dist/client/router-url.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +110 -28
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +186 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +26 -50
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +21 -13
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +13 -11
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +15 -8
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +323 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +68 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +95 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +46 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +74 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/{plugins/dev-error-overlay.d.ts → dev-tools/overlay.d.ts} +15 -25
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +112 -8
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +5 -3
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +5 -5
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +35 -181
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8844 -14244
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +262 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +61 -11
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- package/dist/plugins/dev-server.d.ts +24 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +35 -74
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/graph-endpoint.d.ts +112 -0
- package/dist/plugins/graph-endpoint.d.ts.map +1 -0
- package/dist/plugins/mdx.d.ts +18 -5
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/post-build.d.ts +110 -0
- package/dist/plugins/post-build.d.ts.map +1 -0
- package/dist/plugins/prebuilt-capture.d.ts +67 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +98 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +39 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/react-resolve.d.ts +49 -0
- package/dist/plugins/react-resolve.d.ts.map +1 -0
- package/dist/plugins/request-dep/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/rsc-assets-manifest.d.ts +33 -0
- package/dist/plugins/rsc-assets-manifest.d.ts.map +1 -0
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +246 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +26 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +61 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen-write.d.ts +42 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +8 -3
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/convention-lint.d.ts +55 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +91 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +13 -7
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception-overlap.d.ts +35 -0
- package/dist/routing/interception-overlap.d.ts.map +1 -0
- package/dist/routing/interception.d.ts +234 -10
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +105 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +26 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +14 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +114 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/segment-keys.d.ts +118 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/types.d.ts +81 -26
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +57 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +14 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- package/dist/schema-bridge.d.ts +145 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +262 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +3 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +179 -360
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +81 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/serialize-equal.d.ts +9 -0
- package/dist/search-params/serialize-equal.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +76 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/server/access-gate.d.ts +98 -10
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +44 -9
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +40 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +78 -40
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +166 -16
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +25 -30
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/compress.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +149 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csp-nonce.d.ts +36 -0
- package/dist/server/csp-nonce.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +58 -15
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/debug.d.ts +0 -1
- package/dist/server/debug.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +23 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +257 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +21 -15
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +102 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- package/dist/server/fallback-error.d.ts +19 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +45 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/form-flash.d.ts +2 -2
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/html-injector-core.d.ts +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +17 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2922
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +11 -4
- package/dist/server/instrumentation.d.ts.map +1 -1
- package/dist/server/internal.d.ts +47 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4645 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/json-status-response.d.ts +34 -0
- package/dist/server/json-status-response.d.ts.map +1 -0
- package/dist/server/logger.d.ts +78 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +73 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +71 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +83 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +193 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +70 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +7 -1
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +59 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +147 -23
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +63 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-render.d.ts +25 -0
- package/dist/server/prebuilt/capture-render.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-routes.d.ts +37 -0
- package/dist/server/prebuilt/capture-routes.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +101 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +52 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/lifetime.d.ts +38 -0
- package/dist/server/prebuilt/lifetime.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +79 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +106 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +101 -90
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/react-cache-bridge.d.ts +59 -0
- package/dist/server/react-cache-bridge.d.ts.map +1 -0
- package/dist/server/react-cache-scope.d.ts +49 -0
- package/dist/server/react-cache-scope.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +66 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +35 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +128 -103
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +55 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-dispatcher.d.ts +67 -0
- package/dist/server/rsc-entry/action-dispatcher.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +19 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +55 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +35 -21
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +14 -59
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +30 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/render-signals.d.ts +65 -0
- package/dist/server/rsc-entry/render-signals.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +98 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +30 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +12 -30
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +6 -2
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +44 -7
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +39 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/signal-identity.d.ts +43 -0
- package/dist/server/signal-identity.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +130 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/skippable-prefix.d.ts +29 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +138 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts +54 -0
- package/dist/server/slot-subtree-contain.d.ts.map +1 -0
- package/dist/server/ssr-bridge-types.d.ts +198 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +8 -47
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +60 -27
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +93 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +44 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +112 -0
- package/dist/server/static-generator.d.ts.map +1 -0
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +26 -15
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +59 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +57 -26
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +59 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +89 -8
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/csrf-reject.d.ts +16 -0
- package/dist/shared/csrf-reject.d.ts.map +1 -0
- package/dist/shared/error-digest.d.ts +28 -0
- package/dist/shared/error-digest.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +110 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +16 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +52 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +48 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/dist/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- package/dist/shims/navigation.d.ts +10 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/dist/utils/write-file-atomic.d.ts +17 -0
- package/dist/utils/write-file-atomic.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +239 -0
- package/docs/api/31-api-client.mdx +170 -0
- package/docs/api/32-api-cache.mdx +339 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +359 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +202 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +227 -0
- package/docs/learn/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +270 -0
- package/docs/learn/11-middleware.mdx +164 -0
- package/docs/learn/12-error-handling.mdx +192 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +120 -29
- package/src/adapters/build-output-helper.ts +353 -0
- package/src/adapters/canonicalize-module.ts +29 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +809 -150
- package/src/adapters/compress-module.ts +110 -86
- package/src/adapters/fs-identity.ts +155 -0
- package/src/adapters/nitro-presets.ts +124 -0
- package/src/adapters/nitro-preview.ts +476 -0
- package/src/adapters/nitro.ts +317 -457
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +283 -0
- package/src/adapters/types.ts +127 -17
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +259 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +331 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +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 +69 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +72 -6
- package/src/cache/sizeof.ts +35 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +254 -0
- package/src/cache/timber-cache.ts +165 -40
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +23 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +34 -0
- package/src/cli-check.ts +417 -0
- package/src/cli-context.ts +119 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +330 -78
- package/src/client/browser-dev.ts +192 -5
- package/src/client/browser-entry/action-dispatch.ts +237 -0
- package/src/client/browser-entry/action-queue.ts +152 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +143 -0
- package/src/client/browser-entry/index.ts +120 -0
- package/src/client/browser-entry/post-hydration.ts +99 -0
- package/src/client/browser-entry/router-init.ts +406 -0
- package/src/client/browser-entry/rsc-stream.ts +145 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/deny-last-resort.tsx +54 -0
- package/src/client/error-boundary.tsx +279 -61
- package/src/client/error-reconstituter.tsx +84 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +74 -11
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +54 -0
- package/src/client/link.tsx +468 -151
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +380 -0
- package/src/client/navigation-commit.ts +318 -0
- package/src/client/navigation-context.ts +67 -134
- package/src/client/navigation-root.tsx +236 -0
- package/src/client/navigation-transition.ts +337 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +82 -0
- package/src/client/router-effects.ts +235 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +458 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +370 -0
- package/src/client/router-url.ts +32 -0
- package/src/client/router.ts +491 -424
- package/src/client/rsc-fetch.ts +510 -109
- package/src/client/segment-cache.ts +362 -41
- package/src/client/segment-context.ts +7 -4
- package/src/client/segment-outlet.tsx +96 -0
- package/src/client/segment-update-context.ts +23 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-content-cache-context.ts +43 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +27 -67
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +31 -24
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +13 -10
- package/src/client/unload-guard.ts +35 -3
- package/src/client/use-cookie.ts +70 -18
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +22 -31
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +31 -9
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +323 -0
- package/src/config-validation.ts +464 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +278 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +185 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +79 -0
- package/src/dev-tools/instrumentation.ts +261 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/{plugins/dev-error-overlay.ts → dev-tools/overlay.ts} +25 -80
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +1 -1
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +101 -19
- package/src/fonts/local.ts +12 -11
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +494 -380
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +502 -0
- package/src/plugins/build-manifest.ts +204 -36
- package/src/plugins/build-report.ts +299 -87
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/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 +360 -97
- package/src/plugins/entries.ts +142 -16
- package/src/plugins/fonts.ts +260 -657
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +108 -35
- package/src/plugins/post-build.ts +327 -0
- package/src/plugins/prebuilt-capture.ts +213 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +670 -0
- package/src/plugins/prerender-sugar.ts +316 -0
- package/src/plugins/react-resolve.ts +149 -0
- package/src/plugins/request-dep/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +273 -277
- package/src/plugins/rsc-assets-manifest.ts +251 -0
- package/src/plugins/server-bundle.ts +99 -14
- package/src/plugins/shims.ts +260 -97
- package/src/plugins/static-build.ts +681 -71
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +163 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +651 -0
- package/src/routing/export-detect.ts +536 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +232 -0
- package/src/routing/scanner.ts +417 -223
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +99 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +82 -26
- package/src/routing/walkers.ts +98 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +27 -0
- package/src/schema-bridge.ts +382 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +195 -56
- package/src/server/action-client.ts +126 -33
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +457 -111
- package/src/server/actions.ts +172 -85
- package/src/server/als-registry.ts +224 -25
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +33 -57
- package/src/server/canonicalize.ts +6 -3
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +116 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- package/src/server/cookie-context.ts +454 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csp-nonce.ts +58 -0
- package/src/server/csrf.ts +228 -35
- package/src/server/debug.ts +0 -1
- package/src/server/default-logger.ts +100 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +527 -0
- package/src/server/deny-renderer.ts +201 -179
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +160 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +88 -104
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +3 -3
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +270 -255
- package/src/server/index.ts +36 -192
- package/src/server/instrumentation.ts +11 -4
- package/src/server/internal.ts +168 -0
- package/src/server/json-status-response.ts +105 -0
- package/src/server/logger.ts +126 -38
- package/src/server/metadata-collector.ts +177 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +220 -24
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +23 -2
- package/src/server/middleware-runner.ts +32 -5
- package/src/server/node-stream-transforms.ts +323 -0
- package/src/server/nuqs-ssr-provider.tsx +8 -7
- package/src/server/param-coercion.ts +201 -0
- package/src/server/pipeline-helpers.ts +485 -0
- package/src/server/pipeline-interception.ts +241 -32
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +290 -0
- package/src/server/pipeline-phases.ts +496 -0
- package/src/server/pipeline.ts +385 -427
- package/src/server/port-resolution.ts +53 -0
- package/src/server/prebuilt/cache-key.ts +299 -0
- package/src/server/prebuilt/capture-render.ts +118 -0
- package/src/server/prebuilt/capture-routes.ts +104 -0
- package/src/server/prebuilt/capture-state.ts +196 -0
- package/src/server/prebuilt/key-discipline.ts +122 -0
- package/src/server/prebuilt/lifetime.ts +151 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +202 -0
- package/src/server/prebuilt/slots.ts +202 -0
- package/src/server/prebuilt/synthetic-store.ts +125 -0
- package/src/server/prebuilt-builder.ts +514 -0
- package/src/server/prebuilt-runtime.ts +813 -0
- package/src/server/primitives.ts +153 -171
- package/src/server/publish-params.ts +42 -0
- package/src/server/react-cache-bridge.ts +124 -0
- package/src/server/react-cache-scope.ts +104 -0
- package/src/server/render-timeout.ts +128 -0
- package/src/server/render-utils.ts +45 -0
- package/src/server/request-context.ts +269 -332
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +514 -355
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +67 -27
- package/src/server/route-matcher.ts +238 -267
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-dispatcher.ts +142 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +130 -0
- package/src/server/rsc-entry/api-handler.ts +49 -81
- package/src/server/rsc-entry/deny-fallback.ts +151 -0
- package/src/server/rsc-entry/error-renderer.ts +301 -113
- package/src/server/rsc-entry/helpers.ts +90 -115
- package/src/server/rsc-entry/index.ts +370 -350
- package/src/server/rsc-entry/render-route.ts +229 -0
- package/src/server/rsc-entry/render-signals.ts +108 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +192 -72
- package/src/server/rsc-entry/rsc-stream.ts +128 -131
- package/src/server/rsc-entry/ssr-bridge.ts +19 -6
- package/src/server/rsc-entry/ssr-renderer.ts +300 -137
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +1 -1
- package/src/server/safe-load.ts +53 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/server-timing.ts +1 -1
- package/src/server/signal-identity.ts +112 -0
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +172 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +707 -300
- package/src/server/slot-subtree-contain.ts +273 -0
- package/src/server/ssr-bridge-types.ts +201 -0
- package/src/server/ssr-entry.ts +225 -104
- package/src/server/ssr-render.ts +354 -91
- package/src/server/ssr-wrappers.tsx +162 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +680 -0
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +107 -148
- package/src/server/stream-utils.ts +343 -0
- package/src/server/tracing.ts +163 -68
- package/src/server/tree-match.ts +494 -0
- package/src/server/types.ts +96 -11
- package/src/server/utils/element-type.ts +88 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +1 -1
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/als-slots.ts +74 -0
- package/src/shared/base-path.ts +80 -0
- package/src/shared/csrf-reject.ts +15 -0
- package/src/shared/error-digest.ts +46 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/param-value.ts +281 -0
- package/src/shared/payload-root.ts +153 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +16 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +59 -0
- package/src/shared/rsc-payload-path.ts +52 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +109 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shared/status-reason-phrase.ts +61 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +36 -32
- package/src/shims/navigation-rsc.ts +47 -0
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/src/utils/write-file-atomic.ts +32 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js +0 -88
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js +0 -109
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/error-boundary.js.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/types.d.ts +0 -14
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts +0 -92
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/content/index.d.ts +0 -11
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -2
- package/dist/plugins/adapter-build.d.ts +0 -18
- package/dist/plugins/adapter-build.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.d.ts.map +0 -1
- package/dist/server/asset-headers.d.ts +0 -42
- package/dist/server/asset-headers.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/tree-builder.d.ts +0 -126
- package/dist/server/tree-builder.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/types.ts +0 -21
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/client/use-params.ts +0 -141
- package/src/content/index.ts +0 -13
- package/src/plugins/adapter-build.ts +0 -118
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/search-params/registry.ts +0 -31
- package/src/server/asset-headers.ts +0 -81
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/tree-builder.ts +0 -382
- package/src/shims/server-only-noop.js +0 -6
- package/src/utils/directive-parser.ts +0 -529
|
@@ -1,35 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* timber-static-build — Vite sub-plugin for static output mode.
|
|
3
3
|
*
|
|
4
|
-
* When `output: 'static'` is set in timber.config.ts
|
|
5
|
-
* 1.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* When `output: 'static'` is set in timber.config.ts:
|
|
5
|
+
* 1. The plugin validates that no dynamic APIs (getCookies(), getHeaders())
|
|
6
|
+
* are used
|
|
7
|
+
* 2. `runStaticGeneration`, the static generation step of the post-build
|
|
8
|
+
* phase (plugins/post-build.ts), renders all routes to static HTML + RSC
|
|
9
|
+
* flight files
|
|
8
10
|
*
|
|
9
|
-
* Design doc: design/
|
|
11
|
+
* Design doc: design/11-platform.md §"static output mode"
|
|
10
12
|
*/
|
|
11
13
|
|
|
12
14
|
import type { Plugin } from 'vite';
|
|
13
|
-
import
|
|
14
|
-
import {
|
|
15
|
+
import { mkdir, readdir, readFile, writeFile, rename, rm, stat } from 'node:fs/promises';
|
|
16
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
17
|
+
import { dirname, extname, isAbsolute, join, resolve, relative } from 'node:path';
|
|
18
|
+
import { pathToFileURL } from 'node:url';
|
|
19
|
+
import { writeFileAtomic } from '../utils/write-file-atomic.ts';
|
|
20
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
21
|
+
import type { DirectoryArtifact } from '../adapters/types.ts';
|
|
22
|
+
import type {
|
|
23
|
+
StaticGenerationOptions,
|
|
24
|
+
StaticGenerationSummary,
|
|
25
|
+
StaticPageEntry,
|
|
26
|
+
StaticRedirectEntry,
|
|
27
|
+
} from '../server/static-generator.ts';
|
|
28
|
+
import { isRelativeBase, normalizeBasePath, withBasePath } from '../shared/base-path.ts';
|
|
29
|
+
import type { RscManifest, RscManifestEntry } from '../shared/rsc-manifest.ts';
|
|
30
|
+
import { htmlEscapeJsonString } from '../server/flight-scripts.ts';
|
|
31
|
+
import { RSC_PAYLOAD_DIR, rscPayloadPath } from '../shared/rsc-payload-path.ts';
|
|
32
|
+
import { REDIRECTS_FILE, RESERVED_OUTPUT_PATHS } from '../shared/static-platform-files.ts';
|
|
33
|
+
import {
|
|
34
|
+
detectFsIdentity,
|
|
35
|
+
fsKey,
|
|
36
|
+
EXACT_FS_IDENTITY,
|
|
37
|
+
type FsIdentity,
|
|
38
|
+
} from '../adapters/fs-identity.ts';
|
|
15
39
|
|
|
16
40
|
// ---------------------------------------------------------------------------
|
|
17
41
|
// Types
|
|
18
42
|
// ---------------------------------------------------------------------------
|
|
19
43
|
|
|
44
|
+
/**
|
|
45
|
+
* A single entry in the RSC manifest injected into static HTML.
|
|
46
|
+
* Maps an unhashed `/_rsc/*.rsc` path to its hashed URL, with
|
|
47
|
+
* optional route params inlined to avoid a sidecar fetch.
|
|
48
|
+
*/
|
|
49
|
+
// Declared in shared/rsc-manifest.ts so the client that reads this manifest and
|
|
50
|
+
// the build that writes it cannot drift. Re-exported for existing importers.
|
|
51
|
+
export type { RscManifestEntry, RscManifest } from '../shared/rsc-manifest.ts';
|
|
52
|
+
|
|
20
53
|
export interface StaticValidationError {
|
|
21
|
-
type: 'dynamic-api'
|
|
54
|
+
type: 'dynamic-api';
|
|
22
55
|
file: string;
|
|
23
56
|
message: string;
|
|
24
57
|
line?: number;
|
|
25
58
|
}
|
|
26
59
|
|
|
27
|
-
export interface StaticOptions {
|
|
28
|
-
clientJavascriptDisabled: boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
60
|
// ---------------------------------------------------------------------------
|
|
32
|
-
// Detection: dynamic APIs (
|
|
61
|
+
// Detection: dynamic APIs (getCookies, getHeaders, and legacy cookies/headers)
|
|
33
62
|
// ---------------------------------------------------------------------------
|
|
34
63
|
|
|
35
64
|
/**
|
|
@@ -39,12 +68,14 @@ export interface StaticOptions {
|
|
|
39
68
|
* We detect both import-level and call-level usage.
|
|
40
69
|
*/
|
|
41
70
|
const DYNAMIC_API_PATTERNS: Array<{ pattern: RegExp; name: string }> = [
|
|
71
|
+
{ pattern: /\bgetCookieJar\s*\(/, name: 'getCookieJar()' },
|
|
72
|
+
{ pattern: /\bgetHeaders\s*\(/, name: 'getHeaders()' },
|
|
42
73
|
{ pattern: /\bcookies\s*\(/, name: 'cookies()' },
|
|
43
74
|
{ pattern: /\bheaders\s*\(/, name: 'headers()' },
|
|
44
75
|
];
|
|
45
76
|
|
|
46
77
|
/**
|
|
47
|
-
* Detect usage of dynamic per-request APIs (
|
|
78
|
+
* Detect usage of dynamic per-request APIs (getCookies(), getHeaders())
|
|
48
79
|
* that cannot work at build time in static mode.
|
|
49
80
|
*
|
|
50
81
|
* Returns an array of validation errors.
|
|
@@ -79,75 +110,654 @@ export function detectDynamicApis(code: string, fileId: string): StaticValidatio
|
|
|
79
110
|
}
|
|
80
111
|
|
|
81
112
|
// ---------------------------------------------------------------------------
|
|
82
|
-
//
|
|
113
|
+
// Redirect rules
|
|
83
114
|
// ---------------------------------------------------------------------------
|
|
84
115
|
|
|
85
116
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
117
|
+
* Generate a `_redirects` file from collected redirect entries.
|
|
118
|
+
* Uses the Cloudflare Pages / Netlify format: `/from /to statusCode`
|
|
119
|
+
*
|
|
120
|
+
* Both sides are base-prefixed (TIM-1274). `from` is matched by the host
|
|
121
|
+
* against the request path and `to` is served to the browser as a `Location`,
|
|
122
|
+
* so both are deployed-URL space while `StaticRedirectEntry` carries route
|
|
123
|
+
* space — under `base: '/repo/'`, a rule `/old /new 301` would match nothing
|
|
124
|
+
* and, if it did, would send the browser off the deployment.
|
|
89
125
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
126
|
+
* An off-origin `to` is left alone: `redirectExternal()` produces an absolute
|
|
127
|
+
* URL, and a protocol-relative one addresses another host too. Neither is a
|
|
128
|
+
* path on this deployment, so neither takes the prefix.
|
|
129
|
+
*
|
|
130
|
+
* @param base Normalized deployment base (see `shared/base-path.ts`).
|
|
131
|
+
* @internal Exported for testing.
|
|
92
132
|
*/
|
|
93
|
-
export function
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
)
|
|
98
|
-
|
|
133
|
+
export function generateRedirectsFile(redirects: StaticRedirectEntry[], base: string): string {
|
|
134
|
+
const target = (to: string) =>
|
|
135
|
+
to.startsWith('/') && !to.startsWith('//') ? withBasePath(base, to) : to;
|
|
136
|
+
const lines = redirects.map((r) => `${withBasePath(base, r.from)} ${target(r.to)} ${r.status}`);
|
|
137
|
+
return lines.join('\n') + '\n';
|
|
138
|
+
}
|
|
99
139
|
|
|
100
|
-
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// File output helpers
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
101
143
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
144
|
+
/**
|
|
145
|
+
* Determine the output file path for a static page entry.
|
|
146
|
+
*
|
|
147
|
+
* Pages: /about → about/index.html, / → index.html
|
|
148
|
+
* RSC: /about → _rsc/about/index.rsc, / → _rsc/index.rsc
|
|
149
|
+
* API: /feed.xml → feed.xml, /api/data → api/data
|
|
150
|
+
*
|
|
151
|
+
* The RSC shape mirrors the HTML shape for the reason the HTML shape has it:
|
|
152
|
+
* a route gets a directory and the artifact is the `index` inside it, so the
|
|
153
|
+
* mapping is injective. See `shared/rsc-payload-path.ts` (TIM-1266).
|
|
154
|
+
*/
|
|
155
|
+
export function staticOutputPath(entry: StaticPageEntry): string {
|
|
156
|
+
const urlPath = entry.urlPath === '/' ? '' : entry.urlPath;
|
|
157
|
+
|
|
158
|
+
if (entry.kind === 'rsc') {
|
|
159
|
+
// Route space is `/…`; the static output path is relative to the output
|
|
160
|
+
// directory, so drop the leading slash.
|
|
161
|
+
return rscPayloadPath(entry.urlPath).slice(1);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (entry.kind === 'api') {
|
|
165
|
+
// API routes use their URL path directly. If no extension, fall
|
|
166
|
+
// back to the path as-is (static host serves based on content type).
|
|
167
|
+
return urlPath.startsWith('/') ? urlPath.slice(1) : urlPath || 'index';
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// HTML pages
|
|
171
|
+
if (!urlPath) return 'index.html';
|
|
172
|
+
// Synthetic 404 entry from static generation — must be 404.html at the
|
|
173
|
+
// root so static hosts (GitHub Pages, Cloudflare Pages, Netlify) serve
|
|
174
|
+
// it automatically for unmatched URLs. Uses an internal urlPath to avoid
|
|
175
|
+
// colliding with a real /404 page route.
|
|
176
|
+
if (urlPath === '/_timber_not_found') return '404.html';
|
|
177
|
+
return `${urlPath.startsWith('/') ? urlPath.slice(1) : urlPath}/index.html`;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Output path collisions (TIM-1266)
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Records which entry claimed each output path and reports second claims.
|
|
186
|
+
*
|
|
187
|
+
* Two entries landing on one path is not a rendering failure — both render
|
|
188
|
+
* fine — so nothing downstream notices. The file is written twice, the second
|
|
189
|
+
* write wins, and the deployment serves one route's bytes at another route's
|
|
190
|
+
* URL with the same content type and the same shape (TIM-1266).
|
|
191
|
+
*
|
|
192
|
+
* The naming rules are injective by construction (a route path is a directory
|
|
193
|
+
* and the artifact is the `index` inside it), so a collision here means either
|
|
194
|
+
* two entries were enumerated for one URL or a route reached a path the
|
|
195
|
+
* framework reserves for itself (`404.html`). Both are build errors: there is
|
|
196
|
+
* no correct file to write.
|
|
197
|
+
*
|
|
198
|
+
* Two entries can also be unwritable together without claiming the same
|
|
199
|
+
* string: one wants a file where the other wants a directory (`about` from an
|
|
200
|
+
* API route, `about/index.html` from a page). The filesystem does refuse that
|
|
201
|
+
* one — `EISDIR` on the rename, `ENOTDIR` on the mkdir, depending on which
|
|
202
|
+
* lands second — but an errno names a path, and in the rename case the path
|
|
203
|
+
* it names is the write's temp file. Reported here instead, so the message says which
|
|
204
|
+
* two routes.
|
|
205
|
+
*
|
|
206
|
+
* Collisions are **collected, not thrown**. `onEntry` runs inside the
|
|
207
|
+
* generator, whose RSC branch treats a throw as "this payload is unavailable,
|
|
208
|
+
* SPA navigation falls back to a full load" and swallows it — which for a
|
|
209
|
+
* collision is the wrong end state, since the two payloads are still
|
|
210
|
+
* ambiguous. The caller raises them once generation is done.
|
|
211
|
+
*
|
|
212
|
+
* @internal Exported for testing.
|
|
213
|
+
*/
|
|
214
|
+
export class StaticOutputPaths {
|
|
215
|
+
private readonly claimed = new Map<string, StaticPageEntry>();
|
|
216
|
+
/** Every ancestor directory of a claimed path, mapped to its claimant. */
|
|
217
|
+
private readonly directories = new Map<string, StaticPageEntry>();
|
|
218
|
+
private readonly collisions: string[] = [];
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* @param identity How the output filesystem decides two paths name one
|
|
222
|
+
* file, from `detectFsIdentity`. The guard predicts whether two writes
|
|
223
|
+
* land on one file, which is a property of the filesystem — so it is
|
|
224
|
+
* asked, not assumed. Folding unconditionally would reject `/Foo` beside
|
|
225
|
+
* `/foo` on Linux, where both are perfectly servable files.
|
|
226
|
+
*/
|
|
227
|
+
private readonly identity: FsIdentity;
|
|
228
|
+
|
|
229
|
+
constructor(identity: FsIdentity = EXACT_FS_IDENTITY) {
|
|
230
|
+
this.identity = identity;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** The identity under which the filesystem will compare this path. */
|
|
234
|
+
private key(relPath: string): string {
|
|
235
|
+
return fsKey(relPath, this.identity);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Claim `relPath` for `entry`. Returns false when the path cannot be
|
|
240
|
+
* written alongside an earlier claim, in which case the caller must not
|
|
241
|
+
* write the file — the losing entry is recorded and the build fails at
|
|
242
|
+
* the end.
|
|
243
|
+
*/
|
|
244
|
+
claim(relPath: string, entry: StaticPageEntry): boolean {
|
|
245
|
+
// Folded like every other comparison here: on a case-insensitive
|
|
246
|
+
// filesystem a route rendering to `_HEADERS` is the same file the
|
|
247
|
+
// adapter is about to write, so a case-sensitive match would wave it
|
|
248
|
+
// through into the overwrite this reservation exists to stop.
|
|
249
|
+
if (RESERVED_OUTPUT_PATHS.some((name) => this.key(name) === this.key(relPath))) {
|
|
250
|
+
this.collisions.push(
|
|
251
|
+
` - ${relPath}: reserved — the framework writes this file itself, ` +
|
|
252
|
+
`and ${entry.kind} for ${entry.urlPath} would be overwritten by it`
|
|
253
|
+
);
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const key = this.key(relPath);
|
|
258
|
+
const conflict =
|
|
259
|
+
this.claimed.get(key) ??
|
|
260
|
+
// This entry wants a file where an earlier one wants a directory…
|
|
261
|
+
this.directories.get(key) ??
|
|
262
|
+
// …or a directory where an earlier one wants a file.
|
|
263
|
+
ancestors(relPath).reduce<StaticPageEntry | undefined>(
|
|
264
|
+
(found, dir) => found ?? this.claimed.get(this.key(dir)),
|
|
265
|
+
undefined
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
if (conflict) {
|
|
269
|
+
this.collisions.push(
|
|
270
|
+
` - ${relPath}: ${conflict.kind} for ${conflict.urlPath} and ${entry.kind} for ${entry.urlPath}`
|
|
271
|
+
);
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
this.claimed.set(key, entry);
|
|
276
|
+
for (const dir of ancestors(relPath)) {
|
|
277
|
+
const dirKey = this.key(dir);
|
|
278
|
+
if (!this.directories.has(dirKey)) this.directories.set(dirKey, entry);
|
|
279
|
+
}
|
|
280
|
+
return true;
|
|
112
281
|
}
|
|
113
282
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
`
|
|
121
|
-
|
|
122
|
-
|
|
283
|
+
/** Throw if any two entries could not both be written. */
|
|
284
|
+
assertNoCollisions(): void {
|
|
285
|
+
if (this.collisions.length === 0) return;
|
|
286
|
+
throw new Error(
|
|
287
|
+
`[timber] Static generation: ${this.collisions.length} output path collision(s) — ` +
|
|
288
|
+
`two entries write the same path and one would silently overwrite the other. ` +
|
|
289
|
+
`Rename or remove one route in each pair:\n${this.collisions.join('\n')}`
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Every directory an output path sits under, outermost first. */
|
|
295
|
+
function ancestors(relPath: string): string[] {
|
|
296
|
+
const parts = relPath.split('/');
|
|
297
|
+
parts.pop();
|
|
298
|
+
return parts.map((_, i) => parts.slice(0, i + 1).join('/'));
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Writes generated entries into the static output directory, one file per
|
|
303
|
+
* entry, refusing any write that would land on a path another entry holds.
|
|
304
|
+
*
|
|
305
|
+
* @internal Exported for testing.
|
|
306
|
+
*/
|
|
307
|
+
export class StaticSiteWriter {
|
|
308
|
+
/** Content-Type per URL path for extensionless API routes (TIM-1241). */
|
|
309
|
+
readonly contentTypes: Record<string, string> = {};
|
|
310
|
+
private readonly paths: StaticOutputPaths;
|
|
311
|
+
|
|
312
|
+
private readonly staticDir: string;
|
|
313
|
+
|
|
314
|
+
constructor(staticDir: string, identity: FsIdentity = EXACT_FS_IDENTITY) {
|
|
315
|
+
this.staticDir = staticDir;
|
|
316
|
+
this.paths = new StaticOutputPaths(identity);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async write(entry: StaticPageEntry): Promise<void> {
|
|
320
|
+
const relPath = staticOutputPath(entry);
|
|
321
|
+
const fullPath = resolve(this.staticDir, relPath);
|
|
322
|
+
|
|
323
|
+
// Reject path traversal: generated params with "../" could escape
|
|
324
|
+
// the output directory and overwrite build artifacts.
|
|
325
|
+
//
|
|
326
|
+
// Tested on the first *segment*, not on the prefix. A slug is arbitrary
|
|
327
|
+
// application data, and `..draft` is an ordinary directory name whose
|
|
328
|
+
// relative path merely begins with two dots — a prefix test failed the
|
|
329
|
+
// build on it. `isAbsolute` covers the case `relative()` gives up on and
|
|
330
|
+
// returns an absolute path for: a different Windows drive, where the
|
|
331
|
+
// round-trip check below compares equal and would let it through.
|
|
332
|
+
const rel = relative(this.staticDir, fullPath);
|
|
333
|
+
const firstSegment = rel.split(/[\\/]/)[0];
|
|
334
|
+
if (firstSegment === '..' || isAbsolute(rel) || resolve(this.staticDir, rel) !== fullPath) {
|
|
335
|
+
throw new Error(
|
|
336
|
+
`[timber] Static generation: output path "${relPath}" escapes the ` +
|
|
337
|
+
`static output directory — check generateStaticSegmentParams for ` +
|
|
338
|
+
`path traversal characters in ${entry.urlPath}`
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Claim the *normalized* path, not the one `staticOutputPath` built. Two
|
|
343
|
+
// distinct strings can name one file — a generated param carrying `..`
|
|
344
|
+
// makes `_rsc/a/../b/index.rsc` and `_rsc/b/index.rsc` different keys for
|
|
345
|
+
// the same write, which is the collision this check exists to stop. The
|
|
346
|
+
// traversal guard above only rejects escapes; it lets an in-bounds detour
|
|
347
|
+
// through.
|
|
348
|
+
//
|
|
349
|
+
// A losing claim is not written: the build is about to fail, and
|
|
350
|
+
// clobbering the winner would make the failure state worse than the one
|
|
351
|
+
// being reported.
|
|
352
|
+
if (!this.paths.claim(rel.replace(/\\/g, '/'), entry)) return;
|
|
353
|
+
|
|
354
|
+
await mkdir(dirname(fullPath), { recursive: true });
|
|
355
|
+
await writeFileAtomic(fullPath, entry.body);
|
|
356
|
+
|
|
357
|
+
// Track Content-Type for extensionless API routes so adapters
|
|
358
|
+
// can write per-path Content-Type rules in _headers. TIM-1241.
|
|
359
|
+
if (entry.kind === 'api' && !extname(relPath) && entry.contentType) {
|
|
360
|
+
this.contentTypes[entry.urlPath] = entry.contentType;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/** Throw if any two entries could not both be written. */
|
|
365
|
+
assertNoCollisions(): void {
|
|
366
|
+
this.paths.assertNoCollisions();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Remove artifacts a generation pass produces only *conditionally*, so none
|
|
372
|
+
* of them can survive from an earlier build into this one.
|
|
373
|
+
*
|
|
374
|
+
* Pages are not in this set: every page is rewritten each pass, and a page
|
|
375
|
+
* whose route was deleted is a different problem (a stale file nothing links
|
|
376
|
+
* to) from the one here.
|
|
377
|
+
*
|
|
378
|
+
* - `_rsc/` because the files are content-hashed. Left in place, a previous
|
|
379
|
+
* build's already-hashed payload gets hashed again and accumulates.
|
|
380
|
+
* - `_redirects` because it is written only when this pass found redirects.
|
|
381
|
+
* A build whose redirects were removed would otherwise ship the previous
|
|
382
|
+
* build's rules — and would break the merge exemption in
|
|
383
|
+
* `shared/static-platform-files.ts`, which lets the pre-rendered copy
|
|
384
|
+
* overwrite `public/_redirects` on the grounds that it *contains* it. That
|
|
385
|
+
* holds only for a file the current pass produced (TIM-1266).
|
|
386
|
+
*
|
|
387
|
+
* @internal Exported for testing.
|
|
388
|
+
*/
|
|
389
|
+
export async function cleanConditionalArtifacts(staticDir: string): Promise<void> {
|
|
390
|
+
await rm(join(staticDir, RSC_PAYLOAD_DIR), { recursive: true, force: true }).catch(() => {});
|
|
391
|
+
await rm(join(staticDir, REDIRECTS_FILE), { force: true }).catch(() => {});
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// ---------------------------------------------------------------------------
|
|
395
|
+
// Static generation orchestration (runs after Vite build)
|
|
396
|
+
// ---------------------------------------------------------------------------
|
|
397
|
+
|
|
398
|
+
interface StaticGenerateModule {
|
|
399
|
+
__timber_generateStaticSite?: (
|
|
400
|
+
options: StaticGenerationOptions
|
|
401
|
+
) => Promise<StaticGenerationSummary>;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* A port as Node actually hands it over: `unref()` is a Node addition the DOM
|
|
406
|
+
* lib type does not declare. Optional rather than asserted, so a runtime whose
|
|
407
|
+
* `MessageChannel` has no such method is simply skipped instead of throwing.
|
|
408
|
+
*/
|
|
409
|
+
type ReleasablePort = MessagePort & { unref?: () => void };
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Run `fn` with `MessageChannel` instrumented, then stop every channel opened
|
|
413
|
+
* while it ran from holding the process open.
|
|
414
|
+
*
|
|
415
|
+
* Static generation is the only build pass that renders **HTML** in the build
|
|
416
|
+
* process: it imports the built app bundle and drives the full SSR pipeline
|
|
417
|
+
* through it. React's scheduler opens a `MessageChannel` at module scope in
|
|
418
|
+
* that bundle (`scheduler`'s DOM build) and never closes it, and a ref'd
|
|
419
|
+
* `MessagePort` keeps Node's event loop alive on its own — so `timber build`
|
|
420
|
+
* finished the site, printed its summary, and then hung forever. Server-mode
|
|
421
|
+
* builds are unaffected because nothing there renders through react-dom.
|
|
422
|
+
*
|
|
423
|
+
* `unref()` is the whole fix: it leaves the port working and only drops the
|
|
424
|
+
* "keep the process alive" property. It is applied **after** `fn` resolves, so
|
|
425
|
+
* a render in flight can never be cut short by the process exiting under it —
|
|
426
|
+
* an unref'd port would let Node exit while the scheduler still had a
|
|
427
|
+
* continuation queued, which is a silently truncated page rather than a hang.
|
|
428
|
+
*
|
|
429
|
+
* Nothing renders after this pass. If that ever changes, the release has to
|
|
430
|
+
* move to the end of whatever renders last.
|
|
431
|
+
*
|
|
432
|
+
* @internal Exported for testing.
|
|
433
|
+
*/
|
|
434
|
+
export async function withSchedulerPortsReleased<T>(fn: () => Promise<T>): Promise<T> {
|
|
435
|
+
const opened: ReleasablePort[] = [];
|
|
436
|
+
const OriginalMessageChannel = globalThis.MessageChannel;
|
|
437
|
+
|
|
438
|
+
globalThis.MessageChannel = class extends OriginalMessageChannel {
|
|
439
|
+
constructor() {
|
|
440
|
+
super();
|
|
441
|
+
opened.push(this.port1, this.port2);
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
try {
|
|
446
|
+
return await fn();
|
|
447
|
+
} finally {
|
|
448
|
+
globalThis.MessageChannel = OriginalMessageChannel;
|
|
449
|
+
for (const port of opened) port.unref?.();
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/** The pre-rendered site a static generation pass wrote. */
|
|
454
|
+
export interface StaticSite {
|
|
455
|
+
pages: DirectoryArtifact;
|
|
456
|
+
/** Content-Type per URL path for extensionless API outputs (TIM-1241). */
|
|
457
|
+
contentTypes: Record<string, string>;
|
|
458
|
+
/** `[RSC_PAYLOAD_DIR]` when payloads were written and content-hashed, else none. */
|
|
459
|
+
immutableDirs: string[];
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Load the built RSC entry and run the static generation pass — the static
|
|
464
|
+
* generation step of the post-build phase (plugins/post-build.ts).
|
|
465
|
+
*
|
|
466
|
+
* The build manifest it renders with is already final: the phase merged the
|
|
467
|
+
* RSC assets manifest into it and published it before this step. Unlike
|
|
468
|
+
* prebuilt capture, this needs the FULL pipeline handler, so
|
|
469
|
+
* __TIMBER_CAPTURE_MODE__ must be false.
|
|
470
|
+
*
|
|
471
|
+
* Returns the site only once it is complete, so an adapter is never handed a
|
|
472
|
+
* directory a failed pass left half-written — a failure throws instead.
|
|
473
|
+
*/
|
|
474
|
+
export async function runStaticGeneration(ctx: PluginContext, rscDir: string): Promise<StaticSite> {
|
|
475
|
+
const entryPath = join(rscDir, 'index.js');
|
|
476
|
+
warnUnusableBase(ctx);
|
|
477
|
+
|
|
478
|
+
// Ensure capture mode is off — we need the full handler.
|
|
479
|
+
(globalThis as Record<string, unknown>).__TIMBER_CAPTURE_MODE__ = false;
|
|
480
|
+
|
|
481
|
+
console.log('[timber] Static generation: building site…');
|
|
482
|
+
|
|
483
|
+
const staticDir = join(ctx.buildDir, 'static-pages');
|
|
484
|
+
await cleanConditionalArtifacts(staticDir);
|
|
485
|
+
await mkdir(staticDir, { recursive: true });
|
|
486
|
+
|
|
487
|
+
const sitemapConfig = ctx.config.sitemap;
|
|
488
|
+
const autoSitemapEnabled = Boolean(sitemapConfig?.enabled && sitemapConfig?.baseUrl);
|
|
489
|
+
|
|
490
|
+
const writer = new StaticSiteWriter(staticDir, await detectFsIdentity(staticDir));
|
|
491
|
+
// Route params are not collected here any more. They used to be lifted off
|
|
492
|
+
// the generated entry's response headers and inlined into the manifest,
|
|
493
|
+
// because a `.rsc` file carries no headers and the manifest was the only
|
|
494
|
+
// channel a static SPA navigation had (TIM-1255, TIM-1285). The params are
|
|
495
|
+
// now inside the payload itself — a field on its root row — so the `.rsc`
|
|
496
|
+
// file carries them and there is nothing to lift (TIM-1294).
|
|
497
|
+
|
|
498
|
+
// The app bundle is imported and rendered inside this wrapper, and only
|
|
499
|
+
// inside it: everything it opens to schedule React work is released on the
|
|
500
|
+
// way out so the build process can exit.
|
|
501
|
+
const summary = await withSchedulerPortsReleased(async () => {
|
|
502
|
+
let mod: StaticGenerateModule;
|
|
503
|
+
try {
|
|
504
|
+
const entryUrl = `${pathToFileURL(entryPath).href}?t=${Date.now()}`;
|
|
505
|
+
mod = (await import(/* @vite-ignore */ entryUrl)) as StaticGenerateModule;
|
|
506
|
+
} catch (error) {
|
|
507
|
+
// A missing entry lands here too: the import is the existence check.
|
|
508
|
+
throw new Error(
|
|
509
|
+
`[timber] Static generation: failed to load the built RSC entry (${entryPath}). ` +
|
|
510
|
+
`The full request handler must initialize for static rendering.`,
|
|
511
|
+
{ cause: error }
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
const generate = mod.__timber_generateStaticSite;
|
|
516
|
+
if (typeof generate !== 'function') {
|
|
517
|
+
throw new Error(
|
|
518
|
+
`[timber] Static generation: built RSC entry does not export ` +
|
|
519
|
+
`__timber_generateStaticSite — rebuild from a clean build directory`
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return generate({
|
|
524
|
+
autoSitemapEnabled,
|
|
525
|
+
renderTimeoutMs: ctx.config.renderTimeoutMs,
|
|
526
|
+
onEntry: (entry: StaticPageEntry) => writer.write(entry),
|
|
123
527
|
});
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
const totalUrls = summary.rendered + summary.errors.length;
|
|
531
|
+
console.log(
|
|
532
|
+
`[timber] Static generation: rendered ${summary.rendered}/${totalUrls} entries.` +
|
|
533
|
+
(summary.errors.length > 0 ? ` ${summary.errors.length} failed.` : '') +
|
|
534
|
+
(summary.redirects.length > 0 ? ` ${summary.redirects.length} redirect(s).` : '')
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
// Warnings are non-fatal but must not be buried in the per-entry log stream —
|
|
538
|
+
// they name a degraded artifact the developer is about to deploy (TIM-1258).
|
|
539
|
+
for (const warning of summary.warnings) {
|
|
540
|
+
console.warn(`[timber] Static generation warning: ${warning}`);
|
|
124
541
|
}
|
|
125
542
|
|
|
126
|
-
|
|
543
|
+
if (summary.errors.length > 0) {
|
|
544
|
+
const details = summary.errors.map((e) => ` - ${e.urlPath}: ${e.message}`).join('\n');
|
|
545
|
+
throw new Error(`[timber] Static generation failed:\n${details}`);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// Raised after the render errors above: a collision means the site is
|
|
549
|
+
// ambiguous, not that a page failed, and the message names both routes.
|
|
550
|
+
writer.assertNoCollisions();
|
|
551
|
+
|
|
552
|
+
// Hash RSC flight payloads for immutable caching (TIM-1254).
|
|
553
|
+
// Renames _rsc/*.rsc → _rsc/*-<hash>.rsc and injects a manifest
|
|
554
|
+
// into each HTML file so the client can resolve hashed URLs.
|
|
555
|
+
// Skip when client JS is disabled — no SPA navigation, no RSC fetches,
|
|
556
|
+
// and injecting a <script> tag would violate the no-JS contract.
|
|
557
|
+
const immutableDirs: string[] = [];
|
|
558
|
+
if (!ctx.clientJavascript.disabled) {
|
|
559
|
+
const rscManifest = await hashRscPayloads(staticDir);
|
|
560
|
+
if (Object.keys(rscManifest).length > 0) {
|
|
561
|
+
immutableDirs.push(RSC_PAYLOAD_DIR);
|
|
562
|
+
await injectRscManifestIntoHtml(staticDir, rscManifest);
|
|
563
|
+
console.log(
|
|
564
|
+
`[timber] Static generation: hashed ${Object.keys(rscManifest).length} RSC flight payloads`
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// Write _redirects file for platform redirect rules (Cloudflare Pages,
|
|
570
|
+
// Netlify, etc.). Format: /from /to status. See TIM-1245.
|
|
571
|
+
if (summary.redirects.length > 0) {
|
|
572
|
+
const generated = generateRedirectsFile(summary.redirects, normalizeBasePath(ctx.base));
|
|
573
|
+
const redirectsPath = join(staticDir, REDIRECTS_FILE);
|
|
574
|
+
|
|
575
|
+
// Merge with user-authored _redirects if present. TIM-1249.
|
|
576
|
+
const userRedirects = await readUserRedirects(ctx.root);
|
|
577
|
+
if (userRedirects !== null) {
|
|
578
|
+
await writeFileAtomic(redirectsPath, generated + '\n' + userRedirects);
|
|
579
|
+
console.log(
|
|
580
|
+
`[timber] Static generation: wrote _redirects with ${summary.redirects.length} ` +
|
|
581
|
+
`generated rule(s), merged with user-authored _redirects`
|
|
582
|
+
);
|
|
583
|
+
} else {
|
|
584
|
+
await writeFileAtomic(redirectsPath, generated);
|
|
585
|
+
console.log(
|
|
586
|
+
`[timber] Static generation: wrote _redirects with ${summary.redirects.length} rule(s)`
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// Content types travel with the site because they describe it: a static
|
|
592
|
+
// host cannot infer the type of an extensionless API output (TIM-1241).
|
|
593
|
+
return { pages: { path: staticDir }, contentTypes: writer.contentTypes, immutableDirs };
|
|
127
594
|
}
|
|
128
595
|
|
|
129
596
|
// ---------------------------------------------------------------------------
|
|
130
|
-
//
|
|
597
|
+
// Base path validation (TIM-1261)
|
|
131
598
|
// ---------------------------------------------------------------------------
|
|
132
599
|
|
|
133
600
|
/**
|
|
134
|
-
*
|
|
601
|
+
* Warn when Vite's `base` is document-relative (`'./'`) in static mode.
|
|
602
|
+
*
|
|
603
|
+
* Payload URLs are addressed from the deployment root plus the base prefix.
|
|
604
|
+
* A relative base gives no prefix to compute (see shared/base-path.ts), so
|
|
605
|
+
* `/_rsc/about.rsc` is requested at the domain root — correct only when the
|
|
606
|
+
* site is served from there. The build still succeeds: relative bases work
|
|
607
|
+
* fine for assets, and for a root-served site nothing is wrong. The warning
|
|
608
|
+
* exists so a sub-path deployment does not silently degrade to a hard
|
|
609
|
+
* navigation on every link.
|
|
610
|
+
*
|
|
611
|
+
* Skipped when client JS is disabled — there is no SPA navigation and no
|
|
612
|
+
* payload fetch to mis-address.
|
|
135
613
|
*
|
|
136
|
-
*
|
|
137
|
-
* - Dynamic API detection (cookies, headers) — always in static mode
|
|
138
|
-
* - Directive detection ('use client', 'use server') — only when client JS is disabled
|
|
614
|
+
* @internal Exported for testing.
|
|
139
615
|
*/
|
|
140
|
-
export function
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
616
|
+
export function warnUnusableBase(ctx: PluginContext): void {
|
|
617
|
+
if (ctx.clientJavascript.disabled) return;
|
|
618
|
+
if (!isRelativeBase(ctx.base)) return;
|
|
619
|
+
console.warn(
|
|
620
|
+
`[timber] Static mode: base is "${ctx.base}", which is document-relative. ` +
|
|
621
|
+
`RSC payload URLs are addressed from the domain root, so client-side ` +
|
|
622
|
+
`navigation will fall back to a full page load if the site is served ` +
|
|
623
|
+
`from a sub-path. Use an absolute base (e.g. base: '/repo/') to deploy ` +
|
|
624
|
+
`under a sub-path. See design/11-platform.md.`
|
|
625
|
+
);
|
|
626
|
+
}
|
|
146
627
|
|
|
147
|
-
|
|
148
|
-
|
|
628
|
+
// ---------------------------------------------------------------------------
|
|
629
|
+
// RSC flight payload hashing (TIM-1254)
|
|
630
|
+
// ---------------------------------------------------------------------------
|
|
149
631
|
|
|
150
|
-
|
|
632
|
+
/**
|
|
633
|
+
* Compute a short content hash for immutable caching.
|
|
634
|
+
* Uses 8 chars of base64url-encoded SHA-256, matching Vite's asset hash style.
|
|
635
|
+
*/
|
|
636
|
+
export function contentHash(data: Buffer | Uint8Array): string {
|
|
637
|
+
return createHash('sha256').update(data).digest('base64url').slice(0, 8);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Walk a directory recursively and return all file paths.
|
|
642
|
+
*/
|
|
643
|
+
async function walkDir(dir: string): Promise<string[]> {
|
|
644
|
+
const results: string[] = [];
|
|
645
|
+
let entries;
|
|
646
|
+
try {
|
|
647
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
648
|
+
} catch {
|
|
649
|
+
return results;
|
|
650
|
+
}
|
|
651
|
+
for (const entry of entries) {
|
|
652
|
+
const full = join(dir, entry.name);
|
|
653
|
+
if (entry.isDirectory()) {
|
|
654
|
+
results.push(...(await walkDir(full)));
|
|
655
|
+
} else {
|
|
656
|
+
results.push(full);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
return results;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* Hash all RSC flight payloads in `_rsc/`, rename them with content
|
|
664
|
+
* hashes, and build a manifest with optional inlined route params.
|
|
665
|
+
*
|
|
666
|
+
* Before: `_rsc/index.rsc`, `_rsc/about.rsc`
|
|
667
|
+
* After: `_rsc/index-B7YxEKdN.rsc`, `_rsc/about-C8ZzFLfO.rsc`
|
|
668
|
+
*
|
|
669
|
+
* The manifest maps the original `_rsc/` URL to an entry object:
|
|
670
|
+
* `{"/_rsc/index.rsc":{"url":"/_rsc/index-B7YxEKdN.rsc"}, ...}`
|
|
671
|
+
*
|
|
672
|
+
* Keys and URLs are **route-space**: root-relative, never carrying Vite's
|
|
673
|
+
* `base`. The client applies the base once, at fetch time
|
|
674
|
+
* (`client/rsc-fetch.ts` → `toStaticRscUrl`), so the generated site stays
|
|
675
|
+
* relocatable and the base has exactly one expression at runtime rather
|
|
676
|
+
* than two that must agree. See TIM-1261.
|
|
677
|
+
*
|
|
678
|
+
* Route params (from `routeParams`) are inlined into the manifest
|
|
679
|
+
* entry, eliminating the need for .params.json sidecar files. TIM-1255.
|
|
680
|
+
*
|
|
681
|
+
* Injected into HTML as:
|
|
682
|
+
* `<script>window.__TIMBER_RSC_MANIFEST__={...}</script>`
|
|
683
|
+
*
|
|
684
|
+
* @internal Exported for testing.
|
|
685
|
+
*/
|
|
686
|
+
export async function hashRscPayloads(staticDir: string): Promise<RscManifest> {
|
|
687
|
+
const rscDir = join(staticDir, RSC_PAYLOAD_DIR);
|
|
688
|
+
const files = await walkDir(rscDir);
|
|
689
|
+
const manifest: RscManifest = {};
|
|
690
|
+
|
|
691
|
+
for (const filePath of files) {
|
|
692
|
+
if (!filePath.endsWith('.rsc')) continue;
|
|
693
|
+
|
|
694
|
+
const content = await readFile(filePath);
|
|
695
|
+
const hash = contentHash(content);
|
|
696
|
+
const rel = relative(staticDir, filePath).replace(/\\/g, '/');
|
|
697
|
+
|
|
698
|
+
const base = filePath.slice(0, -'.rsc'.length);
|
|
699
|
+
const hashedPath = `${base}-${hash}.rsc`;
|
|
700
|
+
|
|
701
|
+
await rename(filePath, hashedPath);
|
|
702
|
+
|
|
703
|
+
const hashedRel = relative(staticDir, hashedPath).replace(/\\/g, '/');
|
|
704
|
+
const key = `/${rel}`;
|
|
705
|
+
manifest[key] = { url: `/${hashedRel}` };
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
return manifest;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/**
|
|
712
|
+
* Inject the RSC manifest into all HTML files as a `<script>` tag
|
|
713
|
+
* before `</head>`. This lets the client resolve hashed RSC URLs
|
|
714
|
+
* without an extra network request.
|
|
715
|
+
*
|
|
716
|
+
* @internal Exported for testing.
|
|
717
|
+
*/
|
|
718
|
+
export async function injectRscManifestIntoHtml(
|
|
719
|
+
staticDir: string,
|
|
720
|
+
manifest: RscManifest
|
|
721
|
+
): Promise<void> {
|
|
722
|
+
const allFiles = await walkDir(staticDir);
|
|
723
|
+
const htmlFiles = allFiles.filter((f) => f.endsWith('.html'));
|
|
724
|
+
const escapedJson = htmlEscapeJsonString(JSON.stringify(manifest));
|
|
725
|
+
const scriptTag = `<script>window.__TIMBER_RSC_MANIFEST__=${escapedJson}</script>`;
|
|
726
|
+
|
|
727
|
+
for (const htmlFile of htmlFiles) {
|
|
728
|
+
let html = await readFile(htmlFile, 'utf-8');
|
|
729
|
+
// Insert before </head> so it's available before any client JS runs
|
|
730
|
+
const headClose = html.indexOf('</head>');
|
|
731
|
+
if (headClose !== -1) {
|
|
732
|
+
html = html.slice(0, headClose) + scriptTag + html.slice(headClose);
|
|
733
|
+
} else {
|
|
734
|
+
// Fallback: prepend to body
|
|
735
|
+
html = scriptTag + html;
|
|
736
|
+
}
|
|
737
|
+
await writeFile(htmlFile, html);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
// ---------------------------------------------------------------------------
|
|
742
|
+
// User-authored _redirects merge (TIM-1249)
|
|
743
|
+
// ---------------------------------------------------------------------------
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Read a user-authored `_redirects` file from the project's `public/`
|
|
747
|
+
* directory. Returns `null` if no file exists.
|
|
748
|
+
*
|
|
749
|
+
* @internal Exported for testing.
|
|
750
|
+
*/
|
|
751
|
+
export async function readUserRedirects(root: string): Promise<string | null> {
|
|
752
|
+
const candidates = [join(root, 'public', REDIRECTS_FILE)];
|
|
753
|
+
for (const path of candidates) {
|
|
754
|
+
try {
|
|
755
|
+
return await readFile(path, 'utf-8');
|
|
756
|
+
} catch {
|
|
757
|
+
// File doesn't exist — try next
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
return null;
|
|
151
761
|
}
|
|
152
762
|
|
|
153
763
|
// ---------------------------------------------------------------------------
|
|
@@ -157,15 +767,11 @@ export function validateStaticMode(
|
|
|
157
767
|
/**
|
|
158
768
|
* Create the timber-static-build Vite plugin.
|
|
159
769
|
*
|
|
160
|
-
* Only active when output: 'static' is configured.
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
* - transform: Validates source files for static mode violations
|
|
770
|
+
* Only active when output: 'static' is configured. Validates source files
|
|
771
|
+
* for static mode violations; rendering the site is `runStaticGeneration`,
|
|
772
|
+
* which the post-build phase calls.
|
|
164
773
|
*/
|
|
165
774
|
export function timberStaticBuild(ctx: PluginContext): Plugin {
|
|
166
|
-
const isStatic = ctx.config.output === 'static';
|
|
167
|
-
const clientJavascriptDisabled = ctx.clientJavascript.disabled;
|
|
168
|
-
|
|
169
775
|
return {
|
|
170
776
|
name: 'timber-static-build',
|
|
171
777
|
|
|
@@ -173,10 +779,14 @@ export function timberStaticBuild(ctx: PluginContext): Plugin {
|
|
|
173
779
|
* Validate source files during transform.
|
|
174
780
|
*
|
|
175
781
|
* In static mode, we check every app/ file for:
|
|
176
|
-
* - Dynamic API usage (
|
|
177
|
-
* - When client JS disabled: 'use client' / 'use server' directives → build error
|
|
782
|
+
* - Dynamic API usage (getCookies(), getHeaders()) → build error
|
|
178
783
|
*/
|
|
179
784
|
transform(code: string, id: string) {
|
|
785
|
+
// Read ctx.config lazily inside the hook — not at plugin construction
|
|
786
|
+
// time — so file-based config from timber.config.ts is respected.
|
|
787
|
+
// See TIM-451.
|
|
788
|
+
const isStatic = ctx.config.output === 'static';
|
|
789
|
+
|
|
180
790
|
// Only active in static mode
|
|
181
791
|
if (!isStatic) return null;
|
|
182
792
|
|
|
@@ -189,7 +799,7 @@ export function timberStaticBuild(ctx: PluginContext): Plugin {
|
|
|
189
799
|
// Only check JS/TS files
|
|
190
800
|
if (!/\.[jt]sx?$/.test(id)) return null;
|
|
191
801
|
|
|
192
|
-
const errors =
|
|
802
|
+
const errors = detectDynamicApis(code, id);
|
|
193
803
|
|
|
194
804
|
if (errors.length > 0) {
|
|
195
805
|
// Format all errors into a single build error message
|