import { z } from 'zod'; import dotenv from 'dotenv'; dotenv.config(); const envSchema = z.object({ NODE_ENV: z.enum(['development', 'production', 'test']).default('development'), PORT: z.coerce.number().default(3000), APP_URL: z.string().url().default('http://localhost:3000'), SESSION_SECRET: z.string().min(32), SESSION_TTL_DAYS: z.coerce.number().default(30), CSRF_SECRET: z.string().min(32), ARGON2_MEMORY: z.coerce.number().default(65536), ARGON2_ITERATIONS: z.coerce.number().default(3), ARGON2_PARALLELISM: z.coerce.number().default(4), GROQ_API_KEY: z.string().min(1), GROQ_MODELS: z.string().default('llama-3.1-70b-versatile,llama-3.1-8b-instant,gemma2-9b-it'), SCRAPER_RATE_LIMIT: z.coerce.number().default(10), SCRAPER_INTERVAL_MS: z.coerce.number().default(6000), WHATSAPP_CHANNEL_REGEX: z.string().default('^https://chat\\.whatsapp\\.com/[A-Za-z0-9]{22}$'), IPAPI_KEY: z.string().optional(), VPN_DETECTION_ENABLED: z.coerce.boolean().default(true), CAPTCHA_PROVIDER: z.enum(['hcaptcha', 'turnstile']).default('hcaptcha'), CAPTCHA_SECRET_KEY: z.string().optional(), CAPTCHA_SITE_KEY: z.string().optional(), ADMIN_INIT_USERNAME: z.string().default('admin'), ADMIN_INIT_PASSWORD: z.string().default('changeme'), LOG_LEVEL: z.enum(['trace', 'debug', 'info', 'warn', 'error']).default('info'), LOG_DIR: z.string().default('./data/logs'), DATA_DIR: z.string().default('./data'), }); export type Env = z.infer; let env: Env; try { env = envSchema.parse(process.env); } catch (error) { if (error instanceof z.ZodError) { console.error('❌ Invalid environment variables:'); error.errors.forEach(e => console.error(` ${e.path.join('.')}: ${e.message}`)); process.exit(1); } throw error; } export const config = { ...env, groqModels: env.GROQ_MODELS.split(',').map(m => m.trim()), whatsappChannelRegex: new RegExp(env.WHATSAPP_CHANNEL_REGEX), sessionTtlMs: env.SESSION_TTL_DAYS * 24 * 60 * 60 * 1000, };