@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/src/adapters/nitro.ts
CHANGED
|
@@ -5,28 +5,13 @@
|
|
|
5
5
|
// compression, graceful shutdown, static file serving, and platform quirks.
|
|
6
6
|
// See design/11-platform.md and design/25-production-deployments.md.
|
|
7
7
|
|
|
8
|
-
import { writeFile, readFile,
|
|
8
|
+
import { writeFile, readFile, cp, glob } from 'node:fs/promises';
|
|
9
9
|
import { execFile } from 'node:child_process';
|
|
10
|
-
import { join, relative } from 'node:path';
|
|
10
|
+
import { join, relative, dirname, basename } from 'node:path';
|
|
11
11
|
import type { TimberPlatformAdapter, TimberConfig } from './types';
|
|
12
12
|
import { generateCompressModule } from './compress-module.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// directory .ts imports don't resolve.
|
|
16
|
-
const IMMUTABLE_CACHE = 'public, max-age=31536000, immutable';
|
|
17
|
-
const STATIC_CACHE = 'public, max-age=3600, must-revalidate';
|
|
18
|
-
|
|
19
|
-
function generateHeadersFile(): string {
|
|
20
|
-
return `# Auto-generated by @timber-js/app — static asset cache headers.
|
|
21
|
-
# See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
22
|
-
|
|
23
|
-
/assets/*
|
|
24
|
-
Cache-Control: ${IMMUTABLE_CACHE}
|
|
25
|
-
|
|
26
|
-
/*
|
|
27
|
-
Cache-Control: ${STATIC_CACHE}
|
|
28
|
-
`;
|
|
29
|
-
}
|
|
13
|
+
import { IMMUTABLE_CACHE } from './shared.js';
|
|
14
|
+
import { runSharedBuildSteps } from './build-output-helper.js';
|
|
30
15
|
|
|
31
16
|
// ─── Presets ─────────────────────────────────────────────────────────────────
|
|
32
17
|
|
|
@@ -53,6 +38,12 @@ interface PresetConfig {
|
|
|
53
38
|
nitroPreset: string;
|
|
54
39
|
/** Output directory name within the build dir. */
|
|
55
40
|
outputDir: string;
|
|
41
|
+
/**
|
|
42
|
+
* Path to the server bundle directory relative to outputDir.
|
|
43
|
+
* Nitro places the bundled server entry + _chunks/ here.
|
|
44
|
+
* Most presets use `server`; Vercel uses `functions/__server.func`.
|
|
45
|
+
*/
|
|
46
|
+
serverBundleDir: string;
|
|
56
47
|
/** Whether the runtime supports waitUntil. */
|
|
57
48
|
supportsWaitUntil: boolean;
|
|
58
49
|
/** Whether the runtime supports application-level 103 Early Hints. */
|
|
@@ -67,6 +58,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
67
58
|
'vercel': {
|
|
68
59
|
nitroPreset: 'vercel',
|
|
69
60
|
outputDir: '.vercel/output',
|
|
61
|
+
serverBundleDir: 'functions/__server.func',
|
|
70
62
|
supportsWaitUntil: true,
|
|
71
63
|
supportsEarlyHints: false,
|
|
72
64
|
runtimeName: 'vercel',
|
|
@@ -75,6 +67,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
75
67
|
'vercel-edge': {
|
|
76
68
|
nitroPreset: 'vercel-edge',
|
|
77
69
|
outputDir: '.vercel/output',
|
|
70
|
+
serverBundleDir: 'functions/__server.func',
|
|
78
71
|
supportsWaitUntil: true,
|
|
79
72
|
supportsEarlyHints: false,
|
|
80
73
|
runtimeName: 'vercel-edge',
|
|
@@ -82,6 +75,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
82
75
|
'netlify': {
|
|
83
76
|
nitroPreset: 'netlify',
|
|
84
77
|
outputDir: '.netlify/functions-internal',
|
|
78
|
+
serverBundleDir: 'server',
|
|
85
79
|
supportsWaitUntil: false,
|
|
86
80
|
supportsEarlyHints: false,
|
|
87
81
|
runtimeName: 'netlify',
|
|
@@ -89,6 +83,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
89
83
|
'netlify-edge': {
|
|
90
84
|
nitroPreset: 'netlify-edge',
|
|
91
85
|
outputDir: '.netlify/edge-functions',
|
|
86
|
+
serverBundleDir: 'server',
|
|
92
87
|
supportsWaitUntil: true,
|
|
93
88
|
supportsEarlyHints: false,
|
|
94
89
|
runtimeName: 'netlify-edge',
|
|
@@ -96,6 +91,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
96
91
|
'aws-lambda': {
|
|
97
92
|
nitroPreset: 'aws-lambda',
|
|
98
93
|
outputDir: '.output',
|
|
94
|
+
serverBundleDir: 'server',
|
|
99
95
|
supportsWaitUntil: false,
|
|
100
96
|
supportsEarlyHints: false,
|
|
101
97
|
runtimeName: 'aws-lambda',
|
|
@@ -103,6 +99,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
103
99
|
'deno-deploy': {
|
|
104
100
|
nitroPreset: 'deno-deploy',
|
|
105
101
|
outputDir: '.output',
|
|
102
|
+
serverBundleDir: 'server',
|
|
106
103
|
supportsWaitUntil: true,
|
|
107
104
|
supportsEarlyHints: false,
|
|
108
105
|
runtimeName: 'deno-deploy',
|
|
@@ -110,6 +107,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
110
107
|
'azure-functions': {
|
|
111
108
|
nitroPreset: 'azure-functions',
|
|
112
109
|
outputDir: '.output',
|
|
110
|
+
serverBundleDir: 'server',
|
|
113
111
|
supportsWaitUntil: false,
|
|
114
112
|
supportsEarlyHints: false,
|
|
115
113
|
runtimeName: 'azure-functions',
|
|
@@ -117,6 +115,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
117
115
|
'node-server': {
|
|
118
116
|
nitroPreset: 'node-server',
|
|
119
117
|
outputDir: '.output',
|
|
118
|
+
serverBundleDir: 'server',
|
|
120
119
|
supportsWaitUntil: true,
|
|
121
120
|
// Disabled by default: most node-server deployments sit behind a
|
|
122
121
|
// reverse proxy (nginx, caddy, traefik) that doesn't support 103
|
|
@@ -131,6 +130,7 @@ const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
|
|
|
131
130
|
'bun': {
|
|
132
131
|
nitroPreset: 'bun',
|
|
133
132
|
outputDir: '.output',
|
|
133
|
+
serverBundleDir: 'server',
|
|
134
134
|
supportsWaitUntil: true,
|
|
135
135
|
// Disabled for same reason as node-server — reverse proxies choke on 103.
|
|
136
136
|
// Link headers on the 200 response are converted to 103 by CDNs.
|
|
@@ -195,46 +195,28 @@ export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter
|
|
|
195
195
|
const preset = options.preset ?? 'node-server';
|
|
196
196
|
const compress = options.compress ?? true;
|
|
197
197
|
const presetConfig = PRESET_CONFIGS[preset];
|
|
198
|
-
const pendingPromises: Promise<unknown>[] = [];
|
|
199
|
-
|
|
200
198
|
return {
|
|
201
199
|
name: `nitro-${preset}`,
|
|
202
200
|
|
|
203
201
|
async buildOutput(config: TimberConfig, buildDir: string) {
|
|
204
202
|
const outDir = join(buildDir, 'nitro');
|
|
205
|
-
await mkdir(outDir, { recursive: true });
|
|
206
|
-
|
|
207
|
-
// Copy client assets to public directory.
|
|
208
|
-
// When client JavaScript is disabled, skip .js files — only CSS,
|
|
209
|
-
// fonts, images, and other static assets are needed.
|
|
210
|
-
const clientDir = join(buildDir, 'client');
|
|
211
|
-
const publicDir = join(outDir, 'public');
|
|
212
|
-
await mkdir(publicDir, { recursive: true });
|
|
213
|
-
await cp(clientDir, publicDir, {
|
|
214
|
-
recursive: true,
|
|
215
|
-
filter: config.clientJavascriptDisabled ? (src: string) => !src.endsWith('.js') : undefined,
|
|
216
|
-
}).catch(() => {
|
|
217
|
-
// Client dir may not exist when client JavaScript is disabled
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
// Write _headers file for platforms that support it (Netlify, etc.).
|
|
221
|
-
// See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
222
|
-
await writeFile(join(publicDir, '_headers'), generateHeadersFile());
|
|
223
203
|
|
|
224
|
-
//
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
204
|
+
// Steps 1–5: shared across all adapters (mkdir, copy client/rsc/ssr,
|
|
205
|
+
// write _headers, write manifest-init).
|
|
206
|
+
await runSharedBuildSteps({
|
|
207
|
+
config,
|
|
208
|
+
buildDir,
|
|
209
|
+
outDir,
|
|
210
|
+
publicDirName: 'public',
|
|
211
|
+
});
|
|
228
212
|
|
|
229
|
-
// Write
|
|
213
|
+
// Write runtime helper modules used by the preview server.
|
|
230
214
|
// See design/25-production-deployments.md — self-hosted deployments
|
|
231
215
|
// need application-level compression (Cloudflare handles it at the edge).
|
|
232
|
-
await writeFile(join(outDir, '_compress.mjs'), generateCompressModule());
|
|
216
|
+
await writeFile(join(outDir, '_compress.mjs'), await generateCompressModule());
|
|
233
217
|
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
await cp(join(buildDir, 'rsc'), join(outDir, 'rsc'), { recursive: true });
|
|
237
|
-
await cp(join(buildDir, 'ssr'), join(outDir, 'ssr'), { recursive: true }).catch(() => {});
|
|
218
|
+
// Web→Node response bridge with backpressure. See TIM-1154.
|
|
219
|
+
await writeFile(join(outDir, '_send-response.mjs'), generateSendResponseModule());
|
|
238
220
|
|
|
239
221
|
// Prepend the manifest assignment directly into the RSC entry so
|
|
240
222
|
// globalThis.__TIMBER_BUILD_MANIFEST__ is set before any module reads it.
|
|
@@ -253,7 +235,29 @@ export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter
|
|
|
253
235
|
// Run the Nitro build to produce a production-ready server bundle.
|
|
254
236
|
// The output goes to dist/nitro/.output/server/index.mjs (for node-server preset).
|
|
255
237
|
// Config is passed programmatically — no nitro.config.ts file needed.
|
|
256
|
-
await runNitroBuild(outDir, preset, options.nitroConfig);
|
|
238
|
+
const { serverDir } = await runNitroBuild(outDir, preset, options.nitroConfig);
|
|
239
|
+
|
|
240
|
+
// Copy prebuilt flight payloads from the canonical build source
|
|
241
|
+
// (buildDir/prebuilt, cleaned by the prebuilt plugin each build) into
|
|
242
|
+
// the Nitro output. The RSC entry resolves `../prebuilt/` relative to
|
|
243
|
+
// its bundled chunk (<serverDir>/_chunks/), so prebuilt/ must live at
|
|
244
|
+
// <serverDir>/prebuilt/. serverDir is the resolved path from Nitro
|
|
245
|
+
// (honors user overrides via nitroConfig.output.serverDir).
|
|
246
|
+
const prebuiltSrc = join(buildDir, 'prebuilt');
|
|
247
|
+
await cp(prebuiltSrc, join(serverDir, 'prebuilt'), {
|
|
248
|
+
recursive: true,
|
|
249
|
+
}).catch((e: NodeJS.ErrnoException) => {
|
|
250
|
+
if (e.code !== 'ENOENT') throw e;
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Vercel with functionRules clones __server.func to per-route .func
|
|
254
|
+
// directories during the Nitro build. Copy prebuilt into those clones
|
|
255
|
+
// so requests routed to them also resolve ../prebuilt correctly.
|
|
256
|
+
if (preset === 'vercel' || preset === 'vercel-edge') {
|
|
257
|
+
const functionsDir = dirname(serverDir);
|
|
258
|
+
const baseFuncName = basename(serverDir);
|
|
259
|
+
await copyPrebuiltToVercelFuncClones(functionsDir, prebuiltSrc, baseFuncName);
|
|
260
|
+
}
|
|
257
261
|
},
|
|
258
262
|
|
|
259
263
|
// Only presets that produce a locally-runnable server get preview().
|
|
@@ -272,15 +276,6 @@ export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter
|
|
|
272
276
|
await spawnNitroPreview(command, [scriptPath], join(buildDir, 'nitro'));
|
|
273
277
|
}
|
|
274
278
|
: undefined,
|
|
275
|
-
|
|
276
|
-
waitUntil: presetConfig.supportsWaitUntil
|
|
277
|
-
? (promise: Promise<unknown>) => {
|
|
278
|
-
const tracked = promise.catch((err) => {
|
|
279
|
-
console.error('[timber] waitUntil promise rejected:', err);
|
|
280
|
-
});
|
|
281
|
-
pendingPromises.push(tracked);
|
|
282
|
-
}
|
|
283
|
-
: undefined,
|
|
284
279
|
};
|
|
285
280
|
}
|
|
286
281
|
|
|
@@ -291,8 +286,7 @@ export function generateNitroEntry(
|
|
|
291
286
|
buildDir: string,
|
|
292
287
|
outDir: string,
|
|
293
288
|
preset: NitroPreset,
|
|
294
|
-
compress = true
|
|
295
|
-
hasManifestInit = false
|
|
289
|
+
compress = true
|
|
296
290
|
): string {
|
|
297
291
|
// The RSC entry is the main request handler — it exports the fetch handler as default.
|
|
298
292
|
// rsc/ is copied into the nitro dir so the import is local.
|
|
@@ -349,11 +343,6 @@ export function generateNitroEntry(
|
|
|
349
343
|
handlerCall = ` const webResponse = await handler(webRequest)`;
|
|
350
344
|
}
|
|
351
345
|
|
|
352
|
-
// Build manifest init must be imported before the handler so that
|
|
353
|
-
// globalThis.__TIMBER_BUILD_MANIFEST__ is set when the virtual module evaluates.
|
|
354
|
-
// ESM guarantees imports are evaluated in order.
|
|
355
|
-
const manifestImport = hasManifestInit ? "import './_timber-manifest-init.js'\n" : '';
|
|
356
|
-
|
|
357
346
|
// Import runWithWaitUntil only when the preset supports it.
|
|
358
347
|
const waitUntilImport = supportsWaitUntil ? ', runWithWaitUntil' : '';
|
|
359
348
|
|
|
@@ -363,7 +352,7 @@ export function generateNitroEntry(
|
|
|
363
352
|
return `// Generated by @timber-js/app/adapters/nitro
|
|
364
353
|
// Do not edit — this file is regenerated on each build.
|
|
365
354
|
|
|
366
|
-
|
|
355
|
+
import handler, { runWithEarlyHintsSender${waitUntilImport} } from '${serverEntryRelative}'
|
|
367
356
|
${compressImport}
|
|
368
357
|
// Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
|
|
369
358
|
// See design/25-production-deployments.md §"TIMBER_RUNTIME".
|
|
@@ -383,37 +372,6 @@ ${handlerCall}
|
|
|
383
372
|
`;
|
|
384
373
|
}
|
|
385
374
|
|
|
386
|
-
/** @internal Exported for testing. */
|
|
387
|
-
export function generateNitroConfig(
|
|
388
|
-
preset: NitroPreset,
|
|
389
|
-
userConfig?: Record<string, unknown>
|
|
390
|
-
): string {
|
|
391
|
-
const presetConfig = PRESET_CONFIGS[preset];
|
|
392
|
-
|
|
393
|
-
const config: Record<string, unknown> = {
|
|
394
|
-
preset: presetConfig.nitroPreset,
|
|
395
|
-
entry: './entry.ts',
|
|
396
|
-
output: { dir: presetConfig.outputDir },
|
|
397
|
-
// Static asset cache headers — hashed assets are immutable, others get 1h.
|
|
398
|
-
// See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
399
|
-
routeRules: {
|
|
400
|
-
'/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
|
|
401
|
-
},
|
|
402
|
-
...presetConfig.extraConfig,
|
|
403
|
-
...userConfig,
|
|
404
|
-
};
|
|
405
|
-
|
|
406
|
-
const configJson = JSON.stringify(config, null, 2);
|
|
407
|
-
|
|
408
|
-
return `// Generated by @timber-js/app/adapters/nitro
|
|
409
|
-
// Do not edit — this file is regenerated on each build.
|
|
410
|
-
|
|
411
|
-
import { defineNitroConfig } from 'nitro/config'
|
|
412
|
-
|
|
413
|
-
export default defineNitroConfig(${configJson})
|
|
414
|
-
`;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
375
|
// ─── Preview ─────────────────────────────────────────────────────────────────
|
|
418
376
|
|
|
419
377
|
/** Presets that produce a locally-runnable server entry. */
|
|
@@ -460,6 +418,9 @@ const { default: handler, runWithEarlyHintsSender } = await import('${rscEntry}'
|
|
|
460
418
|
// Import compression helper for self-hosted response compression.
|
|
461
419
|
const { compressResponse } = await import('./_compress.mjs');
|
|
462
420
|
|
|
421
|
+
// Web→Node response bridge with backpressure (TIM-1154).
|
|
422
|
+
const { sendNodeResponse } = await import('./_send-response.mjs');
|
|
423
|
+
|
|
463
424
|
const MIME_TYPES = {
|
|
464
425
|
'.html': 'text/html',
|
|
465
426
|
'.js': 'application/javascript',
|
|
@@ -486,11 +447,32 @@ const MIME_TYPES = {
|
|
|
486
447
|
};
|
|
487
448
|
|
|
488
449
|
const publicDir = join(__dirname, '${publicDir}');
|
|
489
|
-
|
|
490
|
-
|
|
450
|
+
|
|
451
|
+
// Port resolution (TIM-842):
|
|
452
|
+
// - Default to 3000
|
|
453
|
+
// - If PORT env var is set, honor it strictly (fail loudly on conflict)
|
|
454
|
+
// - Otherwise auto-bump from 3000 until a free port is found
|
|
455
|
+
// Mirrors the dev server behavior so timber dev/preview/production all
|
|
456
|
+
// behave the same way around port selection.
|
|
457
|
+
const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : null;
|
|
458
|
+
const portIsExplicit = envPort != null && Number.isFinite(envPort) && envPort > 0;
|
|
459
|
+
const startPort = portIsExplicit ? envPort : 3000;
|
|
460
|
+
const host = process.env.HOST || 'localhost';
|
|
461
|
+
|
|
462
|
+
// Set after listenWithBump() resolves so request handlers can build
|
|
463
|
+
// absolute URLs from the actual bound port (which may differ from
|
|
464
|
+
// startPort after an auto-bump).
|
|
465
|
+
let boundPort = startPort;
|
|
491
466
|
|
|
492
467
|
const server = createServer(async (req, res) => {
|
|
493
|
-
|
|
468
|
+
// Scheme from the socket's TLS state — a hardcoded http:// breaks CSRF
|
|
469
|
+
// origin comparison and absolute-URL construction when TLS is terminated
|
|
470
|
+
// at this server (TIM-1073; mirrors the dev-server fix in TIM-1067).
|
|
471
|
+
// X-Forwarded-Proto is intentionally not consulted here: on a direct
|
|
472
|
+
// connection it would be attacker-controlled. The CSRF layer honors it
|
|
473
|
+
// separately for reverse-proxy deployments.
|
|
474
|
+
const scheme = req.socket?.encrypted ? 'https' : 'http';
|
|
475
|
+
const url = new URL(req.url || '/', \`\${scheme}://\${host}:\${boundPort}\`);
|
|
494
476
|
|
|
495
477
|
// Try serving static files from the public directory first.
|
|
496
478
|
const filePath = join(publicDir, url.pathname);
|
|
@@ -503,7 +485,9 @@ const server = createServer(async (req, res) => {
|
|
|
503
485
|
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
504
486
|
const body = await readFile(filePath);
|
|
505
487
|
// Hashed assets get immutable cache, others get short cache.
|
|
506
|
-
const
|
|
488
|
+
const isImmutable =
|
|
489
|
+
url.pathname.startsWith('/assets/') || url.pathname.startsWith('/_timber/fonts/');
|
|
490
|
+
const cacheControl = isImmutable
|
|
507
491
|
? 'public, max-age=31536000, immutable'
|
|
508
492
|
: 'public, max-age=3600, must-revalidate';
|
|
509
493
|
res.writeHead(200, {
|
|
@@ -560,22 +544,11 @@ const server = createServer(async (req, res) => {
|
|
|
560
544
|
// Compress the response for self-hosted deployments.
|
|
561
545
|
const webResponse = compressResponse(webRequest, rawResponse);
|
|
562
546
|
|
|
563
|
-
// Write the response
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
const pump = async () => {
|
|
569
|
-
while (true) {
|
|
570
|
-
const { done, value } = await reader.read();
|
|
571
|
-
if (done) { res.end(); return; }
|
|
572
|
-
res.write(value);
|
|
573
|
-
}
|
|
574
|
-
};
|
|
575
|
-
await pump();
|
|
576
|
-
} else {
|
|
577
|
-
res.end();
|
|
578
|
-
}
|
|
547
|
+
// Write the response to Node's ServerResponse. sendNodeResponse handles
|
|
548
|
+
// status, headers (including Set-Cookie splitting via [...headers]),
|
|
549
|
+
// body streaming with backpressure, and client disconnect cleanup.
|
|
550
|
+
// See TIM-1154.
|
|
551
|
+
await sendNodeResponse(res, webResponse);
|
|
579
552
|
} catch (err) {
|
|
580
553
|
console.error('[timber preview] Request error:', err);
|
|
581
554
|
if (!res.headersSent) {
|
|
@@ -585,13 +558,49 @@ const server = createServer(async (req, res) => {
|
|
|
585
558
|
}
|
|
586
559
|
});
|
|
587
560
|
|
|
588
|
-
|
|
561
|
+
function listenWithBump(port, attempt = 0) {
|
|
562
|
+
return new Promise((resolveListen, rejectListen) => {
|
|
563
|
+
const onError = (err) => {
|
|
564
|
+
server.removeListener('listening', onListening);
|
|
565
|
+
if (err && err.code === 'EADDRINUSE' && !portIsExplicit && attempt < 100) {
|
|
566
|
+
if (attempt === 0) {
|
|
567
|
+
console.log(\` [timber] Port \${port} in use, trying \${port + 1}...\`);
|
|
568
|
+
}
|
|
569
|
+
listenWithBump(port + 1, attempt + 1).then(resolveListen, rejectListen);
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
rejectListen(err);
|
|
573
|
+
};
|
|
574
|
+
const onListening = () => {
|
|
575
|
+
server.removeListener('error', onError);
|
|
576
|
+
resolveListen(port);
|
|
577
|
+
};
|
|
578
|
+
server.once('error', onError);
|
|
579
|
+
server.once('listening', onListening);
|
|
580
|
+
server.listen(port, host);
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
try {
|
|
585
|
+
boundPort = await listenWithBump(startPort);
|
|
586
|
+
if (boundPort !== startPort) {
|
|
587
|
+
console.log();
|
|
588
|
+
console.log(\` [timber] Port \${startPort} in use, using \${boundPort}\`);
|
|
589
|
+
}
|
|
589
590
|
console.log();
|
|
590
591
|
console.log(' ⚡ timber preview server running at:');
|
|
591
592
|
console.log();
|
|
592
|
-
console.log(\` ➜ http://\${host}:\${
|
|
593
|
+
console.log(\` ➜ http://\${host}:\${boundPort}\`);
|
|
593
594
|
console.log();
|
|
594
|
-
})
|
|
595
|
+
} catch (err) {
|
|
596
|
+
if (err && err.code === 'EADDRINUSE') {
|
|
597
|
+
console.error(\`[timber] Port \${startPort} is already in use. \` +
|
|
598
|
+
'Set PORT to a free port, or unset PORT to auto-pick.');
|
|
599
|
+
} else {
|
|
600
|
+
console.error('[timber] Failed to start preview server:', err);
|
|
601
|
+
}
|
|
602
|
+
process.exit(1);
|
|
603
|
+
}
|
|
595
604
|
`;
|
|
596
605
|
}
|
|
597
606
|
|
|
@@ -626,11 +635,16 @@ export function generateNitroPreviewCommand(
|
|
|
626
635
|
* Externalizes the timber RSC/SSR output — those files are pre-built
|
|
627
636
|
* by timber and have internal references that nitro's bundler can't follow.
|
|
628
637
|
*/
|
|
638
|
+
interface NitroBuildResult {
|
|
639
|
+
/** Resolved output.serverDir — where the server bundle + _chunks/ live. */
|
|
640
|
+
serverDir: string;
|
|
641
|
+
}
|
|
642
|
+
|
|
629
643
|
async function runNitroBuild(
|
|
630
644
|
nitroDir: string,
|
|
631
645
|
preset: NitroPreset,
|
|
632
646
|
userConfig?: Record<string, unknown>
|
|
633
|
-
): Promise<
|
|
647
|
+
): Promise<NitroBuildResult> {
|
|
634
648
|
const presetConfig = PRESET_CONFIGS[preset];
|
|
635
649
|
const {
|
|
636
650
|
createNitro,
|
|
@@ -649,6 +663,7 @@ async function runNitroBuild(
|
|
|
649
663
|
output: { dir: join(nitroDir, presetConfig.outputDir) },
|
|
650
664
|
routeRules: {
|
|
651
665
|
'/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
|
|
666
|
+
'/_timber/fonts/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
|
|
652
667
|
},
|
|
653
668
|
// Don't bundle the timber RSC/SSR build output — it has its own
|
|
654
669
|
// internal file references that nitro's bundler can't follow.
|
|
@@ -660,10 +675,18 @@ async function runNitroBuild(
|
|
|
660
675
|
...userConfig,
|
|
661
676
|
});
|
|
662
677
|
|
|
678
|
+
// Read the resolved serverDir AFTER config merging — userConfig may
|
|
679
|
+
// override output.dir or output.serverDir. Nitro appends a trailing
|
|
680
|
+
// slash during resolution; strip it for join() compatibility.
|
|
681
|
+
const raw = nitro.options.output.serverDir;
|
|
682
|
+
const serverDir = raw.endsWith('/') ? raw.slice(0, -1) : raw;
|
|
683
|
+
|
|
663
684
|
await prepare(nitro);
|
|
664
685
|
await copyPublicAssets(nitro);
|
|
665
686
|
await nitroBuild(nitro);
|
|
666
687
|
await nitro.close();
|
|
688
|
+
|
|
689
|
+
return { serverDir };
|
|
667
690
|
}
|
|
668
691
|
|
|
669
692
|
/** Spawn a Nitro preview process and pipe stdio. */
|
|
@@ -678,6 +701,75 @@ function spawnNitroPreview(command: string, args: string[], cwd: string): Promis
|
|
|
678
701
|
});
|
|
679
702
|
}
|
|
680
703
|
|
|
704
|
+
// ─── Send Response Module ───────────────────────────────────────────────────
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* Generate a standalone ESM module that exports sendNodeResponse.
|
|
708
|
+
*
|
|
709
|
+
* Mirrors srvx/node's sendNodeResponse: status + headers via writeHead,
|
|
710
|
+
* body streaming with backpressure (waits for drain on write() === false),
|
|
711
|
+
* and client disconnect cleanup. Written to `_send-response.mjs` during
|
|
712
|
+
* buildOutput for use by the preview server script. See TIM-1154.
|
|
713
|
+
*
|
|
714
|
+
* @internal Exported for testing.
|
|
715
|
+
*/
|
|
716
|
+
export function generateSendResponseModule(): string {
|
|
717
|
+
return `// Generated by @timber-js/app — Web→Node response bridge.
|
|
718
|
+
// Do not edit — this file is regenerated on each build.
|
|
719
|
+
// Mirrors srvx/node's sendNodeResponse with backpressure support.
|
|
720
|
+
|
|
721
|
+
export function sendNodeResponse(nodeRes, webRes) {
|
|
722
|
+
if (!webRes) {
|
|
723
|
+
nodeRes.statusCode = 500;
|
|
724
|
+
return new Promise((resolve) => nodeRes.end(resolve));
|
|
725
|
+
}
|
|
726
|
+
const rawHeaders = [...webRes.headers];
|
|
727
|
+
const writeHeaders = rawHeaders.flat();
|
|
728
|
+
if (!nodeRes.headersSent) {
|
|
729
|
+
if (nodeRes.req?.httpVersion === '2.0') {
|
|
730
|
+
nodeRes.writeHead(webRes.status, writeHeaders);
|
|
731
|
+
} else {
|
|
732
|
+
nodeRes.writeHead(webRes.status, webRes.statusText, writeHeaders);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
if (!webRes.body) {
|
|
736
|
+
return new Promise((resolve) => nodeRes.end(resolve));
|
|
737
|
+
}
|
|
738
|
+
// Stream with backpressure: pause reading when the kernel buffer is
|
|
739
|
+
// full (write() returns false) and resume on 'drain'.
|
|
740
|
+
if (nodeRes.destroyed) {
|
|
741
|
+
webRes.body.cancel();
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
const reader = webRes.body.getReader();
|
|
745
|
+
function streamCancel(error) {
|
|
746
|
+
reader.cancel(error).catch(() => {});
|
|
747
|
+
if (error) nodeRes.destroy(error);
|
|
748
|
+
}
|
|
749
|
+
function streamHandle({ done, value }) {
|
|
750
|
+
try {
|
|
751
|
+
if (done) {
|
|
752
|
+
nodeRes.end();
|
|
753
|
+
} else if (nodeRes.write(value)) {
|
|
754
|
+
reader.read().then(streamHandle, streamCancel);
|
|
755
|
+
} else {
|
|
756
|
+
nodeRes.once('drain', () => reader.read().then(streamHandle, streamCancel));
|
|
757
|
+
}
|
|
758
|
+
} catch (error) {
|
|
759
|
+
streamCancel(error instanceof Error ? error : undefined);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
nodeRes.on('close', streamCancel);
|
|
763
|
+
nodeRes.on('error', streamCancel);
|
|
764
|
+
reader.read().then(streamHandle, streamCancel);
|
|
765
|
+
return reader.closed.catch(streamCancel).finally(() => {
|
|
766
|
+
nodeRes.off('close', streamCancel);
|
|
767
|
+
nodeRes.off('error', streamCancel);
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
`;
|
|
771
|
+
}
|
|
772
|
+
|
|
681
773
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
682
774
|
|
|
683
775
|
/**
|
|
@@ -687,3 +779,55 @@ function spawnNitroPreview(command: string, args: string[], cwd: string): Promis
|
|
|
687
779
|
export function getPresetConfig(preset: NitroPreset): PresetConfig {
|
|
688
780
|
return PRESET_CONFIGS[preset];
|
|
689
781
|
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Resolve the destination path for prebuilt flight payloads in the Nitro
|
|
785
|
+
* output directory. The RSC entry resolves `../prebuilt/` relative to its
|
|
786
|
+
* bundled chunk location (`<serverBundleDir>/_chunks/`), so prebuilt/ must
|
|
787
|
+
* live at `<serverBundleDir>/prebuilt/`.
|
|
788
|
+
*
|
|
789
|
+
* The serverBundleDir varies by preset — Nitro's Vercel preset uses
|
|
790
|
+
* `functions/__server.func` while most others use `server`.
|
|
791
|
+
*
|
|
792
|
+
* @internal Exported for testing.
|
|
793
|
+
*/
|
|
794
|
+
export function resolvePrebuiltOutputPath(outDir: string, preset: NitroPreset): string {
|
|
795
|
+
const presetConfig = PRESET_CONFIGS[preset];
|
|
796
|
+
return join(outDir, presetConfig.outputDir, presetConfig.serverBundleDir, 'prebuilt');
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
/**
|
|
800
|
+
* Copy prebuilt payloads into cloned Vercel function directories.
|
|
801
|
+
*
|
|
802
|
+
* When users configure `vercel.functionRules`, Nitro's compiled hook clones
|
|
803
|
+
* the base __server.func to per-route .func directories. These clones are
|
|
804
|
+
* created during `runNitroBuild()` — before our post-build prebuilt copy.
|
|
805
|
+
* Each clone resolves `../prebuilt` independently, so they each need a copy.
|
|
806
|
+
*
|
|
807
|
+
* @internal Exported for testing.
|
|
808
|
+
*/
|
|
809
|
+
export async function copyPrebuiltToVercelFuncClones(
|
|
810
|
+
functionsDir: string,
|
|
811
|
+
prebuiltSrc: string,
|
|
812
|
+
baseFuncName: string
|
|
813
|
+
): Promise<void> {
|
|
814
|
+
const funcDirs: string[] = [];
|
|
815
|
+
try {
|
|
816
|
+
for await (const match of glob('**/*.func', { cwd: functionsDir })) {
|
|
817
|
+
if (!match.endsWith(baseFuncName)) {
|
|
818
|
+
funcDirs.push(join(functionsDir, match));
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
} catch {
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
824
|
+
await Promise.all(
|
|
825
|
+
funcDirs.map((dir) =>
|
|
826
|
+
cp(prebuiltSrc, join(dir, 'prebuilt'), { recursive: true }).catch(
|
|
827
|
+
(e: NodeJS.ErrnoException) => {
|
|
828
|
+
if (e.code !== 'ENOENT') throw e;
|
|
829
|
+
}
|
|
830
|
+
)
|
|
831
|
+
)
|
|
832
|
+
);
|
|
833
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Shared adapter utilities — leaf module with zero deps on server/, client/,
|
|
2
|
+
// or any Vite-dependent code.
|
|
3
|
+
//
|
|
4
|
+
// Adapters are loaded by Node at Vite startup time, before Vite's module
|
|
5
|
+
// resolver is available. This module uses only Node built-ins and can be
|
|
6
|
+
// imported by both adapters via a relative path.
|
|
7
|
+
//
|
|
8
|
+
// IMPORTANT: Do NOT add imports from ../server/, ../client/, ../plugins/,
|
|
9
|
+
// or any module that transitively depends on Vite. A test in
|
|
10
|
+
// tests/adapters/shared-no-forbidden-imports.test.ts enforces this.
|
|
11
|
+
|
|
12
|
+
// ─── Static asset cache headers ──────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
/** Cache-Control value for hashed (immutable) assets. */
|
|
15
|
+
export const IMMUTABLE_CACHE = 'public, max-age=31536000, immutable';
|
|
16
|
+
|
|
17
|
+
/** Cache-Control value for unhashed static assets. */
|
|
18
|
+
export const STATIC_CACHE = 'public, max-age=3600, must-revalidate';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Generate a `_headers` file for static asset cache control.
|
|
22
|
+
*
|
|
23
|
+
* The `_headers` file is a platform convention supported by Cloudflare Workers
|
|
24
|
+
* Static Assets, Cloudflare Pages, and Netlify. It maps URL patterns to
|
|
25
|
+
* HTTP response headers.
|
|
26
|
+
*
|
|
27
|
+
* Only hashed (immutable) asset paths are listed here by default. When
|
|
28
|
+
* `unhashedPaths` is provided, per-file rules are appended for unhashed
|
|
29
|
+
* static assets (favicon.ico, robots.txt, etc.) so they get Cache-Control
|
|
30
|
+
* on platforms like Cloudflare Workers Static Assets where the server
|
|
31
|
+
* handler never sees static file requests.
|
|
32
|
+
*
|
|
33
|
+
* A `/*` catch-all is NOT used — it would be additive on Cloudflare,
|
|
34
|
+
* producing duplicate Cache-Control directives on hashed assets
|
|
35
|
+
* (invalid per RFC 9111).
|
|
36
|
+
*/
|
|
37
|
+
// Cloudflare Workers Static Assets caps _headers at 100 rules.
|
|
38
|
+
// Reserve 2 for the wildcard hashed-asset rules.
|
|
39
|
+
const MAX_UNHASHED_RULES = 98;
|
|
40
|
+
|
|
41
|
+
export function generateHeadersFile(unhashedPaths?: string[]): string {
|
|
42
|
+
let content = `# Auto-generated by @timber-js/app — static asset cache headers.
|
|
43
|
+
# See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
44
|
+
|
|
45
|
+
/assets/*
|
|
46
|
+
Cache-Control: ${IMMUTABLE_CACHE}
|
|
47
|
+
|
|
48
|
+
/_timber/fonts/*
|
|
49
|
+
Cache-Control: ${IMMUTABLE_CACHE}
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
if (unhashedPaths && unhashedPaths.length > 0) {
|
|
53
|
+
const capped = unhashedPaths.slice(0, MAX_UNHASHED_RULES);
|
|
54
|
+
if (unhashedPaths.length > MAX_UNHASHED_RULES) {
|
|
55
|
+
console.warn(
|
|
56
|
+
`[timber] _headers: ${unhashedPaths.length} unhashed static files found, ` +
|
|
57
|
+
`but Cloudflare limits _headers to 100 rules. Only the first ${MAX_UNHASHED_RULES} ` +
|
|
58
|
+
`unhashed files will get Cache-Control headers.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
content += `\n# Unhashed static assets — short-lived cache with revalidation\n`;
|
|
62
|
+
for (const p of capped) {
|
|
63
|
+
content += `\n${p}\n Cache-Control: ${STATIC_CACHE}\n`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return content;
|
|
68
|
+
}
|