@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
package/src/plugins/fonts.ts
CHANGED
|
@@ -1,411 +1,152 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* timber-fonts — Vite sub-plugin for build-time font processing.
|
|
2
|
+
* timber-fonts — Vite sub-plugin shell for build-time font processing.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* - @font-face CSS generation and scoped class output
|
|
8
|
-
* - Size-adjusted fallback font generation
|
|
4
|
+
* This file is intentionally thin: it wires the Vite plugin hooks to the
|
|
5
|
+
* pipeline + per-concern modules under `../fonts/`. All real logic lives
|
|
6
|
+
* in:
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
* -
|
|
12
|
-
* -
|
|
8
|
+
* - `../fonts/pipeline.ts` — `FontPipeline` (state, mutators)
|
|
9
|
+
* - `../fonts/transform.ts` — transform-hook logic, parsing helpers
|
|
10
|
+
* - `../fonts/dev-middleware.ts` — dev font binary server
|
|
11
|
+
* - `../fonts/virtual-modules.ts` — virtual module ID constants + source
|
|
12
|
+
*
|
|
13
|
+
* The public exports below are the stable API that the test suite and
|
|
14
|
+
* other parts of the framework import. Anything new should be added to
|
|
15
|
+
* one of the per-concern modules and re-exported here only if external
|
|
16
|
+
* consumers need it.
|
|
13
17
|
*
|
|
14
18
|
* Design doc: 24-fonts.md
|
|
15
19
|
*/
|
|
16
20
|
|
|
17
|
-
import
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import type {
|
|
21
|
-
import type { ExtractedFont, GoogleFontConfig } from '#/fonts/types.js';
|
|
22
|
-
import type { ManifestFontEntry } from '#/server/build-manifest.js';
|
|
23
|
-
import { generateVariableClass, generateFontFamilyClass, generateFontFaces } from '#/fonts/css.js';
|
|
24
|
-
import { generateFallbackCss, buildFontStack } from '#/fonts/fallbacks.js';
|
|
25
|
-
import { processLocalFont, generateLocalFontFaces } from '#/fonts/local.js';
|
|
26
|
-
import { inferFontFormat } from '#/fonts/local.js';
|
|
27
|
-
import { downloadAndCacheFonts, type CachedFont } from '#/fonts/google.js';
|
|
21
|
+
import { parseAst } from 'vite';
|
|
22
|
+
import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite';
|
|
23
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
24
|
+
import type { BuildManifest } from '../server/build-manifest.ts';
|
|
28
25
|
import {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
} from '
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* Convert a font family name to a PascalCase export name.
|
|
64
|
-
* e.g. "JetBrains Mono" → "JetBrains_Mono"
|
|
65
|
-
*/
|
|
66
|
-
function familyToExportName(family: string): string {
|
|
67
|
-
return family.replace(/\s+/g, '_');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Convert a font family name to a scoped class name.
|
|
72
|
-
* e.g. "JetBrains Mono" → "timber-font-jetbrains-mono"
|
|
73
|
-
*/
|
|
74
|
-
function familyToClassName(family: string): string {
|
|
75
|
-
return `timber-font-${family.toLowerCase().replace(/\s+/g, '-')}`;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Generate a unique font ID from family + config hash.
|
|
80
|
-
*/
|
|
81
|
-
function generateFontId(family: string, config: GoogleFontConfig): string {
|
|
82
|
-
const weights = normalizeToArray(config.weight);
|
|
83
|
-
const styles = normalizeToArray(config.style);
|
|
84
|
-
const subsets = config.subsets ?? ['latin'];
|
|
85
|
-
return `${family.toLowerCase()}-${weights.join(',')}-${styles.join(',')}-${subsets.join(',')}`;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Normalize a string or string array to an array.
|
|
90
|
-
*/
|
|
91
|
-
function normalizeToArray(value: string | string[] | undefined): string[] {
|
|
92
|
-
if (!value) return ['400'];
|
|
93
|
-
return Array.isArray(value) ? value : [value];
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Normalize style to an array.
|
|
98
|
-
*/
|
|
99
|
-
function normalizeStyleArray(value: string | string[] | undefined): string[] {
|
|
100
|
-
if (!value) return ['normal'];
|
|
101
|
-
return Array.isArray(value) ? value : [value];
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Extract static font config from a font function call in source code.
|
|
106
|
-
*
|
|
107
|
-
* Parses patterns like:
|
|
108
|
-
* const inter = Inter({ subsets: ['latin'], weight: '400', display: 'swap', variable: '--font-sans' })
|
|
109
|
-
*
|
|
110
|
-
* Returns null if the call cannot be statically analyzed.
|
|
111
|
-
*
|
|
112
|
-
* Uses acorn AST parsing for robust handling of comments, trailing commas,
|
|
113
|
-
* and multi-line configs.
|
|
114
|
-
*/
|
|
115
|
-
export function extractFontConfig(callSource: string): GoogleFontConfig | null {
|
|
116
|
-
return extractFontConfigAst(callSource);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Detect if a source file contains dynamic/computed font function calls
|
|
121
|
-
* that cannot be statically analyzed.
|
|
122
|
-
*
|
|
123
|
-
* Returns the offending expression if found, null if all calls are static.
|
|
124
|
-
*
|
|
125
|
-
* Uses acorn AST parsing for accurate detection.
|
|
126
|
-
*/
|
|
127
|
-
export function detectDynamicFontCall(source: string, importedNames: string[]): string | null {
|
|
128
|
-
return detectDynamicFontCallAst(source, importedNames);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Regex that matches imports from either `@timber/fonts/google` or `next/font/google`.
|
|
133
|
-
* The shims plugin resolves `next/font/google` to the same virtual module,
|
|
134
|
-
* but the source code still contains the original import specifier.
|
|
135
|
-
*/
|
|
136
|
-
const GOOGLE_FONT_IMPORT_RE =
|
|
137
|
-
/import\s*\{([^}]+)\}\s*from\s*['"](?:@timber\/fonts\/google|next\/font\/google)['"]/g;
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Parse import specifiers from a source file that imports from
|
|
141
|
-
* `@timber/fonts/google` or `next/font/google`.
|
|
142
|
-
*
|
|
143
|
-
* Returns the list of imported font names (e.g. ['Inter', 'JetBrains_Mono']).
|
|
144
|
-
*/
|
|
145
|
-
export function parseGoogleFontImports(source: string): string[] {
|
|
146
|
-
const importPattern = new RegExp(GOOGLE_FONT_IMPORT_RE.source, 'g');
|
|
147
|
-
const names: string[] = [];
|
|
148
|
-
|
|
149
|
-
let match;
|
|
150
|
-
while ((match = importPattern.exec(source)) !== null) {
|
|
151
|
-
const specifiers = match[1]
|
|
152
|
-
.split(',')
|
|
153
|
-
.map((s) => s.trim())
|
|
154
|
-
.filter(Boolean);
|
|
155
|
-
for (const spec of specifiers) {
|
|
156
|
-
// Handle `Inter as MyInter` — we want the local name
|
|
157
|
-
const parts = spec.split(/\s+as\s+/);
|
|
158
|
-
names.push(parts[parts.length - 1].trim());
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return names;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Parse the original (remote) font family names from imports.
|
|
167
|
-
*
|
|
168
|
-
* Returns a map of local name → family name.
|
|
169
|
-
* e.g. { Inter: 'Inter', JetBrains_Mono: 'JetBrains Mono' }
|
|
170
|
-
*/
|
|
171
|
-
export function parseGoogleFontFamilies(source: string): Map<string, string> {
|
|
172
|
-
const importPattern = new RegExp(GOOGLE_FONT_IMPORT_RE.source, 'g');
|
|
173
|
-
const families = new Map<string, string>();
|
|
174
|
-
|
|
175
|
-
let match;
|
|
176
|
-
while ((match = importPattern.exec(source)) !== null) {
|
|
177
|
-
const specifiers = match[1]
|
|
178
|
-
.split(',')
|
|
179
|
-
.map((s) => s.trim())
|
|
180
|
-
.filter(Boolean);
|
|
181
|
-
for (const spec of specifiers) {
|
|
182
|
-
const parts = spec.split(/\s+as\s+/);
|
|
183
|
-
const originalName = parts[0].trim();
|
|
184
|
-
const localName = parts[parts.length - 1].trim();
|
|
185
|
-
// Convert export name back to family name: JetBrains_Mono → JetBrains Mono
|
|
186
|
-
const family = originalName.replace(/_/g, ' ');
|
|
187
|
-
families.set(localName, family);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return families;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Generate the virtual module source for `@timber/fonts/google`.
|
|
196
|
-
*
|
|
197
|
-
* Each Google Font family gets a named export that returns a FontResult.
|
|
198
|
-
* In this base implementation, the functions return static data.
|
|
199
|
-
* The Google Fonts download task (timber-nk5) will add real font file URLs.
|
|
200
|
-
*/
|
|
201
|
-
function generateGoogleVirtualModule(registry: FontRegistry): string {
|
|
202
|
-
// Collect unique families from the registry
|
|
203
|
-
const families = new Set<string>();
|
|
204
|
-
for (const font of registry.values()) {
|
|
205
|
-
if (font.provider === 'google') families.add(font.family);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const lines = [
|
|
209
|
-
'// Auto-generated virtual module: @timber/fonts/google',
|
|
210
|
-
'// Each export is a font loader function that returns a FontResult.',
|
|
211
|
-
'',
|
|
212
|
-
];
|
|
213
|
-
|
|
214
|
-
// If no fonts registered yet, export a generic loader for any font
|
|
215
|
-
// This is the initial load — the transform hook will process actual calls
|
|
216
|
-
lines.push('function createFontResult(family, config) {');
|
|
217
|
-
lines.push(' return {');
|
|
218
|
-
lines.push(' className: `timber-font-${family.toLowerCase().replace(/\\s+/g, "-")}`,');
|
|
219
|
-
lines.push(' style: { fontFamily: family },');
|
|
220
|
-
lines.push(' variable: config?.variable,');
|
|
221
|
-
lines.push(' };');
|
|
222
|
-
lines.push('}');
|
|
223
|
-
lines.push('');
|
|
224
|
-
|
|
225
|
-
// Export a Proxy-based default that handles any font name import
|
|
226
|
-
lines.push('export default new Proxy({}, {');
|
|
227
|
-
lines.push(' get(_, prop) {');
|
|
228
|
-
lines.push(' if (typeof prop === "string") {');
|
|
229
|
-
lines.push(' return (config) => createFontResult(prop.replace(/_/g, " "), config);');
|
|
230
|
-
lines.push(' }');
|
|
231
|
-
lines.push(' }');
|
|
232
|
-
lines.push('});');
|
|
233
|
-
|
|
234
|
-
// Also export known families as named exports for tree-shaking
|
|
235
|
-
for (const family of families) {
|
|
236
|
-
const exportName = familyToExportName(family);
|
|
237
|
-
lines.push('');
|
|
238
|
-
lines.push(`export function ${exportName}(config) {`);
|
|
239
|
-
lines.push(` return createFontResult('${family}', config);`);
|
|
240
|
-
lines.push('}');
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
return lines.join('\n');
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Generate the virtual module source for `@timber/fonts/local`.
|
|
248
|
-
*/
|
|
249
|
-
function generateLocalVirtualModule(): string {
|
|
250
|
-
return [
|
|
251
|
-
'// Auto-generated virtual module: @timber/fonts/local',
|
|
252
|
-
'',
|
|
253
|
-
'export default function localFont(config) {',
|
|
254
|
-
' const family = config?.family || "Local Font";',
|
|
255
|
-
' return {',
|
|
256
|
-
' className: `timber-font-${family.toLowerCase().replace(/\\s+/g, "-")}`,',
|
|
257
|
-
' style: { fontFamily: family },',
|
|
258
|
-
' variable: config?.variable,',
|
|
259
|
-
' };',
|
|
260
|
-
'}',
|
|
261
|
-
].join('\n');
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Generate CSS for a single extracted font.
|
|
266
|
-
*
|
|
267
|
-
* Includes @font-face rules (for local fonts), fallback @font-face,
|
|
268
|
-
* and the scoped class rule.
|
|
269
|
-
*/
|
|
270
|
-
export function generateFontCss(font: ExtractedFont): string {
|
|
271
|
-
const cssParts: string[] = [];
|
|
272
|
-
|
|
273
|
-
if (font.provider === 'local' && font.localSources) {
|
|
274
|
-
const faces = generateLocalFontFaces(font.family, font.localSources, font.display);
|
|
275
|
-
const faceCss = generateFontFaces(faces);
|
|
276
|
-
if (faceCss) cssParts.push(faceCss);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
const fallbackCss = generateFallbackCss(font.family);
|
|
280
|
-
if (fallbackCss) cssParts.push(fallbackCss);
|
|
281
|
-
|
|
282
|
-
if (font.variable) {
|
|
283
|
-
cssParts.push(generateVariableClass(font.className, font.variable, font.fontFamily));
|
|
284
|
-
} else {
|
|
285
|
-
cssParts.push(generateFontFamilyClass(font.className, font.fontFamily));
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
return cssParts.join('\n\n');
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* Generate the CSS output for all extracted fonts.
|
|
293
|
-
*
|
|
294
|
-
* Includes @font-face rules for local fonts, fallback @font-face rules,
|
|
295
|
-
* and scoped classes.
|
|
296
|
-
*/
|
|
297
|
-
export function generateAllFontCss(registry: FontRegistry): string {
|
|
298
|
-
const cssParts: string[] = [];
|
|
299
|
-
for (const font of registry.values()) {
|
|
300
|
-
cssParts.push(generateFontCss(font));
|
|
301
|
-
}
|
|
302
|
-
return cssParts.join('\n\n');
|
|
303
|
-
}
|
|
26
|
+
downloadAndCacheFonts,
|
|
27
|
+
generateProductionFontFaces,
|
|
28
|
+
resolveDevFontFaces,
|
|
29
|
+
} from '../fonts/google.ts';
|
|
30
|
+
import { FONT_OUTPUT_DIR, fontUrlPrefix } from '../fonts/paths.ts';
|
|
31
|
+
import { FontPipeline } from '../fonts/pipeline.ts';
|
|
32
|
+
import { runFontsTransform } from '../fonts/transform.ts';
|
|
33
|
+
import { installFontDevMiddleware } from '../fonts/dev-middleware.ts';
|
|
34
|
+
import { emitFontAssets, writeFontManifest, groupCachedFontsByFamily } from '../fonts/bundle.ts';
|
|
35
|
+
import {
|
|
36
|
+
RESOLVED_GOOGLE,
|
|
37
|
+
RESOLVED_LOCAL,
|
|
38
|
+
VIRTUAL_GOOGLE,
|
|
39
|
+
VIRTUAL_LOCAL,
|
|
40
|
+
generateGoogleVirtualModule,
|
|
41
|
+
generateLocalVirtualModule,
|
|
42
|
+
} from '../fonts/virtual-modules.ts';
|
|
43
|
+
|
|
44
|
+
// ── Public re-exports ────────────────────────────────────────────────────
|
|
45
|
+
//
|
|
46
|
+
// These exports are part of the stable surface area imported by tests and
|
|
47
|
+
// downstream consumers. Do NOT change their names or signatures without
|
|
48
|
+
// updating every caller. New helpers should be added to the per-concern
|
|
49
|
+
// module first and re-exported here only if external code needs them.
|
|
50
|
+
|
|
51
|
+
export { FontPipeline } from '../fonts/pipeline.ts';
|
|
52
|
+
export {
|
|
53
|
+
generateFontId,
|
|
54
|
+
extractFontConfig,
|
|
55
|
+
detectDynamicFontCall,
|
|
56
|
+
parseGoogleFontImports,
|
|
57
|
+
parseGoogleFontFamilies,
|
|
58
|
+
parseLocalFontImportName,
|
|
59
|
+
} from '../fonts/transform.ts';
|
|
304
60
|
|
|
305
61
|
/**
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
* import myLoader from '@timber/fonts/local'
|
|
62
|
+
* What the post-build phase asks of the font plugin (plugins/post-build.ts).
|
|
63
|
+
* Called after every environment has been built, so the font entries are
|
|
64
|
+
* complete — no environment's `generateBundle` has to run after the build
|
|
65
|
+
* manifest exists.
|
|
311
66
|
*/
|
|
312
|
-
export
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
* Transform local font calls in source code.
|
|
321
|
-
*
|
|
322
|
-
* Finds `localFont({ ... })` calls, extracts the config,
|
|
323
|
-
* registers the font, and replaces the call with a static FontResult.
|
|
324
|
-
*/
|
|
325
|
-
function transformLocalFonts(
|
|
326
|
-
transformedCode: string,
|
|
327
|
-
originalCode: string,
|
|
328
|
-
importerId: string,
|
|
329
|
-
registry: FontRegistry,
|
|
330
|
-
emitError: (msg: string) => void
|
|
331
|
-
): string {
|
|
332
|
-
const localName = parseLocalFontImportName(originalCode);
|
|
333
|
-
if (!localName) return transformedCode;
|
|
334
|
-
|
|
335
|
-
// Check for dynamic calls
|
|
336
|
-
const dynamicCall = detectDynamicFontCall(originalCode, [localName]);
|
|
337
|
-
if (dynamicCall) {
|
|
338
|
-
emitError(
|
|
339
|
-
`Font function calls must be statically analyzable. ` +
|
|
340
|
-
`Found dynamic call: ${dynamicCall}. ` +
|
|
341
|
-
`Pass a literal object with string/array values instead.`
|
|
342
|
-
);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// Find all calls: const varName = localFont({ ... })
|
|
346
|
-
const callPattern = new RegExp(
|
|
347
|
-
`(?:const|let|var)\\s+(\\w+)\\s*=\\s*${localName}\\s*\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)`,
|
|
348
|
-
'g'
|
|
349
|
-
);
|
|
350
|
-
|
|
351
|
-
let callMatch;
|
|
352
|
-
while ((callMatch = callPattern.exec(originalCode)) !== null) {
|
|
353
|
-
const varName = callMatch[1];
|
|
354
|
-
const configSource = callMatch[2];
|
|
355
|
-
const fullMatch = callMatch[0];
|
|
356
|
-
|
|
357
|
-
const config = extractLocalFontConfigAst(`(${configSource})`);
|
|
358
|
-
if (!config) {
|
|
359
|
-
emitError(
|
|
360
|
-
`Could not statically analyze local font config. ` +
|
|
361
|
-
`Ensure src is a string or array of { path, weight?, style? } objects.`
|
|
362
|
-
);
|
|
363
|
-
return transformedCode;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
const extracted = processLocalFont(config, importerId);
|
|
367
|
-
registry.set(extracted.id, extracted);
|
|
368
|
-
|
|
369
|
-
const resultObj = extracted.variable
|
|
370
|
-
? `{ className: "${extracted.className}", style: { fontFamily: "${extracted.fontFamily}" }, variable: "${extracted.variable}" }`
|
|
371
|
-
: `{ className: "${extracted.className}", style: { fontFamily: "${extracted.fontFamily}" } }`;
|
|
372
|
-
|
|
373
|
-
const replacement = `const ${varName} = ${resultObj}`;
|
|
374
|
-
transformedCode = transformedCode.replace(fullMatch, replacement);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// Remove the import statement
|
|
378
|
-
transformedCode = transformedCode.replace(
|
|
379
|
-
/import\s+\w+\s+from\s*['"](?:@timber\/fonts\/local|next\/font\/local)['"];?\s*\n?/g,
|
|
380
|
-
''
|
|
381
|
-
);
|
|
382
|
-
|
|
383
|
-
return transformedCode;
|
|
67
|
+
export interface FontsBuildStep {
|
|
68
|
+
/** Write this build's font entries into the build manifest. */
|
|
69
|
+
contributeManifest(manifest: BuildManifest): void;
|
|
70
|
+
/**
|
|
71
|
+
* Directories of the client bundle this build filled with content-hashed
|
|
72
|
+
* font binaries — `[FONT_OUTPUT_DIR]` when any were emitted, else none.
|
|
73
|
+
*/
|
|
74
|
+
immutableDirs(): string[];
|
|
384
75
|
}
|
|
385
76
|
|
|
386
77
|
/**
|
|
387
78
|
* Create the timber-fonts Vite plugin.
|
|
388
79
|
*/
|
|
389
|
-
export function timberFonts(ctx: PluginContext): Plugin {
|
|
390
|
-
const
|
|
391
|
-
/**
|
|
392
|
-
let
|
|
80
|
+
export function timberFonts(ctx: PluginContext): Plugin & { api: FontsBuildStep } {
|
|
81
|
+
const pipeline = new FontPipeline({ hashOnRegister: !ctx.dev });
|
|
82
|
+
/** Whether the client environment emitted a binary this build. */
|
|
83
|
+
let emittedToClient = false;
|
|
393
84
|
|
|
394
85
|
return {
|
|
395
86
|
name: 'timber-fonts',
|
|
396
87
|
|
|
88
|
+
api: {
|
|
89
|
+
contributeManifest: (manifest) => writeFontManifest(pipeline, manifest, ctx.base),
|
|
90
|
+
immutableDirs: () => (emittedToClient ? [FONT_OUTPUT_DIR] : []),
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Push Vite's resolved `base` into the pipeline so every font URL it
|
|
95
|
+
* emits (@font-face src, manifest hrefs, dev middleware matching)
|
|
96
|
+
* carries the prefix. Emitted file locations are unaffected — only URLs.
|
|
97
|
+
*
|
|
98
|
+
* `config.base` is read here rather than `ctx.base`: this plugin is
|
|
99
|
+
* `enforce: 'pre'`, so its configResolved runs before timber-root-sync
|
|
100
|
+
* populates `ctx.base`. Every *later* hook reads `ctx.base` — the single
|
|
101
|
+
* copy (TIM-1261).
|
|
102
|
+
*/
|
|
103
|
+
configResolved(config: ResolvedConfig) {
|
|
104
|
+
pipeline.setBase(config.base);
|
|
105
|
+
|
|
106
|
+
// Font binaries are emitted in generateBundle, after Vite's CSS
|
|
107
|
+
// url() resolution runs. The warnings are benign — suppress them.
|
|
108
|
+
const originalWarnOnce = config.logger.warnOnce.bind(config.logger);
|
|
109
|
+
config.logger.warnOnce = (msg, options) => {
|
|
110
|
+
if (msg.includes('_timber/fonts/') && msg.includes("didn't resolve at build time")) return;
|
|
111
|
+
originalWarnOnce(msg, options);
|
|
112
|
+
};
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* `enforce: 'pre'` is load-bearing for the font CSS pipeline (TIM-828).
|
|
117
|
+
*
|
|
118
|
+
* The transform hook injects a side-effect
|
|
119
|
+
* `import 'virtual:timber-font-css/<hash>.css'` into every file that
|
|
120
|
+
* registers a font. @vitejs/plugin-rsc's `rsc:rsc-css-export-transform`
|
|
121
|
+
* later inspects each server component's source for CSS imports and
|
|
122
|
+
* wraps the default export in `import.meta.viteRsc.loadCss(...)` so
|
|
123
|
+
* the matched virtual CSS module ends up `preinit`'d as
|
|
124
|
+
* `<link rel="stylesheet" data-rsc-css-href=...>`.
|
|
125
|
+
*
|
|
126
|
+
* If timber-fonts ran in normal order it would inject the CSS import
|
|
127
|
+
* *after* plugin-rsc had already scanned the source, and the font CSS
|
|
128
|
+
* would be silently dropped from the rendered HTML. Running in the
|
|
129
|
+
* `pre` slot guarantees our injected import is visible to plugin-rsc's
|
|
130
|
+
* later CSS-export scan.
|
|
131
|
+
*/
|
|
132
|
+
enforce: 'pre',
|
|
133
|
+
|
|
397
134
|
/**
|
|
398
|
-
* Resolve `@timber/fonts/google`, `@timber/fonts/local`,
|
|
399
|
-
*
|
|
135
|
+
* Resolve `@timber/fonts/google`, `@timber/fonts/local`, and the
|
|
136
|
+
* per-importer `virtual:timber-font-css/<hash>.css` modules injected
|
|
137
|
+
* by the transform hook.
|
|
400
138
|
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
403
|
-
*
|
|
139
|
+
* Strips the `\0` prefix added by the RSC plugin's re-imports and the
|
|
140
|
+
* absolute root prefix added by SSR build entries before comparing
|
|
141
|
+
* against the public IDs. The `.css` suffix on font-css ids is
|
|
142
|
+
* preserved so Vite's CSS pipeline (`isCSSRequest`) recognises the
|
|
143
|
+
* resolved id as CSS.
|
|
404
144
|
*/
|
|
405
145
|
resolveId(id: string) {
|
|
406
|
-
// Strip \0 prefix (RSC plugin re-imports)
|
|
407
146
|
let cleanId = id.startsWith('\0') ? id.slice(1) : id;
|
|
408
|
-
|
|
147
|
+
const qIdx = cleanId.indexOf('?');
|
|
148
|
+
const query = qIdx !== -1 ? cleanId.slice(qIdx) : '';
|
|
149
|
+
if (qIdx !== -1) cleanId = cleanId.slice(0, qIdx);
|
|
409
150
|
if (cleanId.startsWith(ctx.root)) {
|
|
410
151
|
const stripped = cleanId.slice(ctx.root.length);
|
|
411
152
|
if (stripped.startsWith('/') || stripped.startsWith('\\')) {
|
|
@@ -417,317 +158,179 @@ export function timberFonts(ctx: PluginContext): Plugin {
|
|
|
417
158
|
|
|
418
159
|
if (cleanId === VIRTUAL_GOOGLE) return RESOLVED_GOOGLE;
|
|
419
160
|
if (cleanId === VIRTUAL_LOCAL) return RESOLVED_LOCAL;
|
|
420
|
-
|
|
161
|
+
// Preserve query suffix (notably `?direct`) on the resolved CSS id.
|
|
162
|
+
// Vite's transform middleware appends `?direct` when the browser
|
|
163
|
+
// fetches the URL as a `<link rel="stylesheet">`, and the CSS plugin
|
|
164
|
+
// only skips its JS-wrapping step when `isDirectCSSRequest(id)` sees
|
|
165
|
+
// that query on the resolved id. Dropping it here caused virtual
|
|
166
|
+
// font CSS to be served as Vite's HMR JS shim, leaving the
|
|
167
|
+
// `<link>`-loaded stylesheet empty (TIM-937 follow-up).
|
|
168
|
+
if (pipeline.cssIdMap.matches(cleanId)) return '\0' + cleanId + query;
|
|
421
169
|
return null;
|
|
422
170
|
},
|
|
423
171
|
|
|
424
172
|
/**
|
|
425
173
|
* Return generated source for font virtual modules.
|
|
426
174
|
*
|
|
427
|
-
* `virtual:timber-font-css`
|
|
428
|
-
*
|
|
429
|
-
*
|
|
430
|
-
*
|
|
175
|
+
* The per-importer `virtual:timber-font-css/<hash>.css` modules
|
|
176
|
+
* return the combined font CSS for the specific importer that
|
|
177
|
+
* registered them. Vite's CSS pipeline handles injection from here:
|
|
178
|
+
* in dev the module rides the CSS HMR channel; in production it is
|
|
179
|
+
* emitted as a real CSS asset and @vitejs/plugin-rsc's `collectCss`
|
|
180
|
+
* walks the RSC module graph to find it.
|
|
181
|
+
*
|
|
182
|
+
* Google `@font-face` descriptors are resolved lazily here (both
|
|
183
|
+
* dev and production) because `load` runs after `transform` has
|
|
184
|
+
* registered the font. `buildStart` runs before any transforms,
|
|
185
|
+
* so fonts aren't in the pipeline yet when it fires for the first
|
|
186
|
+
* environment.
|
|
431
187
|
*/
|
|
432
|
-
load(id: string) {
|
|
433
|
-
if (id === RESOLVED_GOOGLE) return generateGoogleVirtualModule(
|
|
188
|
+
async load(id: string) {
|
|
189
|
+
if (id === RESOLVED_GOOGLE) return generateGoogleVirtualModule(pipeline.fonts());
|
|
434
190
|
if (id === RESOLVED_LOCAL) return generateLocalVirtualModule();
|
|
435
191
|
|
|
436
|
-
if (id
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
return null;
|
|
442
|
-
},
|
|
443
|
-
|
|
444
|
-
/**
|
|
445
|
-
* Serve local font files and font CSS in dev mode under `/_timber/fonts/`.
|
|
446
|
-
*
|
|
447
|
-
* Serves:
|
|
448
|
-
* - `/_timber/fonts/fonts.css` — combined @font-face + scoped class CSS
|
|
449
|
-
* - `/_timber/fonts/<filename>` — individual font files from the registry
|
|
450
|
-
*
|
|
451
|
-
* Only files registered in the font registry are served.
|
|
452
|
-
* Paths are validated to prevent directory traversal.
|
|
453
|
-
*/
|
|
454
|
-
configureServer(server: ViteDevServer) {
|
|
455
|
-
server.middlewares.use((req, res, next) => {
|
|
456
|
-
const url = req.url;
|
|
457
|
-
if (!url || !url.startsWith('/_timber/fonts/')) return next();
|
|
192
|
+
if (pipeline.cssIdMap.matches(id)) {
|
|
193
|
+
const importer = pipeline.cssIdMap.importerFor(id);
|
|
194
|
+
if (!importer) {
|
|
195
|
+
return '';
|
|
196
|
+
}
|
|
458
197
|
|
|
459
|
-
|
|
460
|
-
//
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
return;
|
|
198
|
+
// The analyze crawl only needs import edges, not actual font
|
|
199
|
+
// CSS. Return an empty stylesheet so transforms resolve
|
|
200
|
+
// without triggering network fetches or cache writes.
|
|
201
|
+
if (process.env.TIMBER_ANALYZE === '1') {
|
|
202
|
+
return '';
|
|
465
203
|
}
|
|
466
204
|
|
|
467
|
-
|
|
468
|
-
// This middleware only serves font binary files (woff2, etc.).
|
|
205
|
+
const skipFonts = process.env.TIMBER_SKIP_FONTS === '1';
|
|
469
206
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
if (
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
const
|
|
483
|
-
const
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
};
|
|
491
|
-
res.setHeader('Content-Type', mimeMap[ext ?? ''] ?? 'application/octet-stream');
|
|
492
|
-
res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');
|
|
493
|
-
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
494
|
-
res.end(data);
|
|
495
|
-
return;
|
|
207
|
+
for (const font of pipeline.googleFonts()) {
|
|
208
|
+
if (font.importer !== importer) continue;
|
|
209
|
+
if (pipeline.hasFaces(font.id)) continue;
|
|
210
|
+
if (skipFonts && !ctx.dev) {
|
|
211
|
+
console.warn(`[timber-fonts] Skipping font "${font.family}" (TIMBER_SKIP_FONTS=1)`);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
if (ctx.dev) {
|
|
216
|
+
const faces = await resolveDevFontFaces(font);
|
|
217
|
+
pipeline.attachFaces(font.id, faces);
|
|
218
|
+
} else {
|
|
219
|
+
const cached = await downloadAndCacheFonts([font], ctx.root);
|
|
220
|
+
const byFamily = groupCachedFontsByFamily(cached);
|
|
221
|
+
const familyCached = byFamily.get(font.family.toLowerCase()) ?? [];
|
|
222
|
+
pipeline.attachCachedFiles(font.id, familyCached);
|
|
223
|
+
pipeline.attachFaces(
|
|
224
|
+
font.id,
|
|
225
|
+
generateProductionFontFaces(familyCached, font.display, fontUrlPrefix(ctx.base))
|
|
226
|
+
);
|
|
496
227
|
}
|
|
228
|
+
} catch (e) {
|
|
229
|
+
if (!ctx.dev) throw e;
|
|
230
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
231
|
+
console.warn(
|
|
232
|
+
`[timber-fonts] Failed to resolve Google font "${font.family}": ${msg}. Will retry on next request.`
|
|
233
|
+
);
|
|
497
234
|
}
|
|
498
235
|
}
|
|
499
236
|
|
|
500
|
-
|
|
501
|
-
}
|
|
237
|
+
return pipeline.getCssForSegment(importer);
|
|
238
|
+
}
|
|
239
|
+
return null;
|
|
502
240
|
},
|
|
503
241
|
|
|
504
242
|
/**
|
|
505
|
-
*
|
|
506
|
-
*
|
|
507
|
-
*
|
|
508
|
-
* The registry is populated by the transform hook which runs before
|
|
509
|
-
* buildStart in the build pipeline, so all fonts are known here.
|
|
243
|
+
* Serve local font files in dev mode under `/_timber/fonts/<basename>`.
|
|
244
|
+
* Font CSS goes through Vite's CSS pipeline (virtual modules), not
|
|
245
|
+
* this middleware.
|
|
510
246
|
*/
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
const googleFonts = [...registry.values()].filter((f) => f.provider === 'google');
|
|
515
|
-
if (googleFonts.length === 0) return;
|
|
516
|
-
|
|
517
|
-
cachedFonts = await downloadAndCacheFonts(googleFonts, ctx.root);
|
|
247
|
+
configureServer(server: ViteDevServer) {
|
|
248
|
+
installFontDevMiddleware(server, pipeline, ctx.base);
|
|
518
249
|
},
|
|
519
250
|
|
|
520
251
|
/**
|
|
521
|
-
*
|
|
252
|
+
* No-op. Font downloading and face attachment happen lazily in `load()`
|
|
253
|
+
* because `buildStart` runs before `transform` — fonts aren't registered
|
|
254
|
+
* in the pipeline yet when this fires for the first environment.
|
|
522
255
|
*
|
|
523
|
-
*
|
|
524
|
-
*
|
|
525
|
-
*
|
|
526
|
-
* 3. Validate that all calls are statically analyzable
|
|
527
|
-
* 4. Register extracted fonts in the registry
|
|
528
|
-
* 5. Replace the function call with a static FontResult object
|
|
256
|
+
* Local font hashing is handled at registration time by the pipeline
|
|
257
|
+
* (when `hashOnRegister` is set) so hashed filenames are available
|
|
258
|
+
* before the virtual CSS `load()` hook runs.
|
|
529
259
|
*/
|
|
530
|
-
|
|
531
|
-
// Skip virtual modules and node_modules
|
|
532
|
-
if (id.startsWith('\0') || id.includes('node_modules')) return null;
|
|
533
|
-
|
|
534
|
-
const hasGoogleImport =
|
|
535
|
-
code.includes('@timber/fonts/google') || code.includes('next/font/google');
|
|
536
|
-
const hasLocalImport =
|
|
537
|
-
code.includes('@timber/fonts/local') || code.includes('next/font/local');
|
|
538
|
-
if (!hasGoogleImport && !hasLocalImport) return null;
|
|
539
|
-
|
|
540
|
-
let transformedCode = code;
|
|
541
|
-
|
|
542
|
-
// ── Google font transform ──────────────────────────────────────────
|
|
543
|
-
if (hasGoogleImport) {
|
|
544
|
-
const families = parseGoogleFontFamilies(code);
|
|
545
|
-
if (families.size > 0) {
|
|
546
|
-
const importedNames = [...families.keys()];
|
|
547
|
-
|
|
548
|
-
const dynamicCall = detectDynamicFontCall(code, importedNames);
|
|
549
|
-
if (dynamicCall) {
|
|
550
|
-
this.error(
|
|
551
|
-
`Font function calls must be statically analyzable. ` +
|
|
552
|
-
`Found dynamic call: ${dynamicCall}. ` +
|
|
553
|
-
`Pass a literal object with string/array values instead.`
|
|
554
|
-
);
|
|
555
|
-
}
|
|
260
|
+
buildStart() {},
|
|
556
261
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
const config = extractFontConfig(`(${configSource})`);
|
|
570
|
-
if (!config) {
|
|
571
|
-
this.error(
|
|
572
|
-
`Could not statically analyze font config for ${family}. ` +
|
|
573
|
-
`Ensure all config values are string literals or arrays of string literals.`
|
|
574
|
-
);
|
|
575
|
-
return null;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
const fontId = generateFontId(family, config);
|
|
579
|
-
const className = familyToClassName(family);
|
|
580
|
-
const fontStack = buildFontStack(family);
|
|
581
|
-
const display = config.display ?? 'swap';
|
|
582
|
-
|
|
583
|
-
const extracted: ExtractedFont = {
|
|
584
|
-
id: fontId,
|
|
585
|
-
family,
|
|
586
|
-
provider: 'google',
|
|
587
|
-
weights: normalizeToArray(config.weight),
|
|
588
|
-
styles: normalizeStyleArray(config.style),
|
|
589
|
-
subsets: config.subsets ?? ['latin'],
|
|
590
|
-
display,
|
|
591
|
-
variable: config.variable,
|
|
592
|
-
className,
|
|
593
|
-
fontFamily: fontStack,
|
|
594
|
-
importer: id,
|
|
595
|
-
};
|
|
596
|
-
|
|
597
|
-
registry.set(fontId, extracted);
|
|
598
|
-
|
|
599
|
-
const resultObj = config.variable
|
|
600
|
-
? `{ className: "${className}", style: { fontFamily: "${fontStack}" }, variable: "${config.variable}" }`
|
|
601
|
-
: `{ className: "${className}", style: { fontFamily: "${fontStack}" } }`;
|
|
602
|
-
|
|
603
|
-
const replacement = `const ${varName} = ${resultObj}`;
|
|
604
|
-
transformedCode = transformedCode.replace(fullMatch, replacement);
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
transformedCode = transformedCode.replace(
|
|
609
|
-
/import\s*\{[^}]+\}\s*from\s*['"](?:@timber\/fonts\/google|next\/font\/google)['"];?\s*\n?/g,
|
|
610
|
-
''
|
|
611
|
-
);
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
// ── Local font transform ───────────────────────────────────────────
|
|
616
|
-
if (hasLocalImport) {
|
|
617
|
-
transformedCode = transformLocalFonts(
|
|
618
|
-
transformedCode,
|
|
619
|
-
code,
|
|
620
|
-
id,
|
|
621
|
-
registry,
|
|
622
|
-
this.error.bind(this)
|
|
623
|
-
);
|
|
262
|
+
/**
|
|
263
|
+
* Prune stale font entries when a module that previously imported fonts
|
|
264
|
+
* no longer contains any font import. The transform hook's `filter.code`
|
|
265
|
+
* skips such modules, so without this hook the old entries would persist
|
|
266
|
+
* until dev restart. See TIM-1087.
|
|
267
|
+
*/
|
|
268
|
+
async hotUpdate({ type, file, read }) {
|
|
269
|
+
if (!pipeline.hasImporter(file)) return;
|
|
270
|
+
if (type === 'delete') {
|
|
271
|
+
pipeline.pruneImporter(file);
|
|
272
|
+
return;
|
|
624
273
|
}
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
274
|
+
const code = await read();
|
|
275
|
+
const hasFontImport =
|
|
276
|
+
code.includes('@timber/fonts/') ||
|
|
277
|
+
code.includes('@timber-js/app/fonts/') ||
|
|
278
|
+
code.includes('next/font/');
|
|
279
|
+
if (hasFontImport) return;
|
|
280
|
+
// Only prune if the new source parses successfully. A syntax error
|
|
281
|
+
// means the HMR update will fail and the old module stays active —
|
|
282
|
+
// pruning would leave it without font CSS until the next valid save.
|
|
283
|
+
try {
|
|
284
|
+
parseAst(code, { lang: 'tsx' });
|
|
285
|
+
} catch {
|
|
286
|
+
return;
|
|
633
287
|
}
|
|
634
|
-
|
|
635
|
-
return null;
|
|
288
|
+
pipeline.pruneImporter(file);
|
|
636
289
|
},
|
|
637
290
|
|
|
638
291
|
/**
|
|
639
|
-
*
|
|
292
|
+
* Scan source files for font function calls and extract static config.
|
|
640
293
|
*
|
|
641
|
-
*
|
|
642
|
-
*
|
|
294
|
+
* Delegates to `runFontsTransform`. Errors raised through the
|
|
295
|
+
* `this.error` callback are surfaced as Vite plugin errors.
|
|
643
296
|
*
|
|
644
|
-
*
|
|
297
|
+
* The `filter` option uses Vite 8's rolldown-native hook filters to
|
|
298
|
+
* skip non-JS/TS files and files that don't mention any font module
|
|
299
|
+
* before crossing into JS — replacing the hand-rolled pre-filter that
|
|
300
|
+
* was previously inside `runFontsTransform` (TIM-840, TIM-1147).
|
|
301
|
+
*/
|
|
302
|
+
transform: {
|
|
303
|
+
filter: {
|
|
304
|
+
id: {
|
|
305
|
+
include: /^[^?]*\.(?:js|jsx|ts|tsx|mjs|cjs|mts|cts)(?:\?|$)/,
|
|
306
|
+
exclude: /(?:^\0|(?:^|\/)node_modules\/)/,
|
|
307
|
+
},
|
|
308
|
+
code: ['@timber/fonts/', '@timber-js/app/fonts/', 'next/font/'],
|
|
309
|
+
},
|
|
310
|
+
handler(code: string, id: string) {
|
|
311
|
+
return runFontsTransform(code, id, pipeline, (msg) => this.error(msg));
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Emit font binaries.
|
|
645
317
|
*
|
|
646
|
-
*
|
|
318
|
+
* All font binaries (Google and local) use content-hashed filenames
|
|
319
|
+
* for immutable caching. Font CSS is handled by Vite's CSS pipeline
|
|
320
|
+
* via virtual modules — we only emit binaries here. Manifest entries are
|
|
321
|
+
* written by the post-build phase through `api.contributeManifest`.
|
|
647
322
|
*/
|
|
648
323
|
generateBundle() {
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
for (const font of registry.values()) {
|
|
660
|
-
if (font.provider !== 'local' || !font.localSources) continue;
|
|
661
|
-
for (const src of font.localSources) {
|
|
662
|
-
const absolutePath = normalize(resolve(src.path));
|
|
663
|
-
if (!existsSync(absolutePath)) {
|
|
664
|
-
this.warn(`Local font file not found: ${absolutePath}`);
|
|
665
|
-
continue;
|
|
666
|
-
}
|
|
667
|
-
const basename = src.path.split('/').pop() ?? src.path;
|
|
668
|
-
const data = readFileSync(absolutePath);
|
|
669
|
-
this.emitFile({
|
|
670
|
-
type: 'asset',
|
|
671
|
-
fileName: `_timber/fonts/${basename}`,
|
|
672
|
-
source: data,
|
|
673
|
-
});
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
// Font CSS is emitted by Vite's CSS pipeline via virtual:timber-font-css modules.
|
|
678
|
-
// We only need to emit font binary files and update the build manifest here.
|
|
679
|
-
|
|
680
|
-
if (!ctx.buildManifest) return;
|
|
681
|
-
|
|
682
|
-
// Build a lookup from font family → cached files for manifest entries
|
|
683
|
-
const cachedByFamily = new Map<string, CachedFont[]>();
|
|
684
|
-
for (const cf of cachedFonts) {
|
|
685
|
-
const key = cf.face.family.toLowerCase();
|
|
686
|
-
const arr = cachedByFamily.get(key) ?? [];
|
|
687
|
-
arr.push(cf);
|
|
688
|
-
cachedByFamily.set(key, arr);
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
const fontsByImporter = new Map<string, ManifestFontEntry[]>();
|
|
692
|
-
|
|
693
|
-
for (const font of registry.values()) {
|
|
694
|
-
const entries = fontsByImporter.get(font.importer) ?? [];
|
|
695
|
-
|
|
696
|
-
if (font.provider === 'local' && font.localSources) {
|
|
697
|
-
// Local fonts: one entry per source file
|
|
698
|
-
for (const src of font.localSources) {
|
|
699
|
-
const filename = src.path.split('/').pop() ?? src.path;
|
|
700
|
-
const format = inferFontFormat(src.path);
|
|
701
|
-
entries.push({
|
|
702
|
-
href: `/_timber/fonts/${filename}`,
|
|
703
|
-
format,
|
|
704
|
-
crossOrigin: 'anonymous',
|
|
705
|
-
});
|
|
706
|
-
}
|
|
707
|
-
} else {
|
|
708
|
-
// Google fonts: use real content-hashed URLs from cached downloads
|
|
709
|
-
const familyKey = font.family.toLowerCase();
|
|
710
|
-
const familyCached = cachedByFamily.get(familyKey) ?? [];
|
|
711
|
-
for (const cf of familyCached) {
|
|
712
|
-
entries.push({
|
|
713
|
-
href: `/_timber/fonts/${cf.hashedFilename}`,
|
|
714
|
-
format: 'woff2',
|
|
715
|
-
crossOrigin: 'anonymous',
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
fontsByImporter.set(font.importer, entries);
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
// Normalize importer paths to be relative to project root (matching
|
|
724
|
-
// how Vite's manifest.json keys work for css/js).
|
|
725
|
-
for (const [importer, entries] of fontsByImporter) {
|
|
726
|
-
const relativePath = importer.startsWith(ctx.root)
|
|
727
|
-
? importer.slice(ctx.root.length + 1)
|
|
728
|
-
: importer;
|
|
729
|
-
ctx.buildManifest.fonts[relativePath] = entries;
|
|
730
|
-
}
|
|
324
|
+
let emitted = 0;
|
|
325
|
+
emitFontAssets(
|
|
326
|
+
pipeline,
|
|
327
|
+
(asset) => {
|
|
328
|
+
emitted++;
|
|
329
|
+
return this.emitFile(asset);
|
|
330
|
+
},
|
|
331
|
+
(msg) => this.warn(msg)
|
|
332
|
+
);
|
|
333
|
+
if (this.environment?.name === 'client') emittedToClient = emitted > 0;
|
|
731
334
|
},
|
|
732
335
|
};
|
|
733
336
|
}
|