@timber-js/app 0.2.0-alpha.192 → 0.2.0-alpha.195
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/agent-skill.md +2 -0
- package/dist/_chunks/{actions-BjbbNRFN.js → actions-CWYtq6ii.js} +3 -3
- package/dist/_chunks/actions-CWYtq6ii.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -1
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -1
- package/dist/_chunks/{build-output-helper-C3DrfzZR.js → build-output-helper-9dqCv1pZ.js} +3 -2
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/{cache-api-DllJ-Lyw.js → cache-api-CQeYzA5g.js} +6 -8
- package/dist/_chunks/cache-api-CQeYzA5g.js.map +1 -0
- package/dist/_chunks/chains-h7EO-u3n.js +412 -0
- package/dist/_chunks/chains-h7EO-u3n.js.map +1 -0
- package/dist/_chunks/{cli-check-DJZDc22E.js → cli-check-BVthpfLS.js} +43 -6
- package/dist/_chunks/cli-check-BVthpfLS.js.map +1 -0
- package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js → cli-schema-sync-3Wutm8pH.js} +7 -6
- package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js.map → cli-schema-sync-3Wutm8pH.js.map} +1 -1
- package/dist/_chunks/{cloudflare-CGP6BZKO.js → cloudflare-BKJC3SC_.js} +28 -22
- package/dist/_chunks/{cloudflare-CGP6BZKO.js.map → cloudflare-BKJC3SC_.js.map} +1 -1
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -1
- package/dist/_chunks/{convention-lint-CpteIpTm.js → convention-lint-DO10_pVl.js} +93 -7
- package/dist/_chunks/convention-lint-DO10_pVl.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-D-ODYX41.js → error-boundary-D-lkwyaD.js} +3 -3
- package/dist/_chunks/{error-boundary-D-ODYX41.js.map → error-boundary-D-lkwyaD.js.map} +1 -1
- package/dist/_chunks/{file-cache-DmX7OqZP.js → file-cache-Dw6BJPG7.js} +5 -1
- package/dist/_chunks/{file-cache-DmX7OqZP.js.map → file-cache-Dw6BJPG7.js.map} +1 -1
- package/dist/_chunks/{format-CfwjgPz9.js → format-BKclgVbk.js} +3 -3
- package/dist/_chunks/{format-CfwjgPz9.js.map → format-BKclgVbk.js.map} +1 -1
- package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -1
- package/dist/_chunks/live-graph-Bx4HodF1.js +150 -0
- package/dist/_chunks/live-graph-Bx4HodF1.js.map +1 -0
- package/dist/_chunks/{logger-CH7IcMmg.js → logger-pumCm3Il.js} +25 -7
- package/dist/_chunks/{logger-CH7IcMmg.js.map → logger-pumCm3Il.js.map} +1 -1
- package/dist/_chunks/{mdx-file-C005ay-P.js → mdx-file-CXyHGUpS.js} +3 -3
- package/dist/_chunks/mdx-file-CXyHGUpS.js.map +1 -0
- package/dist/_chunks/{plugin-context-rCinWLiE.js → plugin-context-8idfR3UZ.js} +2 -2
- 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-BAxfTT5L.js +101 -0
- package/dist/_chunks/poison-scan-BAxfTT5L.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -1
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/{router-ref-DuYuV_0Q.js → router-ref-BzqbPwYC.js} +2 -2
- package/dist/_chunks/{router-ref-DuYuV_0Q.js.map → router-ref-BzqbPwYC.js.map} +1 -1
- package/dist/_chunks/{rsc-media-type-DRqE_lD_.js → rsc-media-type-DDc7duTD.js} +17 -2
- package/dist/_chunks/{rsc-media-type-DRqE_lD_.js.map → rsc-media-type-DDc7duTD.js.map} +1 -1
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/{scanner-CAietmj4.js → scanner-BRIOmHE2.js} +43 -4
- package/dist/_chunks/scanner-BRIOmHE2.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -1
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -1
- package/dist/_chunks/{segment-keys-BawYuNFO.js → segment-keys-BhqoHiLc.js} +14 -2
- package/dist/_chunks/{segment-keys-BawYuNFO.js.map → segment-keys-BhqoHiLc.js.map} +1 -1
- package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -1
- package/dist/_chunks/{ssr-data-14MXm7Pj.js → ssr-data-Ya2HJPFp.js} +1 -7
- package/dist/_chunks/{ssr-data-14MXm7Pj.js.map → ssr-data-Ya2HJPFp.js.map} +1 -1
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -1
- package/dist/_chunks/{use-segment-params-C4r4BD9T.js → use-segment-params-DzTBpkvj.js} +3 -3
- package/dist/_chunks/use-segment-params-DzTBpkvj.js.map +1 -0
- package/dist/_chunks/{walkers-BsVLmD1S.js → walkers-BU6z9xRV.js} +9 -6
- package/dist/_chunks/{walkers-BsVLmD1S.js.map → walkers-BU6z9xRV.js.map} +1 -1
- package/dist/adapters/build-output-helper.d.ts +1 -1
- package/dist/adapters/build-output-helper.d.ts.map +1 -1
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -1
- package/dist/adapters/cloudflare-dev.js +2 -1
- package/dist/adapters/cloudflare-dev.js.map +1 -1
- package/dist/adapters/cloudflare-kv-cache.d.ts +1 -1
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +7 -8
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -1
- package/dist/adapters/cloudflare.d.ts +1 -1
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +1 -1
- 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 +28 -51
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -171
- package/dist/adapters/nitro.js.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 +2 -2
- package/dist/cache/cache-api.d.ts.map +1 -1
- package/dist/cache/index.d.ts +8 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/cache/redis-handler.d.ts +1 -1
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/stores/cloudflare-kv.d.ts +1 -1
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -1
- package/dist/cache/stores/cloudflare-kv.js.map +1 -1
- package/dist/cache/stores/memory.d.ts +1 -1
- package/dist/cache/stores/memory.d.ts.map +1 -1
- package/dist/cache/stores/memory.js.map +1 -1
- package/dist/cache/stores/redis.d.ts +1 -1
- package/dist/cache/stores/redis.d.ts.map +1 -1
- package/dist/cache/stores/redis.js.map +1 -1
- package/dist/cache/stores/vercel.d.ts +1 -1
- package/dist/cache/stores/vercel.d.ts.map +1 -1
- package/dist/cache/stores/vercel.js.map +1 -1
- package/dist/cache/tag-aware-handler.d.ts +2 -2
- package/dist/cache/tag-aware-handler.d.ts.map +1 -1
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +1 -1
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.js.map +1 -1
- package/dist/cdn/fastly-purge.d.ts +1 -1
- package/dist/cdn/fastly-purge.d.ts.map +1 -1
- package/dist/cdn/fastly-purge.js.map +1 -1
- package/dist/cdn/index.d.ts +4 -4
- package/dist/cdn/index.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.d.ts +5 -1
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.js.map +1 -1
- package/dist/cli-check.d.ts +10 -0
- package/dist/cli-check.d.ts.map +1 -1
- package/dist/cli.d.ts +12 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-entry/hydrate.d.ts +2 -2
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/post-hydration.d.ts +2 -2
- package/dist/client/browser-entry/router-init.d.ts +2 -2
- package/dist/client/browser-entry/rsc-stream.d.ts +1 -1
- package/dist/client/error-boundary.js +1 -1
- package/dist/client/form.d.ts +2 -2
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +2 -2
- package/dist/client/index.d.ts +18 -18
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -3
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -19
- package/dist/client/internal.d.ts.map +1 -1
- package/dist/client/internal.js +15 -19
- package/dist/client/internal.js.map +1 -1
- package/dist/client/link.d.ts +3 -3
- package/dist/client/navigation-commit.d.ts +5 -5
- package/dist/client/navigation-root.d.ts +1 -1
- package/dist/client/navigation-root.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +3 -3
- package/dist/client/router-pipeline.d.ts +7 -7
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router-types.d.ts +6 -6
- package/dist/client/router-types.d.ts.map +1 -1
- package/dist/client/router.d.ts +1 -1
- package/dist/client/rsc-fetch.d.ts +4 -4
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +2 -2
- package/dist/client/slot-provider.d.ts +1 -1
- package/dist/client/ssr-data.d.ts +2 -2
- package/dist/client/state.d.ts +4 -4
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-segment-params.d.ts +3 -3
- package/dist/codec.d.ts +2 -2
- package/dist/codec.js.map +1 -1
- package/dist/config-types.d.ts +12 -9
- package/dist/config-types.d.ts.map +1 -1
- package/dist/config-validation.d.ts +1 -1
- package/dist/cookies/define-cookie.d.ts +3 -3
- package/dist/cookies/index.d.ts +3 -3
- package/dist/cookies/index.js +4 -5
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +1 -1
- package/dist/dev-tools/404-page.d.ts +2 -2
- package/dist/dev-tools/error-page.d.ts +2 -2
- package/dist/dev-tools/index.d.ts +12 -12
- package/dist/dev-tools/instrumentation.d.ts +1 -1
- package/dist/dev-tools/logs.d.ts +1 -1
- package/dist/dev-tools/overlay.d.ts +2 -2
- package/dist/dev-tools/terminal.d.ts +1 -1
- package/dist/fonts/ast.d.ts +4 -4
- package/dist/fonts/bundle.d.ts +3 -3
- package/dist/fonts/css.d.ts +1 -1
- package/dist/fonts/dev-middleware.d.ts +1 -1
- package/dist/fonts/google.d.ts +1 -1
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +3 -3
- package/dist/fonts/transform.d.ts +2 -2
- package/dist/fonts/types.d.ts +1 -1
- package/dist/fonts/virtual-modules.d.ts +1 -1
- package/dist/index.d.ts +3 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +861 -314
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +1 -1
- package/dist/params/define-schema.d.ts +2 -2
- package/dist/params/index.d.ts +4 -4
- package/dist/params/index.js.map +1 -1
- package/dist/params/resolve-schema.d.ts +1 -1
- package/dist/plugin-context.d.ts +9 -9
- package/dist/plugin-context.d.ts.map +1 -1
- package/dist/plugins/adapter-build.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-report.d.ts +5 -5
- package/dist/plugins/cache.d.ts +1 -1
- package/dist/plugins/callsite-jsx.d.ts +2 -2
- package/dist/plugins/chunks.d.ts +1 -1
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/cloudflare-wasm.d.ts +1 -1
- 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 +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/fonts.d.ts +3 -3
- 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 +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +2 -2
- package/dist/plugins/prebuilt-options-analysis.d.ts +1 -1
- package/dist/plugins/prebuilt.d.ts +1 -1
- package/dist/plugins/prerender-sugar.d.ts +11 -14
- package/dist/plugins/prerender-sugar.d.ts.map +1 -1
- package/dist/plugins/request-dep/analysis.d.ts +1 -1
- package/dist/plugins/request-dep/index.d.ts +5 -5
- package/dist/plugins/request-dep/origin.d.ts +1 -1
- 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 +1 -1
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -5
- package/dist/routing/codegen-shared.d.ts +1 -1
- package/dist/routing/codegen-write.d.ts +1 -1
- package/dist/routing/codegen.d.ts +1 -1
- package/dist/routing/collision-probe.d.ts +1 -1
- package/dist/routing/collision-spaces.d.ts +1 -1
- package/dist/routing/convention-lint.d.ts +1 -1
- package/dist/routing/convention-lint.d.ts.map +1 -1
- package/dist/routing/index.d.ts +13 -13
- package/dist/routing/index.js +3 -3
- package/dist/routing/interception.d.ts +1 -1
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +1 -1
- package/dist/routing/manifest-codegen.d.ts +1 -1
- package/dist/routing/scanner.d.ts +14 -1
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +1 -1
- package/dist/routing/segment-classify.d.ts +1 -1
- package/dist/routing/segment-codegen.d.ts +1 -1
- package/dist/routing/segment-keys.d.ts +1 -1
- package/dist/routing/slot-placement.d.ts +1 -1
- package/dist/routing/walkers.d.ts +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 +1 -1
- package/dist/search-params/define.d.ts +3 -3
- package/dist/search-params/index.d.ts +3 -3
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/wrappers.d.ts +1 -1
- package/dist/server/access-gate.d.ts +1 -1
- package/dist/server/action-client.d.ts +1 -1
- package/dist/server/action-handler.d.ts +5 -5
- package/dist/server/actions.d.ts +2 -2
- package/dist/server/als-registry.d.ts +8 -8
- package/dist/server/asset-headers.d.ts +1 -1
- package/dist/server/chain-url-parts.d.ts +3 -3
- package/dist/server/children-interception.d.ts +2 -2
- package/dist/server/cookie-context.d.ts +1 -1
- package/dist/server/cookie-parsing.d.ts +2 -2
- package/dist/server/default-logger.d.ts +1 -1
- package/dist/server/deny-boundary.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts +5 -5
- package/dist/server/early-hints.d.ts +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +2 -4
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +5 -5
- package/dist/server/flight-injection-state.d.ts +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/html-injector-core.d.ts +2 -2
- package/dist/server/html-injectors.d.ts +1 -1
- package/dist/server/index.d.ts +18 -18
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +34 -38
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -50
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +1024 -1026
- package/dist/server/internal.js.map +1 -1
- package/dist/server/metadata-collector.d.ts +2 -2
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-routes.d.ts +3 -3
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +2 -2
- package/dist/server/middleware-runner.d.ts +1 -1
- package/dist/server/node-stream-transforms.d.ts +1 -1
- package/dist/server/param-coercion.d.ts +4 -4
- package/dist/server/pipeline-helpers.d.ts +3 -3
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-metadata.d.ts +1 -1
- package/dist/server/pipeline-outcome.d.ts +2 -2
- package/dist/server/pipeline-phases.d.ts +3 -3
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +9 -9
- package/dist/server/prebuilt/cache-key.d.ts +1 -1
- package/dist/server/prebuilt/capture-state.d.ts +1 -1
- package/dist/server/prebuilt/key-discipline.d.ts +1 -1
- package/dist/server/prebuilt/manifest-tag-index.d.ts +1 -1
- package/dist/server/prebuilt/overlay.d.ts +2 -2
- package/dist/server/prebuilt/payload-source.d.ts +1 -1
- package/dist/server/prebuilt/slots.d.ts +1 -1
- package/dist/server/prebuilt/synthetic-store.d.ts +2 -2
- package/dist/server/prebuilt-builder.d.ts +2 -2
- package/dist/server/primitives.d.ts +2 -2
- package/dist/server/publish-params.d.ts +1 -1
- package/dist/server/request-context.d.ts +3 -3
- package/dist/server/route-element-builder.d.ts +16 -6
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-matcher.d.ts +4 -4
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +3 -3
- package/dist/server/rsc-entry/error-renderer.d.ts +4 -4
- package/dist/server/rsc-entry/helpers.d.ts +6 -6
- package/dist/server/rsc-entry/index.d.ts +7 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +4 -4
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +4 -4
- package/dist/server/rsc-entry/rsc-payload.d.ts +4 -4
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +3 -3
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +7 -7
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +5 -5
- package/dist/server/sitemap-generator.d.ts +2 -2
- package/dist/server/sitemap-handler.d.ts +1 -1
- package/dist/server/skippable-prefix.d.ts +3 -3
- package/dist/server/slot-interception.d.ts +2 -2
- package/dist/server/slot-resolver.d.ts +3 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +2 -2
- package/dist/server/ssr-entry.d.ts +1 -1
- package/dist/server/static-generator.d.ts +1 -1
- package/dist/server/static-not-found.d.ts +1 -1
- package/dist/server/status-code-resolver.d.ts +1 -1
- package/dist/server/tracing.d.ts +3 -3
- package/dist/server/tree-builder.d.ts +3 -3
- package/dist/server/tree-match.d.ts +1 -1
- package/dist/server/types.d.ts +2 -2
- package/dist/server/utils/mdx-file.d.ts +2 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -1
- package/dist/server/workers-cache-bridge.d.ts +1 -1
- package/dist/shared/als-slots.d.ts +1 -1
- package/dist/shared/payload-root.d.ts +2 -2
- package/dist/shared/rsc-media-type.d.ts +12 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -1
- package/dist/shared/slot-params.d.ts +1 -1
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.js.map +1 -1
- package/dist/shims/font-local.d.ts +1 -1
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/navigation-client.d.ts +4 -4
- package/dist/shims/navigation.d.ts +2 -2
- package/docs/api/34-api-config.mdx +7 -4
- package/docs/api/36-cli.mdx +23 -3
- package/docs/learn/11-error-handling.mdx +11 -0
- package/docs/learn/13-configuration.mdx +1 -1
- package/docs/more/01-advanced-routing.mdx +1 -0
- package/package.json +11 -10
- package/src/adapters/build-output-helper.ts +4 -4
- package/src/adapters/cloudflare-dev.ts +7 -1
- package/src/adapters/cloudflare-kv-cache.ts +11 -8
- package/src/adapters/cloudflare.ts +21 -15
- package/src/adapters/compress-module.ts +2 -2
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +100 -465
- package/src/adapters/shared.ts +1 -1
- 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 +7 -7
- package/src/cache/index.ts +9 -9
- package/src/cache/redis-handler.ts +2 -2
- package/src/cache/stores/cloudflare-kv.ts +1 -1
- package/src/cache/stores/memory.ts +2 -2
- package/src/cache/stores/redis.ts +1 -1
- package/src/cache/stores/vercel.ts +1 -1
- package/src/cache/tag-aware-handler.ts +2 -2
- package/src/cache/timber-cache.ts +8 -8
- package/src/cdn/cloudflare-purge.ts +1 -1
- package/src/cdn/fastly-purge.ts +1 -1
- package/src/cdn/index.ts +10 -4
- package/src/cdn/workers-cache-purge.ts +6 -2
- package/src/cli-check.ts +53 -4
- package/src/cli-schema-sync.ts +3 -3
- package/src/cli.ts +50 -11
- package/src/client/browser-dev.ts +1 -1
- package/src/client/browser-entry/action-dispatch.ts +5 -5
- package/src/client/browser-entry/hmr.ts +1 -1
- package/src/client/browser-entry/hydrate.ts +9 -9
- package/src/client/browser-entry/index.ts +10 -10
- package/src/client/browser-entry/post-hydration.ts +5 -5
- package/src/client/browser-entry/router-init.ts +9 -9
- package/src/client/browser-entry/rsc-stream.ts +3 -3
- package/src/client/error-boundary.tsx +4 -4
- package/src/client/form.tsx +7 -2
- package/src/client/history.ts +2 -2
- package/src/client/index.ts +21 -18
- package/src/client/internal.ts +19 -19
- package/src/client/link.tsx +9 -9
- package/src/client/navigation-api.ts +1 -1
- package/src/client/navigation-commit.ts +5 -5
- package/src/client/navigation-context.ts +1 -1
- package/src/client/navigation-root.tsx +1 -1
- package/src/client/nuqs-adapter.tsx +2 -2
- package/src/client/params-context.ts +4 -4
- package/src/client/router-effects.ts +3 -3
- package/src/client/router-lifecycle.ts +2 -2
- package/src/client/router-pipeline.ts +10 -10
- package/src/client/router-ref.ts +2 -2
- package/src/client/router-skew.ts +2 -2
- package/src/client/router-types.ts +6 -6
- package/src/client/router.ts +13 -13
- package/src/client/rsc-fetch.ts +11 -16
- package/src/client/segment-cache.ts +2 -2
- package/src/client/segment-outlet.tsx +1 -1
- package/src/client/shallow-url.ts +1 -1
- package/src/client/slot-outlet.tsx +1 -1
- package/src/client/slot-provider.tsx +1 -1
- package/src/client/ssr-data.ts +3 -3
- package/src/client/stale-client.ts +1 -1
- package/src/client/state.ts +4 -4
- package/src/client/top-loader.tsx +1 -1
- package/src/client/unload-guard.ts +1 -1
- package/src/client/use-cookie.ts +2 -2
- package/src/client/use-pathname.ts +2 -2
- package/src/client/use-pending-navigation.ts +1 -1
- package/src/client/use-query-states.ts +3 -3
- package/src/client/use-router.ts +2 -2
- package/src/client/use-search-params.ts +3 -3
- package/src/client/use-segment-params.ts +6 -6
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +2 -2
- package/src/config-types.ts +12 -9
- package/src/config-validation.ts +1 -1
- package/src/cookies/define-cookie.ts +6 -6
- package/src/cookies/index.ts +3 -3
- package/src/cookies/json-cookie.ts +1 -1
- package/src/dev-tools/404-page.ts +4 -4
- package/src/dev-tools/dev-page-shell.ts +1 -1
- package/src/dev-tools/error-page.ts +4 -4
- package/src/dev-tools/index.ts +12 -12
- package/src/dev-tools/instrumentation.ts +1 -1
- package/src/dev-tools/logs.ts +1 -1
- package/src/dev-tools/overlay.ts +3 -3
- package/src/dev-tools/terminal.ts +2 -2
- package/src/fonts/ast.ts +5 -5
- package/src/fonts/bundle.ts +5 -5
- package/src/fonts/css.ts +1 -1
- package/src/fonts/dev-middleware.ts +2 -2
- package/src/fonts/google.ts +2 -2
- package/src/fonts/local.ts +4 -4
- package/src/fonts/pipeline.ts +8 -8
- package/src/fonts/transform.ts +5 -5
- package/src/fonts/types.ts +1 -1
- package/src/fonts/virtual-modules.ts +1 -1
- package/src/index.ts +90 -95
- package/src/params/codec-registry.ts +1 -1
- package/src/params/define-schema.ts +2 -2
- package/src/params/index.ts +4 -4
- package/src/params/resolve-schema.ts +2 -2
- package/src/plugin-context.ts +10 -10
- package/src/plugins/adapter-build.ts +5 -5
- package/src/plugins/build-manifest.ts +4 -4
- package/src/plugins/build-report.ts +6 -6
- package/src/plugins/cache.ts +3 -3
- package/src/plugins/callsite-ast.ts +1 -1
- package/src/plugins/callsite-jsx.ts +2 -2
- package/src/plugins/chunks.ts +1 -1
- package/src/plugins/cloudflare-wasm.ts +1 -1
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +97 -12
- package/src/plugins/entries.ts +1 -1
- package/src/plugins/fonts.ts +17 -10
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +4 -3
- package/src/plugins/prebuilt-capture.ts +3 -3
- package/src/plugins/prebuilt-options-analysis.ts +1 -1
- package/src/plugins/prebuilt.ts +7 -7
- package/src/plugins/prerender-sugar.ts +11 -19
- package/src/plugins/request-dep/analysis.ts +1 -1
- package/src/plugins/request-dep/index.ts +8 -8
- package/src/plugins/request-dep/origin.ts +1 -1
- package/src/plugins/routing.ts +12 -7
- package/src/plugins/server-bundle.ts +9 -2
- package/src/plugins/shims.ts +16 -31
- package/src/plugins/static-build.ts +10 -10
- package/src/routing/codegen-shared.ts +1 -1
- package/src/routing/codegen-write.ts +3 -3
- package/src/routing/codegen.ts +14 -5
- package/src/routing/collision-probe.ts +3 -3
- package/src/routing/collision-spaces.ts +3 -3
- package/src/routing/convention-lint.ts +136 -6
- package/src/routing/export-detect.ts +1 -1
- package/src/routing/index.ts +13 -13
- package/src/routing/interception.ts +41 -4
- package/src/routing/link-codegen.ts +3 -3
- package/src/routing/manifest-codegen.ts +2 -2
- package/src/routing/scanner.ts +33 -9
- package/src/routing/schema-validation.ts +4 -4
- package/src/routing/segment-classify.ts +2 -2
- package/src/routing/segment-codegen.ts +1 -1
- package/src/routing/segment-keys.ts +1 -1
- package/src/routing/slot-placement.ts +1 -1
- package/src/routing/walkers.ts +1 -1
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +12 -0
- package/src/schema-bridge.ts +1 -1
- package/src/search-params/define.ts +8 -8
- package/src/search-params/index.ts +3 -3
- package/src/search-params/wrappers.ts +3 -3
- package/src/server/access-gate.tsx +6 -6
- package/src/server/action-client.ts +5 -5
- package/src/server/action-handler.ts +16 -16
- package/src/server/actions.ts +5 -5
- package/src/server/als-registry.ts +8 -8
- package/src/server/asset-headers.ts +2 -2
- package/src/server/chain-url-parts.ts +5 -5
- package/src/server/children-interception.ts +4 -4
- package/src/server/compress.ts +1 -1
- package/src/server/cookie-context.ts +4 -4
- package/src/server/cookie-parsing.ts +2 -2
- package/src/server/default-logger.ts +3 -3
- package/src/server/deny-boundary.ts +10 -10
- package/src/server/deny-renderer.ts +38 -25
- package/src/server/early-hints-sender.ts +2 -2
- package/src/server/early-hints.ts +2 -2
- package/src/server/error-boundary-wrapper.ts +4 -12
- package/src/server/fallback-error.ts +13 -13
- package/src/server/flight-injection-state.ts +1 -1
- package/src/server/form-flash.ts +2 -2
- package/src/server/html-injector-core.ts +4 -4
- package/src/server/html-injectors.ts +5 -5
- package/src/server/index.ts +18 -18
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +50 -50
- package/src/server/logger.ts +4 -4
- package/src/server/metadata-collector.ts +7 -7
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +4 -4
- package/src/server/metadata-routes.ts +3 -3
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +2 -2
- package/src/server/middleware-runner.ts +1 -1
- package/src/server/node-stream-transforms.ts +4 -4
- package/src/server/param-coercion.ts +8 -8
- package/src/server/pipeline-helpers.ts +7 -7
- package/src/server/pipeline-interception.ts +2 -2
- package/src/server/pipeline-metadata.ts +1 -1
- package/src/server/pipeline-outcome.ts +8 -8
- package/src/server/pipeline-phases.ts +24 -28
- package/src/server/pipeline.ts +22 -22
- package/src/server/prebuilt/cache-key.ts +1 -1
- package/src/server/prebuilt/capture-state.ts +1 -1
- package/src/server/prebuilt/key-discipline.ts +1 -1
- package/src/server/prebuilt/manifest-tag-index.ts +1 -1
- package/src/server/prebuilt/overlay.ts +6 -6
- package/src/server/prebuilt/payload-source.ts +2 -2
- package/src/server/prebuilt/slots.ts +5 -5
- package/src/server/prebuilt/synthetic-store.ts +2 -2
- package/src/server/prebuilt-builder.ts +16 -16
- package/src/server/prebuilt-runtime.ts +12 -12
- package/src/server/primitives.ts +7 -7
- package/src/server/publish-params.ts +3 -3
- package/src/server/request-context.ts +7 -7
- package/src/server/route-element-builder.ts +108 -50
- package/src/server/route-handler.ts +4 -4
- package/src/server/route-matcher.ts +5 -5
- package/src/server/rsc-cache-key-guard.ts +3 -5
- package/src/server/rsc-entry/action-middleware-runner.ts +7 -7
- package/src/server/rsc-entry/api-handler.ts +18 -9
- package/src/server/rsc-entry/deny-fallback.ts +10 -10
- package/src/server/rsc-entry/error-renderer.ts +27 -27
- package/src/server/rsc-entry/helpers.ts +10 -10
- package/src/server/rsc-entry/index.ts +51 -47
- package/src/server/rsc-entry/render-route.ts +20 -20
- package/src/server/rsc-entry/revalidate-renderer.ts +12 -12
- package/src/server/rsc-entry/rsc-payload.ts +19 -15
- package/src/server/rsc-entry/rsc-stream.ts +8 -8
- package/src/server/rsc-entry/ssr-bridge.ts +3 -3
- package/src/server/rsc-entry/ssr-renderer.ts +23 -23
- package/src/server/rsc-entry/wrap-action-dispatch.ts +9 -9
- package/src/server/rsc-prop-warnings.ts +1 -1
- package/src/server/sensitive-fields.ts +1 -1
- package/src/server/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +3 -3
- package/src/server/sitemap-handler.ts +3 -3
- package/src/server/skippable-prefix.ts +7 -7
- package/src/server/slot-interception.ts +5 -5
- package/src/server/slot-resolver.ts +20 -28
- package/src/server/ssr-bridge-types.ts +2 -2
- package/src/server/ssr-entry.ts +18 -18
- package/src/server/ssr-render.ts +4 -4
- package/src/server/ssr-wrappers.tsx +1 -1
- package/src/server/state-tree-diff.ts +1 -1
- package/src/server/static-generator.ts +6 -6
- package/src/server/static-not-found.ts +3 -3
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/tracing.ts +5 -5
- package/src/server/tree-builder.ts +4 -4
- package/src/server/tree-match.ts +1 -1
- package/src/server/types.ts +2 -2
- package/src/server/utils/mdx-file.ts +2 -2
- package/src/server/waituntil-bridge.ts +1 -1
- package/src/server/workers-cache-bridge.ts +2 -2
- package/src/shared/als-slots.ts +1 -1
- package/src/shared/payload-root.ts +2 -2
- package/src/shared/rsc-media-type.ts +16 -0
- package/src/shared/slot-params.ts +1 -1
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +1 -1
- package/src/shims/navigation-client.ts +5 -5
- package/src/shims/navigation.ts +2 -2
- package/dist/_chunks/actions-BjbbNRFN.js.map +0 -1
- package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +0 -1
- package/dist/_chunks/cache-api-DllJ-Lyw.js.map +0 -1
- package/dist/_chunks/cli-check-DJZDc22E.js.map +0 -1
- package/dist/_chunks/convention-lint-CpteIpTm.js.map +0 -1
- package/dist/_chunks/dist-BA3u1z3W.js +0 -423
- package/dist/_chunks/dist-BA3u1z3W.js.map +0 -1
- package/dist/_chunks/mdx-file-C005ay-P.js.map +0 -1
- package/dist/_chunks/plugin-context-rCinWLiE.js.map +0 -1
- package/dist/_chunks/scanner-CAietmj4.js.map +0 -1
- package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +0 -1
- package/dist/content/index.d.ts +0 -2
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -0
- package/src/content/index.ts +0 -5
- package/src/shims/server-only-noop.js +0 -6
package/dist/adapters/nitro.d.ts
CHANGED
|
@@ -1,32 +1,6 @@
|
|
|
1
|
-
import type { TimberPlatformAdapter } from './types';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
* Each preset maps to a Nitro deployment target. The adapter generates
|
|
6
|
-
* the appropriate configuration and entry point for the selected platform.
|
|
7
|
-
*/
|
|
8
|
-
export type NitroPreset = 'vercel' | 'vercel-edge' | 'netlify' | 'netlify-edge' | 'aws-lambda' | 'deno-deploy' | 'azure-functions' | 'node-server' | 'bun';
|
|
9
|
-
/** Preset-specific Nitro configuration. */
|
|
10
|
-
interface PresetConfig {
|
|
11
|
-
/** Nitro preset name passed to the Nitro build. */
|
|
12
|
-
nitroPreset: string;
|
|
13
|
-
/** Output directory name within the build dir. */
|
|
14
|
-
outputDir: string;
|
|
15
|
-
/**
|
|
16
|
-
* Path to the server bundle directory relative to outputDir.
|
|
17
|
-
* Nitro places the bundled server entry + _chunks/ here.
|
|
18
|
-
* Most presets use `server`; Vercel uses `functions/__server.func`.
|
|
19
|
-
*/
|
|
20
|
-
serverBundleDir: string;
|
|
21
|
-
/** Whether the runtime supports waitUntil. */
|
|
22
|
-
supportsWaitUntil: boolean;
|
|
23
|
-
/** Whether the runtime supports application-level 103 Early Hints. */
|
|
24
|
-
supportsEarlyHints: boolean;
|
|
25
|
-
/** Value for TIMBER_RUNTIME env var. See design/25-production-deployments.md. */
|
|
26
|
-
runtimeName: string;
|
|
27
|
-
/** Additional nitro.config fields for this preset. */
|
|
28
|
-
extraConfig?: Record<string, unknown>;
|
|
29
|
-
}
|
|
1
|
+
import type { TimberPlatformAdapter } from './types.ts';
|
|
2
|
+
import { type NitroPreset } from './nitro-presets.ts';
|
|
3
|
+
export type { NitroPreset } from './nitro-presets.ts';
|
|
30
4
|
/**
|
|
31
5
|
* Static deploy target for `output: 'static'` mode.
|
|
32
6
|
*
|
|
@@ -89,39 +63,43 @@ export interface NitroAdapterOptions {
|
|
|
89
63
|
export declare function nitro(options?: NitroAdapterOptions): TimberPlatformAdapter;
|
|
90
64
|
/** @internal Exported for testing. */
|
|
91
65
|
export declare function generateNitroEntry(buildDir: string, outDir: string, preset: NitroPreset, compress?: boolean): string;
|
|
66
|
+
/** @internal Exported for testing. */
|
|
67
|
+
export declare function isSuppressedNitroHint(message: unknown, prefixes?: readonly string[]): boolean;
|
|
92
68
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
69
|
+
* Nitro's rolldown and vite builders render `framework.previewCommand` /
|
|
70
|
+
* `framework.deployCommand` into these hints. A user who explicitly set one
|
|
71
|
+
* via `nitroConfig` has provided valid guidance — only suppress the hints
|
|
72
|
+
* whose command is still nitro's broken default.
|
|
97
73
|
*
|
|
98
74
|
* @internal Exported for testing.
|
|
99
75
|
*/
|
|
100
|
-
export declare function
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
76
|
+
export declare function selectSuppressedHintPrefixes(framework?: {
|
|
77
|
+
previewCommand?: string;
|
|
78
|
+
deployCommand?: string;
|
|
79
|
+
}): string[];
|
|
80
|
+
/** Minimal structural view of the nitro (consola) logger the wrap needs. */
|
|
81
|
+
interface NitroBuildLogger {
|
|
82
|
+
success: (message: unknown, ...args: unknown[]) => void;
|
|
106
83
|
}
|
|
107
|
-
/** @internal Exported for testing. */
|
|
108
|
-
export declare function generateNitroPreviewCommand(buildDir: string, preset: NitroPreset): NitroPreviewCommand | null;
|
|
109
84
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* and client disconnect cleanup. Written to `_send-response.mjs` during
|
|
115
|
-
* buildOutput for use by the preview server script. See TIM-1154.
|
|
85
|
+
* Wrap a nitro logger's `success` so hardcoded preview/deploy hints are
|
|
86
|
+
* dropped for this programmatic build only. Returns the original
|
|
87
|
+
* (unfiltered) success fn so timber can print its own hint — which shares
|
|
88
|
+
* the suppressed prefix on purpose, replacing nitro's wording.
|
|
116
89
|
*
|
|
117
90
|
* @internal Exported for testing.
|
|
118
91
|
*/
|
|
119
|
-
export declare function
|
|
92
|
+
export declare function wrapNitroLoggerForBuild(logger: NitroBuildLogger, prefixes?: readonly string[]): NitroBuildLogger['success'];
|
|
120
93
|
/**
|
|
121
|
-
*
|
|
94
|
+
* Timber's own post-build hint. Locally-runnable presets are previewed via
|
|
95
|
+
* `timber preview`, which invokes this adapter's `preview()` to run the
|
|
96
|
+
* generated `_preview-server.mjs`. Serverless presets get no hint — their
|
|
97
|
+
* output lives under `.timber/dist/nitro/`, so any cwd-relative deploy
|
|
98
|
+
* command would be as wrong as the nitro hint this replaces.
|
|
99
|
+
*
|
|
122
100
|
* @internal Exported for testing.
|
|
123
101
|
*/
|
|
124
|
-
export declare function
|
|
102
|
+
export declare function getPostBuildHint(preset: NitroPreset): string | null;
|
|
125
103
|
/**
|
|
126
104
|
* Resolve the destination path for prebuilt flight payloads in the Nitro
|
|
127
105
|
* output directory. The RSC entry resolves `../prebuilt/` relative to its
|
|
@@ -145,5 +123,4 @@ export declare function resolvePrebuiltOutputPath(outDir: string, preset: NitroP
|
|
|
145
123
|
* @internal Exported for testing.
|
|
146
124
|
*/
|
|
147
125
|
export declare function copyPrebuiltToVercelFuncClones(functionsDir: string, prebuiltSrc: string, baseFuncName: string): Promise<void>;
|
|
148
|
-
export {};
|
|
149
126
|
//# sourceMappingURL=nitro.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nitro.d.ts","sourceRoot":"","sources":["../../src/adapters/nitro.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nitro.d.ts","sourceRoot":"","sources":["../../src/adapters/nitro.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAgB,MAAM,YAAY,CAAC;AAStE,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAS3F,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;AAEtD,qCAAqC;AACrC,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAID;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,mBAAwB,GAAG,qBAAqB,CAwH9E;AAID,sCAAsC;AACtC,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,UAAO,GACd,MAAM,CAmFR;AAkBD,sCAAsC;AACtC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,QAAQ,GAAE,SAAS,MAAM,EAAmC,GAC3D,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,CAAC,EAAE;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,EAAE,CAKX;AAED,4EAA4E;AAC5E,UAAU,gBAAgB;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACzD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,SAAS,MAAM,EAAmC,GAC3D,gBAAgB,CAAC,SAAS,CAAC,CAS7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAInE;AA+ED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAGrF;AAED;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
package/dist/adapters/nitro.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { t as RSC_CONTENT_TYPE } from "../_chunks/rsc-media-type-
|
|
2
|
-
import { a as IMMUTABLE_CACHE, i as writeHeadersFile, n as findUnhashedStaticFiles, r as runSharedBuildSteps, t as buildStaticDirectoryOutput } from "../_chunks/build-output-helper-
|
|
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
3
|
import { transformWithOxc } from "vite";
|
|
4
4
|
import { basename, dirname, join, relative } from "node:path";
|
|
5
5
|
import { cp, glob, readFile, writeFile } from "node:fs/promises";
|
|
6
6
|
import { execFile } from "node:child_process";
|
|
7
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.
|
|
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
9
|
//#endregion
|
|
10
10
|
//#region src/adapters/compress-module.ts
|
|
11
11
|
/**
|
|
@@ -19,7 +19,7 @@ var compress_default = "// Response compression for self-hosted deployments (dev
|
|
|
19
19
|
* import falls through to the rejection below instead.
|
|
20
20
|
*/
|
|
21
21
|
var INLINED_IMPORTS = [{
|
|
22
|
-
pattern: /^import\s*\{\s*RSC_CONTENT_TYPE\s*,?\s*\}\s*from\s*["'][^"']*shared\/rsc-media-type\.js["'];?[ \t]*$/m,
|
|
22
|
+
pattern: /^import\s*\{\s*RSC_CONTENT_TYPE\s*,?\s*\}\s*from\s*["'][^"']*shared\/rsc-media-type\.(?:js|ts)["'];?[ \t]*$/m,
|
|
23
23
|
replacement: `const RSC_CONTENT_TYPE = ${JSON.stringify(RSC_CONTENT_TYPE)};`
|
|
24
24
|
}];
|
|
25
25
|
/**
|
|
@@ -72,7 +72,7 @@ async function generateCompressModule() {
|
|
|
72
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);
|
|
73
73
|
}
|
|
74
74
|
//#endregion
|
|
75
|
-
//#region src/adapters/nitro.ts
|
|
75
|
+
//#region src/adapters/nitro-presets.ts
|
|
76
76
|
var PRESET_CONFIGS = {
|
|
77
77
|
"vercel": {
|
|
78
78
|
nitroPreset: "vercel",
|
|
@@ -148,135 +148,17 @@ var PRESET_CONFIGS = {
|
|
|
148
148
|
runtimeName: "bun"
|
|
149
149
|
}
|
|
150
150
|
};
|
|
151
|
+
/** Presets that produce a locally-runnable server entry. */
|
|
152
|
+
var LOCALLY_PREVIEWABLE = /* @__PURE__ */ new Set(["node-server", "bun"]);
|
|
151
153
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* Nitro abstracts deployment targets — the same timber.js app can deploy
|
|
155
|
-
* to Vercel, Netlify, AWS, Deno Deploy, or Azure by changing the preset.
|
|
156
|
-
*
|
|
157
|
-
* @example
|
|
158
|
-
* ```ts
|
|
159
|
-
* import { nitro } from '@timber-js/app/adapters/nitro'
|
|
160
|
-
*
|
|
161
|
-
* export default {
|
|
162
|
-
* output: 'server',
|
|
163
|
-
* adapter: nitro({ preset: 'vercel' }),
|
|
164
|
-
* }
|
|
165
|
-
* ```
|
|
154
|
+
* Get the preset configuration for a given preset name.
|
|
155
|
+
* @internal Exported for testing.
|
|
166
156
|
*/
|
|
167
|
-
function
|
|
168
|
-
|
|
169
|
-
const compress = options.compress ?? true;
|
|
170
|
-
PRESET_CONFIGS[preset];
|
|
171
|
-
return {
|
|
172
|
-
name: `nitro-${preset}`,
|
|
173
|
-
async buildOutput(config, buildDir) {
|
|
174
|
-
const outDir = join(buildDir, "nitro");
|
|
175
|
-
if (config.output === "static" && config.staticPagesDir) {
|
|
176
|
-
await buildStaticDirectoryOutput(config, buildDir, outDir, "public");
|
|
177
|
-
const publicDir = join(outDir, "public");
|
|
178
|
-
await writeHeadersFile(publicDir, config, await findUnhashedStaticFiles(publicDir));
|
|
179
|
-
if ((options.staticTarget ?? "generic") === "github-pages") {
|
|
180
|
-
await writeFile(join(publicDir, ".nojekyll"), "");
|
|
181
|
-
try {
|
|
182
|
-
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.");
|
|
183
|
-
} catch {}
|
|
184
|
-
}
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
await runSharedBuildSteps({
|
|
188
|
-
config,
|
|
189
|
-
buildDir,
|
|
190
|
-
outDir,
|
|
191
|
-
publicDirName: "public"
|
|
192
|
-
});
|
|
193
|
-
await writeFile(join(outDir, "_compress.mjs"), await generateCompressModule());
|
|
194
|
-
await writeFile(join(outDir, "_send-response.mjs"), generateSendResponseModule());
|
|
195
|
-
if (config.manifestInit) {
|
|
196
|
-
const rscEntry = join(outDir, "rsc", "index.js");
|
|
197
|
-
const rscContent = await readFile(rscEntry, "utf-8");
|
|
198
|
-
await writeFile(rscEntry, `${config.manifestInit}\n${rscContent}`);
|
|
199
|
-
}
|
|
200
|
-
const entry = generateNitroEntry(buildDir, outDir, preset, compress);
|
|
201
|
-
await writeFile(join(outDir, "entry.ts"), entry);
|
|
202
|
-
const { serverDir } = await runNitroBuild(outDir, preset, options.nitroConfig);
|
|
203
|
-
const prebuiltSrc = join(buildDir, "prebuilt");
|
|
204
|
-
await cp(prebuiltSrc, join(serverDir, "prebuilt"), { recursive: true }).catch((e) => {
|
|
205
|
-
if (e.code !== "ENOENT") throw e;
|
|
206
|
-
});
|
|
207
|
-
if (preset === "vercel" || preset === "vercel-edge") await copyPrebuiltToVercelFuncClones(dirname(serverDir), prebuiltSrc, basename(serverDir));
|
|
208
|
-
},
|
|
209
|
-
preview: LOCALLY_PREVIEWABLE.has(preset) ? async (_config, buildDir) => {
|
|
210
|
-
const previewScript = generatePreviewScript(buildDir, preset);
|
|
211
|
-
const scriptPath = join(buildDir, "nitro", "_preview-server.mjs");
|
|
212
|
-
await writeFile(scriptPath, previewScript);
|
|
213
|
-
await spawnNitroPreview(preset === "bun" ? "bun" : "node", [scriptPath], join(buildDir, "nitro"));
|
|
214
|
-
} : void 0
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
/** @internal Exported for testing. */
|
|
218
|
-
function generateNitroEntry(buildDir, outDir, preset, compress = true) {
|
|
219
|
-
const serverEntryRelative = "./rsc/index.js";
|
|
220
|
-
const runtimeName = PRESET_CONFIGS[preset].runtimeName;
|
|
221
|
-
const earlyHints = PRESET_CONFIGS[preset].supportsEarlyHints;
|
|
222
|
-
const supportsWaitUntil = PRESET_CONFIGS[preset].supportsWaitUntil;
|
|
223
|
-
let handlerCall;
|
|
224
|
-
if (earlyHints && supportsWaitUntil) handlerCall = ` const nodeRes = event.node?.res
|
|
225
|
-
const earlyHintsSender = (typeof nodeRes?.writeEarlyHints === 'function')
|
|
226
|
-
? (links) => { try { nodeRes.writeEarlyHints({ link: links }) } catch {} }
|
|
227
|
-
: undefined
|
|
228
|
-
|
|
229
|
-
const waitUntilFn = (typeof event.waitUntil === 'function')
|
|
230
|
-
? (p) => event.waitUntil(p)
|
|
231
|
-
: undefined
|
|
232
|
-
|
|
233
|
-
const callHandler = () => handler(webRequest)
|
|
234
|
-
let wrappedHandler = earlyHintsSender
|
|
235
|
-
? () => runWithEarlyHintsSender(earlyHintsSender, callHandler)
|
|
236
|
-
: callHandler
|
|
237
|
-
const webResponse = waitUntilFn
|
|
238
|
-
? await runWithWaitUntil(waitUntilFn, wrappedHandler)
|
|
239
|
-
: await wrappedHandler()`;
|
|
240
|
-
else if (earlyHints) handlerCall = ` const nodeRes = event.node?.res
|
|
241
|
-
const earlyHintsSender = (typeof nodeRes?.writeEarlyHints === 'function')
|
|
242
|
-
? (links) => { try { nodeRes.writeEarlyHints({ link: links }) } catch {} }
|
|
243
|
-
: undefined
|
|
244
|
-
|
|
245
|
-
const webResponse = earlyHintsSender
|
|
246
|
-
? await runWithEarlyHintsSender(earlyHintsSender, () => handler(webRequest))
|
|
247
|
-
: await handler(webRequest)`;
|
|
248
|
-
else if (supportsWaitUntil) handlerCall = ` const waitUntilFn = (typeof event.waitUntil === 'function')
|
|
249
|
-
? (p) => event.waitUntil(p)
|
|
250
|
-
: undefined
|
|
251
|
-
|
|
252
|
-
const webResponse = waitUntilFn
|
|
253
|
-
? await runWithWaitUntil(waitUntilFn, () => handler(webRequest))
|
|
254
|
-
: await handler(webRequest)`;
|
|
255
|
-
else handlerCall = ` const webResponse = await handler(webRequest)`;
|
|
256
|
-
return `// Generated by @timber-js/app/adapters/nitro
|
|
257
|
-
// Do not edit — this file is regenerated on each build.
|
|
258
|
-
|
|
259
|
-
import handler, { runWithEarlyHintsSender${supportsWaitUntil ? ", runWithWaitUntil" : ""} } from '${serverEntryRelative}'
|
|
260
|
-
${compress ? "import { compressResponse } from './_compress.mjs'\n" : ""}
|
|
261
|
-
// Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
|
|
262
|
-
// See design/25-production-deployments.md §"TIMBER_RUNTIME".
|
|
263
|
-
process.env.TIMBER_RUNTIME = '${runtimeName}'
|
|
264
|
-
|
|
265
|
-
// Nitro's index.mjs wraps this import with defineLazyEventHandler, which
|
|
266
|
-
// already handles the event handler protocol. We export a plain async
|
|
267
|
-
// function — no defineEventHandler wrapper needed.
|
|
268
|
-
// Nitro bundles h3 into its internal _libs/ directory but doesn't make
|
|
269
|
-
// it available as a bare specifier in the output's node_modules.
|
|
270
|
-
export default async function timberHandler(event) {
|
|
271
|
-
// h3 v2: event.req is the Web Request
|
|
272
|
-
const webRequest = event.req
|
|
273
|
-
${handlerCall}
|
|
274
|
-
return ${compress ? "compressResponse(webRequest, webResponse)" : "webResponse"}
|
|
275
|
-
}
|
|
276
|
-
`;
|
|
157
|
+
function getPresetConfig(preset) {
|
|
158
|
+
return PRESET_CONFIGS[preset];
|
|
277
159
|
}
|
|
278
|
-
|
|
279
|
-
|
|
160
|
+
//#endregion
|
|
161
|
+
//#region src/adapters/nitro-preview.ts
|
|
280
162
|
/**
|
|
281
163
|
* Generate a standalone preview server script that uses Node's built-in
|
|
282
164
|
* HTTP server. This bypasses Nitro entirely — the Nitro entry.ts imports
|
|
@@ -301,7 +183,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
301
183
|
import { existsSync } from 'node:fs';
|
|
302
184
|
|
|
303
185
|
// Set runtime before importing the handler.
|
|
304
|
-
process.env.TIMBER_RUNTIME = '${
|
|
186
|
+
process.env.TIMBER_RUNTIME = '${getPresetConfig(preset).runtimeName}';
|
|
305
187
|
|
|
306
188
|
// Load the build manifest if it exists.
|
|
307
189
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
@@ -501,41 +383,6 @@ try {
|
|
|
501
383
|
}
|
|
502
384
|
`;
|
|
503
385
|
}
|
|
504
|
-
/** @internal Exported for testing. */
|
|
505
|
-
function generateNitroPreviewCommand(buildDir, preset) {
|
|
506
|
-
if (!LOCALLY_PREVIEWABLE.has(preset)) return null;
|
|
507
|
-
const nitroDir = join(buildDir, "nitro");
|
|
508
|
-
const entryPath = join(nitroDir, "entry.ts");
|
|
509
|
-
return {
|
|
510
|
-
command: preset === "bun" ? "bun" : "node",
|
|
511
|
-
args: [entryPath],
|
|
512
|
-
cwd: nitroDir
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
async function runNitroBuild(nitroDir, preset, userConfig) {
|
|
516
|
-
const presetConfig = PRESET_CONFIGS[preset];
|
|
517
|
-
const { createNitro, build: nitroBuild, prepare, copyPublicAssets } = await import("nitro/builder");
|
|
518
|
-
const nitro = await createNitro({
|
|
519
|
-
rootDir: nitroDir,
|
|
520
|
-
preset: presetConfig.nitroPreset,
|
|
521
|
-
renderer: { handler: join(nitroDir, "entry.ts") },
|
|
522
|
-
output: { dir: join(nitroDir, presetConfig.outputDir) },
|
|
523
|
-
routeRules: {
|
|
524
|
-
"/assets/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } },
|
|
525
|
-
"/_timber/fonts/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } }
|
|
526
|
-
},
|
|
527
|
-
rollupConfig: { external: [/\.\.\/rsc\//] },
|
|
528
|
-
...presetConfig.extraConfig,
|
|
529
|
-
...userConfig
|
|
530
|
-
});
|
|
531
|
-
const raw = nitro.options.output.serverDir;
|
|
532
|
-
const serverDir = raw.endsWith("/") ? raw.slice(0, -1) : raw;
|
|
533
|
-
await prepare(nitro);
|
|
534
|
-
await copyPublicAssets(nitro);
|
|
535
|
-
await nitroBuild(nitro);
|
|
536
|
-
await nitro.close();
|
|
537
|
-
return { serverDir };
|
|
538
|
-
}
|
|
539
386
|
/** Spawn a Nitro preview process and pipe stdio. */
|
|
540
387
|
function spawnNitroPreview(command, args, cwd) {
|
|
541
388
|
return new Promise((resolve, reject) => {
|
|
@@ -613,12 +460,218 @@ export function sendNodeResponse(nodeRes, webRes) {
|
|
|
613
460
|
}
|
|
614
461
|
`;
|
|
615
462
|
}
|
|
463
|
+
//#endregion
|
|
464
|
+
//#region src/adapters/nitro.ts
|
|
616
465
|
/**
|
|
617
|
-
*
|
|
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;
|
|
484
|
+
return {
|
|
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
|
|
528
|
+
};
|
|
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
|
+
}
|
|
591
|
+
/**
|
|
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.
|
|
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
|
+
*
|
|
618
614
|
* @internal Exported for testing.
|
|
619
615
|
*/
|
|
620
|
-
function
|
|
621
|
-
return
|
|
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
|
+
}
|
|
648
|
+
async function runNitroBuild(nitroDir, preset, userConfig) {
|
|
649
|
+
const presetConfig = PRESET_CONFIGS[preset];
|
|
650
|
+
const { createNitro, build: nitroBuild, prepare, copyPublicAssets } = await import("nitro/builder");
|
|
651
|
+
const nitro = await createNitro({
|
|
652
|
+
rootDir: nitroDir,
|
|
653
|
+
preset: presetConfig.nitroPreset,
|
|
654
|
+
renderer: { handler: join(nitroDir, "entry.ts") },
|
|
655
|
+
output: { dir: join(nitroDir, presetConfig.outputDir) },
|
|
656
|
+
routeRules: {
|
|
657
|
+
"/assets/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } },
|
|
658
|
+
"/_timber/fonts/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } }
|
|
659
|
+
},
|
|
660
|
+
rollupConfig: { external: [/\.\.\/rsc\//] },
|
|
661
|
+
...presetConfig.extraConfig,
|
|
662
|
+
...userConfig
|
|
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;
|
|
668
|
+
await prepare(nitro);
|
|
669
|
+
await copyPublicAssets(nitro);
|
|
670
|
+
await nitroBuild(nitro);
|
|
671
|
+
await nitro.close();
|
|
672
|
+
const hint = framework?.previewCommand ? null : getPostBuildHint(preset);
|
|
673
|
+
if (hint) logSuccess(hint);
|
|
674
|
+
return { serverDir };
|
|
622
675
|
}
|
|
623
676
|
/**
|
|
624
677
|
* Resolve the destination path for prebuilt flight payloads in the Nitro
|
|
@@ -657,6 +710,6 @@ async function copyPrebuiltToVercelFuncClones(functionsDir, prebuiltSrc, baseFun
|
|
|
657
710
|
})));
|
|
658
711
|
}
|
|
659
712
|
//#endregion
|
|
660
|
-
export { copyPrebuiltToVercelFuncClones, generateNitroEntry,
|
|
713
|
+
export { copyPrebuiltToVercelFuncClones, generateNitroEntry, getPostBuildHint, isSuppressedNitroHint, nitro, resolvePrebuiltOutputPath, selectSuppressedHintPrefixes, wrapNitroLoggerForBuild };
|
|
661
714
|
|
|
662
715
|
//# sourceMappingURL=nitro.js.map
|