{TITLE_TEXT}
+ diff --git a/apps/cli/src/helpers/core/api-setup.ts b/apps/cli/src/helpers/core/api-setup.ts
index f685ac39c..c489311db 100644
--- a/apps/cli/src/helpers/core/api-setup.ts
+++ b/apps/cli/src/helpers/core/api-setup.ts
@@ -25,6 +25,7 @@ function getFrontendType(frontend: Frontend[]): {
hasNuxtWeb: boolean;
hasSvelteWeb: boolean;
hasSolidWeb: boolean;
+ hasAstroWeb: boolean;
hasNative: boolean;
} {
const reactBasedFrontends = [
@@ -40,6 +41,7 @@ function getFrontendType(frontend: Frontend[]): {
hasNuxtWeb: frontend.includes("nuxt"),
hasSvelteWeb: frontend.includes("svelte"),
hasSolidWeb: frontend.includes("solid"),
+ hasAstroWeb: frontend.includes("astro"),
hasNative: frontend.some((f) => nativeFrontends.includes(f)),
};
}
@@ -108,6 +110,15 @@ function getApiDependencies(
"@tanstack/solid-router-devtools",
],
};
+ } else if (frontendType.hasAstroWeb && api === "orpc") {
+ deps.web = {
+ dependencies: [
+ "@orpc/tanstack-query",
+ "@orpc/client",
+ "@tanstack/react-query",
+ ],
+ devDependencies: ["@tanstack/react-query-devtools"],
+ };
}
if (api === "trpc") {
diff --git a/apps/cli/src/helpers/core/auth-setup.ts b/apps/cli/src/helpers/core/auth-setup.ts
index f6246ce20..f973e9af0 100644
--- a/apps/cli/src/helpers/core/auth-setup.ts
+++ b/apps/cli/src/helpers/core/auth-setup.ts
@@ -116,6 +116,7 @@ export async function setupAuth(config: ProjectConfig) {
"tanstack-start",
"next",
"nuxt",
+ "astro",
"svelte",
"solid",
].includes(f),
diff --git a/apps/cli/src/helpers/core/create-readme.ts b/apps/cli/src/helpers/core/create-readme.ts
index fa31d4585..81818b44b 100644
--- a/apps/cli/src/helpers/core/create-readme.ts
+++ b/apps/cli/src/helpers/core/create-readme.ts
@@ -174,6 +174,7 @@ function generateStackDescription(
const hasTanstackStart = frontend.includes("tanstack-start");
const hasSvelte = frontend.includes("svelte");
const hasNuxt = frontend.includes("nuxt");
+ const hasAstro = frontend.includes("astro");
const hasSolid = frontend.includes("solid");
const hasFrontendNone = frontend.length === 0 || frontend.includes("none");
@@ -190,6 +191,8 @@ function generateStackDescription(
parts.push("SvelteKit");
} else if (hasNuxt) {
parts.push("Nuxt");
+ } else if (hasAstro) {
+ parts.push("Astro");
} else if (hasSolid) {
parts.push("SolidJS");
}
diff --git a/apps/cli/src/helpers/core/env-setup.ts b/apps/cli/src/helpers/core/env-setup.ts
index 02febdc19..1d79af848 100644
--- a/apps/cli/src/helpers/core/env-setup.ts
+++ b/apps/cli/src/helpers/core/env-setup.ts
@@ -106,6 +106,7 @@ export async function setupEnvironmentVariables(config: ProjectConfig) {
const hasTanStackStart = frontend.includes("tanstack-start");
const hasNextJs = frontend.includes("next");
const hasNuxt = frontend.includes("nuxt");
+ const hasAstro = frontend.includes("astro");
const hasSvelte = frontend.includes("svelte");
const hasSolid = frontend.includes("solid");
const hasWebFrontend =
@@ -114,6 +115,7 @@ export async function setupEnvironmentVariables(config: ProjectConfig) {
hasTanStackStart ||
hasNextJs ||
hasNuxt ||
+ hasAstro ||
hasSolid ||
hasSvelte;
@@ -281,12 +283,16 @@ export async function setupEnvironmentVariables(config: ProjectConfig) {
if (!(await fs.pathExists(serverDir))) {
return;
}
+
const envPath = path.join(serverDir, ".env");
let corsOrigin = "http://localhost:3001";
if (hasReactRouter || hasSvelte) {
corsOrigin = "http://localhost:5173";
}
+ if (hasAstro) {
+ corsOrigin = "http://localhost:4321";
+ }
let databaseUrl: string | null = null;
diff --git a/apps/cli/src/helpers/core/payments-setup.ts b/apps/cli/src/helpers/core/payments-setup.ts
index 5557b826d..438e0d0a2 100644
--- a/apps/cli/src/helpers/core/payments-setup.ts
+++ b/apps/cli/src/helpers/core/payments-setup.ts
@@ -34,6 +34,7 @@ export async function setupPayments(config: ProjectConfig) {
"tanstack-start",
"next",
"nuxt",
+ "astro",
"svelte",
"solid",
].includes(f),
diff --git a/apps/cli/src/helpers/core/post-installation.ts b/apps/cli/src/helpers/core/post-installation.ts
index 5c6742e26..e11b0def5 100644
--- a/apps/cli/src/helpers/core/post-installation.ts
+++ b/apps/cli/src/helpers/core/post-installation.ts
@@ -94,6 +94,7 @@ export async function displayPostInstallInstructions(
"next",
"tanstack-start",
"nuxt",
+ "astro",
"svelte",
"solid",
].includes(f),
diff --git a/apps/cli/src/helpers/core/template-manager.ts b/apps/cli/src/helpers/core/template-manager.ts
index f8c3e2c33..0fe61c9e7 100644
--- a/apps/cli/src/helpers/core/template-manager.ts
+++ b/apps/cli/src/helpers/core/template-manager.ts
@@ -67,6 +67,7 @@ export async function setupFrontendTemplates(
["tanstack-router", "react-router", "tanstack-start", "next"].includes(f),
);
const hasNuxtWeb = context.frontend.includes("nuxt");
+ const hasAstroWeb = context.frontend.includes("astro");
const hasSvelteWeb = context.frontend.includes("svelte");
const hasSolidWeb = context.frontend.includes("solid");
const hasNativeWind = context.frontend.includes("native-nativewind");
@@ -74,7 +75,7 @@ export async function setupFrontendTemplates(
const _hasNative = hasNativeWind || hasUnistyles;
const isConvex = context.backend === "convex";
- if (hasReactWeb || hasNuxtWeb || hasSvelteWeb || hasSolidWeb) {
+ if (hasReactWeb || hasNuxtWeb || hasAstroWeb || hasSvelteWeb || hasSolidWeb) {
const webAppDir = path.join(projectDir, "apps/web");
await fs.ensureDir(webAppDir);
@@ -140,6 +141,23 @@ export async function setupFrontendTemplates(
} else {
}
}
+ } else if (hasAstroWeb) {
+ const astroBaseDir = path.join(PKG_ROOT, "templates/frontend/astro");
+ if (await fs.pathExists(astroBaseDir)) {
+ await processAndCopyFiles("**/*", astroBaseDir, webAppDir, context);
+ } else {
+ }
+
+ if (!isConvex && context.api === "orpc") {
+ const apiWebAstroDir = path.join(
+ PKG_ROOT,
+ `templates/api/${context.api}/web/astro`,
+ );
+ if (await fs.pathExists(apiWebAstroDir)) {
+ await processAndCopyFiles("**/*", apiWebAstroDir, webAppDir, context);
+ } else {
+ }
+ }
} else if (hasSvelteWeb) {
const svelteBaseDir = path.join(PKG_ROOT, "templates/frontend/svelte");
if (await fs.pathExists(svelteBaseDir)) {
diff --git a/apps/cli/src/prompts/frontend.ts b/apps/cli/src/prompts/frontend.ts
index f4079c857..91739dd58 100644
--- a/apps/cli/src/prompts/frontend.ts
+++ b/apps/cli/src/prompts/frontend.ts
@@ -55,6 +55,11 @@ export async function getFrontendChoice(
label: "Nuxt",
hint: "The Progressive Web Framework for Vue.js",
},
+ {
+ value: "astro" as const,
+ label: "Astro",
+ hint: "All-in-one web framework for content-driven websites",
+ },
{
value: "svelte" as const,
label: "Svelte",
diff --git a/apps/cli/src/types.ts b/apps/cli/src/types.ts
index a6f7fcfb8..ba9f98369 100644
--- a/apps/cli/src/types.ts
+++ b/apps/cli/src/types.ts
@@ -27,6 +27,7 @@ export const FrontendSchema = z
"tanstack-start",
"next",
"nuxt",
+ "astro",
"native-nativewind",
"native-unistyles",
"svelte",
diff --git a/apps/cli/src/utils/compatibility-rules.ts b/apps/cli/src/utils/compatibility-rules.ts
index 473f02c2a..9d13ecae4 100644
--- a/apps/cli/src/utils/compatibility-rules.ts
+++ b/apps/cli/src/utils/compatibility-rules.ts
@@ -33,7 +33,7 @@ export function ensureSingleWebAndNative(frontends: Frontend[]) {
const { web, native } = splitFrontends(frontends);
if (web.length > 1) {
exitWithError(
- "Cannot select multiple web frameworks. Choose only one of: tanstack-router, tanstack-start, react-router, next, nuxt, svelte, solid",
+ "Cannot select multiple web frameworks. Choose only one of: tanstack-router, tanstack-start, react-router, next, nuxt, astro, svelte, solid",
);
}
if (native.length > 1) {
diff --git a/apps/cli/src/utils/compatibility.ts b/apps/cli/src/utils/compatibility.ts
index 3f488d4c5..0b3f277f2 100644
--- a/apps/cli/src/utils/compatibility.ts
+++ b/apps/cli/src/utils/compatibility.ts
@@ -6,6 +6,7 @@ export const WEB_FRAMEWORKS: readonly Frontend[] = [
"tanstack-start",
"next",
"nuxt",
+ "astro",
"svelte",
"solid",
] as const;
diff --git a/apps/cli/templates/api/orpc/web/astro/src/components/orpc-status.tsx.hbs b/apps/cli/templates/api/orpc/web/astro/src/components/orpc-status.tsx.hbs
new file mode 100644
index 000000000..13a7e83a1
--- /dev/null
+++ b/apps/cli/templates/api/orpc/web/astro/src/components/orpc-status.tsx.hbs
@@ -0,0 +1,39 @@
+import { orpc, queryClient } from '../lib/orpc';
+import { useQuery, QueryClientProvider } from '@tanstack/react-query';
+
+function ApiStatus() {
+ const healthCheck = useQuery(orpc.healthCheck.queryOptions());
+
+ return (
+ API Status
+
{TITLE_TEXT}
+