@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.160
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-C9yAuoX3.js +314 -0
- package/dist/_chunks/actions-C9yAuoX3.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-swbefQ6F.js +1125 -0
- package/dist/_chunks/cache-api-swbefQ6F.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
- package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-BhYDz_-x.js +638 -0
- package/dist/_chunks/cli-schema-sync-BhYDz_-x.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-Bssfp6ot.js +82 -0
- package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
- package/dist/_chunks/define-CFmvb4Bt.js +203 -0
- package/dist/_chunks/define-CFmvb4Bt.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/logger-CPoQkGK6.js +1523 -0
- package/dist/_chunks/logger-CPoQkGK6.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-DeAxFRMq.js +280 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.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-3iUvBV5T.js +50 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.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-BY3QLBL7.js +119 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.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/tree-match-D2l830j2.js +102 -0
- package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.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-c8aReVgo.js +988 -0
- package/dist/_chunks/walkers-c8aReVgo.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 +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +117 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +177 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +342 -67
- package/dist/adapters/cloudflare.js.map +1 -1
- 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 +1 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -144
- 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/cache/cache-api.d.ts +26 -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 +27 -7
- 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/redis-handler.d.ts +97 -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 +51 -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 +34 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +107 -33
- 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 +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 +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 +11 -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 +182 -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 +825 -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 +120 -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 +87 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +47 -14
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +4 -4
- 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/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 +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +304 -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 +253 -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} +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/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 +158 -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 +7807 -13691
- 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 +190 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -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 +95 -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 +1 -1
- 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.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/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 +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 +91 -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 +37 -440
- 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 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +85 -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 +6 -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 +115 -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 +221 -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 +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- 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 +3577 -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 +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 +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +122 -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 +58 -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/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/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 +101 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +83 -31
- 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/route-element-builder.d.ts +39 -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/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 +51 -28
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +30 -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/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 +5 -6
- 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 +34 -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 +7 -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 +12 -5
- 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 +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 +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 +16 -16
- 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 +199 -0
- package/docs/api/33-api-search-params.mdx +141 -0
- package/docs/api/34-api-config.mdx +189 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +76 -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 +136 -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 +168 -0
- package/docs/learn/13-configuration.mdx +145 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +139 -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 +102 -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 +179 -0
- package/src/adapters/cloudflare.ts +594 -119
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +131 -96
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- 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 +88 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +122 -15
- 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 +233 -0
- package/src/cache/timber-cache.ts +142 -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 +388 -0
- package/src/cli.ts +157 -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 +111 -0
- package/src/client/browser-entry/post-hydration.ts +103 -0
- package/src/client/browser-entry/router-init.ts +287 -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 +11 -7
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +346 -150
- package/src/client/navigation-api.ts +341 -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 +482 -166
- package/src/client/rsc-fetch.ts +214 -33
- package/src/client/segment-cache.ts +7 -7
- 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/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +49 -14
- 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 +9 -3
- 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 +147 -0
- package/src/config-types.ts +302 -0
- package/src/config-validation.ts +328 -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} +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 +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 +63 -8
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +316 -0
- package/src/fonts/transform.ts +305 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +431 -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 +378 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +186 -0
- package/src/plugins/callsite-ast.ts +167 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +144 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +293 -46
- package/src/plugins/entries.ts +129 -8
- package/src/plugins/fonts.ts +191 -664
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +210 -0
- package/src/plugins/prebuilt.ts +700 -0
- package/src/plugins/prerender-sugar.ts +329 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +97 -12
- package/src/plugins/shims.ts +217 -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 +360 -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 +310 -0
- package/src/routing/manifest-codegen.ts +281 -0
- package/src/routing/scanner.ts +248 -188
- 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 +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 +252 -0
- package/src/search-params/define.ts +570 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +110 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +84 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +39 -54
- package/src/server/als-registry.ts +129 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +13 -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 +311 -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 +437 -0
- package/src/server/html-injectors.ts +267 -254
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +331 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +538 -0
- package/src/server/pipeline.ts +226 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +224 -0
- package/src/server/prebuilt/capture-state.ts +89 -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/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +696 -0
- package/src/server/prebuilt-runtime.ts +708 -0
- package/src/server/primitives.ts +155 -63
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +523 -233
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +144 -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/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +160 -76
- package/src/server/rsc-entry/index.ts +393 -329
- package/src/server/rsc-entry/render-route.ts +284 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +72 -33
- 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 +273 -43
- 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 +344 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +258 -257
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +286 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +220 -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.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/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
|
@@ -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, readFile, cp, rm, readdir } 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. ' +
|
|
@@ -71,10 +72,88 @@ export function getCloudflareBindings<
|
|
|
71
72
|
|
|
72
73
|
/**
|
|
73
74
|
* Run a function with Cloudflare bindings available via getCloudflareBindings().
|
|
74
|
-
* @internal Used by
|
|
75
|
+
* @internal Used by cloudflareDevBindings() to wrap dev-server requests.
|
|
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,73 @@ 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
|
-
await
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
230
|
+
|
|
231
|
+
// Clean stale prebuilt artifacts BEFORE the shared copy step.
|
|
232
|
+
// The shared step uses cp (merge, not replace), so old .flight files
|
|
233
|
+
// from removed/renamed components would persist and get picked up by
|
|
234
|
+
// find_additional_modules. Also clean static/prebuilt/ from pre-TIM-1162
|
|
235
|
+
// builds where prebuilt was copied into static assets.
|
|
236
|
+
await rm(join(outDir, 'prebuilt'), { recursive: true, force: true }).catch(() => {});
|
|
237
|
+
await rm(join(outDir, 'static', 'prebuilt'), { recursive: true, force: true }).catch(
|
|
238
|
+
() => {}
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
// Steps 1–5: shared across all adapters (mkdir, copy client/rsc/ssr,
|
|
242
|
+
// write _headers, write manifest-init).
|
|
243
|
+
await runSharedBuildSteps({
|
|
244
|
+
config,
|
|
245
|
+
buildDir,
|
|
246
|
+
outDir,
|
|
247
|
+
publicDirName: 'static',
|
|
133
248
|
});
|
|
134
249
|
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
250
|
+
// Compile optional worker handlers (queue, scheduled, etc.)
|
|
251
|
+
// Uses Vite's build API to bundle the TypeScript source into ESM.
|
|
252
|
+
let hasWorkerHandlers = false;
|
|
253
|
+
if (options.workerHandlers) {
|
|
254
|
+
const handlersEntry = join(process.cwd(), options.workerHandlers);
|
|
255
|
+
const { build: viteBuild } = await import('vite');
|
|
256
|
+
await viteBuild({
|
|
257
|
+
configFile: false,
|
|
258
|
+
logLevel: 'info',
|
|
259
|
+
build: {
|
|
260
|
+
lib: {
|
|
261
|
+
entry: handlersEntry,
|
|
262
|
+
formats: ['es'],
|
|
263
|
+
fileName: () => '_worker-handlers.js',
|
|
264
|
+
},
|
|
265
|
+
outDir,
|
|
266
|
+
emptyOutDir: false,
|
|
267
|
+
minify: false,
|
|
268
|
+
rollupOptions: {
|
|
269
|
+
external: [/^node:/, /^cloudflare:/],
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
hasWorkerHandlers = true;
|
|
152
274
|
}
|
|
153
275
|
|
|
276
|
+
// Embed prebuilt flight payloads directly into the worker module
|
|
277
|
+
// (TIM-1162). Previously, prebuilt/ was copied into static assets and
|
|
278
|
+
// read via env.ASSETS.fetch() — but that made .flight files and
|
|
279
|
+
// manifest.json publicly fetchable, bypassing middleware and access
|
|
280
|
+
// gates. Now payloads are imported as native wrangler Data/Text modules
|
|
281
|
+
// from outDir/prebuilt/ (outside static/), keeping them server-side only.
|
|
282
|
+
const prebuiltData = await readPrebuiltData(buildDir);
|
|
283
|
+
await writeFile(
|
|
284
|
+
join(outDir, '_timber-prebuilt-source.js'),
|
|
285
|
+
generatePrebuiltSourceModule(prebuiltData)
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
// Write the runtime init module — sets process.env.TIMBER_RUNTIME
|
|
289
|
+
// BEFORE the RSC entry evaluates (ESM import order). Without this,
|
|
290
|
+
// createRequestHandler's auto-wire for WorkersCachePurge would not
|
|
291
|
+
// detect the Cloudflare runtime (TIM-1170).
|
|
292
|
+
await writeFile(join(outDir, '_timber-runtime-init.js'), generateRuntimeInitModule());
|
|
293
|
+
|
|
154
294
|
// Generate the Workers entry point
|
|
155
295
|
const hasManifestInit = !!config.manifestInit;
|
|
156
|
-
const workerEntry = generateWorkerEntry(outDir, outDir, hasManifestInit);
|
|
296
|
+
const workerEntry = generateWorkerEntry(outDir, outDir, hasManifestInit, hasWorkerHandlers);
|
|
157
297
|
await writeFile(join(outDir, '_worker.js'), workerEntry);
|
|
158
298
|
|
|
159
299
|
// Generate wrangler.jsonc
|
|
@@ -166,45 +306,11 @@ export function cloudflare(options: CloudflareAdapterOptions = {}): TimberPlatfo
|
|
|
166
306
|
await spawnPreviewProcess(cmd.command, cmd.args, cmd.cwd);
|
|
167
307
|
},
|
|
168
308
|
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Wrap a timber request handler to bind the Cloudflare execution context
|
|
177
|
-
* for `waitUntil()` support and env bindings passthrough.
|
|
178
|
-
* Called from the generated worker entry.
|
|
179
|
-
*
|
|
180
|
-
* This function:
|
|
181
|
-
* 1. Binds `adapter.waitUntil()` to `ctx.waitUntil()` per-request
|
|
182
|
-
* 2. Makes `env` accessible via `getCloudflareBindings()` per-request via ALS
|
|
183
|
-
*/
|
|
184
|
-
export function wrapWithExecutionContext(
|
|
185
|
-
adapter: TimberPlatformAdapter,
|
|
186
|
-
handler: (req: Request) => Promise<Response>
|
|
187
|
-
): ExportedHandler<Record<string, unknown>> {
|
|
188
|
-
return {
|
|
189
|
-
async fetch(
|
|
190
|
-
request: Request,
|
|
191
|
-
env: Record<string, unknown>,
|
|
192
|
-
ctx: ExecutionContext
|
|
193
|
-
): Promise<Response> {
|
|
194
|
-
// Bind the adapter's waitUntil to the Workers execution context
|
|
195
|
-
const originalWaitUntil = adapter.waitUntil;
|
|
196
|
-
adapter.waitUntil = (promise: Promise<unknown>) => {
|
|
197
|
-
ctx.waitUntil(promise);
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
try {
|
|
201
|
-
// Run the handler within ALS so getCloudflareBindings() works
|
|
202
|
-
return await runWithBindings(env, () => handler(request));
|
|
203
|
-
} finally {
|
|
204
|
-
// Restore (in case adapter is reused across isolate resets)
|
|
205
|
-
adapter.waitUntil = originalWaitUntil;
|
|
206
|
-
}
|
|
207
|
-
},
|
|
309
|
+
// No adapter-level waitUntil: on Workers there is no ambient
|
|
310
|
+
// ExecutionContext outside a request, so support is provided
|
|
311
|
+
// per-request by the generated _worker.js, which bridges
|
|
312
|
+
// ctx.waitUntil() into the ALS via runWithWaitUntil().
|
|
313
|
+
// See design/11-platform.md §"waitUntil()".
|
|
208
314
|
};
|
|
209
315
|
}
|
|
210
316
|
|
|
@@ -214,7 +320,8 @@ export function wrapWithExecutionContext(
|
|
|
214
320
|
export function generateWorkerEntry(
|
|
215
321
|
buildDir: string,
|
|
216
322
|
outDir: string,
|
|
217
|
-
hasManifestInit = false
|
|
323
|
+
hasManifestInit = false,
|
|
324
|
+
hasWorkerHandlers = false
|
|
218
325
|
): string {
|
|
219
326
|
// The RSC entry is the main request handler — it exports the fetch handler as default.
|
|
220
327
|
// The Vite RSC plugin outputs it to rsc/index.js.
|
|
@@ -229,20 +336,355 @@ export function generateWorkerEntry(
|
|
|
229
336
|
// ESM guarantees imports are evaluated in order.
|
|
230
337
|
const manifestImport = hasManifestInit ? "import './_timber-manifest-init.js'\n" : '';
|
|
231
338
|
|
|
339
|
+
// Optional additional Worker handlers (queue, scheduled, email, etc.)
|
|
340
|
+
// Compiled by buildOutput via Vite's build API into _worker-handlers.js.
|
|
341
|
+
// The module's named exports are spread into the default export alongside fetch.
|
|
342
|
+
const handlersImport = hasWorkerHandlers
|
|
343
|
+
? "import * as workerHandlers from './_worker-handlers.js'\n"
|
|
344
|
+
: '';
|
|
345
|
+
const handlersSpread = hasWorkerHandlers ? ' ...workerHandlers,\n' : '';
|
|
346
|
+
|
|
232
347
|
return `// Generated by @timber-js/app/adapters/cloudflare
|
|
233
348
|
// Do not edit — this file is regenerated on each build.
|
|
234
349
|
|
|
235
|
-
|
|
350
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
351
|
+
// Side-effect imports: evaluated IN ORDER before the _worker.js body runs.
|
|
352
|
+
// _timber-runtime-init.js sets TIMBER_RUNTIME before createRequestHandler()
|
|
353
|
+
// runs (during the RSC entry's top-level await) so the auto-wire for
|
|
354
|
+
// WorkersCachePurge can detect the Cloudflare runtime (TIM-1170).
|
|
355
|
+
// _timber-prebuilt-source.js sets globalThis.__TIMBER_PREBUILT_SOURCE__
|
|
356
|
+
// for cache.component payloads.
|
|
357
|
+
import './_timber-runtime-init.js'
|
|
358
|
+
import './_timber-prebuilt-source.js'
|
|
359
|
+
${manifestImport}import handler, { runWithWaitUntil, runWithWorkersCachePurge } from '${rscEntryRelative}'
|
|
360
|
+
${handlersImport}
|
|
361
|
+
|
|
362
|
+
// Bind Cloudflare env to ALS so getCloudflareBindings() works at runtime.
|
|
363
|
+
// Uses the same Symbol.for key as getCloudflareBindings() reads from.
|
|
364
|
+
const ALS_KEY = Symbol.for('timber:cf-bindings-als')
|
|
365
|
+
let bindingsAls = globalThis[ALS_KEY]
|
|
366
|
+
if (!bindingsAls) {
|
|
367
|
+
bindingsAls = new AsyncLocalStorage()
|
|
368
|
+
globalThis[ALS_KEY] = bindingsAls
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Register timber's platform tracer so pipeline phase spans (timber.proxy,
|
|
372
|
+
// timber.middleware, timber.render, timber.access, timber.action, …) appear
|
|
373
|
+
// as native Cloudflare spans in the Observability dashboard, nested under
|
|
374
|
+
// the auto-instrumented fetch/KV/D1 spans. Requires observability.traces
|
|
375
|
+
// enabled in wrangler.jsonc (generated by default).
|
|
376
|
+
//
|
|
377
|
+
// Lazily imported and guarded: runtimes without the custom spans API
|
|
378
|
+
// (older compatibility dates, older local workerd) fall back to OTEL-only
|
|
379
|
+
// emission. withSpan() in the framework composes both channels.
|
|
380
|
+
const TRACER_KEY = Symbol.for('timber:platform-tracer')
|
|
381
|
+
let tracerInit
|
|
382
|
+
function initPlatformTracer() {
|
|
383
|
+
tracerInit ??= import('cloudflare:workers')
|
|
384
|
+
.then(({ tracing }) => {
|
|
385
|
+
if (tracing && typeof tracing.enterSpan === 'function') {
|
|
386
|
+
globalThis[TRACER_KEY] ??= {
|
|
387
|
+
enterSpan: (name, fn) => tracing.enterSpan(name, fn),
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
})
|
|
391
|
+
.catch(() => {})
|
|
392
|
+
return tracerInit
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export default {
|
|
396
|
+
${handlersSpread} async fetch(request, env, ctx) {
|
|
397
|
+
// One-time on first request; resolved-promise await thereafter.
|
|
398
|
+
await initPlatformTracer()
|
|
399
|
+
|
|
400
|
+
// Edge-cache GET/HEAD responses via the Cache API. RSC navigation
|
|
401
|
+
// requests (Accept: text/x-component) are excluded — they vary by
|
|
402
|
+
// X-Timber-State-Tree which the cache key doesn't capture.
|
|
403
|
+
const isRsc = request.headers.get('Accept')?.includes('text/x-component')
|
|
404
|
+
const reqCc = request.headers.get('Cache-Control') || ''
|
|
405
|
+
const bypassCache = reqCc.includes('no-cache') || reqCc.includes('max-age=0')
|
|
406
|
+
|| request.headers.has('Pragma')
|
|
407
|
+
const cacheable = !isRsc && !bypassCache
|
|
408
|
+
&& (request.method === 'GET' || request.method === 'HEAD')
|
|
409
|
+
const cache = cacheable && typeof caches !== 'undefined' ? caches.default : null
|
|
410
|
+
if (cache) {
|
|
411
|
+
const cached = await cache.match(request)
|
|
412
|
+
if (cached) return cached
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Bridge ctx.cache into the per-request ALS so WorkersCachePurge can
|
|
416
|
+
// call ctx.cache.purge({ tags }) during cache.invalidate/revalidateTag.
|
|
417
|
+
// Workers Cache is available on all Cloudflare plans — no API token needed.
|
|
418
|
+
const workersCacheCtx = ctx.cache && typeof ctx.cache.purge === 'function' ? ctx.cache : null
|
|
419
|
+
const runHandler = () =>
|
|
420
|
+
runWithWaitUntil((promise) => ctx.waitUntil(promise), () => handler(request))
|
|
421
|
+
const response = await bindingsAls.run(env, () =>
|
|
422
|
+
workersCacheCtx
|
|
423
|
+
? runWithWorkersCachePurge(workersCacheCtx, runHandler)
|
|
424
|
+
: runHandler()
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
// Cache public responses at the edge. A response is edge-cacheable if
|
|
428
|
+
// it has 'public' or 's-maxage' (a shared-cache TTL directive) and no
|
|
429
|
+
// 'no-store' or 'private'. Cloudflare's cache.put() only accepts GET
|
|
430
|
+
// requests and rejects 206, so only store GET 200s. HEAD requests
|
|
431
|
+
// benefit from cache.match() which handles HEAD→GET matching automatically.
|
|
432
|
+
// See design/25-production-deployments.md §"CDN / Edge Cache".
|
|
433
|
+
if (cache && request.method === 'GET' && response.status === 200) {
|
|
434
|
+
const cc = response.headers.get('Cache-Control')
|
|
435
|
+
const vary = response.headers.get('Vary')
|
|
436
|
+
if (cc && !cc.includes('no-store') && !cc.includes('private')
|
|
437
|
+
&& (cc.includes('public') || cc.includes('s-maxage'))
|
|
438
|
+
&& vary !== '*' && !response.headers.has('Set-Cookie')) {
|
|
439
|
+
ctx.waitUntil(cache.put(request, response.clone()))
|
|
440
|
+
}
|
|
441
|
+
}
|
|
236
442
|
|
|
237
|
-
|
|
238
|
-
|
|
443
|
+
return response
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
`;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/** Build-time prebuilt file list read from `.timber/dist/prebuilt/`. */
|
|
450
|
+
export interface PrebuiltModuleData {
|
|
451
|
+
/** Payload file paths relative to prebuilt/ (e.g. "comp_abc/deadbeef.flight"). */
|
|
452
|
+
payloadFiles: string[];
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Discover prebuilt flight payload files from the build directory.
|
|
457
|
+
* Returns null when no prebuilt artifacts exist (no cache.component usage).
|
|
458
|
+
*
|
|
459
|
+
* @internal Exported for testing.
|
|
460
|
+
*/
|
|
461
|
+
export async function readPrebuiltData(buildDir: string): Promise<PrebuiltModuleData | null> {
|
|
462
|
+
const prebuiltDir = join(buildDir, 'prebuilt');
|
|
463
|
+
try {
|
|
464
|
+
await readFile(join(prebuiltDir, 'manifest.json'));
|
|
465
|
+
} catch {
|
|
466
|
+
return null;
|
|
467
|
+
}
|
|
468
|
+
const payloadFiles: string[] = [];
|
|
469
|
+
try {
|
|
470
|
+
const componentDirs = await readdir(prebuiltDir, { withFileTypes: true });
|
|
471
|
+
for (const dir of componentDirs) {
|
|
472
|
+
if (!dir.isDirectory()) continue;
|
|
473
|
+
const files = await readdir(join(prebuiltDir, dir.name));
|
|
474
|
+
for (const file of files) {
|
|
475
|
+
if (file.endsWith('.flight')) {
|
|
476
|
+
payloadFiles.push(`${dir.name}/${file}`);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
} catch {
|
|
481
|
+
// No subdirectories — manifest exists but no payloads
|
|
482
|
+
}
|
|
483
|
+
return { payloadFiles };
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Generate the prebuilt payload source module for Cloudflare Workers.
|
|
488
|
+
*
|
|
489
|
+
* Imports prebuilt flight payloads as native wrangler Data/Text modules
|
|
490
|
+
* from the worker's module graph (NOT from static assets — TIM-1162).
|
|
491
|
+
* Files live at `outDir/prebuilt/` which is outside `static/` and thus
|
|
492
|
+
* not publicly fetchable. Wrangler discovers them via
|
|
493
|
+
* `find_additional_modules: true` with Data/Text rules.
|
|
494
|
+
*
|
|
495
|
+
* This is a separate ESM module so it evaluates before the RSC handler —
|
|
496
|
+
* static imports are hoisted, guaranteeing `globalThis.__TIMBER_PREBUILT_SOURCE__`
|
|
497
|
+
* is set before `createRequestHandler()` reads it.
|
|
498
|
+
*
|
|
499
|
+
* @internal Exported for testing.
|
|
500
|
+
*/
|
|
501
|
+
export function generatePrebuiltSourceModule(data: PrebuiltModuleData | null): string {
|
|
502
|
+
if (!data) {
|
|
503
|
+
return `// Generated by @timber-js/app/adapters/cloudflare
|
|
504
|
+
// No prebuilt artifacts — all cache.component wrappers render dynamically.
|
|
505
|
+
globalThis.__TIMBER_PREBUILT_SOURCE__ = {
|
|
506
|
+
async loadManifest() { return null },
|
|
507
|
+
async readPayload() { return null },
|
|
508
|
+
}
|
|
509
|
+
`;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
const imports: string[] = [];
|
|
513
|
+
const entries: string[] = [];
|
|
514
|
+
|
|
515
|
+
imports.push(`import _manifestText from './prebuilt/manifest.json'`);
|
|
516
|
+
|
|
517
|
+
for (let i = 0; i < data.payloadFiles.length; i++) {
|
|
518
|
+
const file = data.payloadFiles[i];
|
|
519
|
+
imports.push(`import _p${i} from './prebuilt/${file}'`);
|
|
520
|
+
entries.push(` ${JSON.stringify(file)}: new Uint8Array(_p${i})`);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return `// Generated by @timber-js/app/adapters/cloudflare
|
|
524
|
+
// Prebuilt payload source — imports cache.component flight payloads as
|
|
525
|
+
// native wrangler modules from the worker bundle (TIM-1162). Files live
|
|
526
|
+
// at outDir/prebuilt/, outside static/, so they are not publicly fetchable.
|
|
527
|
+
${imports.join('\n')}
|
|
528
|
+
|
|
529
|
+
const _manifest = JSON.parse(_manifestText)
|
|
530
|
+
|
|
531
|
+
const _payloads = {
|
|
532
|
+
${entries.join(',\n')}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
globalThis.__TIMBER_PREBUILT_SOURCE__ = {
|
|
536
|
+
async loadManifest() { return _manifest },
|
|
537
|
+
async readPayload(file) { return _payloads[file] ?? null },
|
|
538
|
+
}
|
|
539
|
+
`;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Generate the runtime init module that sets TIMBER_RUNTIME before the
|
|
544
|
+
* RSC entry evaluates. Imported as a side-effect module in _worker.js.
|
|
545
|
+
*
|
|
546
|
+
* @internal Exported for testing.
|
|
547
|
+
*/
|
|
548
|
+
export function generateRuntimeInitModule(): string {
|
|
549
|
+
return `// Generated by @timber-js/app/adapters/cloudflare
|
|
550
|
+
// Sets TIMBER_RUNTIME before the RSC handler evaluates (TIM-1170).
|
|
551
|
+
// Must be a separate module imported before rsc/index.js so that ESM
|
|
552
|
+
// evaluation order guarantees the env var is set when
|
|
553
|
+
// createRequestHandler() runs its auto-wire logic.
|
|
239
554
|
globalThis.process ??= { env: {} }
|
|
240
555
|
process.env.TIMBER_RUNTIME = 'cloudflare'
|
|
241
|
-
|
|
242
|
-
export default { fetch: handler }
|
|
243
556
|
`;
|
|
244
557
|
}
|
|
245
558
|
|
|
559
|
+
/** Wrangler binding sections generated from `CloudflareBindings`. */
|
|
560
|
+
export interface WranglerBindingsConfig {
|
|
561
|
+
kv_namespaces?: Array<{ binding: string; id: string }>;
|
|
562
|
+
d1_databases?: Array<{ binding: string; database_id: string }>;
|
|
563
|
+
r2_buckets?: Array<{ binding: string; bucket_name: string }>;
|
|
564
|
+
queues?: {
|
|
565
|
+
producers?: Array<{ binding: string; queue: string }>;
|
|
566
|
+
consumers?: Array<Record<string, unknown>>;
|
|
567
|
+
};
|
|
568
|
+
durable_objects?: {
|
|
569
|
+
bindings: Array<Record<string, string>>;
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Convert declarative `CloudflareBindings` into wrangler.jsonc binding sections.
|
|
575
|
+
*
|
|
576
|
+
* Maps:
|
|
577
|
+
* - `kv` → `kv_namespaces`
|
|
578
|
+
* - `d1` → `d1_databases`
|
|
579
|
+
* - `r2` → `r2_buckets`
|
|
580
|
+
* - `queues` → `queues` (producers + consumers)
|
|
581
|
+
* - `durableObjects` → `durable_objects`
|
|
582
|
+
*
|
|
583
|
+
* Empty arrays are omitted from the output.
|
|
584
|
+
*
|
|
585
|
+
* @internal Exported for testing.
|
|
586
|
+
*/
|
|
587
|
+
export function generateBindingsConfig(
|
|
588
|
+
bindings: CloudflareBindings | undefined
|
|
589
|
+
): WranglerBindingsConfig {
|
|
590
|
+
if (!bindings) return {};
|
|
591
|
+
|
|
592
|
+
const result: WranglerBindingsConfig = {};
|
|
593
|
+
|
|
594
|
+
// KV namespaces
|
|
595
|
+
if (bindings.kv && bindings.kv.length > 0) {
|
|
596
|
+
result.kv_namespaces = bindings.kv.map((kv) => ({
|
|
597
|
+
binding: kv.name,
|
|
598
|
+
id: kv.id ?? '',
|
|
599
|
+
}));
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// D1 databases
|
|
603
|
+
if (bindings.d1 && bindings.d1.length > 0) {
|
|
604
|
+
result.d1_databases = bindings.d1.map((d1) => ({
|
|
605
|
+
binding: d1.name,
|
|
606
|
+
database_id: d1.database_id,
|
|
607
|
+
}));
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// R2 buckets
|
|
611
|
+
if (bindings.r2 && bindings.r2.length > 0) {
|
|
612
|
+
result.r2_buckets = bindings.r2.map((r2) => ({
|
|
613
|
+
binding: r2.name,
|
|
614
|
+
bucket_name: r2.bucket_name,
|
|
615
|
+
}));
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Queues (producers and/or consumers)
|
|
619
|
+
if (bindings.queues) {
|
|
620
|
+
const queues: Record<string, unknown> = {};
|
|
621
|
+
if (bindings.queues.producers && bindings.queues.producers.length > 0) {
|
|
622
|
+
queues.producers = bindings.queues.producers.map((p) => ({
|
|
623
|
+
binding: p.name,
|
|
624
|
+
queue: p.queue,
|
|
625
|
+
}));
|
|
626
|
+
}
|
|
627
|
+
if (bindings.queues.consumers && bindings.queues.consumers.length > 0) {
|
|
628
|
+
queues.consumers = bindings.queues.consumers.map((c) => {
|
|
629
|
+
const consumer: Record<string, unknown> = { queue: c.queue };
|
|
630
|
+
if (c.max_batch_size !== undefined) consumer.max_batch_size = c.max_batch_size;
|
|
631
|
+
if (c.max_retries !== undefined) consumer.max_retries = c.max_retries;
|
|
632
|
+
if (c.dead_letter_queue !== undefined) consumer.dead_letter_queue = c.dead_letter_queue;
|
|
633
|
+
return consumer;
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
if (Object.keys(queues).length > 0) {
|
|
637
|
+
result.queues = queues;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// Durable Objects
|
|
642
|
+
if (bindings.durableObjects && bindings.durableObjects.length > 0) {
|
|
643
|
+
result.durable_objects = {
|
|
644
|
+
bindings: bindings.durableObjects.map((dobj) => {
|
|
645
|
+
const entry: Record<string, string> = {
|
|
646
|
+
name: dobj.name,
|
|
647
|
+
class_name: dobj.class_name,
|
|
648
|
+
};
|
|
649
|
+
if (dobj.script_name) entry.script_name = dobj.script_name;
|
|
650
|
+
return entry;
|
|
651
|
+
}),
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
return result;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* One-level deep merge: for each key in `override`, if both the base and
|
|
660
|
+
* override values are plain objects (not arrays, not null), merge their
|
|
661
|
+
* keys with override winning on conflicts. Everything else (primitives,
|
|
662
|
+
* arrays, null) is replaced outright — matching the intuitive behavior
|
|
663
|
+
* where `kv_namespaces: [...]` replaces fully but
|
|
664
|
+
* `durable_objects: { migrations }` merges with generated `bindings`.
|
|
665
|
+
*/
|
|
666
|
+
function shallowDeepMerge(
|
|
667
|
+
base: Record<string, unknown>,
|
|
668
|
+
override: Record<string, unknown>
|
|
669
|
+
): Record<string, unknown> {
|
|
670
|
+
const result = { ...base };
|
|
671
|
+
for (const key of Object.keys(override)) {
|
|
672
|
+
const baseVal = result[key];
|
|
673
|
+
const overVal = override[key];
|
|
674
|
+
if (isPlainObject(baseVal) && isPlainObject(overVal)) {
|
|
675
|
+
result[key] = { ...baseVal, ...overVal };
|
|
676
|
+
} else {
|
|
677
|
+
result[key] = overVal;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
return result;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/** True for `{}` literals — false for arrays, null, Date, etc. */
|
|
684
|
+
function isPlainObject(val: unknown): val is Record<string, unknown> {
|
|
685
|
+
return val !== null && typeof val === 'object' && !Array.isArray(val);
|
|
686
|
+
}
|
|
687
|
+
|
|
246
688
|
/** @internal Exported for testing. */
|
|
247
689
|
export function generateWranglerConfig(
|
|
248
690
|
config: TimberConfig,
|
|
@@ -252,6 +694,11 @@ export function generateWranglerConfig(
|
|
|
252
694
|
|
|
253
695
|
const flags = options.compatibilityFlags ?? ['nodejs_compat'];
|
|
254
696
|
|
|
697
|
+
const PREBUILT_MODULE_RULES = [
|
|
698
|
+
{ type: 'Text' as const, globs: ['prebuilt/**/*.json'] },
|
|
699
|
+
{ type: 'Data' as const, globs: ['prebuilt/**/*.flight'] },
|
|
700
|
+
];
|
|
701
|
+
|
|
255
702
|
const base: Record<string, unknown> = {
|
|
256
703
|
name: 'timber-app',
|
|
257
704
|
main: '_worker.js',
|
|
@@ -261,18 +708,49 @@ export function generateWranglerConfig(
|
|
|
261
708
|
// esbuild pass to avoid issues with top-level await and module format.
|
|
262
709
|
no_bundle: true,
|
|
263
710
|
find_additional_modules: true,
|
|
264
|
-
rules: [{ type: 'ESModule', globs: ['**/*.js'] }],
|
|
711
|
+
rules: [{ type: 'ESModule', globs: ['**/*.js'] }, ...PREBUILT_MODULE_RULES],
|
|
265
712
|
assets: {
|
|
266
713
|
directory: './static',
|
|
714
|
+
binding: 'ASSETS',
|
|
715
|
+
},
|
|
716
|
+
// Native trace destination — required for timber's pipeline spans
|
|
717
|
+
// (emitted via tracing.enterSpan in the generated _worker.js) to appear
|
|
718
|
+
// in the Cloudflare Observability dashboard. Gates traces only; does
|
|
719
|
+
// not enable Workers Logs. Override via the `wrangler` escape hatch:
|
|
720
|
+
// wrangler: { observability: { traces: { enabled: false } } }.
|
|
721
|
+
observability: {
|
|
722
|
+
traces: { enabled: true },
|
|
267
723
|
},
|
|
268
724
|
};
|
|
269
725
|
|
|
270
|
-
//
|
|
726
|
+
// Layer 1: merge bindings-generated sections into base
|
|
727
|
+
const bindingsConfig = generateBindingsConfig(options.bindings);
|
|
728
|
+
const merged = { ...base, ...bindingsConfig };
|
|
729
|
+
|
|
730
|
+
// Layer 2: wrangler escape hatch with deep merge for nested plain objects.
|
|
731
|
+
// A shallow spread would replace entire sections like durable_objects and
|
|
732
|
+
// queues — e.g. adding migrations via wrangler would drop the generated
|
|
733
|
+
// durable_objects.bindings. Deep merge preserves generated keys while
|
|
734
|
+
// letting wrangler override on actual key-level conflicts.
|
|
271
735
|
if (options.wrangler) {
|
|
272
|
-
|
|
736
|
+
const result = shallowDeepMerge(merged, options.wrangler);
|
|
737
|
+
// Ensure required prebuilt module rules survive a user `rules` override.
|
|
738
|
+
// Without this, `wrangler: { rules: [...] }` replaces the entire array
|
|
739
|
+
// and drops the Text/Data rules that _timber-prebuilt-source.js needs.
|
|
740
|
+
if (options.wrangler.rules) {
|
|
741
|
+
const userRules = result.rules as Array<Record<string, unknown>>;
|
|
742
|
+
for (const required of PREBUILT_MODULE_RULES) {
|
|
743
|
+
const exists = userRules.some(
|
|
744
|
+
(r) =>
|
|
745
|
+
r.type === required.type && JSON.stringify(r.globs) === JSON.stringify(required.globs)
|
|
746
|
+
);
|
|
747
|
+
if (!exists) userRules.push(required);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
return result;
|
|
273
751
|
}
|
|
274
752
|
|
|
275
|
-
return
|
|
753
|
+
return merged;
|
|
276
754
|
}
|
|
277
755
|
|
|
278
756
|
// ─── Preview ─────────────────────────────────────────────────────────────────
|
|
@@ -310,16 +788,13 @@ function spawnPreviewProcess(command: string, args: string[], cwd: string): Prom
|
|
|
310
788
|
}
|
|
311
789
|
|
|
312
790
|
// ─── Cloudflare Workers type stubs ───────────────────────────────────────────
|
|
313
|
-
//
|
|
314
|
-
//
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
interface ExportedHandler<Env = Record<string, unknown>> {
|
|
323
|
-
fetch?(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> | Response;
|
|
324
|
-
}
|
|
791
|
+
// Local type declarations so this file compiles without @cloudflare/workers-types.
|
|
792
|
+
// These are NOT declared globally — that would clash with @cloudflare/workers-types
|
|
793
|
+
// when users install it. Instead, they're module-scoped and used only within
|
|
794
|
+
// this file's function signatures.
|
|
795
|
+
|
|
796
|
+
/** @internal Minimal stub — use @cloudflare/workers-types for full types. */
|
|
797
|
+
export interface CfExecutionContext {
|
|
798
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
799
|
+
passThroughOnException(): void;
|
|
325
800
|
}
|