import dotenv from 'dotenv'; import path from 'path'; import * as yup from 'yup'; dotenv.config({ path: path.join(__dirname, '../../.env') }); const envVarsSchema = yup .object() .shape({ NODE_ENV: yup .string() .oneOf(['production', 'development', 'test']) .required(), PORT: yup.number().default(3000), BASEURL: yup.string().required('Base URL is required'), // FRONTEND_URL: yup.string().required('Frontend URL is required'), //JWT JWT_SECRET: yup.string().required('JWT secret key is required'), JWT_ACCESS_EXPIRATION_MINUTES: yup .number() .default(30) .required('minutes after which access tokens expire'), JWT_REFRESH_EXPIRATION_DAYS: yup .number() .default(30) .required('days after which refresh tokens expire'), JWT_RESET_PASSWORD_EXPIRATION_MINUTES: yup .number() .default(10) .required('minutes after which reset password token expires'), JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: yup .number() .default(10) .required('minutes after which verify email token expires'), //SMTP and BREVO // BREVO_SMTP_HOST: yup // .string() // .nullable() // .required('server that will send the emails'), // BREVO_SMTP_PORT: yup // .number() // .nullable() // .required('port to connect to the email server'), // BREVO_SMTP_USER: yup // .string() // .nullable() // .required('username for email server'), // BREVO_SMTP_PASS: yup // .string() // .nullable() // .required('password for email server'), // BREVO_FROM_EMAIL: yup // .string() // .nullable() // .required('the from field in the emails sent by the app'), // BREVO_EMAIL_API_KEY: yup // .string() // .nullable() // .required('the from field in the emails sent by the app api key'), // BREVO_API_BASEURL: yup.string().required('Brevo base URL is required'), // //one signal // ONESIGNAL_APPID: yup.string().required('One signal app id is required'), // ONESIGNAL_REST_APIKEY: yup // .string() // .required('One signal api key is required'), //branch IO // BRANCH_IO_KEY: yup.string().required('Branch IO key is required'), // DataBase DB_USERNAME: yup.string().required('DB Username is required'), DB_PASSWORD: yup.string().required('DB Password is required'), DB_DATABASE_NAME: yup.string().required('Database name is required'), DB_HOSTNAME: yup .string() .default('127.0.0.1') .required('DB Hostname is required'), DB_PORT: yup.number().default(3306).required('DB Port is required'), //OTP Bypass BYPASS_OTP: yup.boolean().default(false).required('Bypass OTP is required'), }) .noUnknown(true); // Validate and prepare the configuration function getConfig() { try { // Validate the environment variables const envVars = envVarsSchema.validateSync(process.env, { abortEarly: false, // Validate all fields before throwing errors stripUnknown: true, // Remove fields not in the schema }); // Return the validated configuration return { env: envVars.NODE_ENV, port: envVars.PORT, jwt: { secret: envVars.JWT_SECRET, accessExpirationMinutes: envVars.JWT_ACCESS_EXPIRATION_MINUTES, refreshExpirationDays: envVars.JWT_REFRESH_EXPIRATION_DAYS, resetPasswordExpirationMinutes: envVars.JWT_RESET_PASSWORD_EXPIRATION_MINUTES, verifyEmailExpirationMinutes: envVars.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES, }, database: { development: { host: envVars.DB_HOSTNAME, port: envVars.DB_PORT, username: envVars.DB_USERNAME, password: envVars.DB_PASSWORD, database: envVars.DB_DATABASE_NAME, logging: false, }, test: { host: envVars.DB_HOSTNAME, port: envVars.DB_PORT, username: envVars.DB_USERNAME, password: envVars.DB_PASSWORD, database: envVars.DB_DATABASE_NAME, logging: false, socketPath: '/var/run/mysqld/mysqld.sock', }, production: { host: envVars.DB_HOSTNAME, port: envVars.DB_PORT, username: envVars.DB_USERNAME, password: envVars.DB_PASSWORD, database: envVars.DB_DATABASE_NAME, logging: false, socketPath: '/var/run/mysqld/mysqld.sock', }, }, byPassOTP: envVars.BYPASS_OTP, // BaseURL: envVars.BASEURL, // FRONTEND_URL: envVars.FRONTEND_URL, // email: { // smtp: { // host: envVars?.BREVO_SMTP_HOST, // port: envVars?.BREVO_SMTP_PORT, // secure: envVars?.BREVO_SMTP_PORT == 465, // true for 465, false for other ports // auth: { // user: envVars?.BREVO_SMTP_USER, // pass: envVars?.BREVO_SMTP_PASS, // }, // }, // from: envVars?.BREVO_FROM_EMAIL, // api_key: envVars?.BREVO_EMAIL_API_KEY, // BrevobaseURL: envVars?.BREVO_API_BASEURL, // }, // oneSignal: { // appID: envVars.ONESIGNAL_APPID, // restApiKey: envVars.ONESIGNAL_REST_APIKEY, // }, // branchIO: { // branchIOKey: envVars.BRANCH_IO_KEY, // }, }; } catch (error: unknown) { if (error instanceof yup.ValidationError) { console.error('Validation Errors:', error.errors.join(', ')); } else { console.error('Unexpected error during configuration validation:', error); } console.error( 'Server shut down due to incomplete environment variable configuration.' ); process.exit(1); // Exit with error code 1 } } /** * Created By : Angad Chauhan * Created at : 31/1/25 * Use : For google login .env file global variable */ // export const googleConfig = { // clientID: process.env.GOOGLE_CLIENT_ID!, // clientSecret: process.env.GOOGLE_CLIENT_SECRET!, // callbackURL: process.env.GOOGLE_CALLBACK_URL!, // }; // Validate and export configuration only if validation succeeds const config = getConfig(); export default config;