1import * as Alchemy from "alchemy";
2import * as Cloudflare from "alchemy/Cloudflare";
3import * as Effect from "effect/Effect";
4
5export default Alchemy.Stack(
6 "CloudflareWebsiteReactRouterExample",
7 {
8 providers: Cloudflare.providers(),
9 state: Cloudflare.state(),
10 },
11 Effect.gen(function* () {
12 // React Router's RSC build emits multiple server environments (`rsc`
13 // and `ssr`); `viteEnvironments` tells Alchemy how they assemble into
14 // one Worker: the `rsc` environment is the Worker entry, and the `ssr`
15 // environment's chunks are bundled alongside so cross-environment
16 // `loadModule` calls resolve in the deployed Worker.
17 const site = yield* Cloudflare.Website.Vite("Website", {
18 compatibility: {
19 date: "2026-08-31",
20 },
21 // Only hash the files that affect the build, so unchanged sources
22 // skip the Vite build (and the deploy) entirely.
23 memo: {
24 include: [
25 "app/**",
26 "react-router-vite/**",
27 "public/**",
28 "package.json",
29 "vite.config.ts",
30 ],
31 },
32 env: {
33 GREETING: "Hello from React Router on Cloudflare!",
34 },
35 viteEnvironments: {
36 entry: "rsc",
37 children: ["ssr"],
38 },
39 });
40
41 return {
42 url: site.url,
43 };
44 }),
45);