add cloudflare workers support for all frontends (#366)

This commit is contained in:
Aman Varshney
2025-07-05 15:51:26 +05:30
committed by GitHub
parent 6499f8cf04
commit d2674270a4
53 changed files with 1213 additions and 159 deletions

View File

@@ -73,6 +73,7 @@ const CATEGORY_ORDER: Array<keyof typeof TECH_OPTIONS> = [
"database",
"orm",
"dbSetup",
"webDeploy",
"auth",
"packageManager",
"addons",
@@ -124,6 +125,7 @@ const getBadgeColors = (category: string): string => {
case "packageManager":
return "border-orange-300 bg-orange-100 text-orange-800 dark:border-orange-700/30 dark:bg-orange-900/30 dark:text-orange-300";
case "git":
case "webDeploy":
case "install":
return "border-gray-300 bg-gray-100 text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400";
default:
@@ -800,6 +802,28 @@ const analyzeStackCompatibility = (stack: StackState): CompatibilityResult => {
if (nextStack.examples.length !== originalExamplesLength)
changed = true;
}
// Web deploy compatibility: Workers not supported with TanStack Start
if (
nextStack.webDeploy === "workers" &&
nextStack.webFrontend.includes("tanstack-start")
) {
notes.webDeploy.notes.push(
"Cloudflare Workers deployment is not supported with TanStack Start. It will be set to 'None'.",
);
notes.webFrontend.notes.push(
"TanStack Start is not compatible with Cloudflare Workers deployment.",
);
notes.webDeploy.hasIssue = true;
notes.webFrontend.hasIssue = true;
nextStack.webDeploy = "none";
changed = true;
changes.push({
category: "webDeploy",
message:
"Web deployment set to 'None' (Workers not compatible with TanStack Start)",
});
}
}
}
@@ -899,6 +923,13 @@ const generateCommand = (stackState: StackState): string => {
}
}
if (
stackState.webDeploy &&
!checkDefault("webDeploy", stackState.webDeploy)
) {
flags.push(`--web-deploy ${stackState.webDeploy}`);
}
if (!checkDefault("install", stackState.install)) {
if (stackState.install === "false" && DEFAULT_STACK.install === "true") {
flags.push("--no-install");

View File

@@ -134,7 +134,7 @@ export const TECH_OPTIONS = {
},
{
id: "workers",
name: "Cloudflare Workers (beta)",
name: "Cloudflare Workers",
description: "Serverless runtime for the edge",
icon: "/icon/workers.svg",
color: "from-orange-400 to-orange-600",
@@ -320,6 +320,23 @@ export const TECH_OPTIONS = {
default: true,
},
],
webDeploy: [
{
id: "workers",
name: "Cloudflare Workers",
description: "Deploy to Cloudflare Workers",
icon: "/icon/workers.svg",
color: "from-orange-400 to-orange-600",
},
{
id: "none",
name: "No Deployment",
description: "Skip deployment configuration",
icon: "",
color: "from-gray-400 to-gray-600",
default: true,
},
],
auth: [
{
id: "true",
@@ -594,6 +611,7 @@ export type StackState = {
git: string;
install: string;
api: string;
webDeploy: string;
};
export const DEFAULT_STACK: StackState = {
@@ -612,6 +630,7 @@ export const DEFAULT_STACK: StackState = {
git: "true",
install: "true",
api: "trpc",
webDeploy: "none",
};
export const isStackDefault = <K extends keyof StackState>(

View File

@@ -51,6 +51,9 @@ export const stackParsers = {
"true",
"false",
]).withDefault(DEFAULT_STACK.install),
webDeploy: parseAsStringEnum<StackState["webDeploy"]>(
getValidIds("webDeploy"),
).withDefault(DEFAULT_STACK.webDeploy),
};
export const stackUrlKeys: UrlKeys<typeof stackParsers> = {
@@ -69,6 +72,7 @@ export const stackUrlKeys: UrlKeys<typeof stackParsers> = {
examples: "ex",
git: "git",
install: "i",
webDeploy: "wd",
};
export const stackQueryStatesOptions = {