import dotenv from "dotenv"; import status from "http-status"; import path from "path"; import { AppError } from "../shared/errors/app-error"; dotenv.config({ path: path.join(process.cwd(), ".env") }); interface EnvConfig { NODE_ENV: string; PORT: string; APP_NAME?: string; APP_URL: string; DATABASE_URL: string; FRONTEND_URL: string; BETTER_AUTH_URL: string; BETTER_AUTH_SECRET: string; BETTER_AUTH_SESSION_TOKEN_EXPIRES_IN: string; BETTER_AUTH_SESSION_TOKEN_UPDATE_AGE: string; ACCESS_TOKEN_SECRET: string; ACCESS_TOKEN_EXPIRES_IN: string; REFRESH_TOKEN_SECRET: string; REFRESH_TOKEN_EXPIRES_IN: string; GOOGLE_CLIENT_ID: string; GOOGLE_CLIENT_SECRET: string; GOOGLE_CALLBACK_URL: string; EMAIL_SENDER: { SMTP_USER: string; SMTP_PASS: string; SMTP_HOST: string; SMTP_PORT: string; SMTP_FROM: string; }; {{#if storageProvider == "cloudinary"}} CLOUDINARY: { CLOUDINARY_CLOUD_NAME: string; CLOUDINARY_API_KEY: string; CLOUDINARY_API_SECRET: string; CLOUDINARY_UPLOAD_PRESET: string; }; {{/if}} } const loadEnvVars = (): EnvConfig => { const requiredEnvVars = [ "NODE_ENV", "PORT", "APP_NAME", "APP_URL", "DATABASE_URL", "FRONTEND_URL", "BETTER_AUTH_URL", "BETTER_AUTH_SECRET", "BETTER_AUTH_SESSION_TOKEN_EXPIRES_IN", "BETTER_AUTH_SESSION_TOKEN_UPDATE_AGE", "ACCESS_TOKEN_SECRET", "ACCESS_TOKEN_EXPIRES_IN", "REFRESH_TOKEN_SECRET", "REFRESH_TOKEN_EXPIRES_IN", "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GOOGLE_CALLBACK_URL", "EMAIL_SENDER_SMTP_USER", "EMAIL_SENDER_SMTP_PASS", "EMAIL_SENDER_SMTP_HOST", "EMAIL_SENDER_SMTP_PORT", "EMAIL_SENDER_SMTP_FROM", {{#if storageProvider == "cloudinary"}} "CLOUDINARY_CLOUD_NAME", "CLOUDINARY_API_KEY", "CLOUDINARY_API_SECRET", "CLOUDINARY_UPLOAD_PRESET", {{/if}} ]; requiredEnvVars.forEach((varName) => { if (!process.env[varName]) { throw new AppError( status.INTERNAL_SERVER_ERROR, `Environment variable ${varName} is required but not set in .env file.`, ); } }); return { NODE_ENV: process.env.NODE_ENV as string, PORT: process.env.PORT as string, APP_NAME: process.env.APP_NAME ?? "Your App", APP_URL: process.env.APP_URL as string, DATABASE_URL: process.env.DATABASE_URL as string, FRONTEND_URL: process.env.FRONTEND_URL as string, BETTER_AUTH_URL: process.env.BETTER_AUTH_URL as string, BETTER_AUTH_SECRET: process.env.BETTER_AUTH_SECRET as string, BETTER_AUTH_SESSION_TOKEN_EXPIRES_IN: process.env .BETTER_AUTH_SESSION_TOKEN_EXPIRES_IN as string, BETTER_AUTH_SESSION_TOKEN_UPDATE_AGE: process.env .BETTER_AUTH_SESSION_TOKEN_UPDATE_AGE as string, ACCESS_TOKEN_SECRET: process.env.ACCESS_TOKEN_SECRET as string, ACCESS_TOKEN_EXPIRES_IN: process.env.ACCESS_TOKEN_EXPIRES_IN as string, REFRESH_TOKEN_SECRET: process.env.REFRESH_TOKEN_SECRET as string, REFRESH_TOKEN_EXPIRES_IN: process.env.REFRESH_TOKEN_EXPIRES_IN as string, GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID as string, GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET as string, GOOGLE_CALLBACK_URL: process.env.GOOGLE_CALLBACK_URL as string, EMAIL_SENDER: { SMTP_USER: process.env.EMAIL_SENDER_SMTP_USER as string, SMTP_PASS: process.env.EMAIL_SENDER_SMTP_PASS as string, SMTP_HOST: process.env.EMAIL_SENDER_SMTP_HOST as string, SMTP_PORT: process.env.EMAIL_SENDER_SMTP_PORT as string, SMTP_FROM: process.env.EMAIL_SENDER_SMTP_FROM as string, }, {{#if storageProvider == "cloudinary"}} CLOUDINARY: { CLOUDINARY_CLOUD_NAME: process.env.CLOUDINARY_CLOUD_NAME as string, CLOUDINARY_API_KEY: process.env.CLOUDINARY_API_KEY as string, CLOUDINARY_API_SECRET: process.env.CLOUDINARY_API_SECRET as string, CLOUDINARY_UPLOAD_PRESET: process.env.CLOUDINARY_UPLOAD_PRESET as string, }, {{/if}} }; }; export const envVars = loadEnvVars();