@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.181
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 +344 -0
- package/dist/_chunks/actions-O_LsyCE4.js +317 -0
- package/dist/_chunks/actions-O_LsyCE4.js.map +1 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js +1202 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js +248 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js +688 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +1 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.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/define-COtkxMRT.js +191 -0
- package/dist/_chunks/define-COtkxMRT.js.map +1 -0
- package/dist/_chunks/define-c4au4I9R.js +82 -0
- package/dist/_chunks/define-c4au4I9R.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.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/logger-AWfuX-KJ.js +1468 -0
- package/dist/_chunks/logger-AWfuX-KJ.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context---kTF5v8.js +315 -0
- package/dist/_chunks/plugin-context---kTF5v8.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js +50 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +119 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
- package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
- package/dist/_chunks/segment-classify-Byy425ng.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
- package/dist/_chunks/use-query-states-DFvWd-EA.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/walkers-BtTlKviE.js +1002 -0
- package/dist/_chunks/walkers-BtTlKviE.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -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 +73 -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 +124 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +189 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +41 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -172
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +2 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.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 +31 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +140 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -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 +20 -10
- 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/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.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/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.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 +35 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +113 -34
- 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 +17 -0
- package/dist/client/browser-entry/action-dispatch.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 +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +29 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +27 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -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/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- 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/history.d.ts +21 -6
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +185 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +938 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.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/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +99 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +62 -15
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +30 -7
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +57 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -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-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 +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.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.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 +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +12 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- 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 +284 -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/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- 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 +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +257 -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 +54 -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 +110 -6
- 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/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 +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -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 +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9243 -14093
- 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 +217 -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 +43 -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-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- 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 +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep.d.ts +21 -0
- package/dist/plugins/request-dep.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 +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +64 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +56 -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 +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -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 +81 -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/types.d.ts +81 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -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 +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +91 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +188 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- 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 +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +93 -11
- 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 +12 -29
- 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/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- 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/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +117 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- 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 +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- 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 +42 -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/html-injector-core.d.ts +242 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +182 -2906
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3892 -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-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata.d.ts +8 -0
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +119 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- 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 +59 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +140 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +62 -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 +23 -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 +78 -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 +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -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 +88 -43
- package/dist/server/primitives.d.ts.map +1 -1
- 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 +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -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/route-element-builder.d.ts +53 -25
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- 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 +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +69 -37
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +28 -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 +6 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +25 -1
- 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 +36 -4
- 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/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 +129 -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/slot-resolver.d.ts +66 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +72 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +22 -11
- 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 +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +69 -30
- package/dist/server/tree-builder.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 +71 -6
- package/dist/server/types.d.ts.map +1 -1
- 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 +15 -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/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.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/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.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 +35 -11
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -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 +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +154 -0
- package/docs/api/34-api-config.mdx +325 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -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/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +252 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +176 -0
- package/docs/learn/13-configuration.mdx +162 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +173 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +105 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +204 -0
- package/src/adapters/cloudflare.ts +620 -129
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +266 -122
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +2 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +114 -21
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +197 -19
- package/src/cache/singleflight.ts +64 -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 +161 -36
- 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 +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +167 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +113 -0
- package/src/client/browser-entry/post-hydration.ts +110 -0
- package/src/client/browser-entry/router-init.ts +286 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +21 -6
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +349 -150
- package/src/client/navigation-api.ts +345 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +589 -215
- package/src/client/rsc-fetch.ts +251 -34
- package/src/client/segment-cache.ts +105 -17
- package/src/client/segment-outlet.tsx +141 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -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 +13 -5
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +60 -15
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +108 -10
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +149 -0
- package/src/config-types.ts +282 -0
- package/src/config-validation.ts +330 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -53
- package/src/cookies/index.ts +12 -1
- 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 +187 -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 +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +100 -18
- package/src/fonts/local.ts +9 -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 +446 -352
- 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 +432 -0
- package/src/plugins/adapter-build.ts +220 -7
- package/src/plugins/build-manifest.ts +177 -23
- package/src/plugins/build-report.ts +253 -35
- 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 +1 -1
- package/src/plugins/dev-server.ts +284 -94
- package/src/plugins/entries.ts +134 -16
- package/src/plugins/fonts.ts +225 -660
- package/src/plugins/mdx.ts +47 -10
- 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 +328 -0
- package/src/plugins/request-dep.ts +458 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +241 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +372 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +313 -0
- package/src/routing/manifest-codegen.ts +287 -0
- package/src/routing/scanner.ts +338 -189
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +223 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +82 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +253 -0
- package/src/search-params/define.ts +576 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +101 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +111 -34
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +48 -54
- package/src/server/als-registry.ts +137 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +19 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +314 -0
- package/src/server/deny-renderer.ts +85 -77
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/html-injector-core.ts +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +31 -185
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata.ts +21 -0
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +336 -0
- package/src/server/param-coercion.ts +207 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +45 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +545 -0
- package/src/server/pipeline.ts +274 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +298 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +53 -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 +201 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +809 -0
- package/src/server/prebuilt-runtime.ts +815 -0
- package/src/server/primitives.ts +160 -83
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +170 -337
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +699 -295
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +158 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/deny-fallback.ts +92 -0
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +210 -85
- package/src/server/rsc-entry/index.ts +332 -332
- package/src/server/rsc-entry/render-route.ts +300 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +102 -42
- package/src/server/rsc-entry/rsc-stream.ts +93 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +275 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- 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/sitemap-generator.ts +345 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +574 -250
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -86
- package/src/server/ssr-render.ts +345 -86
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +177 -30
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +214 -90
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +78 -9
- 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/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -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 +51 -29
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.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/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.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +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/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/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/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/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
package/dist/adapters/nitro.js
CHANGED
|
@@ -1,114 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { n as IMMUTABLE_CACHE, t as runSharedBuildSteps } from "../_chunks/build-output-helper-DF5uScqS.js";
|
|
2
|
+
import { transformWithOxc } from "vite";
|
|
3
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
4
|
+
import { cp, glob, readFile, writeFile } from "node:fs/promises";
|
|
3
5
|
import { execFile } from "node:child_process";
|
|
6
|
+
//#region src/server/compress.ts?raw
|
|
7
|
+
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// ─── 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 'text/x-component',\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";
|
|
8
|
+
//#endregion
|
|
4
9
|
//#region src/adapters/compress-module.ts
|
|
5
10
|
/**
|
|
6
|
-
*
|
|
11
|
+
* Compile server/compress.ts into a standalone ESM module.
|
|
7
12
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
13
|
+
* Uses Vite's OXC transform to strip TypeScript types from the
|
|
14
|
+
* embedded source. The result is written to `_compress.mjs` during
|
|
15
|
+
* buildOutput.
|
|
10
16
|
*
|
|
11
17
|
* @internal Exported for testing.
|
|
12
18
|
*/
|
|
13
|
-
function generateCompressModule() {
|
|
14
|
-
return
|
|
15
|
-
// Do not edit — this file is regenerated on each build.
|
|
16
|
-
// Uses CompressionStream (Web API) for gzip. Brotli is left to CDNs/reverse
|
|
17
|
-
// proxies — at streaming quality levels its ratio advantage is marginal and
|
|
18
|
-
// node:zlib buffers output internally, breaking streaming.
|
|
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);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function compressWithGzip(body) {
|
|
65
|
-
return body.pipeThrough(new CompressionStream('gzip'));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function compressResponse(request, response) {
|
|
69
|
-
if (!shouldCompress(response)) return response;
|
|
70
|
-
const acceptEncoding = request.headers.get('Accept-Encoding') || '';
|
|
71
|
-
const encoding = negotiateEncoding(acceptEncoding);
|
|
72
|
-
if (!encoding) return response;
|
|
73
|
-
const compressedBody = compressWithGzip(response.body);
|
|
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
|
-
`;
|
|
19
|
+
async function generateCompressModule() {
|
|
20
|
+
return "// Generated by @timber-js/app — compiled from server/compress.ts.\n// Do not edit — this file is regenerated on each build.\n" + (await transformWithOxc(compress_default, "compress.ts", { lang: "ts" })).code;
|
|
92
21
|
}
|
|
93
22
|
//#endregion
|
|
94
23
|
//#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
|
-
}
|
|
108
24
|
var PRESET_CONFIGS = {
|
|
109
25
|
"vercel": {
|
|
110
26
|
nitroPreset: "vercel",
|
|
111
27
|
outputDir: ".vercel/output",
|
|
28
|
+
serverBundleDir: "functions/__server.func",
|
|
112
29
|
supportsWaitUntil: true,
|
|
113
30
|
supportsEarlyHints: false,
|
|
114
31
|
runtimeName: "vercel",
|
|
@@ -117,6 +34,7 @@ var PRESET_CONFIGS = {
|
|
|
117
34
|
"vercel-edge": {
|
|
118
35
|
nitroPreset: "vercel-edge",
|
|
119
36
|
outputDir: ".vercel/output",
|
|
37
|
+
serverBundleDir: "functions/__server.func",
|
|
120
38
|
supportsWaitUntil: true,
|
|
121
39
|
supportsEarlyHints: false,
|
|
122
40
|
runtimeName: "vercel-edge"
|
|
@@ -124,6 +42,7 @@ var PRESET_CONFIGS = {
|
|
|
124
42
|
"netlify": {
|
|
125
43
|
nitroPreset: "netlify",
|
|
126
44
|
outputDir: ".netlify/functions-internal",
|
|
45
|
+
serverBundleDir: "server",
|
|
127
46
|
supportsWaitUntil: false,
|
|
128
47
|
supportsEarlyHints: false,
|
|
129
48
|
runtimeName: "netlify"
|
|
@@ -131,6 +50,7 @@ var PRESET_CONFIGS = {
|
|
|
131
50
|
"netlify-edge": {
|
|
132
51
|
nitroPreset: "netlify-edge",
|
|
133
52
|
outputDir: ".netlify/edge-functions",
|
|
53
|
+
serverBundleDir: "server",
|
|
134
54
|
supportsWaitUntil: true,
|
|
135
55
|
supportsEarlyHints: false,
|
|
136
56
|
runtimeName: "netlify-edge"
|
|
@@ -138,6 +58,7 @@ var PRESET_CONFIGS = {
|
|
|
138
58
|
"aws-lambda": {
|
|
139
59
|
nitroPreset: "aws-lambda",
|
|
140
60
|
outputDir: ".output",
|
|
61
|
+
serverBundleDir: "server",
|
|
141
62
|
supportsWaitUntil: false,
|
|
142
63
|
supportsEarlyHints: false,
|
|
143
64
|
runtimeName: "aws-lambda"
|
|
@@ -145,6 +66,7 @@ var PRESET_CONFIGS = {
|
|
|
145
66
|
"deno-deploy": {
|
|
146
67
|
nitroPreset: "deno-deploy",
|
|
147
68
|
outputDir: ".output",
|
|
69
|
+
serverBundleDir: "server",
|
|
148
70
|
supportsWaitUntil: true,
|
|
149
71
|
supportsEarlyHints: false,
|
|
150
72
|
runtimeName: "deno-deploy"
|
|
@@ -152,6 +74,7 @@ var PRESET_CONFIGS = {
|
|
|
152
74
|
"azure-functions": {
|
|
153
75
|
nitroPreset: "azure-functions",
|
|
154
76
|
outputDir: ".output",
|
|
77
|
+
serverBundleDir: "server",
|
|
155
78
|
supportsWaitUntil: false,
|
|
156
79
|
supportsEarlyHints: false,
|
|
157
80
|
runtimeName: "azure-functions"
|
|
@@ -159,6 +82,7 @@ var PRESET_CONFIGS = {
|
|
|
159
82
|
"node-server": {
|
|
160
83
|
nitroPreset: "node-server",
|
|
161
84
|
outputDir: ".output",
|
|
85
|
+
serverBundleDir: "server",
|
|
162
86
|
supportsWaitUntil: true,
|
|
163
87
|
supportsEarlyHints: false,
|
|
164
88
|
runtimeName: "node-server"
|
|
@@ -166,6 +90,7 @@ var PRESET_CONFIGS = {
|
|
|
166
90
|
"bun": {
|
|
167
91
|
nitroPreset: "bun",
|
|
168
92
|
outputDir: ".output",
|
|
93
|
+
serverBundleDir: "server",
|
|
169
94
|
supportsWaitUntil: true,
|
|
170
95
|
supportsEarlyHints: false,
|
|
171
96
|
runtimeName: "bun"
|
|
@@ -190,25 +115,19 @@ var PRESET_CONFIGS = {
|
|
|
190
115
|
function nitro(options = {}) {
|
|
191
116
|
const preset = options.preset ?? "node-server";
|
|
192
117
|
const compress = options.compress ?? true;
|
|
193
|
-
|
|
194
|
-
const pendingPromises = [];
|
|
118
|
+
PRESET_CONFIGS[preset];
|
|
195
119
|
return {
|
|
196
120
|
name: `nitro-${preset}`,
|
|
197
121
|
async buildOutput(config, buildDir) {
|
|
198
122
|
const outDir = join(buildDir, "nitro");
|
|
199
|
-
await
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
await writeFile(join(publicDir, "_headers"), generateHeadersFile());
|
|
208
|
-
if (config.manifestInit) await writeFile(join(outDir, "_timber-manifest-init.js"), config.manifestInit);
|
|
209
|
-
await writeFile(join(outDir, "_compress.mjs"), generateCompressModule());
|
|
210
|
-
await cp(join(buildDir, "rsc"), join(outDir, "rsc"), { recursive: true });
|
|
211
|
-
await cp(join(buildDir, "ssr"), join(outDir, "ssr"), { recursive: true }).catch(() => {});
|
|
123
|
+
await runSharedBuildSteps({
|
|
124
|
+
config,
|
|
125
|
+
buildDir,
|
|
126
|
+
outDir,
|
|
127
|
+
publicDirName: "public"
|
|
128
|
+
});
|
|
129
|
+
await writeFile(join(outDir, "_compress.mjs"), await generateCompressModule());
|
|
130
|
+
await writeFile(join(outDir, "_send-response.mjs"), generateSendResponseModule());
|
|
212
131
|
if (config.manifestInit) {
|
|
213
132
|
const rscEntry = join(outDir, "rsc", "index.js");
|
|
214
133
|
const rscContent = await readFile(rscEntry, "utf-8");
|
|
@@ -216,24 +135,23 @@ function nitro(options = {}) {
|
|
|
216
135
|
}
|
|
217
136
|
const entry = generateNitroEntry(buildDir, outDir, preset, compress);
|
|
218
137
|
await writeFile(join(outDir, "entry.ts"), entry);
|
|
219
|
-
await runNitroBuild(outDir, preset, options.nitroConfig);
|
|
138
|
+
const { serverDir } = await runNitroBuild(outDir, preset, options.nitroConfig);
|
|
139
|
+
const prebuiltSrc = join(buildDir, "prebuilt");
|
|
140
|
+
await cp(prebuiltSrc, join(serverDir, "prebuilt"), { recursive: true }).catch((e) => {
|
|
141
|
+
if (e.code !== "ENOENT") throw e;
|
|
142
|
+
});
|
|
143
|
+
if (preset === "vercel" || preset === "vercel-edge") await copyPrebuiltToVercelFuncClones(dirname(serverDir), prebuiltSrc, basename(serverDir));
|
|
220
144
|
},
|
|
221
145
|
preview: LOCALLY_PREVIEWABLE.has(preset) ? async (_config, buildDir) => {
|
|
222
146
|
const previewScript = generatePreviewScript(buildDir, preset);
|
|
223
147
|
const scriptPath = join(buildDir, "nitro", "_preview-server.mjs");
|
|
224
148
|
await writeFile(scriptPath, previewScript);
|
|
225
149
|
await spawnNitroPreview(preset === "bun" ? "bun" : "node", [scriptPath], join(buildDir, "nitro"));
|
|
226
|
-
} : void 0,
|
|
227
|
-
waitUntil: presetConfig.supportsWaitUntil ? (promise) => {
|
|
228
|
-
const tracked = promise.catch((err) => {
|
|
229
|
-
console.error("[timber] waitUntil promise rejected:", err);
|
|
230
|
-
});
|
|
231
|
-
pendingPromises.push(tracked);
|
|
232
150
|
} : void 0
|
|
233
151
|
};
|
|
234
152
|
}
|
|
235
153
|
/** @internal Exported for testing. */
|
|
236
|
-
function generateNitroEntry(buildDir, outDir, preset, compress = true
|
|
154
|
+
function generateNitroEntry(buildDir, outDir, preset, compress = true) {
|
|
237
155
|
const serverEntryRelative = "./rsc/index.js";
|
|
238
156
|
const runtimeName = PRESET_CONFIGS[preset].runtimeName;
|
|
239
157
|
const earlyHints = PRESET_CONFIGS[preset].supportsEarlyHints;
|
|
@@ -274,7 +192,7 @@ function generateNitroEntry(buildDir, outDir, preset, compress = true, hasManife
|
|
|
274
192
|
return `// Generated by @timber-js/app/adapters/nitro
|
|
275
193
|
// Do not edit — this file is regenerated on each build.
|
|
276
194
|
|
|
277
|
-
|
|
195
|
+
import handler, { runWithEarlyHintsSender${supportsWaitUntil ? ", runWithWaitUntil" : ""} } from '${serverEntryRelative}'
|
|
278
196
|
${compress ? "import { compressResponse } from './_compress.mjs'\n" : ""}
|
|
279
197
|
// Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
|
|
280
198
|
// See design/25-production-deployments.md §"TIMBER_RUNTIME".
|
|
@@ -293,27 +211,8 @@ ${handlerCall}
|
|
|
293
211
|
}
|
|
294
212
|
`;
|
|
295
213
|
}
|
|
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
|
-
`;
|
|
314
|
-
}
|
|
315
214
|
/** Presets that produce a locally-runnable server entry. */
|
|
316
|
-
var LOCALLY_PREVIEWABLE = new Set(["node-server", "bun"]);
|
|
215
|
+
var LOCALLY_PREVIEWABLE = /* @__PURE__ */ new Set(["node-server", "bun"]);
|
|
317
216
|
/**
|
|
318
217
|
* Generate a standalone preview server script that uses Node's built-in
|
|
319
218
|
* HTTP server. This bypasses Nitro entirely — the Nitro entry.ts imports
|
|
@@ -353,6 +252,9 @@ const { default: handler, runWithEarlyHintsSender } = await import('${rscEntry}'
|
|
|
353
252
|
// Import compression helper for self-hosted response compression.
|
|
354
253
|
const { compressResponse } = await import('./_compress.mjs');
|
|
355
254
|
|
|
255
|
+
// Web→Node response bridge with backpressure (TIM-1154).
|
|
256
|
+
const { sendNodeResponse } = await import('./_send-response.mjs');
|
|
257
|
+
|
|
356
258
|
const MIME_TYPES = {
|
|
357
259
|
'.html': 'text/html',
|
|
358
260
|
'.js': 'application/javascript',
|
|
@@ -379,11 +281,32 @@ const MIME_TYPES = {
|
|
|
379
281
|
};
|
|
380
282
|
|
|
381
283
|
const publicDir = join(__dirname, '${publicDir}');
|
|
382
|
-
|
|
383
|
-
|
|
284
|
+
|
|
285
|
+
// Port resolution (TIM-842):
|
|
286
|
+
// - Default to 3000
|
|
287
|
+
// - If PORT env var is set, honor it strictly (fail loudly on conflict)
|
|
288
|
+
// - Otherwise auto-bump from 3000 until a free port is found
|
|
289
|
+
// Mirrors the dev server behavior so timber dev/preview/production all
|
|
290
|
+
// behave the same way around port selection.
|
|
291
|
+
const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : null;
|
|
292
|
+
const portIsExplicit = envPort != null && Number.isFinite(envPort) && envPort > 0;
|
|
293
|
+
const startPort = portIsExplicit ? envPort : 3000;
|
|
294
|
+
const host = process.env.HOST || 'localhost';
|
|
295
|
+
|
|
296
|
+
// Set after listenWithBump() resolves so request handlers can build
|
|
297
|
+
// absolute URLs from the actual bound port (which may differ from
|
|
298
|
+
// startPort after an auto-bump).
|
|
299
|
+
let boundPort = startPort;
|
|
384
300
|
|
|
385
301
|
const server = createServer(async (req, res) => {
|
|
386
|
-
|
|
302
|
+
// Scheme from the socket's TLS state — a hardcoded http:// breaks CSRF
|
|
303
|
+
// origin comparison and absolute-URL construction when TLS is terminated
|
|
304
|
+
// at this server (TIM-1073; mirrors the dev-server fix in TIM-1067).
|
|
305
|
+
// X-Forwarded-Proto is intentionally not consulted here: on a direct
|
|
306
|
+
// connection it would be attacker-controlled. The CSRF layer honors it
|
|
307
|
+
// separately for reverse-proxy deployments.
|
|
308
|
+
const scheme = req.socket?.encrypted ? 'https' : 'http';
|
|
309
|
+
const url = new URL(req.url || '/', \`\${scheme}://\${host}:\${boundPort}\`);
|
|
387
310
|
|
|
388
311
|
// Try serving static files from the public directory first.
|
|
389
312
|
const filePath = join(publicDir, url.pathname);
|
|
@@ -396,7 +319,9 @@ const server = createServer(async (req, res) => {
|
|
|
396
319
|
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
397
320
|
const body = await readFile(filePath);
|
|
398
321
|
// Hashed assets get immutable cache, others get short cache.
|
|
399
|
-
const
|
|
322
|
+
const isImmutable =
|
|
323
|
+
url.pathname.startsWith('/assets/') || url.pathname.startsWith('/_timber/fonts/');
|
|
324
|
+
const cacheControl = isImmutable
|
|
400
325
|
? 'public, max-age=31536000, immutable'
|
|
401
326
|
: 'public, max-age=3600, must-revalidate';
|
|
402
327
|
res.writeHead(200, {
|
|
@@ -453,22 +378,11 @@ const server = createServer(async (req, res) => {
|
|
|
453
378
|
// Compress the response for self-hosted deployments.
|
|
454
379
|
const webResponse = compressResponse(webRequest, rawResponse);
|
|
455
380
|
|
|
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
|
-
}
|
|
381
|
+
// Write the response to Node's ServerResponse. sendNodeResponse handles
|
|
382
|
+
// status, headers (including Set-Cookie splitting via [...headers]),
|
|
383
|
+
// body streaming with backpressure, and client disconnect cleanup.
|
|
384
|
+
// See TIM-1154.
|
|
385
|
+
await sendNodeResponse(res, webResponse);
|
|
472
386
|
} catch (err) {
|
|
473
387
|
console.error('[timber preview] Request error:', err);
|
|
474
388
|
if (!res.headersSent) {
|
|
@@ -478,13 +392,49 @@ const server = createServer(async (req, res) => {
|
|
|
478
392
|
}
|
|
479
393
|
});
|
|
480
394
|
|
|
481
|
-
|
|
395
|
+
function listenWithBump(port, attempt = 0) {
|
|
396
|
+
return new Promise((resolveListen, rejectListen) => {
|
|
397
|
+
const onError = (err) => {
|
|
398
|
+
server.removeListener('listening', onListening);
|
|
399
|
+
if (err && err.code === 'EADDRINUSE' && !portIsExplicit && attempt < 100) {
|
|
400
|
+
if (attempt === 0) {
|
|
401
|
+
console.log(\` [timber] Port \${port} in use, trying \${port + 1}...\`);
|
|
402
|
+
}
|
|
403
|
+
listenWithBump(port + 1, attempt + 1).then(resolveListen, rejectListen);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
rejectListen(err);
|
|
407
|
+
};
|
|
408
|
+
const onListening = () => {
|
|
409
|
+
server.removeListener('error', onError);
|
|
410
|
+
resolveListen(port);
|
|
411
|
+
};
|
|
412
|
+
server.once('error', onError);
|
|
413
|
+
server.once('listening', onListening);
|
|
414
|
+
server.listen(port, host);
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
try {
|
|
419
|
+
boundPort = await listenWithBump(startPort);
|
|
420
|
+
if (boundPort !== startPort) {
|
|
421
|
+
console.log();
|
|
422
|
+
console.log(\` [timber] Port \${startPort} in use, using \${boundPort}\`);
|
|
423
|
+
}
|
|
482
424
|
console.log();
|
|
483
425
|
console.log(' ⚡ timber preview server running at:');
|
|
484
426
|
console.log();
|
|
485
|
-
console.log(\` ➜ http://\${host}:\${
|
|
427
|
+
console.log(\` ➜ http://\${host}:\${boundPort}\`);
|
|
486
428
|
console.log();
|
|
487
|
-
})
|
|
429
|
+
} catch (err) {
|
|
430
|
+
if (err && err.code === 'EADDRINUSE') {
|
|
431
|
+
console.error(\`[timber] Port \${startPort} is already in use. \` +
|
|
432
|
+
'Set PORT to a free port, or unset PORT to auto-pick.');
|
|
433
|
+
} else {
|
|
434
|
+
console.error('[timber] Failed to start preview server:', err);
|
|
435
|
+
}
|
|
436
|
+
process.exit(1);
|
|
437
|
+
}
|
|
488
438
|
`;
|
|
489
439
|
}
|
|
490
440
|
/** @internal Exported for testing. */
|
|
@@ -498,12 +448,6 @@ function generateNitroPreviewCommand(buildDir, preset) {
|
|
|
498
448
|
cwd: nitroDir
|
|
499
449
|
};
|
|
500
450
|
}
|
|
501
|
-
/**
|
|
502
|
-
* Run the Nitro production build using the programmatic API.
|
|
503
|
-
* Uses dynamic import so nitro is only loaded at build time.
|
|
504
|
-
* Externalizes the timber RSC/SSR output — those files are pre-built
|
|
505
|
-
* by timber and have internal references that nitro's bundler can't follow.
|
|
506
|
-
*/
|
|
507
451
|
async function runNitroBuild(nitroDir, preset, userConfig) {
|
|
508
452
|
const presetConfig = PRESET_CONFIGS[preset];
|
|
509
453
|
const { createNitro, build: nitroBuild, prepare, copyPublicAssets } = await import("nitro/builder");
|
|
@@ -512,15 +456,21 @@ async function runNitroBuild(nitroDir, preset, userConfig) {
|
|
|
512
456
|
preset: presetConfig.nitroPreset,
|
|
513
457
|
renderer: { handler: join(nitroDir, "entry.ts") },
|
|
514
458
|
output: { dir: join(nitroDir, presetConfig.outputDir) },
|
|
515
|
-
routeRules: {
|
|
459
|
+
routeRules: {
|
|
460
|
+
"/assets/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } },
|
|
461
|
+
"/_timber/fonts/**": { headers: { "Cache-Control": IMMUTABLE_CACHE } }
|
|
462
|
+
},
|
|
516
463
|
rollupConfig: { external: [/\.\.\/rsc\//] },
|
|
517
464
|
...presetConfig.extraConfig,
|
|
518
465
|
...userConfig
|
|
519
466
|
});
|
|
467
|
+
const raw = nitro.options.output.serverDir;
|
|
468
|
+
const serverDir = raw.endsWith("/") ? raw.slice(0, -1) : raw;
|
|
520
469
|
await prepare(nitro);
|
|
521
470
|
await copyPublicAssets(nitro);
|
|
522
471
|
await nitroBuild(nitro);
|
|
523
472
|
await nitro.close();
|
|
473
|
+
return { serverDir };
|
|
524
474
|
}
|
|
525
475
|
/** Spawn a Nitro preview process and pipe stdio. */
|
|
526
476
|
function spawnNitroPreview(command, args, cwd) {
|
|
@@ -534,13 +484,115 @@ function spawnNitroPreview(command, args, cwd) {
|
|
|
534
484
|
});
|
|
535
485
|
}
|
|
536
486
|
/**
|
|
487
|
+
* Generate a standalone ESM module that exports sendNodeResponse.
|
|
488
|
+
*
|
|
489
|
+
* Mirrors srvx/node's sendNodeResponse: status + headers via writeHead,
|
|
490
|
+
* body streaming with backpressure (waits for drain on write() === false),
|
|
491
|
+
* and client disconnect cleanup. Written to `_send-response.mjs` during
|
|
492
|
+
* buildOutput for use by the preview server script. See TIM-1154.
|
|
493
|
+
*
|
|
494
|
+
* @internal Exported for testing.
|
|
495
|
+
*/
|
|
496
|
+
function generateSendResponseModule() {
|
|
497
|
+
return `// Generated by @timber-js/app — Web→Node response bridge.
|
|
498
|
+
// Do not edit — this file is regenerated on each build.
|
|
499
|
+
// Mirrors srvx/node's sendNodeResponse with backpressure support.
|
|
500
|
+
|
|
501
|
+
export function sendNodeResponse(nodeRes, webRes) {
|
|
502
|
+
if (!webRes) {
|
|
503
|
+
nodeRes.statusCode = 500;
|
|
504
|
+
return new Promise((resolve) => nodeRes.end(resolve));
|
|
505
|
+
}
|
|
506
|
+
const rawHeaders = [...webRes.headers];
|
|
507
|
+
const writeHeaders = rawHeaders.flat();
|
|
508
|
+
if (!nodeRes.headersSent) {
|
|
509
|
+
if (nodeRes.req?.httpVersion === '2.0') {
|
|
510
|
+
nodeRes.writeHead(webRes.status, writeHeaders);
|
|
511
|
+
} else {
|
|
512
|
+
nodeRes.writeHead(webRes.status, webRes.statusText, writeHeaders);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
if (!webRes.body) {
|
|
516
|
+
return new Promise((resolve) => nodeRes.end(resolve));
|
|
517
|
+
}
|
|
518
|
+
// Stream with backpressure: pause reading when the kernel buffer is
|
|
519
|
+
// full (write() returns false) and resume on 'drain'.
|
|
520
|
+
if (nodeRes.destroyed) {
|
|
521
|
+
webRes.body.cancel();
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
const reader = webRes.body.getReader();
|
|
525
|
+
function streamCancel(error) {
|
|
526
|
+
reader.cancel(error).catch(() => {});
|
|
527
|
+
if (error) nodeRes.destroy(error);
|
|
528
|
+
}
|
|
529
|
+
function streamHandle({ done, value }) {
|
|
530
|
+
try {
|
|
531
|
+
if (done) {
|
|
532
|
+
nodeRes.end();
|
|
533
|
+
} else if (nodeRes.write(value)) {
|
|
534
|
+
reader.read().then(streamHandle, streamCancel);
|
|
535
|
+
} else {
|
|
536
|
+
nodeRes.once('drain', () => reader.read().then(streamHandle, streamCancel));
|
|
537
|
+
}
|
|
538
|
+
} catch (error) {
|
|
539
|
+
streamCancel(error instanceof Error ? error : undefined);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
nodeRes.on('close', streamCancel);
|
|
543
|
+
nodeRes.on('error', streamCancel);
|
|
544
|
+
reader.read().then(streamHandle, streamCancel);
|
|
545
|
+
return reader.closed.catch(streamCancel).finally(() => {
|
|
546
|
+
nodeRes.off('close', streamCancel);
|
|
547
|
+
nodeRes.off('error', streamCancel);
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
`;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
537
553
|
* Get the preset configuration for a given preset name.
|
|
538
554
|
* @internal Exported for testing.
|
|
539
555
|
*/
|
|
540
556
|
function getPresetConfig(preset) {
|
|
541
557
|
return PRESET_CONFIGS[preset];
|
|
542
558
|
}
|
|
559
|
+
/**
|
|
560
|
+
* Resolve the destination path for prebuilt flight payloads in the Nitro
|
|
561
|
+
* output directory. The RSC entry resolves `../prebuilt/` relative to its
|
|
562
|
+
* bundled chunk location (`<serverBundleDir>/_chunks/`), so prebuilt/ must
|
|
563
|
+
* live at `<serverBundleDir>/prebuilt/`.
|
|
564
|
+
*
|
|
565
|
+
* The serverBundleDir varies by preset — Nitro's Vercel preset uses
|
|
566
|
+
* `functions/__server.func` while most others use `server`.
|
|
567
|
+
*
|
|
568
|
+
* @internal Exported for testing.
|
|
569
|
+
*/
|
|
570
|
+
function resolvePrebuiltOutputPath(outDir, preset) {
|
|
571
|
+
const presetConfig = PRESET_CONFIGS[preset];
|
|
572
|
+
return join(outDir, presetConfig.outputDir, presetConfig.serverBundleDir, "prebuilt");
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Copy prebuilt payloads into cloned Vercel function directories.
|
|
576
|
+
*
|
|
577
|
+
* When users configure `vercel.functionRules`, Nitro's compiled hook clones
|
|
578
|
+
* the base __server.func to per-route .func directories. These clones are
|
|
579
|
+
* created during `runNitroBuild()` — before our post-build prebuilt copy.
|
|
580
|
+
* Each clone resolves `../prebuilt` independently, so they each need a copy.
|
|
581
|
+
*
|
|
582
|
+
* @internal Exported for testing.
|
|
583
|
+
*/
|
|
584
|
+
async function copyPrebuiltToVercelFuncClones(functionsDir, prebuiltSrc, baseFuncName) {
|
|
585
|
+
const funcDirs = [];
|
|
586
|
+
try {
|
|
587
|
+
for await (const match of glob("**/*.func", { cwd: functionsDir })) if (!match.endsWith(baseFuncName)) funcDirs.push(join(functionsDir, match));
|
|
588
|
+
} catch {
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
await Promise.all(funcDirs.map((dir) => cp(prebuiltSrc, join(dir, "prebuilt"), { recursive: true }).catch((e) => {
|
|
592
|
+
if (e.code !== "ENOENT") throw e;
|
|
593
|
+
})));
|
|
594
|
+
}
|
|
543
595
|
//#endregion
|
|
544
|
-
export {
|
|
596
|
+
export { copyPrebuiltToVercelFuncClones, generateNitroEntry, generateNitroPreviewCommand, generatePreviewScript, generateSendResponseModule, getPresetConfig, nitro, resolvePrebuiltOutputPath };
|
|
545
597
|
|
|
546
598
|
//# sourceMappingURL=nitro.js.map
|