// Environment variable validation for all services
export function validateEnvironment() {
const isServer = typeof window === 'undefined';
const isProduction = process.env.NODE_ENV === 'production';
// Server-side validation
if (isServer) {
const requiredServerVars = {
// Stripe
STRIPE_SECRET_KEY: process.env.STRIPE_SECRET_KEY,
STRIPE_WEBHOOK_SECRET: process.env.STRIPE_WEBHOOK_SECRET,
// Supabase
SUPABASE_SERVICE_ROLE_KEY: process.env.SUPABASE_SERVICE_ROLE_KEY,
// AI Services (optional in development)
...(isProduction && {
OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY,
})
};
const missingVars = Object.entries(requiredServerVars)
.filter(([key, value]) => !value)
.map(([key]) => key);
if (missingVars.length > 0) {
console.warn(
`Missing server environment variables: ${missingVars.join(', ')}\n` +
'Some features may not work correctly.'
);
}
// Validate format (only if variables exist)
if (requiredServerVars.STRIPE_SECRET_KEY && !requiredServerVars.STRIPE_SECRET_KEY?.startsWith('sk_')) {
throw new Error('STRIPE_SECRET_KEY must start with "sk_"');
}
if (requiredServerVars.STRIPE_WEBHOOK_SECRET && !requiredServerVars.STRIPE_WEBHOOK_SECRET?.startsWith('whsec_')) {
throw new Error('STRIPE_WEBHOOK_SECRET must start with "whsec_"');
}
}
// Client-side validation
const clientEnvVars = {
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,
NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL,
NEXT_PUBLIC_SUPABASE_URL: process.env.NEXT_PUBLIC_SUPABASE_URL,
NEXT_PUBLIC_SUPABASE_ANON_KEY: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
};
const missingClientVars = Object.entries(clientEnvVars)
.filter(([key, value]) => !value)
.map(([key]) => key);
if (missingClientVars.length > 0 && isProduction) {
throw new Error(
`Missing required client environment variables: ${missingClientVars.join(', ')}\n` +
'Please configure these in your Vercel dashboard.'
);
}
// Validate client-side format (only if variables exist)
if (clientEnvVars.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY && !clientEnvVars.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY?.startsWith('pk_')) {
throw new Error('NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY must start with "pk_"');
}
return {
...clientEnvVars,
...(isServer ? {
STRIPE_SECRET_KEY: process.env.STRIPE_SECRET_KEY,
STRIPE_WEBHOOK_SECRET: process.env.STRIPE_WEBHOOK_SECRET,
SUPABASE_SERVICE_ROLE_KEY: process.env.SUPABASE_SERVICE_ROLE_KEY,
} : {})
};
}
// Legacy function for backward compatibility
export function validateStripeEnv() {
return validateEnvironment();
}
// Check if we're in development mode
export const isDevelopment = process.env.NODE_ENV === 'development';
// Check if Stripe is in test mode
export const isStripeTestMode = process.env.STRIPE_SECRET_KEY?.includes('test') || false;