xtablo-source/api/src/config.ts
2025-07-13 18:42:15 +02:00

98 lines
3.2 KiB
TypeScript

import dotenv from "dotenv";
export interface AppConfig {
NODE_ENV: "development" | "production" | "test";
PORT: number;
FRONTEND_URL: string;
SUPABASE_URL: string;
SUPABASE_SERVICE_ROLE_KEY: string;
STREAM_CHAT_API_KEY: string;
STREAM_CHAT_API_SECRET: string;
EMAIL_USER: string;
EMAIL_KEY: string;
XTABLO_URL: string;
CORS_ORIGIN: string[];
LOG_LEVEL: "debug" | "info" | "warn" | "error";
}
function validateEnvVar(name: string, value: string | undefined): string {
if (!value) {
throw new Error(`Missing required environment variable: ${name}`);
}
return value;
}
function createConfig(): AppConfig {
dotenv.config({ path: `.env.${process.env.NODE_ENV}` });
const NODE_ENV = (process.env.NODE_ENV || "development") as
| "development"
| "production"
| "test";
// Base configuration
const baseConfig: AppConfig = {
NODE_ENV,
PORT: parseInt(process.env.PORT || "8080", 10),
FRONTEND_URL: process.env.FRONTEND_URL || "http://localhost:5173",
SUPABASE_URL: validateEnvVar("SUPABASE_URL", process.env.SUPABASE_URL),
SUPABASE_SERVICE_ROLE_KEY: validateEnvVar(
"SUPABASE_SERVICE_ROLE_KEY",
process.env.SUPABASE_SERVICE_ROLE_KEY
),
STREAM_CHAT_API_KEY: validateEnvVar(
"STREAM_CHAT_API_KEY",
process.env.STREAM_CHAT_API_KEY
),
STREAM_CHAT_API_SECRET: validateEnvVar(
"STREAM_CHAT_API_SECRET",
process.env.STREAM_CHAT_API_SECRET
),
EMAIL_USER: validateEnvVar("EMAIL_USER", process.env.EMAIL_USER),
EMAIL_KEY: validateEnvVar("EMAIL_KEY", process.env.EMAIL_KEY),
CORS_ORIGIN: [],
XTABLO_URL: process.env.XTABLO_URL || "https://app.xtablo.com",
LOG_LEVEL: "info",
};
// Environment-specific configurations
if (NODE_ENV === "development") {
baseConfig.CORS_ORIGIN = [
"http://localhost:5173",
"http://localhost:3000",
"http://127.0.0.1:5173",
"http://127.0.0.1:3000",
];
baseConfig.LOG_LEVEL = "debug";
} else if (NODE_ENV === "production") {
baseConfig.CORS_ORIGIN = [
baseConfig.FRONTEND_URL,
"https://xtablo.com",
"https://develop.xtablo-source.pages.dev",
];
baseConfig.LOG_LEVEL = "info";
} else if (NODE_ENV === "test") {
baseConfig.CORS_ORIGIN = ["http://localhost:3000"];
baseConfig.LOG_LEVEL = "warn";
}
// Log configuration info
console.info(`Configuration loaded for ${NODE_ENV} environment:`);
console.info(`- Port: ${baseConfig.PORT}`);
console.info(`- Frontend URL: ${baseConfig.FRONTEND_URL}`);
console.info(`- CORS Origins: ${baseConfig.CORS_ORIGIN.join(", ")}`);
console.info(`- Log Level: ${baseConfig.LOG_LEVEL}`);
console.info(`- XTablo URL: ${baseConfig.XTABLO_URL}`);
console.info(`- Supabase URL: ${baseConfig.SUPABASE_URL}`);
console.info(`- Stream Chat API Key: ${baseConfig.STREAM_CHAT_API_KEY}`);
console.info(`- Email User: ${baseConfig.EMAIL_USER}`);
console.info(`- Email Key: ${baseConfig.EMAIL_KEY}`);
return baseConfig;
}
export const config = createConfig();
// Helper functions for common environment checks
export const isDevelopment = () => config.NODE_ENV === "development";
export const isProduction = () => config.NODE_ENV === "production";