/home/bdqbpbxa/dev-subdomains/admin.pixory.goodface.com.ua/src/config/env.ts
import { z } from 'zod';
const envVarsSchema = z.object({
// Server
JWT_SECRET: z.string().min(1, 'JWT_SECRET is required'),
APP_URL: z.string().min(1, "APP URL must be filled up"),
// Auth0
AUTH0_ISSUER_BASE_URL: z.string().url('AUTH0_ISSUER_BASE_URL must be a valid URL'),
AUTH0_AUDIENCE: z.string().min(1, 'AUTH0_AUDIENCE is required'),
AUTH0_CLIENT_ID: z.string().min(1, 'AUTH0_CLIENT_ID is required'),
AUTH0_CLIENT_SECRET: z.string().min(1, 'AUTH0_CLIENT_SECRET is required'),
// Editor
EDITOR_HOST: z.string().url('EDITOR_HOST must be a valid URL'),
EDITOR_AUDIENCE: z.string().min(1, 'EDITOR_AUDIENCE is required'),
// Exchange rates
EXCHANGE_RATE_CACHE_DURATION_HOURS: z.string()
.min(1, 'EXCHANGE_RATE_CACHE_DURATION_HOURS must be at least 1 hour')
.regex(/^\d+$/, 'EXCHANGE_RATE_CACHE_DURATION_HOURS must be a number')
.default('24'),
// Stripe
STRIPE_API_KEY: z.string().min(1, 'STRIPE_API_KEY is required'),
STRIPE_WEBHOOK_SECRET: z.string().min(1, 'STRIPE_WEBHOOK_SECRET is required'),
// Peecho
PEECHO_API_KEY: z.string().min(1, 'PEECHO_API_KEY is required'),
PEECHO_SECRET_KEY: z.string().min(1, 'PEECHO_SECRET_KEY is required'),
PEECHO_API_HOST: z.string().url('PEECHO_API_HOST must be a valid URL').min(1, 'PEECHO_API_HOST is required'),
// Klaviyo
KLAVIYO_PUBLIC_KEY: z.string().min(1, 'KLAVIYO_PUBLIC_KEY is required'),
KLAVIYO_SECRET_KEY: z.string().min(1, 'KLAVIYO_SECRET_KEY is required'),
// Printbox
PRINTBOX_API_HOST: z.string().url('PRINTBOX_API_HOST must be a valid URL').min(1, 'PRINTBOX_API_HOST is required'),
PRINTBOX_CLIENT_ID: z.string().min(1, 'PRINTBOX_CLIENT_ID is required'),
PRINTBOX_CLIENT_SECRET: z.string().min(1, 'PRINTBOX_CLIENT_SECRET is required'),
});
function validateEnv() {
try {
return envVarsSchema.parse(process.env);
} catch (error) {
if (error instanceof z.ZodError) {
console.error('❌ Environment validation failed:');
error.errors.forEach((err) => {
console.error(` - ${err.path.join('.')}: ${err.message}`);
});
} else {
console.error('❌ Environment validation error:', error);
}
process.exit(1);
}
}
const envVars = validateEnv();
export const env = {
server: {
jwtSecret: envVars.JWT_SECRET,
appURL: envVars.APP_URL
},
auth0: {
issuerBaseUrl: envVars.AUTH0_ISSUER_BASE_URL,
audience: envVars.AUTH0_AUDIENCE,
clientId: envVars.AUTH0_CLIENT_ID,
clientSecret: envVars.AUTH0_CLIENT_SECRET,
},
editor: {
host: envVars.EDITOR_HOST,
audience: envVars.EDITOR_AUDIENCE,
},
exchangeRate: {
cacheDurationHours: Number(envVars.EXCHANGE_RATE_CACHE_DURATION_HOURS),
},
stripe: {
apiKey: envVars.STRIPE_API_KEY,
webhookSecret: envVars.STRIPE_WEBHOOK_SECRET
},
peecho: {
apiKey: envVars.PEECHO_API_KEY,
secretKey: envVars.PEECHO_SECRET_KEY,
apiHost: envVars.PEECHO_API_HOST,
},
klaviyo: {
publicKey: envVars.KLAVIYO_PUBLIC_KEY,
secretKey: envVars.KLAVIYO_SECRET_KEY
},
printbox: {
apiHost: envVars.PRINTBOX_API_HOST,
clientId: envVars.PRINTBOX_CLIENT_ID,
clientSecret: envVars.PRINTBOX_CLIENT_SECRET,
}
} as const;