Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import * as Joi from 'joi'; export const envConfig = () => ({ nodeEnv: process.env.NODE_ENV || 'development', port: parseInt(process.env.PORT || '3001', 10), database: { host: process.env.DB_HOST || 'localhost', port: parseInt(process.env.DB_PORT || '5432', 10), name: process.env.DB_NAME || 'template_saas_dev', user: process.env.DB_USER || 'template_saas_user', password: process.env.DB_PASSWORD || 'template_saas_dev_2026', }, jwt: { secret: process.env.JWT_SECRET || 'dev-jwt-secret-change-in-production', expiresIn: process.env.JWT_EXPIRES_IN || '15m', refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '7d', }, cors: { origin: process.env.CORS_ORIGIN || 'http://localhost:3000', }, stripe: { secretKey: process.env.STRIPE_SECRET_KEY || '', webhookSecret: process.env.STRIPE_WEBHOOK_SECRET || '', publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || '', }, ai: { openrouterApiKey: process.env.OPENROUTER_API_KEY || '', defaultModel: process.env.AI_DEFAULT_MODEL || 'anthropic/claude-3-haiku', fallbackModel: process.env.AI_FALLBACK_MODEL || 'openai/gpt-3.5-turbo', timeoutMs: parseInt(process.env.AI_TIMEOUT_MS || '30000', 10), }, email: { provider: process.env.EMAIL_PROVIDER || 'sendgrid', // 'sendgrid' | 'ses' | 'smtp' from: process.env.EMAIL_FROM || 'noreply@example.com', fromName: process.env.EMAIL_FROM_NAME || 'Template SaaS', replyTo: process.env.EMAIL_REPLY_TO || '', // SendGrid sendgridApiKey: process.env.SENDGRID_API_KEY || '', // AWS SES sesRegion: process.env.AWS_SES_REGION || 'us-east-1', sesAccessKeyId: process.env.AWS_SES_ACCESS_KEY_ID || '', sesSecretAccessKey: process.env.AWS_SES_SECRET_ACCESS_KEY || '', // SMTP (fallback) smtpHost: process.env.SMTP_HOST || '', smtpPort: parseInt(process.env.SMTP_PORT || '587', 10), smtpUser: process.env.SMTP_USER || '', smtpPassword: process.env.SMTP_PASSWORD || '', smtpSecure: process.env.SMTP_SECURE === 'true', }, }); export const validationSchema = Joi.object({ NODE_ENV: Joi.string() .valid('development', 'production', 'test') .default('development'), PORT: Joi.number().default(3001), DB_HOST: Joi.string().default('localhost'), DB_PORT: Joi.number().default(5432), DB_NAME: Joi.string().default('template_saas_dev'), DB_USER: Joi.string().default('template_saas_user'), DB_PASSWORD: Joi.string().default('template_saas_dev_2026'), JWT_SECRET: Joi.string().default('dev-jwt-secret-change-in-production'), JWT_EXPIRES_IN: Joi.string().default('15m'), JWT_REFRESH_EXPIRES_IN: Joi.string().default('7d'), CORS_ORIGIN: Joi.string().default('http://localhost:3000'), // Stripe (optional - integration disabled if not set) STRIPE_SECRET_KEY: Joi.string().allow('').default(''), STRIPE_WEBHOOK_SECRET: Joi.string().allow('').default(''), STRIPE_PUBLISHABLE_KEY: Joi.string().allow('').default(''), // AI (optional - integration disabled if not set) OPENROUTER_API_KEY: Joi.string().allow('').default(''), AI_DEFAULT_MODEL: Joi.string().default('anthropic/claude-3-haiku'), AI_FALLBACK_MODEL: Joi.string().default('openai/gpt-3.5-turbo'), AI_TIMEOUT_MS: Joi.number().default(30000), // Email (optional - integration disabled if not set) EMAIL_PROVIDER: Joi.string().valid('sendgrid', 'ses', 'smtp').default('sendgrid'), EMAIL_FROM: Joi.string().email().default('noreply@example.com'), EMAIL_FROM_NAME: Joi.string().default('Template SaaS'), EMAIL_REPLY_TO: Joi.string().allow('').default(''), // SendGrid SENDGRID_API_KEY: Joi.string().allow('').default(''), // AWS SES AWS_SES_REGION: Joi.string().default('us-east-1'), AWS_SES_ACCESS_KEY_ID: Joi.string().allow('').default(''), AWS_SES_SECRET_ACCESS_KEY: Joi.string().allow('').default(''), // SMTP SMTP_HOST: Joi.string().allow('').default(''), SMTP_PORT: Joi.number().default(587), SMTP_USER: Joi.string().allow('').default(''), SMTP_PASSWORD: Joi.string().allow('').default(''), SMTP_SECURE: Joi.boolean().default(false), }); |