@timber-js/app 0.2.0-alpha.20 → 0.2.0-alpha.201
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-HUdJADAD.js +345 -0
- package/dist/_chunks/actions-HUdJADAD.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js +370 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/cache-api-CAPbZTga.js +1149 -0
- package/dist/_chunks/cache-api-CAPbZTga.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-CBNA0Ozj.js +412 -0
- package/dist/_chunks/chains-CBNA0Ozj.js.map +1 -0
- package/dist/_chunks/cli-check-BzMGuIH6.js +293 -0
- package/dist/_chunks/cli-check-BzMGuIH6.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DnXqcIIj.js +299 -0
- package/dist/_chunks/cli-schema-sync-DnXqcIIj.js.map +1 -0
- package/dist/_chunks/cloudflare-DxX1SU0g.js +1290 -0
- package/dist/_chunks/cloudflare-DxX1SU0g.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/convention-lint-DHOFvX5s.js +803 -0
- package/dist/_chunks/convention-lint-DHOFvX5s.js.map +1 -0
- package/dist/_chunks/csp-nonce-hOGniaG4.js +227 -0
- package/dist/_chunks/csp-nonce-hOGniaG4.js.map +1 -0
- package/dist/_chunks/dev-server-DioP7tkQ.js +2288 -0
- package/dist/_chunks/dev-server-DioP7tkQ.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-BQKxl6EX.js +1044 -0
- package/dist/_chunks/error-boundary-BQKxl6EX.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js +458 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/graph-cache-Cv3njEH8.js +304 -0
- package/dist/_chunks/graph-cache-Cv3njEH8.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/live-graph-VjHFF5EV.js +150 -0
- package/dist/_chunks/live-graph-VjHFF5EV.js.map +1 -0
- package/dist/_chunks/logger-DqJ2VoAY.js +1476 -0
- package/dist/_chunks/logger-DqJ2VoAY.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-context-D0TU0Jog.js +135 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js +321 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-lEbz4pQE.js +101 -0
- package/dist/_chunks/poison-scan-lEbz4pQE.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-B_tnqFcF.js +1671 -0
- package/dist/_chunks/scanner-B_tnqFcF.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-D9_89u34.js +34 -0
- package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
- package/dist/_chunks/segment-keys-D5hu1hz4.js +62 -0
- package/dist/_chunks/segment-keys-D5hu1hz4.js.map +1 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-D6T6Y3ef.js} +3 -31
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
- package/dist/_chunks/state-FippDgxN.js +52 -0
- package/dist/_chunks/state-FippDgxN.js.map +1 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +1 -0
- package/dist/_chunks/tree-match-CdbvYTBz.js +122 -0
- package/dist/_chunks/tree-match-CdbvYTBz.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-Cm3PC5JT.js +144 -0
- package/dist/_chunks/walkers-Cm3PC5JT.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +74 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +200 -22
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +17 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +66 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +457 -300
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +62 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +28 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +150 -0
- package/dist/analyze/classify.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.d.ts +17 -0
- package/dist/analyze/crawl-entry.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.js +313 -0
- package/dist/analyze/crawl-entry.js.map +1 -0
- package/dist/analyze/crawl.d.ts +134 -0
- package/dist/analyze/crawl.d.ts.map +1 -0
- package/dist/analyze/graph-cache.d.ts +104 -0
- package/dist/analyze/graph-cache.d.ts.map +1 -0
- package/dist/analyze/graph-command.d.ts +43 -0
- package/dist/analyze/graph-command.d.ts.map +1 -0
- package/dist/analyze/graph-command.js +472 -0
- package/dist/analyze/graph-command.js.map +1 -0
- package/dist/analyze/live-graph.d.ts +81 -0
- package/dist/analyze/live-graph.d.ts.map +1 -0
- package/dist/analyze/poison-rules.d.ts +72 -0
- package/dist/analyze/poison-rules.d.ts.map +1 -0
- package/dist/analyze/poison-scan.d.ts +48 -0
- package/dist/analyze/poison-scan.d.ts.map +1 -0
- package/dist/analyze/scan.d.ts +73 -0
- package/dist/analyze/scan.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +5 -0
- package/dist/cache/fast-hash.d.ts.map +1 -1
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +32 -9
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +141 -9
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +21 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +21 -11
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/cloudflare-purge.js +30 -0
- package/dist/cdn/cloudflare-purge.js.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.js +33 -0
- package/dist/cdn/fastly-purge.js.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/index.js +94 -0
- package/dist/cdn/index.js.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +20 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.js +35 -0
- package/dist/cdn/workers-cache-purge.js.map +1 -0
- package/dist/cli-check.d.ts +163 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +81 -9
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +216 -51
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +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 +63 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +46 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +55 -7
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +323 -1148
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +818 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +63 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +98 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +51 -31
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +98 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +187 -0
- package/dist/client/navigation-transition.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +44 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +130 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +87 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +272 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +104 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +161 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +29 -7
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +19 -8
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +13 -11
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +2 -2
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +322 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/debug-channel.d.ts +55 -0
- package/dist/dev-tools/debug-channel.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +46 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +112 -8
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +5 -3
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +5 -5
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +35 -181
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8462 -14279
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +276 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +47 -10
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- package/dist/plugins/dev-server.d.ts +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 +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/graph-endpoint.d.ts +112 -0
- package/dist/plugins/graph-endpoint.d.ts.map +1 -0
- package/dist/plugins/mdx.d.ts +18 -5
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +39 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +218 -21
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +26 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +61 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen-write.d.ts +51 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +8 -3
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/convention-lint.d.ts +55 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +72 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +13 -7
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception-overlap.d.ts +35 -0
- package/dist/routing/interception-overlap.d.ts.map +1 -0
- package/dist/routing/interception.d.ts +234 -10
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +105 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +26 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +14 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +114 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/segment-keys.d.ts +118 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/types.d.ts +74 -26
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +57 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +14 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- package/dist/schema-bridge.d.ts +145 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +262 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +3 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +179 -360
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +81 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/serialize-equal.d.ts +9 -0
- package/dist/search-params/serialize-equal.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +76 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/server/access-gate.d.ts +98 -10
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +39 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +29 -35
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +117 -13
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +25 -30
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/compress.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csp-nonce.d.ts +45 -0
- package/dist/server/csp-nonce.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +251 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +20 -10
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +94 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +45 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/html-injector-core.d.ts +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +18 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2922
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3859 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +71 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +78 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +77 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +59 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +7 -1
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +161 -20
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +63 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +52 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +79 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +131 -45
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +26 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +111 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +40 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +34 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +47 -51
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +40 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +52 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +26 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +36 -3
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +38 -5
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +130 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/skippable-prefix.d.ts +29 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +137 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts +54 -0
- package/dist/server/slot-subtree-contain.d.ts.map +1 -0
- package/dist/server/ssr-bridge-types.d.ts +160 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +1 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +69 -22
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +93 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +44 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +112 -0
- package/dist/server/static-generator.d.ts.map +1 -0
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +26 -15
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +46 -11
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +88 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +109 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +16 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +52 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/dist/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- package/dist/shims/navigation.d.ts +10 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +236 -0
- package/docs/api/31-api-client.mdx +167 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +329 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +192 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +252 -0
- package/docs/learn/11-middleware.mdx +158 -0
- package/docs/learn/12-error-handling.mdx +187 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +116 -30
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +747 -130
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +249 -426
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +274 -0
- package/src/adapters/types.ts +28 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +258 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +332 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +162 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +5 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +115 -22
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +69 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +165 -40
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +23 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +34 -0
- package/src/cli-check.ts +507 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +323 -62
- package/src/client/browser-dev.ts +157 -2
- package/src/client/browser-entry/action-dispatch.ts +209 -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 +148 -0
- package/src/client/browser-entry/index.ts +131 -0
- package/src/client/browser-entry/post-hydration.ts +123 -0
- package/src/client/browser-entry/router-init.ts +418 -0
- package/src/client/browser-entry/rsc-stream.ts +222 -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 +289 -39
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +81 -10
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +439 -151
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +347 -0
- package/src/client/navigation-commit.ts +295 -0
- package/src/client/navigation-context.ts +67 -98
- package/src/client/navigation-root.tsx +224 -0
- package/src/client/navigation-transition.ts +327 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +72 -0
- package/src/client/router-effects.ts +228 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +490 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +294 -0
- package/src/client/router.ts +435 -421
- package/src/client/rsc-fetch.ts +512 -73
- package/src/client/segment-cache.ts +327 -40
- package/src/client/segment-context.ts +7 -4
- package/src/client/segment-outlet.tsx +96 -0
- package/src/client/segment-update-context.ts +23 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-content-cache-context.ts +43 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +30 -9
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +29 -15
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +13 -10
- package/src/client/unload-guard.ts +35 -3
- package/src/client/use-cookie.ts +70 -18
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +22 -31
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +6 -3
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +322 -0
- package/src/config-validation.ts +347 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/debug-channel.ts +151 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +185 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +1 -1
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +101 -19
- package/src/fonts/local.ts +12 -11
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +482 -377
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +503 -0
- package/src/plugins/adapter-build.ts +229 -7
- package/src/plugins/build-manifest.ts +201 -26
- package/src/plugins/build-report.ts +259 -47
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +418 -94
- package/src/plugins/entries.ts +141 -16
- package/src/plugins/fonts.ts +234 -659
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +108 -35
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +320 -0
- package/src/plugins/request-dep/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +273 -277
- package/src/plugins/server-bundle.ts +99 -14
- package/src/plugins/shims.ts +259 -97
- package/src/plugins/static-build.ts +708 -66
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +141 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +516 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +408 -223
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +75 -26
- package/src/routing/walkers.ts +98 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +19 -0
- package/src/schema-bridge.ts +380 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +194 -56
- package/src/server/action-client.ts +122 -31
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +256 -56
- package/src/server/actions.ts +112 -68
- package/src/server/als-registry.ts +160 -21
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +33 -57
- package/src/server/canonicalize.ts +6 -3
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +115 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csp-nonce.ts +70 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +515 -0
- package/src/server/deny-renderer.ts +211 -113
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +157 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +2 -2
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +272 -255
- package/src/server/index.ts +40 -192
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +173 -0
- package/src/server/logger.ts +73 -37
- package/src/server/metadata-collector.ts +174 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +23 -2
- package/src/server/middleware-runner.ts +32 -5
- package/src/server/node-stream-transforms.ts +323 -0
- package/src/server/nuqs-ssr-provider.tsx +8 -7
- package/src/server/param-coercion.ts +198 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +218 -0
- package/src/server/pipeline-phases.ts +606 -0
- package/src/server/pipeline.ts +333 -384
- package/src/server/port-resolution.ts +53 -0
- package/src/server/prebuilt/cache-key.ts +299 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +122 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +202 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +122 -0
- package/src/server/prebuilt-builder.ts +804 -0
- package/src/server/prebuilt-runtime.ts +817 -0
- package/src/server/primitives.ts +240 -98
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +35 -0
- package/src/server/request-context.ts +244 -334
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +508 -355
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +40 -13
- package/src/server/route-matcher.ts +165 -272
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +174 -0
- package/src/server/rsc-entry/api-handler.ts +78 -34
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +341 -91
- package/src/server/rsc-entry/helpers.ts +180 -106
- package/src/server/rsc-entry/index.ts +371 -331
- package/src/server/rsc-entry/render-route.ts +315 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +209 -55
- package/src/server/rsc-entry/rsc-stream.ts +154 -26
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +317 -60
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +1 -1
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +172 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +707 -300
- package/src/server/slot-subtree-contain.ts +255 -0
- package/src/server/ssr-bridge-types.ts +165 -0
- package/src/server/ssr-entry.ts +230 -85
- package/src/server/ssr-render.ts +357 -85
- package/src/server/ssr-wrappers.tsx +162 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +715 -0
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +107 -148
- package/src/server/stream-utils.ts +292 -0
- package/src/server/tracing.ts +128 -16
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +95 -10
- package/src/server/utils/element-type.ts +88 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +1 -1
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/als-slots.ts +74 -0
- package/src/shared/base-path.ts +80 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/param-value.ts +281 -0
- package/src/shared/payload-root.ts +152 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +16 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +59 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +109 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shared/status-reason-phrase.ts +61 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +36 -32
- package/src/shims/navigation-rsc.ts +47 -0
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js +0 -109
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/error-boundary.js.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts +0 -92
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/content/index.d.ts +0 -11
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -2
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/tree-builder.d.ts +0 -126
- package/dist/server/tree-builder.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/client/use-params.ts +0 -141
- package/src/content/index.ts +0 -13
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/search-params/registry.ts +0 -31
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/tree-builder.ts +0 -382
- package/src/shims/server-only-noop.js +0 -6
- package/src/utils/directive-parser.ts +0 -529
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/analyze/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAcH,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,iBAAiB,GACjB,iBAAiB,GACjB,QAAQ,GACR,eAAe,GACf,cAAc,CAAC;AAEnB,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,IAAI,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,qDAAqD;IACrD,KAAK,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB;;;;;OAKG;IACH,IAAI,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAI9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAerE;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAQhG;AAoBD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,iBAAiB,EACtB,GAAG,CAAC,EAAE,eAAe,GACpB,oBAAoB,CA2BtB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAC7B,YAAY,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACzC,GAAG,CAAC,EAAE,eAAe,GACpB,oBAAoB,EAAE,CAIxB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crawl-entry — child-process entry point for the cold crawl.
|
|
3
|
+
*
|
|
4
|
+
* The crawl's memory footprint is transient but large (~1.3 GB RSS on
|
|
5
|
+
* plugin-heavy apps — design/47 §6), so consumers spawn this module as a
|
|
6
|
+
* short-lived child process instead of crawling in-process:
|
|
7
|
+
*
|
|
8
|
+
* node --import tsx/esm crawl-entry.ts --root <dir> [--config <file>]
|
|
9
|
+
* [--out <file>] [--timeout <ms>]
|
|
10
|
+
*
|
|
11
|
+
* With `--out`, the JSON report is written to that file. Otherwise it is
|
|
12
|
+
* printed to stdout after a marker line — plugins in the booted app may
|
|
13
|
+
* write their own stdout noise, so consumers parse everything after the
|
|
14
|
+
* marker, not the whole stream.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=crawl-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl-entry.d.ts","sourceRoot":"","sources":["../../src/analyze/crawl-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { i as scanProjectSourceFiles, n as isScannableSourceFile, t as buildSourceExtensions } from "../_chunks/scan-BoP17W3w.js";
|
|
2
|
+
import { n as isTimberPluginApi, o as resolveAppDir } from "../_chunks/plugin-context-8idfR3UZ.js";
|
|
3
|
+
import { a as detectDirective, i as classifyModules, n as stitchImportChains } from "../_chunks/chains-CBNA0Ozj.js";
|
|
4
|
+
import { n as importSignals, r as poisoningsFor, t as collectImportSpecifiers } from "../_chunks/poison-scan-lEbz4pQE.js";
|
|
5
|
+
import { normalizePath } from "vite";
|
|
6
|
+
import { join, resolve } from "node:path";
|
|
7
|
+
import { readFile, realpath, writeFile } from "node:fs/promises";
|
|
8
|
+
//#region src/analyze/crawl.ts
|
|
9
|
+
/**
|
|
10
|
+
* crawl — programmatic middleware-mode crawl (the cold path).
|
|
11
|
+
*
|
|
12
|
+
* Boots `createServer({ middlewareMode: true })` — no HTTP port, no route
|
|
13
|
+
* rendering — and BFS-walks `env.transformRequest(url)` → importedModules
|
|
14
|
+
* edges from `virtual:timber-rsc-entry`, then from every discovered
|
|
15
|
+
* `'use client'` boundary through the SSR environment. This reuses Vite's
|
|
16
|
+
* actual resolution (aliases, tsconfig paths, react-server export
|
|
17
|
+
* conditions, virtual modules), so it cannot drift from what dev or the
|
|
18
|
+
* build does; hand-rolled resolution was evaluated and rejected
|
|
19
|
+
* (design/47 §"Verified Prototype Findings").
|
|
20
|
+
*
|
|
21
|
+
* Cost model (design/47 §6): 2.5 s on small apps to ~10 s on dep-heavy
|
|
22
|
+
* plugin stacks, with a transient ~1.3 GB RSS — callers MUST run this in
|
|
23
|
+
* a short-lived child process (see crawl-entry.ts) and cache the
|
|
24
|
+
* classification output, not the Vite transforms. The crawl always
|
|
25
|
+
* covers the full project: one crawl per project state, never per
|
|
26
|
+
* question — marginal per-file cost is ~zero once booted.
|
|
27
|
+
*
|
|
28
|
+
* `TIMBER_ANALYZE=1` is set before the server boots so platform dev
|
|
29
|
+
* plugins (wrangler bindings — a measured ~6.8 s remote-bindings
|
|
30
|
+
* handshake on website) skip work the crawl never needs: classification
|
|
31
|
+
* wants import edges, not live Cloudflare connections.
|
|
32
|
+
*
|
|
33
|
+
* Design docs: 47-module-environment-tooling.md §6, §8.
|
|
34
|
+
*/
|
|
35
|
+
var RSC_ENTRY_URL = "virtual:timber-rsc-entry";
|
|
36
|
+
/**
|
|
37
|
+
* Marker preceding the JSON report on crawl-entry's stdout. Lives here
|
|
38
|
+
* (not in crawl-entry.ts) so consumers can import it without executing
|
|
39
|
+
* the child entry's main().
|
|
40
|
+
*/
|
|
41
|
+
var CRAWL_RESULT_MARKER = "__TIMBER_CRAWL_RESULT__";
|
|
42
|
+
/** Marker error for deadline expiry — structurally distinguishable
|
|
43
|
+
* from a deterministic transform failure (consumers must not cache a
|
|
44
|
+
* deadline-truncated report; a transform failure recurs on retry and
|
|
45
|
+
* caches fine). */
|
|
46
|
+
var CrawlDeadlineError = class extends Error {};
|
|
47
|
+
/** Race a promise against the crawl deadline. */
|
|
48
|
+
function withDeadline(promise, remainingMs, label) {
|
|
49
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
50
|
+
const timer = setTimeout(() => rejectPromise(new CrawlDeadlineError(`crawl deadline exceeded while transforming ${label}`)), Math.max(remainingMs, 1));
|
|
51
|
+
promise.then((value) => {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
resolvePromise(value);
|
|
54
|
+
}, (error) => {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
rejectPromise(error);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Whether a graph node's file belongs in the report. `root` must be
|
|
62
|
+
* slash-normalized; module-node paths already are (Vite normalizes
|
|
63
|
+
* them, even on Windows — comparing against a backslashed root would
|
|
64
|
+
* reject every physical module there and misreport the whole app as
|
|
65
|
+
* pending). The rule set is the scan's own (isScannableSourceFile), so
|
|
66
|
+
* report membership, disk-scan coverage, and the cache fingerprint are
|
|
67
|
+
* one set — a graph-reachable file the fingerprint never tracked would
|
|
68
|
+
* let its edits serve a stale cache (codex review, PR #1056).
|
|
69
|
+
*/
|
|
70
|
+
function isProjectFile(file, root, extensions) {
|
|
71
|
+
if (!file) return false;
|
|
72
|
+
return isScannableSourceFile(normalizePath(file), root, extensions);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* BFS one environment from the given seed URLs, transforming every
|
|
76
|
+
* discovered module unconditionally. Transforming (rather than reading
|
|
77
|
+
* live graphs) is what closes the §8 blind spot: modules behind
|
|
78
|
+
* unexecuted dynamic imports are transformed here like any other edge.
|
|
79
|
+
*
|
|
80
|
+
* Exported for tests (deadline behavior is exercised with a fake env).
|
|
81
|
+
*/
|
|
82
|
+
async function crawlEnvironment(env, envName, seeds, root, deadlineAt, errors, extensions) {
|
|
83
|
+
const queue = [...seeds];
|
|
84
|
+
const enqueued = new Set(queue);
|
|
85
|
+
const projectFiles = /* @__PURE__ */ new Set();
|
|
86
|
+
const failedFiles = /* @__PURE__ */ new Set();
|
|
87
|
+
let visited = 0;
|
|
88
|
+
let deadlineHit = false;
|
|
89
|
+
for (let cursor = 0; cursor < queue.length; cursor++) {
|
|
90
|
+
const url = queue[cursor];
|
|
91
|
+
const remaining = deadlineAt - Date.now();
|
|
92
|
+
if (remaining <= 0) {
|
|
93
|
+
errors.push({
|
|
94
|
+
environment: envName,
|
|
95
|
+
id: url,
|
|
96
|
+
message: "crawl deadline exceeded"
|
|
97
|
+
});
|
|
98
|
+
deadlineHit = true;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
let node;
|
|
102
|
+
try {
|
|
103
|
+
await withDeadline(env.transformRequest(url), remaining, url);
|
|
104
|
+
node = await env.moduleGraph.getModuleByUrl(url);
|
|
105
|
+
} catch (error) {
|
|
106
|
+
if (error instanceof CrawlDeadlineError) deadlineHit = true;
|
|
107
|
+
errors.push({
|
|
108
|
+
environment: envName,
|
|
109
|
+
id: url,
|
|
110
|
+
message: error instanceof Error ? error.message : String(error)
|
|
111
|
+
});
|
|
112
|
+
node = await env.moduleGraph.getModuleByUrl(url).catch(() => void 0);
|
|
113
|
+
if (node && isProjectFile(node.file, root, extensions)) {
|
|
114
|
+
projectFiles.add(node.file);
|
|
115
|
+
failedFiles.add(node.file);
|
|
116
|
+
}
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (!node) continue;
|
|
120
|
+
visited++;
|
|
121
|
+
if (isProjectFile(node.file, root, extensions)) projectFiles.add(node.file);
|
|
122
|
+
for (const child of node.importedModules) {
|
|
123
|
+
const childUrl = child.url ?? child.id;
|
|
124
|
+
if (!childUrl || enqueued.has(childUrl)) continue;
|
|
125
|
+
enqueued.add(childUrl);
|
|
126
|
+
queue.push(childUrl);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
projectFiles,
|
|
131
|
+
failedFiles,
|
|
132
|
+
visited,
|
|
133
|
+
deadlineHit
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** Root-relative Vite URL for an absolute project file path.
|
|
137
|
+
* Both arguments must be slash-normalized (the crawl normalizes at
|
|
138
|
+
* the boundary, so callers always satisfy this). */
|
|
139
|
+
function fileToUrl(file, root) {
|
|
140
|
+
return file.slice(root.length);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Read a file's first directive and poison signals from its original
|
|
144
|
+
* source on disk, in one read. A failure is recorded, not swallowed —
|
|
145
|
+
* a lost 'use client' here would silently drop the whole client
|
|
146
|
+
* subtree from the SSR crawl.
|
|
147
|
+
*/
|
|
148
|
+
async function sourceFactsOf(file, errors) {
|
|
149
|
+
try {
|
|
150
|
+
const code = await readFile(file, "utf8");
|
|
151
|
+
return {
|
|
152
|
+
directive: detectDirective(code, file),
|
|
153
|
+
signals: importSignals(collectImportSpecifiers(code, file))
|
|
154
|
+
};
|
|
155
|
+
} catch (error) {
|
|
156
|
+
errors.push({
|
|
157
|
+
environment: "scan",
|
|
158
|
+
id: file,
|
|
159
|
+
message: `directive read failed: ${error instanceof Error ? error.message : String(error)}`
|
|
160
|
+
});
|
|
161
|
+
return {
|
|
162
|
+
directive: null,
|
|
163
|
+
signals: []
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Crawl a project cold and classify every project file.
|
|
169
|
+
*
|
|
170
|
+
* Boots a middleware-mode Vite server with the app's own config (all
|
|
171
|
+
* timber plugins, real resolution), crawls the RSC graph from the entry,
|
|
172
|
+
* detects directives from original sources, crawls the SSR graph from
|
|
173
|
+
* every `'use client'` boundary, and intersects the memberships.
|
|
174
|
+
*/
|
|
175
|
+
async function crawlProject(options) {
|
|
176
|
+
const startedAt = Date.now();
|
|
177
|
+
const deadlineAt = startedAt + (options.timeoutMs ?? 12e4);
|
|
178
|
+
process.env.TIMBER_ANALYZE = "1";
|
|
179
|
+
const { createServer } = await import("vite");
|
|
180
|
+
const server = await createServer({
|
|
181
|
+
root: options.root,
|
|
182
|
+
configFile: options.configFile,
|
|
183
|
+
server: {
|
|
184
|
+
middlewareMode: true,
|
|
185
|
+
watch: null
|
|
186
|
+
},
|
|
187
|
+
logLevel: "error"
|
|
188
|
+
});
|
|
189
|
+
try {
|
|
190
|
+
const root = normalizePath(server.config.resolve.preserveSymlinks ? server.config.root : await realpath(server.config.root));
|
|
191
|
+
const rscEnv = server.environments.rsc;
|
|
192
|
+
const ssrEnv = server.environments.ssr;
|
|
193
|
+
if (!rscEnv?.transformRequest || !ssrEnv?.transformRequest) throw new Error("[timber] crawl requires the rsc and ssr Vite environments");
|
|
194
|
+
const errors = [];
|
|
195
|
+
const rootSyncPlugin = server.config.plugins.find((p) => p.name === "timber-root-sync");
|
|
196
|
+
let appDir;
|
|
197
|
+
let pageExtensions;
|
|
198
|
+
if (rootSyncPlugin && isTimberPluginApi(rootSyncPlugin.api)) {
|
|
199
|
+
const pluginCtx = rootSyncPlugin.api.getContext();
|
|
200
|
+
appDir = pluginCtx.appDir;
|
|
201
|
+
pageExtensions = pluginCtx.config.pageExtensions;
|
|
202
|
+
} else try {
|
|
203
|
+
appDir = resolveAppDir(root);
|
|
204
|
+
} catch {
|
|
205
|
+
appDir = join(root, "app");
|
|
206
|
+
}
|
|
207
|
+
appDir = normalizePath(appDir);
|
|
208
|
+
const extensions = buildSourceExtensions(pageExtensions);
|
|
209
|
+
const rsc = await crawlEnvironment(rscEnv, "rsc", [RSC_ENTRY_URL], root, deadlineAt, errors, extensions);
|
|
210
|
+
const diskFiles = [];
|
|
211
|
+
await scanProjectSourceFiles(root, diskFiles, (failure) => errors.push({
|
|
212
|
+
environment: "scan",
|
|
213
|
+
id: failure.dir,
|
|
214
|
+
message: failure.message
|
|
215
|
+
}), 0, extensions);
|
|
216
|
+
const allFiles = /* @__PURE__ */ new Set([...rsc.projectFiles, ...diskFiles.map(normalizePath)]);
|
|
217
|
+
const facts = /* @__PURE__ */ new Map();
|
|
218
|
+
for (const file of allFiles) facts.set(file, await sourceFactsOf(file, errors));
|
|
219
|
+
const ssr = await crawlEnvironment(ssrEnv, "ssr", [...rsc.projectFiles].filter((file) => facts.get(file)?.directive === "use client").map((file) => fileToUrl(file, root)), root, deadlineAt, errors, extensions);
|
|
220
|
+
for (const file of ssr.projectFiles) if (!facts.has(file)) {
|
|
221
|
+
facts.set(file, await sourceFactsOf(file, errors));
|
|
222
|
+
allFiles.add(file);
|
|
223
|
+
}
|
|
224
|
+
const classifications = classifyModules([...allFiles].map((file) => ({
|
|
225
|
+
file,
|
|
226
|
+
inRsc: rsc.projectFiles.has(file),
|
|
227
|
+
inSsr: ssr.projectFiles.has(file),
|
|
228
|
+
ssrTransformed: ssr.projectFiles.has(file) ? !ssr.failedFiles.has(file) : void 0,
|
|
229
|
+
directive: facts.get(file)?.directive ?? null
|
|
230
|
+
})), {
|
|
231
|
+
appDir,
|
|
232
|
+
pageExtensions
|
|
233
|
+
});
|
|
234
|
+
const chainCtx = {
|
|
235
|
+
rsc: server.environments.rsc.moduleGraph,
|
|
236
|
+
ssr: server.environments.ssr.moduleGraph,
|
|
237
|
+
appDir,
|
|
238
|
+
pageExtensions,
|
|
239
|
+
getDirective: (file) => facts.get(file)?.directive ?? null
|
|
240
|
+
};
|
|
241
|
+
const modules = classifications.map((classification) => ({
|
|
242
|
+
...classification,
|
|
243
|
+
boundary: facts.get(classification.file)?.directive === "use client",
|
|
244
|
+
chains: stitchImportChains(classification.file, chainCtx),
|
|
245
|
+
poisonings: poisoningsFor(classification.kind, classification.pending, facts.get(classification.file)?.signals ?? [])
|
|
246
|
+
}));
|
|
247
|
+
return {
|
|
248
|
+
root,
|
|
249
|
+
incomplete: rsc.deadlineHit || ssr.deadlineHit,
|
|
250
|
+
modules,
|
|
251
|
+
errors,
|
|
252
|
+
stats: {
|
|
253
|
+
rscGraphModules: rsc.visited,
|
|
254
|
+
ssrGraphModules: ssr.visited,
|
|
255
|
+
projectFiles: allFiles.size,
|
|
256
|
+
durationMs: Date.now() - startedAt
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
} finally {
|
|
260
|
+
await Promise.race([server.close().catch(() => {}), new Promise((resolveTimer) => setTimeout(resolveTimer, 5e3))]);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//#endregion
|
|
264
|
+
//#region src/analyze/crawl-entry.ts
|
|
265
|
+
/**
|
|
266
|
+
* crawl-entry — child-process entry point for the cold crawl.
|
|
267
|
+
*
|
|
268
|
+
* The crawl's memory footprint is transient but large (~1.3 GB RSS on
|
|
269
|
+
* plugin-heavy apps — design/47 §6), so consumers spawn this module as a
|
|
270
|
+
* short-lived child process instead of crawling in-process:
|
|
271
|
+
*
|
|
272
|
+
* node --import tsx/esm crawl-entry.ts --root <dir> [--config <file>]
|
|
273
|
+
* [--out <file>] [--timeout <ms>]
|
|
274
|
+
*
|
|
275
|
+
* With `--out`, the JSON report is written to that file. Otherwise it is
|
|
276
|
+
* printed to stdout after a marker line — plugins in the booted app may
|
|
277
|
+
* write their own stdout noise, so consumers parse everything after the
|
|
278
|
+
* marker, not the whole stream.
|
|
279
|
+
*/
|
|
280
|
+
function readFlag(argv, name) {
|
|
281
|
+
const index = argv.indexOf(name);
|
|
282
|
+
return index !== -1 ? argv[index + 1] : void 0;
|
|
283
|
+
}
|
|
284
|
+
async function main() {
|
|
285
|
+
const argv = process.argv.slice(2);
|
|
286
|
+
const rootArg = readFlag(argv, "--root");
|
|
287
|
+
if (!rootArg) {
|
|
288
|
+
process.stderr.write("usage: crawl-entry --root <dir> [--config <file>] [--out <file>]\n");
|
|
289
|
+
process.exitCode = 2;
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const timeoutArg = readFlag(argv, "--timeout");
|
|
293
|
+
const report = await crawlProject({
|
|
294
|
+
root: resolve(rootArg),
|
|
295
|
+
configFile: readFlag(argv, "--config"),
|
|
296
|
+
timeoutMs: timeoutArg ? Number(timeoutArg) : void 0
|
|
297
|
+
});
|
|
298
|
+
const json = JSON.stringify(report);
|
|
299
|
+
const outFile = readFlag(argv, "--out");
|
|
300
|
+
if (outFile) await writeFile(resolve(outFile), json);
|
|
301
|
+
else await new Promise((resolveWrite, rejectWrite) => {
|
|
302
|
+
process.stdout.write(`\n${CRAWL_RESULT_MARKER}\n${json}\n`, (error) => error ? rejectWrite(error) : resolveWrite());
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
main().then(() => {
|
|
306
|
+
process.exit(process.exitCode ?? 0);
|
|
307
|
+
}, (error) => {
|
|
308
|
+
process.stderr.write(`[timber] crawl failed: ${error?.stack ?? String(error)}\n`);
|
|
309
|
+
process.exit(1);
|
|
310
|
+
});
|
|
311
|
+
//#endregion
|
|
312
|
+
|
|
313
|
+
//# sourceMappingURL=crawl-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl-entry.js","names":[],"sources":["../../src/analyze/crawl.ts","../../src/analyze/crawl-entry.ts"],"sourcesContent":["/**\n * crawl — programmatic middleware-mode crawl (the cold path).\n *\n * Boots `createServer({ middlewareMode: true })` — no HTTP port, no route\n * rendering — and BFS-walks `env.transformRequest(url)` → importedModules\n * edges from `virtual:timber-rsc-entry`, then from every discovered\n * `'use client'` boundary through the SSR environment. This reuses Vite's\n * actual resolution (aliases, tsconfig paths, react-server export\n * conditions, virtual modules), so it cannot drift from what dev or the\n * build does; hand-rolled resolution was evaluated and rejected\n * (design/47 §\"Verified Prototype Findings\").\n *\n * Cost model (design/47 §6): 2.5 s on small apps to ~10 s on dep-heavy\n * plugin stacks, with a transient ~1.3 GB RSS — callers MUST run this in\n * a short-lived child process (see crawl-entry.ts) and cache the\n * classification output, not the Vite transforms. The crawl always\n * covers the full project: one crawl per project state, never per\n * question — marginal per-file cost is ~zero once booted.\n *\n * `TIMBER_ANALYZE=1` is set before the server boots so platform dev\n * plugins (wrangler bindings — a measured ~6.8 s remote-bindings\n * handshake on website) skip work the crawl never needs: classification\n * wants import edges, not live Cloudflare connections.\n *\n * Design docs: 47-module-environment-tooling.md §6, §8.\n */\n\nimport { readFile, realpath } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { ViteDevServer } from 'vite';\nimport { normalizePath } from 'vite';\nimport {\n classifyModules,\n detectDirective,\n type Directive,\n type ModuleClassification,\n} from './classify.ts';\nimport { buildSourceExtensions, scanProjectSourceFiles, isScannableSourceFile } from './scan.ts';\nimport { stitchImportChains, type ChainGraph, type ImportChain } from './chains.ts';\nimport {\n collectImportSpecifiers,\n importSignals,\n poisoningsFor,\n type Poisoning,\n} from './poison-scan.ts';\nimport { isTimberPluginApi, resolveAppDir } from '../plugin-context.ts';\n\nconst RSC_ENTRY_URL = 'virtual:timber-rsc-entry';\n\n/**\n * Marker preceding the JSON report on crawl-entry's stdout. Lives here\n * (not in crawl-entry.ts) so consumers can import it without executing\n * the child entry's main().\n */\nexport const CRAWL_RESULT_MARKER = '__TIMBER_CRAWL_RESULT__';\n\nexport interface CrawlOptions {\n /** Project root (the app directory containing vite.config). */\n root: string;\n /** Explicit Vite config file; discovered from root when omitted. */\n configFile?: string;\n /** Overall crawl deadline. Default 120s. */\n timeoutMs?: number;\n}\n\nexport interface CrawlError {\n /** 'scan' covers disk-scan and directive-read failures. */\n environment: 'rsc' | 'ssr' | 'scan';\n id: string;\n message: string;\n}\n\n/**\n * One project file's full graph answer — the classification plus the\n * remaining JSON-contract fields (`boundary`, `chains`, `poisonings`)\n * that need the open graphs / original sources to compute. This is the\n * per-module unit `timber graph` caches and serves.\n */\nexport interface GraphModuleReport extends ModuleClassification {\n /** True when the file itself carries `'use client'`. */\n boundary: boolean;\n /** Boundary-aware import chains (design/47 §7); [] when in no graph. */\n chains: ImportChain[];\n /** Report-only poisoning conflicts (design/47 §3); [] when clean. */\n poisonings: Poisoning[];\n}\n\nexport interface CrawlReport {\n root: string;\n /**\n * True when the crawl deadline expired mid-walk — the report is\n * truncated, not wrong, and the condition is transient (a slow\n * machine, a cold dep-optimizer). Consumers must not cache an\n * incomplete report: with unchanged files it would be served forever,\n * never retrying after the transient cause cleared. Deterministic\n * per-module transform failures do NOT set this — they recur on\n * retry, so caching them is correct.\n */\n incomplete: boolean;\n /** Classification of every project file, sorted by path. */\n modules: GraphModuleReport[];\n /**\n * Transform failures encountered during the BFS. These are classified,\n * not swallowed — CSS/asset URLs and non-transformable modules land\n * here (44 on website in the §6 measurement) and the crawl continues.\n */\n errors: CrawlError[];\n stats: {\n rscGraphModules: number;\n ssrGraphModules: number;\n projectFiles: number;\n durationMs: number;\n };\n}\n\n/** Marker error for deadline expiry — structurally distinguishable\n * from a deterministic transform failure (consumers must not cache a\n * deadline-truncated report; a transform failure recurs on retry and\n * caches fine). */\nclass CrawlDeadlineError extends Error {}\n\n/** Race a promise against the crawl deadline. */\nfunction withDeadline<T>(promise: Promise<T>, remainingMs: number, label: string): Promise<T> {\n return new Promise<T>((resolvePromise, rejectPromise) => {\n const timer = setTimeout(\n () =>\n rejectPromise(\n new CrawlDeadlineError(`crawl deadline exceeded while transforming ${label}`)\n ),\n Math.max(remainingMs, 1)\n );\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolvePromise(value);\n },\n (error) => {\n clearTimeout(timer);\n rejectPromise(error);\n }\n );\n });\n}\n\n/** Duck-typed view of the Vite dev environment surface the crawl uses. */\nexport interface CrawlEnvironment {\n transformRequest(url: string): Promise<unknown>;\n moduleGraph: {\n getModuleByUrl(url: string): Promise<CrawlModuleNode | undefined>;\n };\n}\n\ninterface CrawlModuleNode {\n id: string | null;\n url: string;\n file: string | null;\n importedModules: Set<CrawlModuleNode>;\n transformResult: unknown;\n}\n\ninterface EnvCrawlResult {\n /** Absolute paths of project files reached in this environment. */\n projectFiles: Set<string>;\n /** Project files whose own transform failed (membership unconfirmed subtree). */\n failedFiles: Set<string>;\n /** Total graph modules visited (project + deps + virtual). */\n visited: number;\n /** The deadline expired mid-walk — the result is truncated. */\n deadlineHit: boolean;\n}\n\n/**\n * Whether a graph node's file belongs in the report. `root` must be\n * slash-normalized; module-node paths already are (Vite normalizes\n * them, even on Windows — comparing against a backslashed root would\n * reject every physical module there and misreport the whole app as\n * pending). The rule set is the scan's own (isScannableSourceFile), so\n * report membership, disk-scan coverage, and the cache fingerprint are\n * one set — a graph-reachable file the fingerprint never tracked would\n * let its edits serve a stale cache (codex review, PR #1056).\n */\nfunction isProjectFile(file: string | null, root: string, extensions?: RegExp): file is string {\n if (!file) return false;\n return isScannableSourceFile(normalizePath(file), root, extensions);\n}\n\n/**\n * BFS one environment from the given seed URLs, transforming every\n * discovered module unconditionally. Transforming (rather than reading\n * live graphs) is what closes the §8 blind spot: modules behind\n * unexecuted dynamic imports are transformed here like any other edge.\n *\n * Exported for tests (deadline behavior is exercised with a fake env).\n */\nexport async function crawlEnvironment(\n env: CrawlEnvironment,\n envName: 'rsc' | 'ssr',\n seeds: string[],\n root: string,\n deadlineAt: number,\n errors: CrawlError[],\n extensions?: RegExp\n): Promise<EnvCrawlResult> {\n const queue = [...seeds];\n const enqueued = new Set(queue);\n const projectFiles = new Set<string>();\n const failedFiles = new Set<string>();\n let visited = 0;\n let deadlineHit = false;\n\n // Index-cursor BFS — the queue only grows, so this walks each entry once.\n for (let cursor = 0; cursor < queue.length; cursor++) {\n const url = queue[cursor];\n const remaining = deadlineAt - Date.now();\n if (remaining <= 0) {\n errors.push({ environment: envName, id: url, message: 'crawl deadline exceeded' });\n deadlineHit = true;\n break;\n }\n\n let node: CrawlModuleNode | undefined;\n try {\n await withDeadline(env.transformRequest(url), remaining, url);\n node = await env.moduleGraph.getModuleByUrl(url);\n } catch (error) {\n if (error instanceof CrawlDeadlineError) deadlineHit = true;\n errors.push({\n environment: envName,\n id: url,\n message: error instanceof Error ? error.message : String(error),\n });\n // The URL may still have a graph node with a file — it IS a graph\n // member (reachable), its transform just failed. Record membership\n // AND the failure so classification reports it as reachable with\n // subtreeUnknown, not as pending/unreferenced.\n node = await env.moduleGraph.getModuleByUrl(url).catch(() => undefined);\n if (node && isProjectFile(node.file, root, extensions)) {\n projectFiles.add(node.file);\n failedFiles.add(node.file);\n }\n continue;\n }\n\n if (!node) continue;\n visited++;\n if (isProjectFile(node.file, root, extensions)) projectFiles.add(node.file);\n\n for (const child of node.importedModules) {\n const childUrl = child.url ?? child.id;\n if (!childUrl || enqueued.has(childUrl)) continue;\n enqueued.add(childUrl);\n queue.push(childUrl);\n }\n }\n\n return { projectFiles, failedFiles, visited, deadlineHit };\n}\n\n/** Root-relative Vite URL for an absolute project file path.\n * Both arguments must be slash-normalized (the crawl normalizes at\n * the boundary, so callers always satisfy this). */\nfunction fileToUrl(file: string, root: string): string {\n return file.slice(root.length);\n}\n\n/** What one read of a module's original source yields. */\ninterface SourceFacts {\n directive: Directive;\n /** Import-specifier exclusivity signals (poison-scan). */\n signals: Poisoning[];\n}\n\n/**\n * Read a file's first directive and poison signals from its original\n * source on disk, in one read. A failure is recorded, not swallowed —\n * a lost 'use client' here would silently drop the whole client\n * subtree from the SSR crawl.\n */\nasync function sourceFactsOf(file: string, errors: CrawlError[]): Promise<SourceFacts> {\n try {\n const code = await readFile(file, 'utf8');\n return {\n directive: detectDirective(code, file),\n signals: importSignals(collectImportSpecifiers(code, file)),\n };\n } catch (error) {\n errors.push({\n environment: 'scan',\n id: file,\n message: `directive read failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n return { directive: null, signals: [] };\n }\n}\n\n/**\n * Crawl a project cold and classify every project file.\n *\n * Boots a middleware-mode Vite server with the app's own config (all\n * timber plugins, real resolution), crawls the RSC graph from the entry,\n * detects directives from original sources, crawls the SSR graph from\n * every `'use client'` boundary, and intersects the memberships.\n */\nexport async function crawlProject(options: CrawlOptions): Promise<CrawlReport> {\n const startedAt = Date.now();\n const deadlineAt = startedAt + (options.timeoutMs ?? 120_000);\n // Signal platform dev plugins (wrangler bindings) to skip boot work the\n // crawl never uses. Must be set before createServer runs plugin hooks.\n process.env.TIMBER_ANALYZE = '1';\n\n const { createServer } = await import('vite');\n const server: ViteDevServer = await createServer({\n root: options.root,\n configFile: options.configFile,\n server: { middlewareMode: true, watch: null },\n logLevel: 'error',\n });\n\n try {\n // The root must live in the same path space as the graph nodes.\n // By default Vite resolves through symlinks, so nodes carry\n // realpaths and a symlinked root (pnpm workspaces, ~ links) would\n // string-mismatch every file and misclassify the whole project as\n // unreferenced (design/43 open question 3). Under\n // resolve.preserveSymlinks the graphs keep the SYMLINK paths, and\n // realpathing would create exactly the mismatch it normally\n // prevents — honor the resolved setting. Slash-normalize either\n // way: module-node paths are slash-normalized even on Windows.\n const root = normalizePath(\n server.config.resolve.preserveSymlinks\n ? server.config.root\n : await realpath(server.config.root)\n );\n // Structural assignment, no cast: CrawlEnvironment/CrawlModuleNode\n // are supertypes of Vite's DevEnvironment/EnvironmentModuleNode for\n // the members the BFS reads, so an upstream shape change fails here\n // at compile time instead of inside the walk.\n const rscEnv: CrawlEnvironment | undefined = server.environments.rsc;\n const ssrEnv: CrawlEnvironment | undefined = server.environments.ssr;\n if (!rscEnv?.transformRequest || !ssrEnv?.transformRequest) {\n throw new Error('[timber] crawl requires the rsc and ssr Vite environments');\n }\n\n const errors: CrawlError[] = [];\n\n // appDir and pageExtensions come from the booted server's own\n // resolved timber config (the root-sync plugin api — the single\n // supported way to read it; cf. cli-check.ts). Resolved before\n // Phase 1 so the scan extension set is available to isProjectFile\n // and scanProjectSourceFiles — custom pageExtensions must be\n // admitted throughout, or graph membership disagrees with the\n // disk scan and fingerprint (TIM-1392).\n const rootSyncPlugin = server.config.plugins.find((p) => p.name === 'timber-root-sync');\n let appDir: string;\n let pageExtensions: readonly string[] | undefined;\n if (rootSyncPlugin && isTimberPluginApi(rootSyncPlugin.api)) {\n const pluginCtx = rootSyncPlugin.api.getContext();\n appDir = pluginCtx.appDir;\n pageExtensions = pluginCtx.config.pageExtensions;\n } else {\n try {\n appDir = resolveAppDir(root);\n } catch {\n // No app directory at all — provisional convention hints just\n // never fire; graph-membership classification is unaffected.\n appDir = join(root, 'app');\n }\n }\n // Normalize once at the boundary: appDir comes from node:path\n // join() (backslashes on Windows) but all downstream comparisons\n // — classify, chains, isRouteRoot — expect slash-normalized paths.\n appDir = normalizePath(appDir);\n const extensions = buildSourceExtensions(pageExtensions);\n\n // Phase 1 — RSC graph from the entry.\n const rsc = await crawlEnvironment(\n rscEnv,\n 'rsc',\n [RSC_ENTRY_URL],\n root,\n deadlineAt,\n errors,\n extensions\n );\n\n // Phase 2 — directives + poison signals for everything discovered so\n // far plus files on disk that no graph reached (the provisional/\n // pending set). The disk walk is the same one the graph cache\n // fingerprints (scan.ts) so cache validity covers exactly this set.\n const diskFiles: string[] = [];\n await scanProjectSourceFiles(\n root,\n diskFiles,\n (failure) => errors.push({ environment: 'scan', id: failure.dir, message: failure.message }),\n 0,\n extensions\n );\n // One path space throughout: graph paths are already slash-\n // normalized, disk-walk paths are node-joined (backslashed on\n // Windows) — mixing them in one Set would duplicate every file.\n const allFiles = new Set([...rsc.projectFiles, ...diskFiles.map(normalizePath)]);\n const facts = new Map<string, SourceFacts>();\n for (const file of allFiles) {\n facts.set(file, await sourceFactsOf(file, errors));\n }\n\n // Phase 3 — SSR graph from every RSC-REACHABLE 'use client'\n // boundary. SSR renders exactly the tree the browser hydrates, so\n // this yields the client tree (boundaries plus everything they\n // transitively import). Disk-only boundaries are deliberately NOT\n // seeded: an unreferenced 'use client' file must keep its\n // provisional pending classification, not get promoted to a\n // confirmed boundary (and drag its imports in as client-internal)\n // by the act of analyzing it.\n const boundarySeeds = [...rsc.projectFiles]\n .filter((file) => facts.get(file)?.directive === 'use client')\n .map((file) => fileToUrl(file, root));\n const ssr = await crawlEnvironment(\n ssrEnv,\n 'ssr',\n boundarySeeds,\n root,\n deadlineAt,\n errors,\n extensions\n );\n\n // SSR-only discoveries (client-internal files) need facts too.\n for (const file of ssr.projectFiles) {\n if (!facts.has(file)) {\n facts.set(file, await sourceFactsOf(file, errors));\n allFiles.add(file);\n }\n }\n\n const classifications = classifyModules(\n [...allFiles].map((file) => ({\n file,\n inRsc: rsc.projectFiles.has(file),\n inSsr: ssr.projectFiles.has(file),\n // The crawl transforms unconditionally, so the untransformed\n // frontier only arises where the transform itself failed.\n ssrTransformed: ssr.projectFiles.has(file) ? !ssr.failedFiles.has(file) : undefined,\n directive: facts.get(file)?.directive ?? null,\n })),\n { appDir, pageExtensions }\n );\n\n // Phase 4 — chains, from the live graphs of the still-open server.\n // ChainGraph is a structural supertype of Vite's module graphs\n // (TIM-1382), so the assignment is cast-free and an upstream shape\n // change fails at compile time.\n const rscChainGraph: ChainGraph = server.environments.rsc.moduleGraph;\n const ssrChainGraph: ChainGraph = server.environments.ssr.moduleGraph;\n const chainCtx = {\n rsc: rscChainGraph,\n ssr: ssrChainGraph,\n appDir,\n pageExtensions,\n // facts keys are already slash-normalized (allFiles is built from\n // graph membership + diskFiles.map(normalizePath)), so no\n // per-lookup normalization is needed.\n getDirective: (file: string) => facts.get(file)?.directive ?? null,\n };\n\n const modules: GraphModuleReport[] = classifications.map((classification) => ({\n ...classification,\n boundary: facts.get(classification.file)?.directive === 'use client',\n chains: stitchImportChains(classification.file, chainCtx),\n poisonings: poisoningsFor(\n classification.kind,\n classification.pending,\n facts.get(classification.file)?.signals ?? []\n ),\n }));\n\n return {\n root,\n incomplete: rsc.deadlineHit || ssr.deadlineHit,\n modules,\n errors,\n stats: {\n rscGraphModules: rsc.visited,\n ssrGraphModules: ssr.visited,\n projectFiles: allFiles.size,\n durationMs: Date.now() - startedAt,\n },\n };\n } finally {\n // Bound the cleanup: after a deadline expiry the very transforms\n // that hung are what server.close() waits on — an unbounded await\n // here would hang the child past its own --timeout and the report\n // would never be emitted. The child's process.exit reaps whatever\n // close left behind.\n await Promise.race([\n server.close().catch(() => {}),\n new Promise<void>((resolveTimer) => setTimeout(resolveTimer, 5_000)),\n ]);\n }\n}\n","/**\n * crawl-entry — child-process entry point for the cold crawl.\n *\n * The crawl's memory footprint is transient but large (~1.3 GB RSS on\n * plugin-heavy apps — design/47 §6), so consumers spawn this module as a\n * short-lived child process instead of crawling in-process:\n *\n * node --import tsx/esm crawl-entry.ts --root <dir> [--config <file>]\n * [--out <file>] [--timeout <ms>]\n *\n * With `--out`, the JSON report is written to that file. Otherwise it is\n * printed to stdout after a marker line — plugins in the booted app may\n * write their own stdout noise, so consumers parse everything after the\n * marker, not the whole stream.\n */\n\nimport { writeFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { crawlProject, CRAWL_RESULT_MARKER } from './crawl.ts';\n\nfunction readFlag(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n return index !== -1 ? argv[index + 1] : undefined;\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const rootArg = readFlag(argv, '--root');\n if (!rootArg) {\n process.stderr.write('usage: crawl-entry --root <dir> [--config <file>] [--out <file>]\\n');\n process.exitCode = 2;\n return;\n }\n\n const timeoutArg = readFlag(argv, '--timeout');\n const report = await crawlProject({\n root: resolve(rootArg),\n configFile: readFlag(argv, '--config'),\n timeoutMs: timeoutArg ? Number(timeoutArg) : undefined,\n });\n\n const json = JSON.stringify(report);\n const outFile = readFlag(argv, '--out');\n if (outFile) {\n await writeFile(resolve(outFile), json);\n } else {\n // Await the flush: stdout to a pipe is async, and process.exit()\n // below does NOT flush pending pipe writes — a large report would\n // be truncated right after the marker.\n await new Promise<void>((resolveWrite, rejectWrite) => {\n process.stdout.write(`\\n${CRAWL_RESULT_MARKER}\\n${json}\\n`, (error) =>\n error ? rejectWrite(error) : resolveWrite()\n );\n });\n }\n}\n\nmain().then(\n () => {\n // The booted app's plugins may hold handles (watchers, sockets) past\n // server.close(); the crawl is a read-only child, so exit explicitly.\n process.exit(process.exitCode ?? 0);\n },\n (error) => {\n process.stderr.write(`[timber] crawl failed: ${error?.stack ?? String(error)}\\n`);\n process.exit(1);\n }\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crawl — programmatic middleware-mode crawl (the cold path).
|
|
3
|
+
*
|
|
4
|
+
* Boots `createServer({ middlewareMode: true })` — no HTTP port, no route
|
|
5
|
+
* rendering — and BFS-walks `env.transformRequest(url)` → importedModules
|
|
6
|
+
* edges from `virtual:timber-rsc-entry`, then from every discovered
|
|
7
|
+
* `'use client'` boundary through the SSR environment. This reuses Vite's
|
|
8
|
+
* actual resolution (aliases, tsconfig paths, react-server export
|
|
9
|
+
* conditions, virtual modules), so it cannot drift from what dev or the
|
|
10
|
+
* build does; hand-rolled resolution was evaluated and rejected
|
|
11
|
+
* (design/47 §"Verified Prototype Findings").
|
|
12
|
+
*
|
|
13
|
+
* Cost model (design/47 §6): 2.5 s on small apps to ~10 s on dep-heavy
|
|
14
|
+
* plugin stacks, with a transient ~1.3 GB RSS — callers MUST run this in
|
|
15
|
+
* a short-lived child process (see crawl-entry.ts) and cache the
|
|
16
|
+
* classification output, not the Vite transforms. The crawl always
|
|
17
|
+
* covers the full project: one crawl per project state, never per
|
|
18
|
+
* question — marginal per-file cost is ~zero once booted.
|
|
19
|
+
*
|
|
20
|
+
* `TIMBER_ANALYZE=1` is set before the server boots so platform dev
|
|
21
|
+
* plugins (wrangler bindings — a measured ~6.8 s remote-bindings
|
|
22
|
+
* handshake on website) skip work the crawl never needs: classification
|
|
23
|
+
* wants import edges, not live Cloudflare connections.
|
|
24
|
+
*
|
|
25
|
+
* Design docs: 47-module-environment-tooling.md §6, §8.
|
|
26
|
+
*/
|
|
27
|
+
import { type ModuleClassification } from './classify.ts';
|
|
28
|
+
import { type ImportChain } from './chains.ts';
|
|
29
|
+
import { type Poisoning } from './poison-scan.ts';
|
|
30
|
+
/**
|
|
31
|
+
* Marker preceding the JSON report on crawl-entry's stdout. Lives here
|
|
32
|
+
* (not in crawl-entry.ts) so consumers can import it without executing
|
|
33
|
+
* the child entry's main().
|
|
34
|
+
*/
|
|
35
|
+
export declare const CRAWL_RESULT_MARKER = "__TIMBER_CRAWL_RESULT__";
|
|
36
|
+
export interface CrawlOptions {
|
|
37
|
+
/** Project root (the app directory containing vite.config). */
|
|
38
|
+
root: string;
|
|
39
|
+
/** Explicit Vite config file; discovered from root when omitted. */
|
|
40
|
+
configFile?: string;
|
|
41
|
+
/** Overall crawl deadline. Default 120s. */
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface CrawlError {
|
|
45
|
+
/** 'scan' covers disk-scan and directive-read failures. */
|
|
46
|
+
environment: 'rsc' | 'ssr' | 'scan';
|
|
47
|
+
id: string;
|
|
48
|
+
message: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* One project file's full graph answer — the classification plus the
|
|
52
|
+
* remaining JSON-contract fields (`boundary`, `chains`, `poisonings`)
|
|
53
|
+
* that need the open graphs / original sources to compute. This is the
|
|
54
|
+
* per-module unit `timber graph` caches and serves.
|
|
55
|
+
*/
|
|
56
|
+
export interface GraphModuleReport extends ModuleClassification {
|
|
57
|
+
/** True when the file itself carries `'use client'`. */
|
|
58
|
+
boundary: boolean;
|
|
59
|
+
/** Boundary-aware import chains (design/47 §7); [] when in no graph. */
|
|
60
|
+
chains: ImportChain[];
|
|
61
|
+
/** Report-only poisoning conflicts (design/47 §3); [] when clean. */
|
|
62
|
+
poisonings: Poisoning[];
|
|
63
|
+
}
|
|
64
|
+
export interface CrawlReport {
|
|
65
|
+
root: string;
|
|
66
|
+
/**
|
|
67
|
+
* True when the crawl deadline expired mid-walk — the report is
|
|
68
|
+
* truncated, not wrong, and the condition is transient (a slow
|
|
69
|
+
* machine, a cold dep-optimizer). Consumers must not cache an
|
|
70
|
+
* incomplete report: with unchanged files it would be served forever,
|
|
71
|
+
* never retrying after the transient cause cleared. Deterministic
|
|
72
|
+
* per-module transform failures do NOT set this — they recur on
|
|
73
|
+
* retry, so caching them is correct.
|
|
74
|
+
*/
|
|
75
|
+
incomplete: boolean;
|
|
76
|
+
/** Classification of every project file, sorted by path. */
|
|
77
|
+
modules: GraphModuleReport[];
|
|
78
|
+
/**
|
|
79
|
+
* Transform failures encountered during the BFS. These are classified,
|
|
80
|
+
* not swallowed — CSS/asset URLs and non-transformable modules land
|
|
81
|
+
* here (44 on website in the §6 measurement) and the crawl continues.
|
|
82
|
+
*/
|
|
83
|
+
errors: CrawlError[];
|
|
84
|
+
stats: {
|
|
85
|
+
rscGraphModules: number;
|
|
86
|
+
ssrGraphModules: number;
|
|
87
|
+
projectFiles: number;
|
|
88
|
+
durationMs: number;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** Duck-typed view of the Vite dev environment surface the crawl uses. */
|
|
92
|
+
export interface CrawlEnvironment {
|
|
93
|
+
transformRequest(url: string): Promise<unknown>;
|
|
94
|
+
moduleGraph: {
|
|
95
|
+
getModuleByUrl(url: string): Promise<CrawlModuleNode | undefined>;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
interface CrawlModuleNode {
|
|
99
|
+
id: string | null;
|
|
100
|
+
url: string;
|
|
101
|
+
file: string | null;
|
|
102
|
+
importedModules: Set<CrawlModuleNode>;
|
|
103
|
+
transformResult: unknown;
|
|
104
|
+
}
|
|
105
|
+
interface EnvCrawlResult {
|
|
106
|
+
/** Absolute paths of project files reached in this environment. */
|
|
107
|
+
projectFiles: Set<string>;
|
|
108
|
+
/** Project files whose own transform failed (membership unconfirmed subtree). */
|
|
109
|
+
failedFiles: Set<string>;
|
|
110
|
+
/** Total graph modules visited (project + deps + virtual). */
|
|
111
|
+
visited: number;
|
|
112
|
+
/** The deadline expired mid-walk — the result is truncated. */
|
|
113
|
+
deadlineHit: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* BFS one environment from the given seed URLs, transforming every
|
|
117
|
+
* discovered module unconditionally. Transforming (rather than reading
|
|
118
|
+
* live graphs) is what closes the §8 blind spot: modules behind
|
|
119
|
+
* unexecuted dynamic imports are transformed here like any other edge.
|
|
120
|
+
*
|
|
121
|
+
* Exported for tests (deadline behavior is exercised with a fake env).
|
|
122
|
+
*/
|
|
123
|
+
export declare function crawlEnvironment(env: CrawlEnvironment, envName: 'rsc' | 'ssr', seeds: string[], root: string, deadlineAt: number, errors: CrawlError[], extensions?: RegExp): Promise<EnvCrawlResult>;
|
|
124
|
+
/**
|
|
125
|
+
* Crawl a project cold and classify every project file.
|
|
126
|
+
*
|
|
127
|
+
* Boots a middleware-mode Vite server with the app's own config (all
|
|
128
|
+
* timber plugins, real resolution), crawls the RSC graph from the entry,
|
|
129
|
+
* detects directives from original sources, crawls the SSR graph from
|
|
130
|
+
* every `'use client'` boundary, and intersects the memberships.
|
|
131
|
+
*/
|
|
132
|
+
export declare function crawlProject(options: CrawlOptions): Promise<CrawlReport>;
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=crawl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.d.ts","sourceRoot":"","sources":["../../src/analyze/crawl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAK1B;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,4BAA4B,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D,wDAAwD;IACxD,QAAQ,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,qEAAqE;IACrE,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;OAIG;IACH,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE;QACL,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AA+BD,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,WAAW,EAAE;QACX,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;KACnE,CAAC;CACH;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,eAAe,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACtC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,cAAc;IACtB,mEAAmE;IACnE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,iFAAiF;IACjF,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;CACtB;AAiBD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,KAAK,GAAG,KAAK,EACtB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,EAAE,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAsDzB;AAuCD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAoM9E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graph-cache — the mtime-keyed output cache for `timber graph`.
|
|
3
|
+
*
|
|
4
|
+
* The cold crawl costs seconds (design/47 §6) and its cost is setup +
|
|
5
|
+
* dependency compilation, not project-file count — so the cacheable
|
|
6
|
+
* unit is the classification OUTPUT, never Vite's transforms. One
|
|
7
|
+
* crawl per project state: the first question after a clone pays for
|
|
8
|
+
* the crawl, every subsequent question is a cache hit until the
|
|
9
|
+
* project changes.
|
|
10
|
+
*
|
|
11
|
+
* Validity is a fingerprint over (path, mtime, size) of every project
|
|
12
|
+
* source file — the same disk walk the crawl itself uses (scan.ts), so
|
|
13
|
+
* cache coverage and crawl coverage cannot drift — plus the config
|
|
14
|
+
* files and the nearest lockfile, since dependency changes change
|
|
15
|
+
* resolution (export conditions can flip a file's environment without
|
|
16
|
+
* touching project code).
|
|
17
|
+
*
|
|
18
|
+
* Deliberately vite-free: a cache hit answers without importing Vite.
|
|
19
|
+
*
|
|
20
|
+
* Design docs: 47-module-environment-tooling.md §"Cold-path policy".
|
|
21
|
+
*/
|
|
22
|
+
import type { CrawlReport } from './crawl.ts';
|
|
23
|
+
/**
|
|
24
|
+
* JSON contract version (design/47 §9) — one constant for every
|
|
25
|
+
* frontend (CLI and dev-server endpoint), so the two cannot drift.
|
|
26
|
+
* Lives here rather than graph-command.ts because this module is
|
|
27
|
+
* vite-free and both frontends already depend on the analyze core.
|
|
28
|
+
*/
|
|
29
|
+
export declare const GRAPH_JSON_VERSION = 1;
|
|
30
|
+
/** Bump when the report shape or fingerprint inputs change. */
|
|
31
|
+
export declare const GRAPH_CACHE_VERSION = 2;
|
|
32
|
+
export interface GraphCacheFile {
|
|
33
|
+
version: number;
|
|
34
|
+
fingerprint: string;
|
|
35
|
+
/** The Vite config file the cached crawl booted with. */
|
|
36
|
+
configFile: string;
|
|
37
|
+
/**
|
|
38
|
+
* The resolved pageExtensions from the timber config at crawl time.
|
|
39
|
+
* Stored so the vite-free hit path can reproduce the same scan
|
|
40
|
+
* extension set (custom extensions like 'foo' must be admitted on
|
|
41
|
+
* both the write and the hit path, or the fingerprint disagrees
|
|
42
|
+
* with what was cached).
|
|
43
|
+
*/
|
|
44
|
+
pageExtensions?: string[];
|
|
45
|
+
/**
|
|
46
|
+
* Files the fingerprint tracks BEYOND the disk scan, discovered at
|
|
47
|
+
* crawl time: Vite's `configFileDependencies` (a config helper
|
|
48
|
+
* imported from outside the app root can reshape the whole app) and
|
|
49
|
+
* every file the report itself classifies (the graph can reach files
|
|
50
|
+
* the scan skips — `app/.well-known/page.tsx`, a route under a
|
|
51
|
+
* directory named `dist`). The hit path re-stats exactly this list,
|
|
52
|
+
* so an edit to any of them misses the cache.
|
|
53
|
+
*/
|
|
54
|
+
trackedExtras: string[];
|
|
55
|
+
report: CrawlReport;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Follow a tsconfig/jsconfig `extends` chain, returning every file on
|
|
59
|
+
* it (the start file included). A base config outside the app —
|
|
60
|
+
* `"extends": "../tsconfig.base.json"` with a `paths` mapping — can
|
|
61
|
+
* reshape Vite's resolution without touching anything else the
|
|
62
|
+
* fingerprint tracks. Parsing is a targeted regex, not JSONC: tsconfig
|
|
63
|
+
* allows comments, and all we need is the `extends` value. Package
|
|
64
|
+
* specifiers resolve through Node resolution (an approximation of
|
|
65
|
+
* TypeScript's — the `.json` append covers the common shapes): a
|
|
66
|
+
* WORKSPACE package like `@repo/tsconfig/base.json` is a link, so its
|
|
67
|
+
* edits change neither the lockfile nor any scanned file and must be
|
|
68
|
+
* fingerprinted directly; registry packages resolve too, harmlessly.
|
|
69
|
+
* Cycles and unresolvable targets just end the walk (bounded at 16).
|
|
70
|
+
*/
|
|
71
|
+
/**
|
|
72
|
+
* Strip JSONC comments so a commented-out `"extends"` line cannot
|
|
73
|
+
* shadow the real one. String-aware: comment markers inside string
|
|
74
|
+
* literals (a path containing `//`) survive.
|
|
75
|
+
*/
|
|
76
|
+
export declare function stripJsonComments(raw: string): string;
|
|
77
|
+
/** `path\0mtime\0size` entries for a file list; absent files contribute nothing. */
|
|
78
|
+
export declare function fingerprintEntriesForFiles(files: Iterable<string>): Promise<string[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Entries for the scan-derived base set: project source files, the
|
|
81
|
+
* config, root manifests, and the nearest lockfile. Scan failures are
|
|
82
|
+
* folded into the entry list rather than thrown: an unreadable
|
|
83
|
+
* directory changes the answer's completeness, so it must change the
|
|
84
|
+
* key too.
|
|
85
|
+
*/
|
|
86
|
+
export declare function collectBaseFingerprintEntries(root: string, configFile: string, pageExtensions?: readonly string[]): Promise<string[]>;
|
|
87
|
+
/** Hash an entry list order-independently. */
|
|
88
|
+
export declare function hashFingerprintEntries(entries: string[]): string;
|
|
89
|
+
/**
|
|
90
|
+
* Fingerprint the project state `timber graph`'s answers depend on:
|
|
91
|
+
* the scan-derived base set plus `extraFiles` (the cache's
|
|
92
|
+
* trackedExtras on the hit path; config dependencies + report files on
|
|
93
|
+
* the write path).
|
|
94
|
+
*/
|
|
95
|
+
export declare function computeProjectFingerprint(root: string, configFile: string, extraFiles?: readonly string[], pageExtensions?: readonly string[]): Promise<string>;
|
|
96
|
+
/** Read the cache file; anything unreadable or version-mismatched is a miss. */
|
|
97
|
+
export declare function readGraphCache(root: string): Promise<GraphCacheFile | null>;
|
|
98
|
+
/**
|
|
99
|
+
* Write the cache atomically (temp file + rename) so a concurrent
|
|
100
|
+
* reader — parallel agent invocations are the expected workload —
|
|
101
|
+
* never sees a torn JSON file.
|
|
102
|
+
*/
|
|
103
|
+
export declare function writeGraphCache(root: string, cache: GraphCacheFile): Promise<void>;
|
|
104
|
+
//# sourceMappingURL=graph-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-cache.d.ts","sourceRoot":"","sources":["../../src/analyze/graph-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAuCrC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;;;OAQG;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4BrD;AAsED,oFAAoF;AACpF,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY3F;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB;AAED,8CAA8C;AAC9C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAGhE;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,SAAS,MAAM,EAAO,EAClC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GACjC,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED,gFAAgF;AAChF,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAkBjF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF"}
|