What to build
Add a @sundayceo/framework/cloudflare sub-export that adapts the framework's request handler for Cloudflare Workers.
Adapter API
The adapter wraps RequestHandlerOptions into a Workers export default { fetch } module and merges Cloudflare env bindings into the app's request context explicitly — following ecosystem conventions (React Router, Astro, SolidStart all pass env through the request context, none use AsyncLocalStorage).
// src/server.ts
import { cloudflare } from "@sundayceo/framework/cloudflare";
import { app } from "./app";
import { routes, templates } from "./routes.gen";
export default cloudflare({
app,
getRoutes: () => routes,
loadRouteModule: (route) => route.load(),
loadTemplate: (id) => templates[id]().then((m) => m.default),
}, {
env: (env) => ({ db: env.DB, cache: env.CACHE }),
});
What the adapter does
- Returns a Workers-compatible
{ fetch(request, env, ctx) } object
- Calls the user-provided
env mapping function to convert Cloudflare bindings into context properties
- Wraps
app.context to merge env-derived values into the request context so loaders/handlers see both
- Makes
ExecutionContext (for waitUntil, etc.) available as cloudflare.ctx in the merged context
Package changes
- Add
src/cloudflare.ts entry point to the framework package
- Add to tsup config's
entry array
- Add to
package.json exports map: "./cloudflare": { "import": "./dist/cloudflare.js", "types": "./dist/cloudflare.d.ts" }
Acceptance criteria
Blocked by
What to build
Add a
@sundayceo/framework/cloudflaresub-export that adapts the framework's request handler for Cloudflare Workers.Adapter API
The adapter wraps
RequestHandlerOptionsinto a Workersexport default { fetch }module and merges Cloudflareenvbindings into the app's request context explicitly — following ecosystem conventions (React Router, Astro, SolidStart all pass env through the request context, none use AsyncLocalStorage).What the adapter does
{ fetch(request, env, ctx) }objectenvmapping function to convert Cloudflare bindings into context propertiesapp.contextto merge env-derived values into the request context so loaders/handlers see bothExecutionContext(forwaitUntil, etc.) available ascloudflare.ctxin the merged contextPackage changes
src/cloudflare.tsentry point to the framework packageentryarraypackage.jsonexports map:"./cloudflare": { "import": "./dist/cloudflare.js", "types": "./dist/cloudflare.d.ts" }Acceptance criteria
@sundayceo/framework/cloudflareis importablecloudflare(handlerOptions)returns a valid Workers{ fetch }exportenvmapping function threads bindings into the request contextExecutionContextavailable ascloudflare.ctxin the merged contextwrangler devandwrangler deployBlocked by