create-apppaaaul
Version:
Create projects as paaauldev would
45 lines (35 loc) • 1.38 kB
text/typescript
import { z } from "zod";
const envSchema = z.object({
DATABASE_URL: z.url(),
BETTER_AUTH_URL: z.url(),
RESEND_API_KEY: z.string().min(1),
RESEND_FROM_EMAIL: z.email(),
GOOGLE_CLIENT_ID: z.string().min(1),
GOOGLE_CLIENT_SECRET: z.string().min(1),
NODE_ENV: z.enum(["development", "production"]).default("development"),
// Cloudflare R2 variables
CLOUDFLARE_ACCESS_KEY: z.string().min(1).optional(),
CLOUDFLARE_SECRET_KEY: z.string().min(1).optional(),
CLOUDFLARE_ENDPOINT: z.url().optional(),
CLOUDFLARE_BUCKET: z.string().min(1).optional(),
CLOUDFLARE_ACCOUNT_ID: z.string().min(1).optional(),
CLOUDFLARE_PUBLIC_URL: z.url().optional(),
});
export type Env = z.infer<typeof envSchema>;
function validateEnv(): Env {
try {
return envSchema.parse(process.env);
} catch (error) {
if (error instanceof z.ZodError) {
const missingVars = error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`);
console.error("❌ Invalid environment variables:");
missingVars.forEach((err) => console.error(` - ${err}`));
process.exit(1);
}
throw error;
}
}
export const env = validateEnv();
// Helper to check if we're in development
export const isDevelopment = env.NODE_ENV === "development";
export const isProduction = env.NODE_ENV === "production";