import { config as dotenvConfig } from 'dotenv'; import { z } from 'zod'; dotenvConfig(); const envSchema = z.object({ PORT: z.string().default('4025'), BACKEND_URL: z.string().default('http://localhost:7860'), VESPA_APP_URL: z.string().optional(), VESPA_CERT_PATH: z.string().optional(), VESPA_KEY_PATH: z.string().optional(), NODE_ENV: z.enum(['development', 'production', 'test']).default('development'), CORS_ORIGIN: z.string().default('http://localhost:3000'), CACHE_TTL: z.string().default('300'), // 5 minutes ENABLE_CACHE: z.string().default('true'), RATE_LIMIT_WINDOW: z.string().default('60000'), // 1 minute RATE_LIMIT_MAX: z.string().default('100'), }); const parsedEnv = envSchema.safeParse(process.env); if (!parsedEnv.success) { console.error('❌ Invalid environment variables:', parsedEnv.error.format()); process.exit(1); } export const config = { port: parseInt(parsedEnv.data.PORT), backendUrl: parsedEnv.data.BACKEND_URL, vespaAppUrl: parsedEnv.data.VESPA_APP_URL, vespaCertPath: parsedEnv.data.VESPA_CERT_PATH, vespaKeyPath: parsedEnv.data.VESPA_KEY_PATH, nodeEnv: parsedEnv.data.NODE_ENV, corsOrigin: parsedEnv.data.CORS_ORIGIN, cacheTTL: parseInt(parsedEnv.data.CACHE_TTL), enableCache: parsedEnv.data.ENABLE_CACHE === 'true', rateLimit: { windowMs: parseInt(parsedEnv.data.RATE_LIMIT_WINDOW), max: parseInt(parsedEnv.data.RATE_LIMIT_MAX), }, }; export const isDev = config.nodeEnv === 'development'; export const isProd = config.nodeEnv === 'production';