/** * Centralized configuration management for the application. * This file defines the schema and provides a type-safe way to access environment variables. */ export const config = { env: process.env.NODE_ENV || 'development', isProduction: process.env.NODE_ENV === 'production', isDevelopment: process.env.NODE_ENV === 'development', isTest: process.env.NODE_ENV === 'test', baseUrl: process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000', analytics: { umami: { websiteId: process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID, scriptUrl: process.env.UMAMI_SCRIPT_URL || 'https://analytics.infra.mintel.me/script.js', // The proxied path used in the frontend proxyPath: '/stats/script.js', enabled: Boolean(process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID), }, }, errors: { glitchtip: { // Use SENTRY_DSN for both server and client (proxied) dsn: process.env.SENTRY_DSN, // The proxied origin used in the frontend proxyPath: '/errors', enabled: Boolean(process.env.SENTRY_DSN), }, }, cache: { redis: { url: process.env.REDIS_URL, keyPrefix: process.env.REDIS_KEY_PREFIX || 'klz:', enabled: Boolean(process.env.REDIS_URL), }, }, logging: { level: process.env.LOG_LEVEL || 'info', }, mail: { host: process.env.MAIL_HOST, port: parseInt(process.env.MAIL_PORT || '587', 10), user: process.env.MAIL_USERNAME, pass: process.env.MAIL_PASSWORD, from: process.env.MAIL_FROM, recipients: process.env.MAIL_RECIPIENTS?.split(',') || [], }, woocommerce: { url: process.env.WOOCOMMERCE_URL, consumerKey: process.env.WOOCOMMERCE_CONSUMER_KEY, consumerSecret: process.env.WOOCOMMERCE_CONSUMER_SECRET, }, wordpress: { appPassword: process.env.WORDPRESS_APP_PASSWORD, }, } as const; /** * Helper to get a masked version of the config for logging. */ export function getMaskedConfig() { const mask = (val: string | undefined) => (val ? `***${val.slice(-4)}` : 'not set'); return { env: config.env, baseUrl: config.baseUrl, analytics: { umami: { websiteId: mask(config.analytics.umami.websiteId), scriptUrl: config.analytics.umami.scriptUrl, enabled: config.analytics.umami.enabled, }, }, errors: { glitchtip: { dsn: mask(config.errors.glitchtip.dsn), enabled: config.errors.glitchtip.enabled, }, }, cache: { redis: { url: mask(config.cache.redis.url), keyPrefix: config.cache.redis.keyPrefix, enabled: config.cache.redis.enabled, }, }, logging: { level: config.logging.level, }, }; }