All checks were successful
Build & Deploy KLZ Cables / build-and-deploy (push) Successful in 3m39s
107 lines
2.8 KiB
TypeScript
107 lines
2.8 KiB
TypeScript
/**
|
|
* 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,
|
|
},
|
|
mail: {
|
|
host: config.mail.host,
|
|
port: config.mail.port,
|
|
user: mask(config.mail.user),
|
|
from: config.mail.from,
|
|
recipients: config.mail.recipients,
|
|
},
|
|
};
|
|
}
|