@timber-js/app 0.2.0-alpha.13 → 0.2.0-alpha.131
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/dist/_chunks/actions-BNhpxrnV.js +1104 -0
- package/dist/_chunks/actions-BNhpxrnV.js.map +1 -0
- package/dist/_chunks/build-output-helper-K7oUCRqU.js +102 -0
- package/dist/_chunks/build-output-helper-K7oUCRqU.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-CObqjGWF.js +2 -0
- package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js +785 -0
- package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js.map +1 -0
- package/dist/_chunks/codec-registry-DqkeAydt.js +21 -0
- package/dist/_chunks/codec-registry-DqkeAydt.js.map +1 -0
- package/dist/_chunks/define-DMq-Yjp7.js +112 -0
- package/dist/_chunks/define-DMq-Yjp7.js.map +1 -0
- package/dist/_chunks/define-jeHDXZGq.js +195 -0
- package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
- package/dist/_chunks/format-BjN9HLu9.js +14 -0
- package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
- package/dist/_chunks/handler-store-bIAstrxQ.js +54 -0
- package/dist/_chunks/handler-store-bIAstrxQ.js.map +1 -0
- package/dist/_chunks/logger-CMd9P1xQ.js +291 -0
- package/dist/_chunks/logger-CMd9P1xQ.js.map +1 -0
- package/dist/_chunks/merge-search-params-Cm1j99HC.js +41 -0
- package/dist/_chunks/merge-search-params-Cm1j99HC.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DESG8uk5.js} +32 -19
- package/dist/_chunks/metadata-routes-DESG8uk5.js.map +1 -0
- package/dist/_chunks/navigation-root-B5-RmsPi.js +103 -0
- package/dist/_chunks/navigation-root-B5-RmsPi.js.map +1 -0
- package/dist/_chunks/registry-BI9cgCt7.js +20 -0
- package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
- package/dist/_chunks/resolve-schema-DU2nbVOi.js +77 -0
- package/dist/_chunks/resolve-schema-DU2nbVOi.js.map +1 -0
- package/dist/_chunks/router-ref-B2-2kIIC.js +28 -0
- package/dist/_chunks/router-ref-B2-2kIIC.js.map +1 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DVX8S7vj.js} +1 -1
- package/dist/_chunks/ssr-data-DVX8S7vj.js.map +1 -0
- package/dist/_chunks/stale-reload-CCqb62Z3.js +84 -0
- package/dist/_chunks/stale-reload-CCqb62Z3.js.map +1 -0
- package/dist/_chunks/tracing-DP5djRq5.js +358 -0
- package/dist/_chunks/tracing-DP5djRq5.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
- package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
- package/dist/_chunks/use-segment-params-CIeinIx2.js +151 -0
- package/dist/_chunks/use-segment-params-CIeinIx2.js.map +1 -0
- package/dist/_chunks/validation-AfEFM5ze.js +84 -0
- package/dist/_chunks/validation-AfEFM5ze.js.map +1 -0
- package/dist/_chunks/walkers-BbEu2_Pp.js +724 -0
- package/dist/_chunks/walkers-BbEu2_Pp.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-CAzunaGo.js} +6 -45
- package/dist/_chunks/warnings-CAzunaGo.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -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 +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -45
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +151 -81
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- 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/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +39 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -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 +30 -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 +26 -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 +19 -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 +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -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 +19 -4
- 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 +180 -1119
- 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 +845 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +65 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +67 -56
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +27 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +14 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
- package/dist/client/navigation-root.d.ts.map +1 -0
- 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 +79 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -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/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.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-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-search-params.d.ts +7 -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 +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -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 +251 -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 +46 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -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/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- 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} +2 -2
- 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/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -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/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +167 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -164
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5584 -13386
- 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 +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +18 -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 +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -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/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 +6 -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 +60 -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/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-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 +75 -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 +77 -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 +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -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 +41 -6
- 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 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +8 -2
- package/dist/server/build-manifest.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 +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/debug.d.ts +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 +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +1 -1
- 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 -5
- 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/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +155 -2905
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3027 -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 +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -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 +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +118 -23
- 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/primitives.d.ts +69 -18
- 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/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +28 -2
- 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 +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- 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 +50 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -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 +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -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 +1 -1
- 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 +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -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 +49 -4
- 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/version-skew.d.ts +61 -0
- package/dist/server/version-skew.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/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 +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- 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/package.json +61 -22
- package/src/adapters/build-output-helper.ts +139 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +142 -59
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +25 -20
- package/src/cli-schema-sync.ts +295 -0
- package/src/cli.ts +76 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +125 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +153 -0
- package/src/client/browser-entry/index.ts +151 -0
- package/src/client/browser-entry/post-hydration.ts +113 -0
- package/src/client/browser-entry/router-init.ts +219 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +66 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +116 -0
- package/src/client/link.tsx +336 -119
- package/src/client/nav-link-store.ts +37 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +33 -7
- package/src/client/navigation-root.tsx +347 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +418 -128
- package/src/client/rsc-fetch.ts +208 -10
- package/src/client/segment-cache.ts +6 -3
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/use-search-params.ts +25 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +134 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +506 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +1 -1
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +233 -0
- package/src/index.ts +411 -329
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +114 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +116 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +69 -6
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +179 -37
- package/src/plugins/entries.ts +111 -8
- package/src/plugins/fonts.ts +165 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +386 -47
- package/src/plugins/server-bundle.ts +59 -3
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +321 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +308 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +309 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +14 -23
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +17 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +32 -51
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +101 -5
- package/src/server/html-injector-core.ts +417 -0
- package/src/server/html-injectors.ts +235 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +182 -0
- package/src/server/logger.ts +67 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +468 -0
- package/src/server/pipeline.ts +154 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +435 -208
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +128 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +315 -89
- package/src/server/rsc-entry/helpers.ts +155 -26
- package/src/server/rsc-entry/index.ts +316 -327
- package/src/server/rsc-entry/render-route.ts +313 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +193 -40
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +228 -246
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +217 -78
- package/src/server/ssr-render.ts +344 -71
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +202 -90
- package/src/server/tree-match.ts +210 -0
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- 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-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.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/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/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/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/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.map +0 -1
- package/dist/server/dev-warnings.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/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- 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/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- 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/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -3,36 +3,39 @@
|
|
|
3
3
|
// Primary deployment target. Generates a Workers-compatible entry point
|
|
4
4
|
// and wrangler.jsonc configuration. See design/11-platform.md §"Cloudflare Workers".
|
|
5
5
|
|
|
6
|
-
import { writeFile
|
|
6
|
+
import { writeFile } from 'node:fs/promises';
|
|
7
7
|
import { execFile } from 'node:child_process';
|
|
8
8
|
import { join, relative } from 'node:path';
|
|
9
9
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
10
10
|
import type { TimberPlatformAdapter, TimberConfig } from './types';
|
|
11
|
-
|
|
12
|
-
// Vite startup time, before Vite's module resolver is available, so cross-
|
|
13
|
-
// directory .ts imports don't resolve.
|
|
14
|
-
const IMMUTABLE_CACHE = 'public, max-age=31536000, immutable';
|
|
15
|
-
const STATIC_CACHE = 'public, max-age=3600, must-revalidate';
|
|
16
|
-
|
|
17
|
-
function generateHeadersFile(): string {
|
|
18
|
-
return `# Auto-generated by @timber-js/app — static asset cache headers.
|
|
19
|
-
# See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
20
|
-
|
|
21
|
-
/assets/*
|
|
22
|
-
Cache-Control: ${IMMUTABLE_CACHE}
|
|
23
|
-
|
|
24
|
-
/*
|
|
25
|
-
Cache-Control: ${STATIC_CACHE}
|
|
26
|
-
`;
|
|
27
|
-
}
|
|
11
|
+
import { runSharedBuildSteps } from './build-output-helper.js';
|
|
28
12
|
|
|
29
13
|
// ─── Bindings passthrough ─────────────────────────────────────────────────
|
|
30
14
|
// ALS stores the env object per-request so server components and middleware
|
|
31
15
|
// can access KV, D1, DO, R2, Queues, etc. via getCloudflareBindings().
|
|
32
16
|
// No global fallback — if called outside a request, it throws.
|
|
33
17
|
// See design/11-platform.md §"Platform Target" and design/25-production-deployments.md.
|
|
34
|
-
|
|
35
|
-
|
|
18
|
+
//
|
|
19
|
+
// The ALS is stored on globalThis via Symbol.for so it survives Vite's
|
|
20
|
+
// module instance split in dev mode. The Vite host process (where
|
|
21
|
+
// cloudflareDevBindings → runWithBindings runs) and the RSC module runner
|
|
22
|
+
// (where getCloudflareBindings runs) load separate instances of this file,
|
|
23
|
+
// each with their own module-level variables. globalThis + Symbol.for
|
|
24
|
+
// ensures both share the same ALS — same pattern React uses for
|
|
25
|
+
// Symbol.for('react.element').
|
|
26
|
+
|
|
27
|
+
const BINDINGS_ALS_KEY = Symbol.for('timber:cf-bindings-als');
|
|
28
|
+
|
|
29
|
+
function getBindingsAls(): AsyncLocalStorage<Record<string, unknown>> {
|
|
30
|
+
let als = (globalThis as any)[BINDINGS_ALS_KEY] as
|
|
31
|
+
| AsyncLocalStorage<Record<string, unknown>>
|
|
32
|
+
| undefined;
|
|
33
|
+
if (!als) {
|
|
34
|
+
als = new AsyncLocalStorage<Record<string, unknown>>();
|
|
35
|
+
(globalThis as any)[BINDINGS_ALS_KEY] = als;
|
|
36
|
+
}
|
|
37
|
+
return als;
|
|
38
|
+
}
|
|
36
39
|
|
|
37
40
|
/**
|
|
38
41
|
* Get Cloudflare Worker bindings for the current request.
|
|
@@ -55,10 +58,8 @@ const bindingsAls = new AsyncLocalStorage<Record<string, unknown>>();
|
|
|
55
58
|
* }
|
|
56
59
|
* ```
|
|
57
60
|
*/
|
|
58
|
-
export function getCloudflareBindings<
|
|
59
|
-
|
|
60
|
-
>(): T {
|
|
61
|
-
const env = bindingsAls.getStore();
|
|
61
|
+
export function getCloudflareBindings<T = Record<string, unknown>>(): T {
|
|
62
|
+
const env = getBindingsAls().getStore();
|
|
62
63
|
if (!env) {
|
|
63
64
|
throw new Error(
|
|
64
65
|
'getCloudflareBindings() called outside a Cloudflare Workers request context. ' +
|
|
@@ -74,7 +75,85 @@ export function getCloudflareBindings<
|
|
|
74
75
|
* @internal Used by wrapWithExecutionContext.
|
|
75
76
|
*/
|
|
76
77
|
export function runWithBindings<T>(env: Record<string, unknown>, fn: () => T): T {
|
|
77
|
-
return
|
|
78
|
+
return getBindingsAls().run(env, fn);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ─── Binding configuration types ──────────────────────────────────────────────
|
|
82
|
+
// Declarative binding config that maps to wrangler.jsonc binding sections.
|
|
83
|
+
// See design/35-cloudflare-primitives.md §"Binding Declarations in Adapter Config".
|
|
84
|
+
|
|
85
|
+
/** KV namespace binding. `id` defaults to `''` (filled in by wrangler or dashboard). */
|
|
86
|
+
export interface CloudflareKVBinding {
|
|
87
|
+
name: string;
|
|
88
|
+
id?: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** D1 database binding. `database_id` is required (from Cloudflare dashboard). */
|
|
92
|
+
export interface CloudflareD1Binding {
|
|
93
|
+
name: string;
|
|
94
|
+
database_id: string;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** R2 bucket binding. `bucket_name` must match the bucket created in Cloudflare. */
|
|
98
|
+
export interface CloudflareR2Binding {
|
|
99
|
+
name: string;
|
|
100
|
+
bucket_name: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Queue producer binding. `queue` is the queue name in Cloudflare. */
|
|
104
|
+
export interface CloudflareQueueProducer {
|
|
105
|
+
name: string;
|
|
106
|
+
queue: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Queue consumer declaration. Attached to the worker, not a binding name. */
|
|
110
|
+
export interface CloudflareQueueConsumer {
|
|
111
|
+
queue: string;
|
|
112
|
+
max_batch_size?: number;
|
|
113
|
+
max_retries?: number;
|
|
114
|
+
dead_letter_queue?: string;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Durable Object binding. `script_name` is for external DO references. */
|
|
118
|
+
export interface CloudflareDurableObjectBinding {
|
|
119
|
+
name: string;
|
|
120
|
+
class_name: string;
|
|
121
|
+
script_name?: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Declarative Cloudflare bindings configuration.
|
|
126
|
+
*
|
|
127
|
+
* These are converted to the appropriate wrangler.jsonc sections
|
|
128
|
+
* (`kv_namespaces`, `d1_databases`, `r2_buckets`, `queues`, `durable_objects`).
|
|
129
|
+
* The `wrangler` escape hatch overrides any generated binding sections
|
|
130
|
+
* if there's a conflict.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* cloudflare({
|
|
135
|
+
* bindings: {
|
|
136
|
+
* kv: [{ name: 'TIMBER_CACHE' }],
|
|
137
|
+
* d1: [{ name: 'MY_DB', database_id: 'xxxx' }],
|
|
138
|
+
* r2: [{ name: 'MY_BUCKET', bucket_name: 'my-bucket' }],
|
|
139
|
+
* queues: {
|
|
140
|
+
* producers: [{ name: 'EMAIL_QUEUE', queue: 'email-queue' }],
|
|
141
|
+
* consumers: [{ queue: 'email-queue', max_batch_size: 10 }],
|
|
142
|
+
* },
|
|
143
|
+
* durableObjects: [{ name: 'MY_DO', class_name: 'MyDurableObject' }],
|
|
144
|
+
* },
|
|
145
|
+
* })
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export interface CloudflareBindings {
|
|
149
|
+
kv?: CloudflareKVBinding[];
|
|
150
|
+
d1?: CloudflareD1Binding[];
|
|
151
|
+
r2?: CloudflareR2Binding[];
|
|
152
|
+
queues?: {
|
|
153
|
+
producers?: CloudflareQueueProducer[];
|
|
154
|
+
consumers?: CloudflareQueueConsumer[];
|
|
155
|
+
};
|
|
156
|
+
durableObjects?: CloudflareDurableObjectBinding[];
|
|
78
157
|
}
|
|
79
158
|
|
|
80
159
|
/** Options for the Cloudflare Workers adapter. */
|
|
@@ -91,11 +170,42 @@ export interface CloudflareAdapterOptions {
|
|
|
91
170
|
*/
|
|
92
171
|
compatibilityFlags?: string[];
|
|
93
172
|
|
|
173
|
+
/**
|
|
174
|
+
* Declarative Cloudflare bindings. Generates the appropriate
|
|
175
|
+
* `kv_namespaces`, `d1_databases`, `r2_buckets`, `queues`, and
|
|
176
|
+
* `durable_objects` sections in wrangler.jsonc.
|
|
177
|
+
*
|
|
178
|
+
* If both `bindings` and `wrangler` specify the same section,
|
|
179
|
+
* `wrangler` wins (it's the escape hatch).
|
|
180
|
+
*/
|
|
181
|
+
bindings?: CloudflareBindings;
|
|
182
|
+
|
|
94
183
|
/**
|
|
95
184
|
* Custom wrangler.jsonc fields to merge.
|
|
96
|
-
* Overrides generated values.
|
|
185
|
+
* Overrides generated values (including bindings-generated sections).
|
|
97
186
|
*/
|
|
98
187
|
wrangler?: Record<string, unknown>;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Path to a module that exports additional Worker handlers (queue, scheduled, email, etc.).
|
|
191
|
+
* The module is imported in the generated `_worker.js` and its named exports are
|
|
192
|
+
* spread into the default export alongside `fetch`.
|
|
193
|
+
*
|
|
194
|
+
* The module receives `(batch/event, env, ctx)` — standard Cloudflare handler signatures.
|
|
195
|
+
* It does NOT have access to timber's request pipeline (no ALS, no getCloudflareBindings).
|
|
196
|
+
* Use `env` directly for bindings.
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```ts
|
|
200
|
+
* // timber.config.ts
|
|
201
|
+
* adapter: cloudflare({ workerHandlers: './src/worker-handlers.ts' })
|
|
202
|
+
*
|
|
203
|
+
* // src/worker-handlers.ts
|
|
204
|
+
* export async function queue(batch, env) { ... }
|
|
205
|
+
* export async function scheduled(controller, env, ctx) { ... }
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
workerHandlers?: string;
|
|
99
209
|
}
|
|
100
210
|
|
|
101
211
|
/**
|
|
@@ -117,43 +227,45 @@ export function cloudflare(options: CloudflareAdapterOptions = {}): TimberPlatfo
|
|
|
117
227
|
|
|
118
228
|
async buildOutput(config: TimberConfig, buildDir: string) {
|
|
119
229
|
const outDir = join(buildDir, 'cloudflare');
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
//
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
await cp(clientDir, staticDir, {
|
|
129
|
-
recursive: true,
|
|
130
|
-
filter: config.clientJavascriptDisabled ? (src: string) => !src.endsWith('.js') : undefined,
|
|
131
|
-
}).catch(() => {
|
|
132
|
-
// Client dir may not exist when client JavaScript is disabled
|
|
230
|
+
|
|
231
|
+
// Steps 1–5: shared across all adapters (mkdir, copy client/rsc/ssr,
|
|
232
|
+
// write _headers, write manifest-init).
|
|
233
|
+
await runSharedBuildSteps({
|
|
234
|
+
config,
|
|
235
|
+
buildDir,
|
|
236
|
+
outDir,
|
|
237
|
+
publicDirName: 'static',
|
|
133
238
|
});
|
|
134
239
|
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
240
|
+
// Compile optional worker handlers (queue, scheduled, etc.)
|
|
241
|
+
// Uses Vite's build API to bundle the TypeScript source into ESM.
|
|
242
|
+
let hasWorkerHandlers = false;
|
|
243
|
+
if (options.workerHandlers) {
|
|
244
|
+
const handlersEntry = join(process.cwd(), options.workerHandlers);
|
|
245
|
+
const { build: viteBuild } = await import('vite');
|
|
246
|
+
await viteBuild({
|
|
247
|
+
configFile: false,
|
|
248
|
+
logLevel: 'info',
|
|
249
|
+
build: {
|
|
250
|
+
lib: {
|
|
251
|
+
entry: handlersEntry,
|
|
252
|
+
formats: ['es'],
|
|
253
|
+
fileName: () => '_worker-handlers.js',
|
|
254
|
+
},
|
|
255
|
+
outDir,
|
|
256
|
+
emptyOutDir: false,
|
|
257
|
+
minify: false,
|
|
258
|
+
rollupOptions: {
|
|
259
|
+
external: [/^node:/],
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
hasWorkerHandlers = true;
|
|
152
264
|
}
|
|
153
265
|
|
|
154
266
|
// Generate the Workers entry point
|
|
155
267
|
const hasManifestInit = !!config.manifestInit;
|
|
156
|
-
const workerEntry = generateWorkerEntry(outDir, outDir, hasManifestInit);
|
|
268
|
+
const workerEntry = generateWorkerEntry(outDir, outDir, hasManifestInit, hasWorkerHandlers);
|
|
157
269
|
await writeFile(join(outDir, '_worker.js'), workerEntry);
|
|
158
270
|
|
|
159
271
|
// Generate wrangler.jsonc
|
|
@@ -184,12 +296,12 @@ export function cloudflare(options: CloudflareAdapterOptions = {}): TimberPlatfo
|
|
|
184
296
|
export function wrapWithExecutionContext(
|
|
185
297
|
adapter: TimberPlatformAdapter,
|
|
186
298
|
handler: (req: Request) => Promise<Response>
|
|
187
|
-
):
|
|
299
|
+
): CfExportedHandler<Record<string, unknown>> {
|
|
188
300
|
return {
|
|
189
301
|
async fetch(
|
|
190
302
|
request: Request,
|
|
191
303
|
env: Record<string, unknown>,
|
|
192
|
-
ctx:
|
|
304
|
+
ctx: CfExecutionContext
|
|
193
305
|
): Promise<Response> {
|
|
194
306
|
// Bind the adapter's waitUntil to the Workers execution context
|
|
195
307
|
const originalWaitUntil = adapter.waitUntil;
|
|
@@ -214,7 +326,8 @@ export function wrapWithExecutionContext(
|
|
|
214
326
|
export function generateWorkerEntry(
|
|
215
327
|
buildDir: string,
|
|
216
328
|
outDir: string,
|
|
217
|
-
hasManifestInit = false
|
|
329
|
+
hasManifestInit = false,
|
|
330
|
+
hasWorkerHandlers = false
|
|
218
331
|
): string {
|
|
219
332
|
// The RSC entry is the main request handler — it exports the fetch handler as default.
|
|
220
333
|
// The Vite RSC plugin outputs it to rsc/index.js.
|
|
@@ -229,20 +342,171 @@ export function generateWorkerEntry(
|
|
|
229
342
|
// ESM guarantees imports are evaluated in order.
|
|
230
343
|
const manifestImport = hasManifestInit ? "import './_timber-manifest-init.js'\n" : '';
|
|
231
344
|
|
|
345
|
+
// Optional additional Worker handlers (queue, scheduled, email, etc.)
|
|
346
|
+
// Compiled by buildOutput via Vite's build API into _worker-handlers.js.
|
|
347
|
+
// The module's named exports are spread into the default export alongside fetch.
|
|
348
|
+
const handlersImport = hasWorkerHandlers
|
|
349
|
+
? "import * as workerHandlers from './_worker-handlers.js'\n"
|
|
350
|
+
: '';
|
|
351
|
+
const handlersSpread = hasWorkerHandlers ? ' ...workerHandlers,\n' : '';
|
|
352
|
+
|
|
232
353
|
return `// Generated by @timber-js/app/adapters/cloudflare
|
|
233
354
|
// Do not edit — this file is regenerated on each build.
|
|
234
355
|
|
|
356
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
235
357
|
${manifestImport}import handler from '${rscEntryRelative}'
|
|
236
|
-
|
|
358
|
+
${handlersImport}
|
|
237
359
|
// Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
|
|
238
360
|
// See design/25-production-deployments.md §"TIMBER_RUNTIME".
|
|
239
361
|
globalThis.process ??= { env: {} }
|
|
240
362
|
process.env.TIMBER_RUNTIME = 'cloudflare'
|
|
241
363
|
|
|
242
|
-
|
|
364
|
+
// Bind Cloudflare env to ALS so getCloudflareBindings() works at runtime.
|
|
365
|
+
// Uses the same Symbol.for key as getCloudflareBindings() reads from.
|
|
366
|
+
const ALS_KEY = Symbol.for('timber:cf-bindings-als')
|
|
367
|
+
let bindingsAls = globalThis[ALS_KEY]
|
|
368
|
+
if (!bindingsAls) {
|
|
369
|
+
bindingsAls = new AsyncLocalStorage()
|
|
370
|
+
globalThis[ALS_KEY] = bindingsAls
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
export default {
|
|
374
|
+
${handlersSpread} async fetch(request, env, ctx) {
|
|
375
|
+
return bindingsAls.run(env, () => handler(request))
|
|
376
|
+
}
|
|
377
|
+
}
|
|
243
378
|
`;
|
|
244
379
|
}
|
|
245
380
|
|
|
381
|
+
/** Wrangler binding sections generated from `CloudflareBindings`. */
|
|
382
|
+
export interface WranglerBindingsConfig {
|
|
383
|
+
kv_namespaces?: Array<{ binding: string; id: string }>;
|
|
384
|
+
d1_databases?: Array<{ binding: string; database_id: string }>;
|
|
385
|
+
r2_buckets?: Array<{ binding: string; bucket_name: string }>;
|
|
386
|
+
queues?: {
|
|
387
|
+
producers?: Array<{ binding: string; queue: string }>;
|
|
388
|
+
consumers?: Array<Record<string, unknown>>;
|
|
389
|
+
};
|
|
390
|
+
durable_objects?: {
|
|
391
|
+
bindings: Array<Record<string, string>>;
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Convert declarative `CloudflareBindings` into wrangler.jsonc binding sections.
|
|
397
|
+
*
|
|
398
|
+
* Maps:
|
|
399
|
+
* - `kv` → `kv_namespaces`
|
|
400
|
+
* - `d1` → `d1_databases`
|
|
401
|
+
* - `r2` → `r2_buckets`
|
|
402
|
+
* - `queues` → `queues` (producers + consumers)
|
|
403
|
+
* - `durableObjects` → `durable_objects`
|
|
404
|
+
*
|
|
405
|
+
* Empty arrays are omitted from the output.
|
|
406
|
+
*
|
|
407
|
+
* @internal Exported for testing.
|
|
408
|
+
*/
|
|
409
|
+
export function generateBindingsConfig(
|
|
410
|
+
bindings: CloudflareBindings | undefined
|
|
411
|
+
): WranglerBindingsConfig {
|
|
412
|
+
if (!bindings) return {};
|
|
413
|
+
|
|
414
|
+
const result: WranglerBindingsConfig = {};
|
|
415
|
+
|
|
416
|
+
// KV namespaces
|
|
417
|
+
if (bindings.kv && bindings.kv.length > 0) {
|
|
418
|
+
result.kv_namespaces = bindings.kv.map((kv) => ({
|
|
419
|
+
binding: kv.name,
|
|
420
|
+
id: kv.id ?? '',
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// D1 databases
|
|
425
|
+
if (bindings.d1 && bindings.d1.length > 0) {
|
|
426
|
+
result.d1_databases = bindings.d1.map((d1) => ({
|
|
427
|
+
binding: d1.name,
|
|
428
|
+
database_id: d1.database_id,
|
|
429
|
+
}));
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// R2 buckets
|
|
433
|
+
if (bindings.r2 && bindings.r2.length > 0) {
|
|
434
|
+
result.r2_buckets = bindings.r2.map((r2) => ({
|
|
435
|
+
binding: r2.name,
|
|
436
|
+
bucket_name: r2.bucket_name,
|
|
437
|
+
}));
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Queues (producers and/or consumers)
|
|
441
|
+
if (bindings.queues) {
|
|
442
|
+
const queues: Record<string, unknown> = {};
|
|
443
|
+
if (bindings.queues.producers && bindings.queues.producers.length > 0) {
|
|
444
|
+
queues.producers = bindings.queues.producers.map((p) => ({
|
|
445
|
+
binding: p.name,
|
|
446
|
+
queue: p.queue,
|
|
447
|
+
}));
|
|
448
|
+
}
|
|
449
|
+
if (bindings.queues.consumers && bindings.queues.consumers.length > 0) {
|
|
450
|
+
queues.consumers = bindings.queues.consumers.map((c) => {
|
|
451
|
+
const consumer: Record<string, unknown> = { queue: c.queue };
|
|
452
|
+
if (c.max_batch_size !== undefined) consumer.max_batch_size = c.max_batch_size;
|
|
453
|
+
if (c.max_retries !== undefined) consumer.max_retries = c.max_retries;
|
|
454
|
+
if (c.dead_letter_queue !== undefined) consumer.dead_letter_queue = c.dead_letter_queue;
|
|
455
|
+
return consumer;
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
if (Object.keys(queues).length > 0) {
|
|
459
|
+
result.queues = queues;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Durable Objects
|
|
464
|
+
if (bindings.durableObjects && bindings.durableObjects.length > 0) {
|
|
465
|
+
result.durable_objects = {
|
|
466
|
+
bindings: bindings.durableObjects.map((dobj) => {
|
|
467
|
+
const entry: Record<string, string> = {
|
|
468
|
+
name: dobj.name,
|
|
469
|
+
class_name: dobj.class_name,
|
|
470
|
+
};
|
|
471
|
+
if (dobj.script_name) entry.script_name = dobj.script_name;
|
|
472
|
+
return entry;
|
|
473
|
+
}),
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return result;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* One-level deep merge: for each key in `override`, if both the base and
|
|
482
|
+
* override values are plain objects (not arrays, not null), merge their
|
|
483
|
+
* keys with override winning on conflicts. Everything else (primitives,
|
|
484
|
+
* arrays, null) is replaced outright — matching the intuitive behavior
|
|
485
|
+
* where `kv_namespaces: [...]` replaces fully but
|
|
486
|
+
* `durable_objects: { migrations }` merges with generated `bindings`.
|
|
487
|
+
*/
|
|
488
|
+
function shallowDeepMerge(
|
|
489
|
+
base: Record<string, unknown>,
|
|
490
|
+
override: Record<string, unknown>
|
|
491
|
+
): Record<string, unknown> {
|
|
492
|
+
const result = { ...base };
|
|
493
|
+
for (const key of Object.keys(override)) {
|
|
494
|
+
const baseVal = result[key];
|
|
495
|
+
const overVal = override[key];
|
|
496
|
+
if (isPlainObject(baseVal) && isPlainObject(overVal)) {
|
|
497
|
+
result[key] = { ...baseVal, ...overVal };
|
|
498
|
+
} else {
|
|
499
|
+
result[key] = overVal;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return result;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/** True for `{}` literals — false for arrays, null, Date, etc. */
|
|
506
|
+
function isPlainObject(val: unknown): val is Record<string, unknown> {
|
|
507
|
+
return val !== null && typeof val === 'object' && !Array.isArray(val);
|
|
508
|
+
}
|
|
509
|
+
|
|
246
510
|
/** @internal Exported for testing. */
|
|
247
511
|
export function generateWranglerConfig(
|
|
248
512
|
config: TimberConfig,
|
|
@@ -267,12 +531,20 @@ export function generateWranglerConfig(
|
|
|
267
531
|
},
|
|
268
532
|
};
|
|
269
533
|
|
|
270
|
-
//
|
|
534
|
+
// Layer 1: merge bindings-generated sections into base
|
|
535
|
+
const bindingsConfig = generateBindingsConfig(options.bindings);
|
|
536
|
+
const merged = { ...base, ...bindingsConfig };
|
|
537
|
+
|
|
538
|
+
// Layer 2: wrangler escape hatch with deep merge for nested plain objects.
|
|
539
|
+
// A shallow spread would replace entire sections like durable_objects and
|
|
540
|
+
// queues — e.g. adding migrations via wrangler would drop the generated
|
|
541
|
+
// durable_objects.bindings. Deep merge preserves generated keys while
|
|
542
|
+
// letting wrangler override on actual key-level conflicts.
|
|
271
543
|
if (options.wrangler) {
|
|
272
|
-
return
|
|
544
|
+
return shallowDeepMerge(merged, options.wrangler);
|
|
273
545
|
}
|
|
274
546
|
|
|
275
|
-
return
|
|
547
|
+
return merged;
|
|
276
548
|
}
|
|
277
549
|
|
|
278
550
|
// ─── Preview ─────────────────────────────────────────────────────────────────
|
|
@@ -310,16 +582,18 @@ function spawnPreviewProcess(command: string, args: string[], cwd: string): Prom
|
|
|
310
582
|
}
|
|
311
583
|
|
|
312
584
|
// ─── Cloudflare Workers type stubs ───────────────────────────────────────────
|
|
313
|
-
//
|
|
314
|
-
//
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
585
|
+
// Local type declarations so this file compiles without @cloudflare/workers-types.
|
|
586
|
+
// These are NOT declared globally — that would clash with @cloudflare/workers-types
|
|
587
|
+
// when users install it. Instead, they're module-scoped and used only within
|
|
588
|
+
// this file's function signatures.
|
|
589
|
+
|
|
590
|
+
/** @internal Minimal stub — use @cloudflare/workers-types for full types. */
|
|
591
|
+
export interface CfExecutionContext {
|
|
592
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
593
|
+
passThroughOnException(): void;
|
|
594
|
+
}
|
|
321
595
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
596
|
+
/** @internal Minimal stub — use @cloudflare/workers-types for full types. */
|
|
597
|
+
export interface CfExportedHandler<Env = Record<string, unknown>> {
|
|
598
|
+
fetch?(request: Request, env: Env, ctx: CfExecutionContext): Promise<Response> | Response;
|
|
325
599
|
}
|
|
@@ -22,9 +22,11 @@
|
|
|
22
22
|
export function generateCompressModule(): string {
|
|
23
23
|
return `// Generated by @timber-js/app — response compression for self-hosted deployments.
|
|
24
24
|
// Do not edit — this file is regenerated on each build.
|
|
25
|
-
// Uses
|
|
26
|
-
//
|
|
27
|
-
//
|
|
25
|
+
// Uses node:zlib createGzip() (C++ native) on Node.js, falls back to
|
|
26
|
+
// CompressionStream (Web API) on other runtimes. Brotli is left to CDNs/reverse
|
|
27
|
+
// proxies — at streaming quality levels its ratio advantage is marginal.
|
|
28
|
+
import { Readable } from 'node:stream';
|
|
29
|
+
import { createGzip, constants } from 'node:zlib';
|
|
28
30
|
|
|
29
31
|
const COMPRESSIBLE_TYPES = new Set([
|
|
30
32
|
'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
|
|
@@ -71,7 +73,25 @@ function shouldCompress(response) {
|
|
|
71
73
|
}
|
|
72
74
|
|
|
73
75
|
function compressWithGzip(body) {
|
|
74
|
-
|
|
76
|
+
// Use node:zlib (C++ native) for gzip compression. The Web Streams
|
|
77
|
+
// CompressionStream works but every chunk crosses the JS/Promise boundary.
|
|
78
|
+
// node:zlib.createGzip() compresses entirely in C++ with zero per-chunk
|
|
79
|
+
// Promise overhead.
|
|
80
|
+
//
|
|
81
|
+
// Convert: Web ReadableStream → Node Readable → pipe through gzip →
|
|
82
|
+
// Node Readable → Readable.toWeb() → Web ReadableStream
|
|
83
|
+
try {
|
|
84
|
+
const nodeReadable = Readable.fromWeb(body);
|
|
85
|
+
// Z_SYNC_FLUSH ensures each chunk is flushed immediately so the browser
|
|
86
|
+
// receives the HTML shell before Suspense boundaries resolve. Without it,
|
|
87
|
+
// gzip buffers internally and breaks streaming.
|
|
88
|
+
const gzip = createGzip({ flush: constants.Z_SYNC_FLUSH });
|
|
89
|
+
const compressed = nodeReadable.pipe(gzip);
|
|
90
|
+
return Readable.toWeb(compressed);
|
|
91
|
+
} catch {
|
|
92
|
+
// Fallback: CompressionStream (CF Workers, or if node:stream unavailable)
|
|
93
|
+
return body.pipeThrough(new CompressionStream('gzip'));
|
|
94
|
+
}
|
|
75
95
|
}
|
|
76
96
|
|
|
77
97
|
export function compressResponse(request, response) {
|