/** * Environment variable validation for the editor app. * * This file validates that required environment variables are set at runtime. * Variables are defined in the root .env file. * * @see https://env.t3.gg/docs/nextjs */ import { createEnv } from '@t3-oss/env-nextjs' import { z } from 'zod' export const env = createEnv({ /** * Server-side environment variables (not exposed to client) */ server: { // Database POSTGRES_URL: z.string().min(1), SUPABASE_SERVICE_ROLE_KEY: z.string().min(1), // Auth BETTER_AUTH_SECRET: z.string().min(1), GOOGLE_CLIENT_ID: z.string().optional(), GOOGLE_CLIENT_SECRET: z.string().optional(), // Email RESEND_API_KEY: z.string().optional(), }, /** * Client-side environment variables (exposed to browser via NEXT_PUBLIC_) */ client: { NEXT_PUBLIC_SUPABASE_URL: z.string().min(1), NEXT_PUBLIC_SUPABASE_ANON_KEY: z.string().optional(), }, /** * Runtime values - pulls from process.env */ runtimeEnv: { // Server POSTGRES_URL: process.env.POSTGRES_URL, SUPABASE_SERVICE_ROLE_KEY: process.env.SUPABASE_SERVICE_ROLE_KEY, BETTER_AUTH_SECRET: process.env.BETTER_AUTH_SECRET, GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, RESEND_API_KEY: process.env.RESEND_API_KEY, // Client NEXT_PUBLIC_SUPABASE_URL: process.env.NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, }, /** * Skip validation during build (env vars come from Vercel at runtime) */ skipValidation: !!process.env.SKIP_ENV_VALIDATION, })