@timber-js/app 0.2.0-alpha.2 → 0.2.0-alpha.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/agent-skill.md +346 -0
- package/dist/_chunks/actions-d1hCqnU3.js +345 -0
- package/dist/_chunks/actions-d1hCqnU3.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js +135 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +1 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js +370 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/cache-api-ByagcC-J.js +1149 -0
- package/dist/_chunks/cache-api-ByagcC-J.js.map +1 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
- package/dist/_chunks/chains-Bpb0W4ax.js +412 -0
- package/dist/_chunks/chains-Bpb0W4ax.js.map +1 -0
- package/dist/_chunks/cli-check-D6VolrDV.js +293 -0
- package/dist/_chunks/cli-check-D6VolrDV.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js +299 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js.map +1 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js +1290 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js +893 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js +1050 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js +458 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js +150 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js.map +1 -0
- package/dist/_chunks/logger-uLBuGKDI.js +1484 -0
- package/dist/_chunks/logger-uLBuGKDI.js.map +1 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js +135 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js +321 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js +101 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-AiazgH_f.js +1771 -0
- package/dist/_chunks/scanner-AiazgH_f.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-D9_89u34.js +34 -0
- package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
- package/dist/_chunks/segment-keys-lqtdookO.js +256 -0
- package/dist/_chunks/segment-keys-lqtdookO.js.map +1 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-D6T6Y3ef.js} +3 -31
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
- package/dist/_chunks/state-FippDgxN.js +52 -0
- package/dist/_chunks/state-FippDgxN.js.map +1 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +1 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js +226 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -0
- package/dist/_chunks/walkers-B6XUtmqK.js +144 -0
- package/dist/_chunks/walkers-B6XUtmqK.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +74 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +200 -22
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +17 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +82 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +457 -288
- 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 +27 -0
- package/dist/cache/fast-hash.d.ts.map +1 -0
- 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 -284
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +141 -9
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +21 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +21 -11
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/cloudflare-purge.js +30 -0
- package/dist/cdn/cloudflare-purge.js.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.js +33 -0
- package/dist/cdn/fastly-purge.js.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/index.js +94 -0
- package/dist/cdn/index.js.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +20 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.js +35 -0
- package/dist/cdn/workers-cache-purge.js.map +1 -0
- package/dist/cli-check.d.ts +163 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +75 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +175 -47
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +44 -0
- package/dist/client/browser-entry/action-queue.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +63 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +46 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +66 -6
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +323 -1148
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +818 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +63 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +98 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +51 -31
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +98 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +187 -0
- package/dist/client/navigation-transition.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +44 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +130 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +87 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +272 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +104 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +161 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +29 -7
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +19 -8
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +13 -11
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +2 -2
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +322 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +46 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +112 -8
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +2 -1
- package/dist/fonts/css.d.ts.map +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 +6 -4
- 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 -153
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10488 -13975
- 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 +54 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +32 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -65
- 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 +24 -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/debug.d.ts +82 -0
- package/dist/server/debug.d.ts.map +1 -0
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +253 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +20 -9
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +101 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +45 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/html-injector-core.d.ts +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +18 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +212 -2930
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4034 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +71 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +78 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +77 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +59 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +7 -1
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +160 -24
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +63 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +52 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +79 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +129 -45
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +26 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +111 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +40 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +38 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +59 -42
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +40 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +26 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +39 -3
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +37 -5
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
- 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 +56 -11
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +88 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +17 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/waituntil-bridge.d.ts.map +1 -1
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +109 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +16 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +52 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/dist/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- package/dist/shims/navigation.d.ts +10 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +236 -0
- package/docs/api/31-api-client.mdx +167 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +329 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +192 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +252 -0
- package/docs/learn/11-middleware.mdx +158 -0
- package/docs/learn/12-error-handling.mdx +188 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +117 -29
- 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 +279 -418
- 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 +39 -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 +180 -48
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +23 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +34 -0
- package/src/cli-check.ts +507 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +262 -55
- package/src/client/browser-dev.ts +157 -2
- package/src/client/browser-entry/action-dispatch.ts +197 -0
- package/src/client/browser-entry/action-queue.ts +90 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +148 -0
- package/src/client/browser-entry/index.ts +131 -0
- package/src/client/browser-entry/post-hydration.ts +123 -0
- package/src/client/browser-entry/router-init.ts +418 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/deny-last-resort.tsx +54 -0
- package/src/client/error-boundary.tsx +316 -40
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +81 -10
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +452 -159
- 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 +436 -424
- package/src/client/rsc-fetch.ts +512 -73
- package/src/client/segment-cache.ts +327 -40
- package/src/client/segment-context.ts +13 -5
- 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 +36 -29
- package/src/client/unload-guard.ts +35 -3
- package/src/client/use-cookie.ts +70 -18
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +22 -31
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +6 -3
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +322 -0
- package/src/config-validation.ts +347 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +185 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +3 -2
- 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 +13 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +486 -344
- 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 +275 -43
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +369 -96
- package/src/plugins/entries.ts +148 -18
- package/src/plugins/fonts.ts +251 -524
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +116 -40
- 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 +103 -14
- package/src/plugins/shims.ts +259 -97
- package/src/plugins/static-build.ts +708 -66
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +141 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +623 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +393 -219
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +75 -26
- package/src/routing/walkers.ts +98 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +19 -0
- package/src/schema-bridge.ts +380 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +196 -57
- package/src/server/action-client.ts +136 -35
- 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/debug.ts +137 -0
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +533 -0
- package/src/server/deny-renderer.ts +214 -112
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +181 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +2 -2
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +272 -235
- 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 -36
- 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 +343 -389
- 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 +246 -97
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +35 -0
- package/src/server/request-context.ts +244 -333
- 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 -360
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +40 -13
- package/src/server/route-matcher.ts +165 -272
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +174 -0
- package/src/server/rsc-entry/api-handler.ts +78 -34
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +373 -95
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +405 -323
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +239 -50
- package/src/server/rsc-entry/rsc-stream.ts +160 -30
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +315 -57
- 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 +3 -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 +151 -16
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +95 -10
- package/src/server/utils/element-type.ts +88 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +5 -2
- 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-k-AtAQ9R.js +0 -41
- package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
- package/dist/_chunks/format-DNt20Kt8.js +0 -163
- package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
- package/dist/_chunks/interception-DGDIjDbR.js +0 -676
- package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
- package/dist/_chunks/metadata-routes-CQCnF4VK.js +0 -153
- package/dist/_chunks/metadata-routes-CQCnF4VK.js.map +0 -1
- package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
- package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
- package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
- package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
- package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
- package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
- package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js +0 -109
- package/dist/_chunks/use-query-states-DAhgj8Gx.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 -99
- package/src/client/browser-entry.ts +0 -674
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -345
- package/src/client/stale-reload.ts +0 -89
- package/src/client/transition-root.tsx +0 -160
- 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 -282
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/tree-builder.ts +0 -382
- package/src/shims/server-only-noop.js +0 -6
- package/src/utils/directive-parser.ts +0 -529
package/dist/adapters/nitro.js
CHANGED
|
@@ -1,114 +1,83 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { t as RSC_CONTENT_TYPE } from "../_chunks/rsc-media-type-DDc7duTD.js";
|
|
2
|
+
import { a as IMMUTABLE_CACHE, i as writeHeadersFile, n as findUnhashedStaticFiles, r as runSharedBuildSteps, t as buildStaticDirectoryOutput } from "../_chunks/build-output-helper-9dqCv1pZ.js";
|
|
3
|
+
import { transformWithOxc } from "vite";
|
|
4
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
5
|
+
import { cp, glob, readFile, writeFile } from "node:fs/promises";
|
|
3
6
|
import { execFile } from "node:child_process";
|
|
7
|
+
//#region src/server/compress.ts?raw
|
|
8
|
+
var compress_default = "// Response compression for self-hosted deployments (dev server, Nitro preview).\n//\n// Uses CompressionStream (Web Platform API) for gzip. Brotli is intentionally\n// left to CDNs and reverse proxies — at streaming-friendly quality levels its\n// ratio advantage is marginal, and node:zlib's brotli transform buffers output\n// internally, breaking streaming. Cloudflare Workers auto-compress at the edge —\n// this module is only used on Node.js/Bun.\n//\n// See design/25-production-deployments.md.\n//\n// This module is also emitted standalone as `_compress.mjs` by\n// `adapters/compress-module.ts`, which strips types but does not bundle. Its\n// imports must therefore be interpolated there — a new import that is not\n// fails the build with an explanatory error rather than resolving to nothing\n// on the deployed server.\n\nimport { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.ts';\n\n// ─── Constants ────────────────────────────────────────────────────────────\n\n/**\n * MIME types that benefit from compression.\n * text/* is handled via prefix matching; these are the specific\n * application/* and image/* types that are compressible.\n */\nexport const COMPRESSIBLE_TYPES = new Set([\n 'text/html',\n 'text/css',\n 'text/plain',\n 'text/xml',\n 'text/javascript',\n RSC_CONTENT_TYPE,\n 'application/json',\n 'application/javascript',\n 'application/xml',\n 'application/xhtml+xml',\n 'application/rss+xml',\n 'application/atom+xml',\n 'image/svg+xml',\n]);\n\n/**\n * Status codes that should never be compressed (no body or special semantics).\n */\nconst NO_COMPRESS_STATUSES = new Set([204, 304]);\n\n// ─── Encoding Negotiation ─────────────────────────────────────────────────\n\n/**\n * Parse Accept-Encoding and return the best supported encoding.\n * Returns 'gzip' if the client accepts it, null otherwise.\n *\n * Brotli (br) is intentionally not handled at the application level.\n * At the streaming-friendly quality levels (0–4), brotli's compression\n * ratio advantage over gzip is marginal, and node:zlib's brotli transform\n * buffers output internally — turning smooth streaming responses into\n * large infrequent bursts. Brotli's real wins come from offline/static\n * compression at higher quality levels (5–11), which CDNs and reverse\n * proxies (Cloudflare, nginx, Caddy) apply on cached responses.\n *\n * See design/25-production-deployments.md.\n */\nexport function negotiateEncoding(acceptEncoding: string): 'gzip' | null {\n if (!acceptEncoding) return null;\n\n // Parse tokens with quality values from the Accept-Encoding header.\n // Per RFC 9110 §12.5.3, q=0 means \"not acceptable\" — the client explicitly\n // rejects that encoding. Tokens without a q-value default to q=1.\n // e.g. \"gzip;q=1.0, br;q=0\" → gzip is acceptable, br is rejected.\n const parts = acceptEncoding.split(',');\n for (const part of parts) {\n const [token, ...params] = part.split(';');\n const name = token.trim().toLowerCase();\n if (name !== 'gzip') continue;\n\n // Check for q=0 (explicitly disabled)\n let qValue = 1; // default quality is 1\n for (const param of params) {\n const trimmed = param.trim().toLowerCase();\n if (trimmed.startsWith('q=')) {\n qValue = parseFloat(trimmed.slice(2));\n if (Number.isNaN(qValue)) qValue = 1;\n break;\n }\n }\n\n if (qValue > 0) return 'gzip';\n }\n\n return null;\n}\n\n// ─── Compressibility Check ────────────────────────────────────────────────\n\n/**\n * Determine if a response should be compressed.\n *\n * Returns false for:\n * - Responses without a body (204, 304, null body)\n * - Already-encoded responses (Content-Encoding set)\n * - Non-compressible content types (images, binary)\n * - SSE streams (text/event-stream — must not be buffered)\n */\nexport function shouldCompress(response: Response): boolean {\n // No body to compress\n if (!response.body) return false;\n if (NO_COMPRESS_STATUSES.has(response.status)) return false;\n\n // Already compressed\n if (response.headers.has('Content-Encoding')) return false;\n\n // Check content type\n const contentType = response.headers.get('Content-Type');\n if (!contentType) return false;\n\n // Extract the MIME type (strip charset and other parameters)\n const mimeType = contentType.split(';')[0].trim().toLowerCase();\n\n // SSE must not be compressed — it relies on chunk-by-chunk delivery\n if (mimeType === 'text/event-stream') return false;\n\n return COMPRESSIBLE_TYPES.has(mimeType);\n}\n\n// ─── Compression ──────────────────────────────────────────────────────────\n\n/**\n * Compress a Web Response if the client supports it and the content is compressible.\n *\n * Returns the original response unchanged if compression is not applicable.\n * Returns a new Response with the compressed body, Content-Encoding, and Vary headers.\n *\n * The body is piped through a compression stream — no buffering of the full response.\n * This preserves streaming behavior for HTML shell + deferred Suspense chunks.\n */\nexport function compressResponse(request: Request, response: Response): Response {\n // Check if response is compressible\n if (!shouldCompress(response)) return response;\n\n // Negotiate encoding with the client\n const acceptEncoding = request.headers.get('Accept-Encoding') ?? '';\n const encoding = negotiateEncoding(acceptEncoding);\n if (!encoding) return response;\n\n // Compress the body stream with gzip via the Web Platform CompressionStream API.\n const compressedBody = compressWithGzip(response.body!);\n\n // Build new headers: copy originals, add compression headers, remove Content-Length\n // (compressed size is unknown until streaming completes).\n const headers = new Headers(response.headers);\n headers.set('Content-Encoding', encoding);\n headers.delete('Content-Length');\n\n // Append to Vary header (preserve existing Vary values)\n const existingVary = headers.get('Vary');\n if (existingVary) {\n if (!existingVary.toLowerCase().includes('accept-encoding')) {\n headers.set('Vary', `${existingVary}, Accept-Encoding`);\n }\n } else {\n headers.set('Vary', 'Accept-Encoding');\n }\n\n return new Response(compressedBody, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n// ─── Gzip (node:zlib with Z_SYNC_FLUSH) ──────────────────────────────────\n//\n// Uses node:zlib's createGzip with Z_SYNC_FLUSH so each chunk is flushed\n// to the output immediately. The Web Platform CompressionStream API buffers\n// internally and does NOT flush per-chunk — this kills streaming because\n// the browser doesn't receive the HTML shell until the gzip stream closes\n// (i.e. after all Suspense boundaries resolve).\n//\n// Z_SYNC_FLUSH adds ~2–5% size overhead vs Z_NO_FLUSH but preserves\n// correct streaming behavior: the shell renders instantly, Suspense\n// fallbacks are visible immediately, and streamed content appears\n// progressively.\n\nimport { createGzip, constants } from 'node:zlib';\nimport { Readable, pipeline } from 'node:stream';\n\n/**\n * Compress a ReadableStream with gzip, flushing each chunk immediately.\n *\n * Uses node:zlib's createGzip with Z_SYNC_FLUSH to ensure each HTML chunk\n * (shell, Suspense resolution, RSC payload) is delivered to the browser\n * as soon as it's available — preserving streaming semantics.\n */\nfunction compressWithGzip(body: ReadableStream<Uint8Array>): ReadableStream<Uint8Array> {\n const gzip = createGzip({ flush: constants.Z_SYNC_FLUSH });\n const nodeInput = Readable.fromWeb(body as import('stream/web').ReadableStream);\n\n // pipeline() instead of bare pipe(): pipe() does not forward source errors,\n // so an erroring body (streaming route handler, dropped upstream fetch)\n // would emit an unhandled 'error' event and crash the process. pipeline()\n // destroys gzip on source error — the returned web stream rejects — and\n // tears down nodeInput when the consumer cancels the web stream, which\n // cancels the source body via fromWeb. The error reaches the consumer\n // through the web stream; the callback only marks it handled at the Node\n // layer.\n pipeline(nodeInput, gzip, () => {});\n\n return Readable.toWeb(gzip) as ReadableStream<Uint8Array>;\n}\n";
|
|
9
|
+
//#endregion
|
|
4
10
|
//#region src/adapters/compress-module.ts
|
|
5
11
|
/**
|
|
6
|
-
*
|
|
12
|
+
* The one import `server/compress.ts` is allowed to carry, and its inlined
|
|
13
|
+
* form.
|
|
14
|
+
*
|
|
15
|
+
* The binding list is matched exactly rather than as `{…}`. A second binding
|
|
16
|
+
* added to that import would otherwise be erased along with the statement and
|
|
17
|
+
* become a `ReferenceError` in the deployed `_compress.mjs` — the failure this
|
|
18
|
+
* whole module exists to make impossible. Matching exactly means such an
|
|
19
|
+
* import falls through to the rejection below instead.
|
|
20
|
+
*/
|
|
21
|
+
var INLINED_IMPORTS = [{
|
|
22
|
+
pattern: /^import\s*\{\s*RSC_CONTENT_TYPE\s*,?\s*\}\s*from\s*["'][^"']*shared\/rsc-media-type\.(?:js|ts)["'];?[ \t]*$/m,
|
|
23
|
+
replacement: `const RSC_CONTENT_TYPE = ${JSON.stringify(RSC_CONTENT_TYPE)};`
|
|
24
|
+
}];
|
|
25
|
+
/**
|
|
26
|
+
* Every way a module specifier can reach the emitted file, minus Node
|
|
27
|
+
* builtins.
|
|
7
28
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
29
|
+
* `node:*` is exempt because it resolves on the deployed server exactly as it
|
|
30
|
+
* does here — `_compress.mjs` already imports `node:zlib` and `node:stream`,
|
|
31
|
+
* and self-hosted (Node/Bun) is the only place this file runs. Everything
|
|
32
|
+
* else — relative paths, bare packages — has no resolution target next to a
|
|
33
|
+
* lone `.mjs` in the build output.
|
|
34
|
+
*
|
|
35
|
+
* All three forms are listed rather than the one `server/compress.ts` happens
|
|
36
|
+
* to use, because a re-export or a lazy `await import()` fails in exactly the
|
|
37
|
+
* same place and is exactly as invisible until deploy.
|
|
38
|
+
*/
|
|
39
|
+
var MODULE_SPECIFIERS = [
|
|
40
|
+
/^[ \t]*(?:import|export)\b[^\n]*\bfrom\s*["'](?!node:)[^"']+["']/m,
|
|
41
|
+
/^[ \t]*import\s*["'](?!node:)[^"']+["']/m,
|
|
42
|
+
/\bimport\s*\(\s*["'](?!node:)[^"']+["']/
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* Replace the shared-module imports with their values and reject anything
|
|
46
|
+
* else that would leave a dangling specifier in `_compress.mjs`.
|
|
47
|
+
*
|
|
48
|
+
* Exported separately from `generateCompressModule` so both branches can be
|
|
49
|
+
* driven with fixtures: the source it normally compiles is fixed, so a test
|
|
50
|
+
* of the generator alone can only ever exercise whichever branch that source
|
|
51
|
+
* happens to take today.
|
|
10
52
|
*
|
|
11
53
|
* @internal Exported for testing.
|
|
12
54
|
*/
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const COMPRESSIBLE_TYPES = new Set([
|
|
21
|
-
'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
|
|
22
|
-
'text/x-component', 'application/json', 'application/javascript',
|
|
23
|
-
'application/xml', 'application/xhtml+xml', 'application/rss+xml',
|
|
24
|
-
'application/atom+xml', 'image/svg+xml',
|
|
25
|
-
]);
|
|
26
|
-
|
|
27
|
-
const NO_COMPRESS_STATUSES = new Set([204, 304]);
|
|
28
|
-
|
|
29
|
-
function negotiateEncoding(acceptEncoding) {
|
|
30
|
-
if (!acceptEncoding) return null;
|
|
31
|
-
// Parse tokens with quality values. Per RFC 9110 §12.5.3, q=0 means
|
|
32
|
-
// "not acceptable" — the client explicitly rejects that encoding.
|
|
33
|
-
// Brotli (br) is intentionally not handled at the application level.
|
|
34
|
-
const parts = acceptEncoding.split(',');
|
|
35
|
-
for (const part of parts) {
|
|
36
|
-
const [token, ...params] = part.split(';');
|
|
37
|
-
const name = token.trim().toLowerCase();
|
|
38
|
-
if (name !== 'gzip') continue;
|
|
39
|
-
let qValue = 1;
|
|
40
|
-
for (const param of params) {
|
|
41
|
-
const trimmed = param.trim().toLowerCase();
|
|
42
|
-
if (trimmed.startsWith('q=')) {
|
|
43
|
-
qValue = parseFloat(trimmed.slice(2));
|
|
44
|
-
if (Number.isNaN(qValue)) qValue = 1;
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
if (qValue > 0) return 'gzip';
|
|
49
|
-
}
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function shouldCompress(response) {
|
|
54
|
-
if (!response.body) return false;
|
|
55
|
-
if (NO_COMPRESS_STATUSES.has(response.status)) return false;
|
|
56
|
-
if (response.headers.has('Content-Encoding')) return false;
|
|
57
|
-
const contentType = response.headers.get('Content-Type');
|
|
58
|
-
if (!contentType) return false;
|
|
59
|
-
const mimeType = contentType.split(';')[0].trim().toLowerCase();
|
|
60
|
-
if (mimeType === 'text/event-stream') return false;
|
|
61
|
-
return COMPRESSIBLE_TYPES.has(mimeType);
|
|
55
|
+
function inlineCompressImports(code) {
|
|
56
|
+
let out = code;
|
|
57
|
+
for (const { pattern, replacement } of INLINED_IMPORTS) out = out.replace(pattern, replacement);
|
|
58
|
+
const surviving = MODULE_SPECIFIERS.map((pattern) => pattern.exec(out)).find(Boolean);
|
|
59
|
+
if (surviving) throw new Error(`[timber] server/compress.ts is emitted as a standalone _compress.mjs (type-stripped, not bundled), so it cannot import anything at runtime. Found: ${surviving[0].trim()}\n Either inline the value in adapters/compress-module.ts (see INLINED_IMPORTS) or keep the dependency out of server/compress.ts.`);
|
|
60
|
+
return out;
|
|
62
61
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const headers = new Headers(response.headers);
|
|
75
|
-
headers.set('Content-Encoding', encoding);
|
|
76
|
-
headers.delete('Content-Length');
|
|
77
|
-
const existingVary = headers.get('Vary');
|
|
78
|
-
if (existingVary) {
|
|
79
|
-
if (!existingVary.toLowerCase().includes('accept-encoding')) {
|
|
80
|
-
headers.set('Vary', existingVary + ', Accept-Encoding');
|
|
81
|
-
}
|
|
82
|
-
} else {
|
|
83
|
-
headers.set('Vary', 'Accept-Encoding');
|
|
84
|
-
}
|
|
85
|
-
return new Response(compressedBody, {
|
|
86
|
-
status: response.status,
|
|
87
|
-
statusText: response.statusText,
|
|
88
|
-
headers,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
`;
|
|
62
|
+
/**
|
|
63
|
+
* Compile server/compress.ts into a standalone ESM module.
|
|
64
|
+
*
|
|
65
|
+
* Uses Vite's OXC transform to strip TypeScript types from the
|
|
66
|
+
* embedded source. The result is written to `_compress.mjs` during
|
|
67
|
+
* buildOutput.
|
|
68
|
+
*
|
|
69
|
+
* @internal Exported for testing.
|
|
70
|
+
*/
|
|
71
|
+
async function generateCompressModule() {
|
|
72
|
+
return "// Generated by @timber-js/app — compiled from server/compress.ts.\n// Do not edit — this file is regenerated on each build.\n" + inlineCompressImports((await transformWithOxc(compress_default, "compress.ts", { lang: "ts" })).code);
|
|
92
73
|
}
|
|
93
74
|
//#endregion
|
|
94
|
-
//#region src/adapters/nitro.ts
|
|
95
|
-
var IMMUTABLE_CACHE = "public, max-age=31536000, immutable";
|
|
96
|
-
var STATIC_CACHE = "public, max-age=3600, must-revalidate";
|
|
97
|
-
function generateHeadersFile() {
|
|
98
|
-
return `# Auto-generated by @timber-js/app — static asset cache headers.
|
|
99
|
-
# See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
100
|
-
|
|
101
|
-
/assets/*
|
|
102
|
-
Cache-Control: ${IMMUTABLE_CACHE}
|
|
103
|
-
|
|
104
|
-
/*
|
|
105
|
-
Cache-Control: ${STATIC_CACHE}
|
|
106
|
-
`;
|
|
107
|
-
}
|
|
75
|
+
//#region src/adapters/nitro-presets.ts
|
|
108
76
|
var PRESET_CONFIGS = {
|
|
109
77
|
"vercel": {
|
|
110
78
|
nitroPreset: "vercel",
|
|
111
79
|
outputDir: ".vercel/output",
|
|
80
|
+
serverBundleDir: "functions/__server.func",
|
|
112
81
|
supportsWaitUntil: true,
|
|
113
82
|
supportsEarlyHints: false,
|
|
114
83
|
runtimeName: "vercel",
|
|
@@ -117,6 +86,7 @@ var PRESET_CONFIGS = {
|
|
|
117
86
|
"vercel-edge": {
|
|
118
87
|
nitroPreset: "vercel-edge",
|
|
119
88
|
outputDir: ".vercel/output",
|
|
89
|
+
serverBundleDir: "functions/__server.func",
|
|
120
90
|
supportsWaitUntil: true,
|
|
121
91
|
supportsEarlyHints: false,
|
|
122
92
|
runtimeName: "vercel-edge"
|
|
@@ -124,6 +94,7 @@ var PRESET_CONFIGS = {
|
|
|
124
94
|
"netlify": {
|
|
125
95
|
nitroPreset: "netlify",
|
|
126
96
|
outputDir: ".netlify/functions-internal",
|
|
97
|
+
serverBundleDir: "server",
|
|
127
98
|
supportsWaitUntil: false,
|
|
128
99
|
supportsEarlyHints: false,
|
|
129
100
|
runtimeName: "netlify"
|
|
@@ -131,6 +102,7 @@ var PRESET_CONFIGS = {
|
|
|
131
102
|
"netlify-edge": {
|
|
132
103
|
nitroPreset: "netlify-edge",
|
|
133
104
|
outputDir: ".netlify/edge-functions",
|
|
105
|
+
serverBundleDir: "server",
|
|
134
106
|
supportsWaitUntil: true,
|
|
135
107
|
supportsEarlyHints: false,
|
|
136
108
|
runtimeName: "netlify-edge"
|
|
@@ -138,6 +110,7 @@ var PRESET_CONFIGS = {
|
|
|
138
110
|
"aws-lambda": {
|
|
139
111
|
nitroPreset: "aws-lambda",
|
|
140
112
|
outputDir: ".output",
|
|
113
|
+
serverBundleDir: "server",
|
|
141
114
|
supportsWaitUntil: false,
|
|
142
115
|
supportsEarlyHints: false,
|
|
143
116
|
runtimeName: "aws-lambda"
|
|
@@ -145,6 +118,7 @@ var PRESET_CONFIGS = {
|
|
|
145
118
|
"deno-deploy": {
|
|
146
119
|
nitroPreset: "deno-deploy",
|
|
147
120
|
outputDir: ".output",
|
|
121
|
+
serverBundleDir: "server",
|
|
148
122
|
supportsWaitUntil: true,
|
|
149
123
|
supportsEarlyHints: false,
|
|
150
124
|
runtimeName: "deno-deploy"
|
|
@@ -152,6 +126,7 @@ var PRESET_CONFIGS = {
|
|
|
152
126
|
"azure-functions": {
|
|
153
127
|
nitroPreset: "azure-functions",
|
|
154
128
|
outputDir: ".output",
|
|
129
|
+
serverBundleDir: "server",
|
|
155
130
|
supportsWaitUntil: false,
|
|
156
131
|
supportsEarlyHints: false,
|
|
157
132
|
runtimeName: "azure-functions"
|
|
@@ -159,6 +134,7 @@ var PRESET_CONFIGS = {
|
|
|
159
134
|
"node-server": {
|
|
160
135
|
nitroPreset: "node-server",
|
|
161
136
|
outputDir: ".output",
|
|
137
|
+
serverBundleDir: "server",
|
|
162
138
|
supportsWaitUntil: true,
|
|
163
139
|
supportsEarlyHints: false,
|
|
164
140
|
runtimeName: "node-server"
|
|
@@ -166,154 +142,23 @@ var PRESET_CONFIGS = {
|
|
|
166
142
|
"bun": {
|
|
167
143
|
nitroPreset: "bun",
|
|
168
144
|
outputDir: ".output",
|
|
145
|
+
serverBundleDir: "server",
|
|
169
146
|
supportsWaitUntil: true,
|
|
170
147
|
supportsEarlyHints: false,
|
|
171
148
|
runtimeName: "bun"
|
|
172
149
|
}
|
|
173
150
|
};
|
|
151
|
+
/** Presets that produce a locally-runnable server entry. */
|
|
152
|
+
var LOCALLY_PREVIEWABLE = /* @__PURE__ */ new Set(["node-server", "bun"]);
|
|
174
153
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
* Nitro abstracts deployment targets — the same timber.js app can deploy
|
|
178
|
-
* to Vercel, Netlify, AWS, Deno Deploy, or Azure by changing the preset.
|
|
179
|
-
*
|
|
180
|
-
* @example
|
|
181
|
-
* ```ts
|
|
182
|
-
* import { nitro } from '@timber-js/app/adapters/nitro'
|
|
183
|
-
*
|
|
184
|
-
* export default {
|
|
185
|
-
* output: 'server',
|
|
186
|
-
* adapter: nitro({ preset: 'vercel' }),
|
|
187
|
-
* }
|
|
188
|
-
* ```
|
|
154
|
+
* Get the preset configuration for a given preset name.
|
|
155
|
+
* @internal Exported for testing.
|
|
189
156
|
*/
|
|
190
|
-
function
|
|
191
|
-
|
|
192
|
-
const presetConfig = PRESET_CONFIGS[preset];
|
|
193
|
-
const pendingPromises = [];
|
|
194
|
-
return {
|
|
195
|
-
name: `nitro-${preset}`,
|
|
196
|
-
async buildOutput(config, buildDir) {
|
|
197
|
-
const outDir = join(buildDir, "nitro");
|
|
198
|
-
await mkdir(outDir, { recursive: true });
|
|
199
|
-
const clientDir = join(buildDir, "client");
|
|
200
|
-
const publicDir = join(outDir, "public");
|
|
201
|
-
await mkdir(publicDir, { recursive: true });
|
|
202
|
-
await cp(clientDir, publicDir, {
|
|
203
|
-
recursive: true,
|
|
204
|
-
filter: config.clientJavascriptDisabled ? (src) => !src.endsWith(".js") : void 0
|
|
205
|
-
}).catch(() => {});
|
|
206
|
-
await writeFile(join(publicDir, "_headers"), generateHeadersFile());
|
|
207
|
-
if (config.manifestInit) await writeFile(join(outDir, "_timber-manifest-init.js"), config.manifestInit);
|
|
208
|
-
await writeFile(join(outDir, "_compress.mjs"), generateCompressModule());
|
|
209
|
-
await cp(join(buildDir, "rsc"), join(outDir, "rsc"), { recursive: true });
|
|
210
|
-
await cp(join(buildDir, "ssr"), join(outDir, "ssr"), { recursive: true }).catch(() => {});
|
|
211
|
-
if (config.manifestInit) {
|
|
212
|
-
const rscEntry = join(outDir, "rsc", "index.js");
|
|
213
|
-
const rscContent = await readFile(rscEntry, "utf-8");
|
|
214
|
-
await writeFile(rscEntry, `${config.manifestInit}\n${rscContent}`);
|
|
215
|
-
}
|
|
216
|
-
const entry = generateNitroEntry(buildDir, outDir, preset);
|
|
217
|
-
await writeFile(join(outDir, "entry.ts"), entry);
|
|
218
|
-
await runNitroBuild(outDir, preset, options.nitroConfig);
|
|
219
|
-
},
|
|
220
|
-
preview: LOCALLY_PREVIEWABLE.has(preset) ? async (_config, buildDir) => {
|
|
221
|
-
const previewScript = generatePreviewScript(buildDir, preset);
|
|
222
|
-
const scriptPath = join(buildDir, "nitro", "_preview-server.mjs");
|
|
223
|
-
await writeFile(scriptPath, previewScript);
|
|
224
|
-
await spawnNitroPreview(preset === "bun" ? "bun" : "node", [scriptPath], join(buildDir, "nitro"));
|
|
225
|
-
} : void 0,
|
|
226
|
-
waitUntil: presetConfig.supportsWaitUntil ? (promise) => {
|
|
227
|
-
const tracked = promise.catch((err) => {
|
|
228
|
-
console.error("[timber] waitUntil promise rejected:", err);
|
|
229
|
-
});
|
|
230
|
-
pendingPromises.push(tracked);
|
|
231
|
-
} : void 0
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
/** @internal Exported for testing. */
|
|
235
|
-
function generateNitroEntry(buildDir, outDir, preset, hasManifestInit = false) {
|
|
236
|
-
const serverEntryRelative = "./rsc/index.js";
|
|
237
|
-
const runtimeName = PRESET_CONFIGS[preset].runtimeName;
|
|
238
|
-
const earlyHints = PRESET_CONFIGS[preset].supportsEarlyHints;
|
|
239
|
-
const supportsWaitUntil = PRESET_CONFIGS[preset].supportsWaitUntil;
|
|
240
|
-
let handlerCall;
|
|
241
|
-
if (earlyHints && supportsWaitUntil) handlerCall = ` const nodeRes = event.node?.res
|
|
242
|
-
const earlyHintsSender = (typeof nodeRes?.writeEarlyHints === 'function')
|
|
243
|
-
? (links) => { try { nodeRes.writeEarlyHints({ link: links }) } catch {} }
|
|
244
|
-
: undefined
|
|
245
|
-
|
|
246
|
-
const waitUntilFn = (typeof event.waitUntil === 'function')
|
|
247
|
-
? (p) => event.waitUntil(p)
|
|
248
|
-
: undefined
|
|
249
|
-
|
|
250
|
-
const callHandler = () => handler(webRequest)
|
|
251
|
-
let wrappedHandler = earlyHintsSender
|
|
252
|
-
? () => runWithEarlyHintsSender(earlyHintsSender, callHandler)
|
|
253
|
-
: callHandler
|
|
254
|
-
const webResponse = waitUntilFn
|
|
255
|
-
? await runWithWaitUntil(waitUntilFn, wrappedHandler)
|
|
256
|
-
: await wrappedHandler()`;
|
|
257
|
-
else if (earlyHints) handlerCall = ` const nodeRes = event.node?.res
|
|
258
|
-
const earlyHintsSender = (typeof nodeRes?.writeEarlyHints === 'function')
|
|
259
|
-
? (links) => { try { nodeRes.writeEarlyHints({ link: links }) } catch {} }
|
|
260
|
-
: undefined
|
|
261
|
-
|
|
262
|
-
const webResponse = earlyHintsSender
|
|
263
|
-
? await runWithEarlyHintsSender(earlyHintsSender, () => handler(webRequest))
|
|
264
|
-
: await handler(webRequest)`;
|
|
265
|
-
else if (supportsWaitUntil) handlerCall = ` const waitUntilFn = (typeof event.waitUntil === 'function')
|
|
266
|
-
? (p) => event.waitUntil(p)
|
|
267
|
-
: undefined
|
|
268
|
-
|
|
269
|
-
const webResponse = waitUntilFn
|
|
270
|
-
? await runWithWaitUntil(waitUntilFn, () => handler(webRequest))
|
|
271
|
-
: await handler(webRequest)`;
|
|
272
|
-
else handlerCall = ` const webResponse = await handler(webRequest)`;
|
|
273
|
-
return `// Generated by @timber-js/app/adapters/nitro
|
|
274
|
-
// Do not edit — this file is regenerated on each build.
|
|
275
|
-
|
|
276
|
-
${hasManifestInit ? "import './_timber-manifest-init.js'\n" : ""}import handler, { runWithEarlyHintsSender${supportsWaitUntil ? ", runWithWaitUntil" : ""} } from '${serverEntryRelative}'
|
|
277
|
-
import { compressResponse } from './_compress.mjs'
|
|
278
|
-
|
|
279
|
-
// Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
|
|
280
|
-
// See design/25-production-deployments.md §"TIMBER_RUNTIME".
|
|
281
|
-
process.env.TIMBER_RUNTIME = '${runtimeName}'
|
|
282
|
-
|
|
283
|
-
// Nitro's index.mjs wraps this import with defineLazyEventHandler, which
|
|
284
|
-
// already handles the event handler protocol. We export a plain async
|
|
285
|
-
// function — no defineEventHandler wrapper needed.
|
|
286
|
-
// Nitro bundles h3 into its internal _libs/ directory but doesn't make
|
|
287
|
-
// it available as a bare specifier in the output's node_modules.
|
|
288
|
-
export default async function timberHandler(event) {
|
|
289
|
-
// h3 v2: event.req is the Web Request
|
|
290
|
-
const webRequest = event.req
|
|
291
|
-
${handlerCall}
|
|
292
|
-
return compressResponse(webRequest, webResponse)
|
|
293
|
-
}
|
|
294
|
-
`;
|
|
295
|
-
}
|
|
296
|
-
/** @internal Exported for testing. */
|
|
297
|
-
function generateNitroConfig(preset, userConfig) {
|
|
298
|
-
const presetConfig = PRESET_CONFIGS[preset];
|
|
299
|
-
const config = {
|
|
300
|
-
preset: presetConfig.nitroPreset,
|
|
301
|
-
entry: "./entry.ts",
|
|
302
|
-
output: { dir: presetConfig.outputDir },
|
|
303
|
-
routeRules: { "/assets/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } } },
|
|
304
|
-
...presetConfig.extraConfig,
|
|
305
|
-
...userConfig
|
|
306
|
-
};
|
|
307
|
-
return `// Generated by @timber-js/app/adapters/nitro
|
|
308
|
-
// Do not edit — this file is regenerated on each build.
|
|
309
|
-
|
|
310
|
-
import { defineNitroConfig } from 'nitro/config'
|
|
311
|
-
|
|
312
|
-
export default defineNitroConfig(${JSON.stringify(config, null, 2)})
|
|
313
|
-
`;
|
|
157
|
+
function getPresetConfig(preset) {
|
|
158
|
+
return PRESET_CONFIGS[preset];
|
|
314
159
|
}
|
|
315
|
-
|
|
316
|
-
|
|
160
|
+
//#endregion
|
|
161
|
+
//#region src/adapters/nitro-preview.ts
|
|
317
162
|
/**
|
|
318
163
|
* Generate a standalone preview server script that uses Node's built-in
|
|
319
164
|
* HTTP server. This bypasses Nitro entirely — the Nitro entry.ts imports
|
|
@@ -338,7 +183,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
338
183
|
import { existsSync } from 'node:fs';
|
|
339
184
|
|
|
340
185
|
// Set runtime before importing the handler.
|
|
341
|
-
process.env.TIMBER_RUNTIME = '${
|
|
186
|
+
process.env.TIMBER_RUNTIME = '${getPresetConfig(preset).runtimeName}';
|
|
342
187
|
|
|
343
188
|
// Load the build manifest if it exists.
|
|
344
189
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
@@ -353,6 +198,9 @@ const { default: handler, runWithEarlyHintsSender } = await import('${rscEntry}'
|
|
|
353
198
|
// Import compression helper for self-hosted response compression.
|
|
354
199
|
const { compressResponse } = await import('./_compress.mjs');
|
|
355
200
|
|
|
201
|
+
// Web→Node response bridge with backpressure (TIM-1154).
|
|
202
|
+
const { sendNodeResponse } = await import('./_send-response.mjs');
|
|
203
|
+
|
|
356
204
|
const MIME_TYPES = {
|
|
357
205
|
'.html': 'text/html',
|
|
358
206
|
'.js': 'application/javascript',
|
|
@@ -379,11 +227,32 @@ const MIME_TYPES = {
|
|
|
379
227
|
};
|
|
380
228
|
|
|
381
229
|
const publicDir = join(__dirname, '${publicDir}');
|
|
382
|
-
|
|
383
|
-
|
|
230
|
+
|
|
231
|
+
// Port resolution (TIM-842):
|
|
232
|
+
// - Default to 3000
|
|
233
|
+
// - If PORT env var is set, honor it strictly (fail loudly on conflict)
|
|
234
|
+
// - Otherwise auto-bump from 3000 until a free port is found
|
|
235
|
+
// Mirrors the dev server behavior so timber dev/preview/production all
|
|
236
|
+
// behave the same way around port selection.
|
|
237
|
+
const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : null;
|
|
238
|
+
const portIsExplicit = envPort != null && Number.isFinite(envPort) && envPort > 0;
|
|
239
|
+
const startPort = portIsExplicit ? envPort : 3000;
|
|
240
|
+
const host = process.env.HOST || 'localhost';
|
|
241
|
+
|
|
242
|
+
// Set after listenWithBump() resolves so request handlers can build
|
|
243
|
+
// absolute URLs from the actual bound port (which may differ from
|
|
244
|
+
// startPort after an auto-bump).
|
|
245
|
+
let boundPort = startPort;
|
|
384
246
|
|
|
385
247
|
const server = createServer(async (req, res) => {
|
|
386
|
-
|
|
248
|
+
// Scheme from the socket's TLS state — a hardcoded http:// breaks CSRF
|
|
249
|
+
// origin comparison and absolute-URL construction when TLS is terminated
|
|
250
|
+
// at this server (TIM-1073; mirrors the dev-server fix in TIM-1067).
|
|
251
|
+
// X-Forwarded-Proto is intentionally not consulted here: on a direct
|
|
252
|
+
// connection it would be attacker-controlled. The CSRF layer honors it
|
|
253
|
+
// separately for reverse-proxy deployments.
|
|
254
|
+
const scheme = req.socket?.encrypted ? 'https' : 'http';
|
|
255
|
+
const url = new URL(req.url || '/', \`\${scheme}://\${host}:\${boundPort}\`);
|
|
387
256
|
|
|
388
257
|
// Try serving static files from the public directory first.
|
|
389
258
|
const filePath = join(publicDir, url.pathname);
|
|
@@ -396,7 +265,9 @@ const server = createServer(async (req, res) => {
|
|
|
396
265
|
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
397
266
|
const body = await readFile(filePath);
|
|
398
267
|
// Hashed assets get immutable cache, others get short cache.
|
|
399
|
-
const
|
|
268
|
+
const isImmutable =
|
|
269
|
+
url.pathname.startsWith('/assets/') || url.pathname.startsWith('/_timber/fonts/');
|
|
270
|
+
const cacheControl = isImmutable
|
|
400
271
|
? 'public, max-age=31536000, immutable'
|
|
401
272
|
: 'public, max-age=3600, must-revalidate';
|
|
402
273
|
res.writeHead(200, {
|
|
@@ -453,22 +324,11 @@ const server = createServer(async (req, res) => {
|
|
|
453
324
|
// Compress the response for self-hosted deployments.
|
|
454
325
|
const webResponse = compressResponse(webRequest, rawResponse);
|
|
455
326
|
|
|
456
|
-
// Write the response
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
const pump = async () => {
|
|
462
|
-
while (true) {
|
|
463
|
-
const { done, value } = await reader.read();
|
|
464
|
-
if (done) { res.end(); return; }
|
|
465
|
-
res.write(value);
|
|
466
|
-
}
|
|
467
|
-
};
|
|
468
|
-
await pump();
|
|
469
|
-
} else {
|
|
470
|
-
res.end();
|
|
471
|
-
}
|
|
327
|
+
// Write the response to Node's ServerResponse. sendNodeResponse handles
|
|
328
|
+
// status, headers (including Set-Cookie splitting via [...headers]),
|
|
329
|
+
// body streaming with backpressure, and client disconnect cleanup.
|
|
330
|
+
// See TIM-1154.
|
|
331
|
+
await sendNodeResponse(res, webResponse);
|
|
472
332
|
} catch (err) {
|
|
473
333
|
console.error('[timber preview] Request error:', err);
|
|
474
334
|
if (!res.headersSent) {
|
|
@@ -478,32 +338,313 @@ const server = createServer(async (req, res) => {
|
|
|
478
338
|
}
|
|
479
339
|
});
|
|
480
340
|
|
|
481
|
-
|
|
341
|
+
function listenWithBump(port, attempt = 0) {
|
|
342
|
+
return new Promise((resolveListen, rejectListen) => {
|
|
343
|
+
const onError = (err) => {
|
|
344
|
+
server.removeListener('listening', onListening);
|
|
345
|
+
if (err && err.code === 'EADDRINUSE' && !portIsExplicit && attempt < 100) {
|
|
346
|
+
if (attempt === 0) {
|
|
347
|
+
console.log(\` [timber] Port \${port} in use, trying \${port + 1}...\`);
|
|
348
|
+
}
|
|
349
|
+
listenWithBump(port + 1, attempt + 1).then(resolveListen, rejectListen);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
rejectListen(err);
|
|
353
|
+
};
|
|
354
|
+
const onListening = () => {
|
|
355
|
+
server.removeListener('error', onError);
|
|
356
|
+
resolveListen(port);
|
|
357
|
+
};
|
|
358
|
+
server.once('error', onError);
|
|
359
|
+
server.once('listening', onListening);
|
|
360
|
+
server.listen(port, host);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
try {
|
|
365
|
+
boundPort = await listenWithBump(startPort);
|
|
366
|
+
if (boundPort !== startPort) {
|
|
367
|
+
console.log();
|
|
368
|
+
console.log(\` [timber] Port \${startPort} in use, using \${boundPort}\`);
|
|
369
|
+
}
|
|
482
370
|
console.log();
|
|
483
371
|
console.log(' ⚡ timber preview server running at:');
|
|
484
372
|
console.log();
|
|
485
|
-
console.log(\` ➜ http://\${host}:\${
|
|
373
|
+
console.log(\` ➜ http://\${host}:\${boundPort}\`);
|
|
486
374
|
console.log();
|
|
487
|
-
})
|
|
375
|
+
} catch (err) {
|
|
376
|
+
if (err && err.code === 'EADDRINUSE') {
|
|
377
|
+
console.error(\`[timber] Port \${startPort} is already in use. \` +
|
|
378
|
+
'Set PORT to a free port, or unset PORT to auto-pick.');
|
|
379
|
+
} else {
|
|
380
|
+
console.error('[timber] Failed to start preview server:', err);
|
|
381
|
+
}
|
|
382
|
+
process.exit(1);
|
|
383
|
+
}
|
|
488
384
|
`;
|
|
489
385
|
}
|
|
490
|
-
/**
|
|
491
|
-
function
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
386
|
+
/** Spawn a Nitro preview process and pipe stdio. */
|
|
387
|
+
function spawnNitroPreview(command, args, cwd) {
|
|
388
|
+
return new Promise((resolve, reject) => {
|
|
389
|
+
const child = execFile(command, args, { cwd }, (err) => {
|
|
390
|
+
if (err) reject(err);
|
|
391
|
+
else resolve();
|
|
392
|
+
});
|
|
393
|
+
child.stdout?.pipe(process.stdout);
|
|
394
|
+
child.stderr?.pipe(process.stderr);
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Generate a standalone ESM module that exports sendNodeResponse.
|
|
399
|
+
*
|
|
400
|
+
* Mirrors srvx/node's sendNodeResponse: status + headers via writeHead,
|
|
401
|
+
* body streaming with backpressure (waits for drain on write() === false),
|
|
402
|
+
* and client disconnect cleanup. Written to `_send-response.mjs` during
|
|
403
|
+
* buildOutput for use by the preview server script. See TIM-1154.
|
|
404
|
+
*
|
|
405
|
+
* @internal Exported for testing.
|
|
406
|
+
*/
|
|
407
|
+
function generateSendResponseModule() {
|
|
408
|
+
return `// Generated by @timber-js/app — Web→Node response bridge.
|
|
409
|
+
// Do not edit — this file is regenerated on each build.
|
|
410
|
+
// Mirrors srvx/node's sendNodeResponse with backpressure support.
|
|
411
|
+
|
|
412
|
+
export function sendNodeResponse(nodeRes, webRes) {
|
|
413
|
+
if (!webRes) {
|
|
414
|
+
nodeRes.statusCode = 500;
|
|
415
|
+
return new Promise((resolve) => nodeRes.end(resolve));
|
|
416
|
+
}
|
|
417
|
+
const rawHeaders = [...webRes.headers];
|
|
418
|
+
const writeHeaders = rawHeaders.flat();
|
|
419
|
+
if (!nodeRes.headersSent) {
|
|
420
|
+
if (nodeRes.req?.httpVersion === '2.0') {
|
|
421
|
+
nodeRes.writeHead(webRes.status, writeHeaders);
|
|
422
|
+
} else {
|
|
423
|
+
nodeRes.writeHead(webRes.status, webRes.statusText, writeHeaders);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if (!webRes.body) {
|
|
427
|
+
return new Promise((resolve) => nodeRes.end(resolve));
|
|
428
|
+
}
|
|
429
|
+
// Stream with backpressure: pause reading when the kernel buffer is
|
|
430
|
+
// full (write() returns false) and resume on 'drain'.
|
|
431
|
+
if (nodeRes.destroyed) {
|
|
432
|
+
webRes.body.cancel();
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
const reader = webRes.body.getReader();
|
|
436
|
+
function streamCancel(error) {
|
|
437
|
+
reader.cancel(error).catch(() => {});
|
|
438
|
+
if (error) nodeRes.destroy(error);
|
|
439
|
+
}
|
|
440
|
+
function streamHandle({ done, value }) {
|
|
441
|
+
try {
|
|
442
|
+
if (done) {
|
|
443
|
+
nodeRes.end();
|
|
444
|
+
} else if (nodeRes.write(value)) {
|
|
445
|
+
reader.read().then(streamHandle, streamCancel);
|
|
446
|
+
} else {
|
|
447
|
+
nodeRes.once('drain', () => reader.read().then(streamHandle, streamCancel));
|
|
448
|
+
}
|
|
449
|
+
} catch (error) {
|
|
450
|
+
streamCancel(error instanceof Error ? error : undefined);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
nodeRes.on('close', streamCancel);
|
|
454
|
+
nodeRes.on('error', streamCancel);
|
|
455
|
+
reader.read().then(streamHandle, streamCancel);
|
|
456
|
+
return reader.closed.catch(streamCancel).finally(() => {
|
|
457
|
+
nodeRes.off('close', streamCancel);
|
|
458
|
+
nodeRes.off('error', streamCancel);
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
`;
|
|
462
|
+
}
|
|
463
|
+
//#endregion
|
|
464
|
+
//#region src/adapters/nitro.ts
|
|
465
|
+
/**
|
|
466
|
+
* Create a Nitro-based adapter for multi-platform deployment.
|
|
467
|
+
*
|
|
468
|
+
* Nitro abstracts deployment targets — the same timber.js app can deploy
|
|
469
|
+
* to Vercel, Netlify, AWS, Deno Deploy, or Azure by changing the preset.
|
|
470
|
+
*
|
|
471
|
+
* @example
|
|
472
|
+
* ```ts
|
|
473
|
+
* import { nitro } from '@timber-js/app/adapters/nitro'
|
|
474
|
+
*
|
|
475
|
+
* export default {
|
|
476
|
+
* output: 'server',
|
|
477
|
+
* adapter: nitro({ preset: 'vercel' }),
|
|
478
|
+
* }
|
|
479
|
+
* ```
|
|
480
|
+
*/
|
|
481
|
+
function nitro(options = {}) {
|
|
482
|
+
const preset = options.preset ?? "node-server";
|
|
483
|
+
const compress = options.compress ?? true;
|
|
495
484
|
return {
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
485
|
+
name: `nitro-${preset}`,
|
|
486
|
+
async buildOutput(config, buildDir) {
|
|
487
|
+
const outDir = join(buildDir, "nitro");
|
|
488
|
+
if (config.output === "static" && config.staticPagesDir) {
|
|
489
|
+
await buildStaticDirectoryOutput(config, buildDir, outDir, "public");
|
|
490
|
+
const publicDir = join(outDir, "public");
|
|
491
|
+
await writeHeadersFile(publicDir, config, await findUnhashedStaticFiles(publicDir));
|
|
492
|
+
if ((options.staticTarget ?? "generic") === "github-pages") {
|
|
493
|
+
await writeFile(join(publicDir, ".nojekyll"), "");
|
|
494
|
+
try {
|
|
495
|
+
if ((await readFile(join(publicDir, "_redirects"), "utf-8")).trim().length > 0) console.warn("[timber] Warning: GitHub Pages does not support _redirects files. Redirect rules from middleware/proxy will not work on this platform.");
|
|
496
|
+
} catch {}
|
|
497
|
+
}
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
await runSharedBuildSteps({
|
|
501
|
+
config,
|
|
502
|
+
buildDir,
|
|
503
|
+
outDir,
|
|
504
|
+
publicDirName: "public"
|
|
505
|
+
});
|
|
506
|
+
await writeFile(join(outDir, "_compress.mjs"), await generateCompressModule());
|
|
507
|
+
await writeFile(join(outDir, "_send-response.mjs"), generateSendResponseModule());
|
|
508
|
+
if (config.manifestInit) {
|
|
509
|
+
const rscEntry = join(outDir, "rsc", "index.js");
|
|
510
|
+
const rscContent = await readFile(rscEntry, "utf-8");
|
|
511
|
+
await writeFile(rscEntry, `${config.manifestInit}\n${rscContent}`);
|
|
512
|
+
}
|
|
513
|
+
const entry = generateNitroEntry(buildDir, outDir, preset, compress);
|
|
514
|
+
await writeFile(join(outDir, "entry.ts"), entry);
|
|
515
|
+
const { serverDir } = await runNitroBuild(outDir, preset, options.nitroConfig);
|
|
516
|
+
const prebuiltSrc = join(buildDir, "prebuilt");
|
|
517
|
+
await cp(prebuiltSrc, join(serverDir, "prebuilt"), { recursive: true }).catch((e) => {
|
|
518
|
+
if (e.code !== "ENOENT") throw e;
|
|
519
|
+
});
|
|
520
|
+
if (preset === "vercel" || preset === "vercel-edge") await copyPrebuiltToVercelFuncClones(dirname(serverDir), prebuiltSrc, basename(serverDir));
|
|
521
|
+
},
|
|
522
|
+
preview: LOCALLY_PREVIEWABLE.has(preset) ? async (_config, buildDir) => {
|
|
523
|
+
const previewScript = generatePreviewScript(buildDir, preset);
|
|
524
|
+
const scriptPath = join(buildDir, "nitro", "_preview-server.mjs");
|
|
525
|
+
await writeFile(scriptPath, previewScript);
|
|
526
|
+
await spawnNitroPreview(preset === "bun" ? "bun" : "node", [scriptPath], join(buildDir, "nitro"));
|
|
527
|
+
} : void 0
|
|
499
528
|
};
|
|
500
529
|
}
|
|
530
|
+
/** @internal Exported for testing. */
|
|
531
|
+
function generateNitroEntry(buildDir, outDir, preset, compress = true) {
|
|
532
|
+
const serverEntryRelative = "./rsc/index.js";
|
|
533
|
+
const runtimeName = PRESET_CONFIGS[preset].runtimeName;
|
|
534
|
+
const earlyHints = PRESET_CONFIGS[preset].supportsEarlyHints;
|
|
535
|
+
const supportsWaitUntil = PRESET_CONFIGS[preset].supportsWaitUntil;
|
|
536
|
+
let handlerCall;
|
|
537
|
+
if (earlyHints && supportsWaitUntil) handlerCall = ` const nodeRes = event.node?.res
|
|
538
|
+
const earlyHintsSender = (typeof nodeRes?.writeEarlyHints === 'function')
|
|
539
|
+
? (links) => { try { nodeRes.writeEarlyHints({ link: links }) } catch {} }
|
|
540
|
+
: undefined
|
|
541
|
+
|
|
542
|
+
const waitUntilFn = (typeof event.waitUntil === 'function')
|
|
543
|
+
? (p) => event.waitUntil(p)
|
|
544
|
+
: undefined
|
|
545
|
+
|
|
546
|
+
const callHandler = () => handler(webRequest)
|
|
547
|
+
let wrappedHandler = earlyHintsSender
|
|
548
|
+
? () => runWithEarlyHintsSender(earlyHintsSender, callHandler)
|
|
549
|
+
: callHandler
|
|
550
|
+
const webResponse = waitUntilFn
|
|
551
|
+
? await runWithWaitUntil(waitUntilFn, wrappedHandler)
|
|
552
|
+
: await wrappedHandler()`;
|
|
553
|
+
else if (earlyHints) handlerCall = ` const nodeRes = event.node?.res
|
|
554
|
+
const earlyHintsSender = (typeof nodeRes?.writeEarlyHints === 'function')
|
|
555
|
+
? (links) => { try { nodeRes.writeEarlyHints({ link: links }) } catch {} }
|
|
556
|
+
: undefined
|
|
557
|
+
|
|
558
|
+
const webResponse = earlyHintsSender
|
|
559
|
+
? await runWithEarlyHintsSender(earlyHintsSender, () => handler(webRequest))
|
|
560
|
+
: await handler(webRequest)`;
|
|
561
|
+
else if (supportsWaitUntil) handlerCall = ` const waitUntilFn = (typeof event.waitUntil === 'function')
|
|
562
|
+
? (p) => event.waitUntil(p)
|
|
563
|
+
: undefined
|
|
564
|
+
|
|
565
|
+
const webResponse = waitUntilFn
|
|
566
|
+
? await runWithWaitUntil(waitUntilFn, () => handler(webRequest))
|
|
567
|
+
: await handler(webRequest)`;
|
|
568
|
+
else handlerCall = ` const webResponse = await handler(webRequest)`;
|
|
569
|
+
return `// Generated by @timber-js/app/adapters/nitro
|
|
570
|
+
// Do not edit — this file is regenerated on each build.
|
|
571
|
+
|
|
572
|
+
import handler, { runWithEarlyHintsSender${supportsWaitUntil ? ", runWithWaitUntil" : ""} } from '${serverEntryRelative}'
|
|
573
|
+
${compress ? "import { compressResponse } from './_compress.mjs'\n" : ""}
|
|
574
|
+
// Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
|
|
575
|
+
// See design/25-production-deployments.md §"TIMBER_RUNTIME".
|
|
576
|
+
process.env.TIMBER_RUNTIME = '${runtimeName}'
|
|
577
|
+
|
|
578
|
+
// Nitro's index.mjs wraps this import with defineLazyEventHandler, which
|
|
579
|
+
// already handles the event handler protocol. We export a plain async
|
|
580
|
+
// function — no defineEventHandler wrapper needed.
|
|
581
|
+
// Nitro bundles h3 into its internal _libs/ directory but doesn't make
|
|
582
|
+
// it available as a bare specifier in the output's node_modules.
|
|
583
|
+
export default async function timberHandler(event) {
|
|
584
|
+
// h3 v2: event.req is the Web Request
|
|
585
|
+
const webRequest = event.req
|
|
586
|
+
${handlerCall}
|
|
587
|
+
return ${compress ? "compressResponse(webRequest, webResponse)" : "webResponse"}
|
|
588
|
+
}
|
|
589
|
+
`;
|
|
590
|
+
}
|
|
501
591
|
/**
|
|
502
|
-
*
|
|
503
|
-
*
|
|
504
|
-
*
|
|
505
|
-
*
|
|
592
|
+
* Prefixes of nitro build-output lines that give wrong advice for timber
|
|
593
|
+
* builds. Every nitro bundler path emits these hints via `logger.success` —
|
|
594
|
+
* the rollup path hardcodes `npx nitro preview`; rolldown and vite default
|
|
595
|
+
* to it. That command resolves `.output/nitro.json` relative to cwd, but
|
|
596
|
+
* timber's nitro build lives at `.timber/dist/nitro/.output`, so the
|
|
597
|
+
* suggested command can never work from the project root.
|
|
598
|
+
* Prefix matching degrades gracefully: if upstream rewords the line
|
|
599
|
+
* entirely, it passes through rather than being silently eaten.
|
|
506
600
|
*/
|
|
601
|
+
var NITRO_PREVIEW_HINT_PREFIX = "You can preview this build using";
|
|
602
|
+
var NITRO_DEPLOY_HINT_PREFIX = "You can deploy this build using";
|
|
603
|
+
var SUPPRESSED_NITRO_HINT_PREFIXES = [NITRO_PREVIEW_HINT_PREFIX, NITRO_DEPLOY_HINT_PREFIX];
|
|
604
|
+
/** @internal Exported for testing. */
|
|
605
|
+
function isSuppressedNitroHint(message, prefixes = SUPPRESSED_NITRO_HINT_PREFIXES) {
|
|
606
|
+
return typeof message === "string" && prefixes.some((prefix) => message.startsWith(prefix));
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Nitro's rolldown and vite builders render `framework.previewCommand` /
|
|
610
|
+
* `framework.deployCommand` into these hints. A user who explicitly set one
|
|
611
|
+
* via `nitroConfig` has provided valid guidance — only suppress the hints
|
|
612
|
+
* whose command is still nitro's broken default.
|
|
613
|
+
*
|
|
614
|
+
* @internal Exported for testing.
|
|
615
|
+
*/
|
|
616
|
+
function selectSuppressedHintPrefixes(framework) {
|
|
617
|
+
return [...framework?.previewCommand ? [] : [NITRO_PREVIEW_HINT_PREFIX], ...framework?.deployCommand ? [] : [NITRO_DEPLOY_HINT_PREFIX]];
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Wrap a nitro logger's `success` so hardcoded preview/deploy hints are
|
|
621
|
+
* dropped for this programmatic build only. Returns the original
|
|
622
|
+
* (unfiltered) success fn so timber can print its own hint — which shares
|
|
623
|
+
* the suppressed prefix on purpose, replacing nitro's wording.
|
|
624
|
+
*
|
|
625
|
+
* @internal Exported for testing.
|
|
626
|
+
*/
|
|
627
|
+
function wrapNitroLoggerForBuild(logger, prefixes = SUPPRESSED_NITRO_HINT_PREFIXES) {
|
|
628
|
+
const originalSuccess = logger.success.bind(logger);
|
|
629
|
+
const wrapped = (message, ...args) => {
|
|
630
|
+
if (isSuppressedNitroHint(message, prefixes)) return;
|
|
631
|
+
originalSuccess(message, ...args);
|
|
632
|
+
};
|
|
633
|
+
logger.success = Object.assign(wrapped, logger.success);
|
|
634
|
+
return originalSuccess;
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Timber's own post-build hint. Locally-runnable presets are previewed via
|
|
638
|
+
* `timber preview`, which invokes this adapter's `preview()` to run the
|
|
639
|
+
* generated `_preview-server.mjs`. Serverless presets get no hint — their
|
|
640
|
+
* output lives under `.timber/dist/nitro/`, so any cwd-relative deploy
|
|
641
|
+
* command would be as wrong as the nitro hint this replaces.
|
|
642
|
+
*
|
|
643
|
+
* @internal Exported for testing.
|
|
644
|
+
*/
|
|
645
|
+
function getPostBuildHint(preset) {
|
|
646
|
+
return LOCALLY_PREVIEWABLE.has(preset) ? "You can preview this build using `timber preview`" : null;
|
|
647
|
+
}
|
|
507
648
|
async function runNitroBuild(nitroDir, preset, userConfig) {
|
|
508
649
|
const presetConfig = PRESET_CONFIGS[preset];
|
|
509
650
|
const { createNitro, build: nitroBuild, prepare, copyPublicAssets } = await import("nitro/builder");
|
|
@@ -512,35 +653,63 @@ async function runNitroBuild(nitroDir, preset, userConfig) {
|
|
|
512
653
|
preset: presetConfig.nitroPreset,
|
|
513
654
|
renderer: { handler: join(nitroDir, "entry.ts") },
|
|
514
655
|
output: { dir: join(nitroDir, presetConfig.outputDir) },
|
|
515
|
-
routeRules: {
|
|
656
|
+
routeRules: {
|
|
657
|
+
"/assets/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } },
|
|
658
|
+
"/_timber/fonts/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } }
|
|
659
|
+
},
|
|
516
660
|
rollupConfig: { external: [/\.\.\/rsc\//] },
|
|
517
661
|
...presetConfig.extraConfig,
|
|
518
662
|
...userConfig
|
|
519
663
|
});
|
|
664
|
+
const framework = nitro.options.builder === "rollup" ? void 0 : nitro.options.framework;
|
|
665
|
+
const logSuccess = wrapNitroLoggerForBuild(nitro.logger, selectSuppressedHintPrefixes(framework));
|
|
666
|
+
const raw = nitro.options.output.serverDir;
|
|
667
|
+
const serverDir = raw.endsWith("/") ? raw.slice(0, -1) : raw;
|
|
520
668
|
await prepare(nitro);
|
|
521
669
|
await copyPublicAssets(nitro);
|
|
522
670
|
await nitroBuild(nitro);
|
|
523
671
|
await nitro.close();
|
|
672
|
+
const hint = framework?.previewCommand ? null : getPostBuildHint(preset);
|
|
673
|
+
if (hint) logSuccess(hint);
|
|
674
|
+
return { serverDir };
|
|
524
675
|
}
|
|
525
|
-
/**
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
676
|
+
/**
|
|
677
|
+
* Resolve the destination path for prebuilt flight payloads in the Nitro
|
|
678
|
+
* output directory. The RSC entry resolves `../prebuilt/` relative to its
|
|
679
|
+
* bundled chunk location (`<serverBundleDir>/_chunks/`), so prebuilt/ must
|
|
680
|
+
* live at `<serverBundleDir>/prebuilt/`.
|
|
681
|
+
*
|
|
682
|
+
* The serverBundleDir varies by preset — Nitro's Vercel preset uses
|
|
683
|
+
* `functions/__server.func` while most others use `server`.
|
|
684
|
+
*
|
|
685
|
+
* @internal Exported for testing.
|
|
686
|
+
*/
|
|
687
|
+
function resolvePrebuiltOutputPath(outDir, preset) {
|
|
688
|
+
const presetConfig = PRESET_CONFIGS[preset];
|
|
689
|
+
return join(outDir, presetConfig.outputDir, presetConfig.serverBundleDir, "prebuilt");
|
|
535
690
|
}
|
|
536
691
|
/**
|
|
537
|
-
*
|
|
692
|
+
* Copy prebuilt payloads into cloned Vercel function directories.
|
|
693
|
+
*
|
|
694
|
+
* When users configure `vercel.functionRules`, Nitro's compiled hook clones
|
|
695
|
+
* the base __server.func to per-route .func directories. These clones are
|
|
696
|
+
* created during `runNitroBuild()` — before our post-build prebuilt copy.
|
|
697
|
+
* Each clone resolves `../prebuilt` independently, so they each need a copy.
|
|
698
|
+
*
|
|
538
699
|
* @internal Exported for testing.
|
|
539
700
|
*/
|
|
540
|
-
function
|
|
541
|
-
|
|
701
|
+
async function copyPrebuiltToVercelFuncClones(functionsDir, prebuiltSrc, baseFuncName) {
|
|
702
|
+
const funcDirs = [];
|
|
703
|
+
try {
|
|
704
|
+
for await (const match of glob("**/*.func", { cwd: functionsDir })) if (!match.endsWith(baseFuncName)) funcDirs.push(join(functionsDir, match));
|
|
705
|
+
} catch {
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
await Promise.all(funcDirs.map((dir) => cp(prebuiltSrc, join(dir, "prebuilt"), { recursive: true }).catch((e) => {
|
|
709
|
+
if (e.code !== "ENOENT") throw e;
|
|
710
|
+
})));
|
|
542
711
|
}
|
|
543
712
|
//#endregion
|
|
544
|
-
export {
|
|
713
|
+
export { copyPrebuiltToVercelFuncClones, generateNitroEntry, getPostBuildHint, isSuppressedNitroHint, nitro, resolvePrebuiltOutputPath, selectSuppressedHintPrefixes, wrapNitroLoggerForBuild };
|
|
545
714
|
|
|
546
715
|
//# sourceMappingURL=nitro.js.map
|