import { config } from 'dotenv';
import { z } from 'zod';
// Load environment variables
config();
// Configuration schema with validation
const configSchema = z.object({
// API Keys
rapidApiKey: z.string().min(1, 'RAPIDAPI_KEY is required'),
rapidApiHostZillow: z.string().default('zillow-com1.p.rapidapi.com'),
rentcastApiKey: z.string().optional(),
rentcastBaseUrl: z.string().url().default('https://api.rentcast.io'),
// Application settings
nodeEnv: z.enum(['development', 'production', 'test']).default('development'),
logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
apiTimeout: z.coerce.number().default(10000),
cacheTtl: z.coerce.number().default(3600),
// Rate limiting
zillowRateLimit: z.coerce.number().default(60),
rentcastRateLimit: z.coerce.number().default(100),
});
// Parse and validate configuration
const parseConfig = () => {
try {
return configSchema.parse({
rapidApiKey: process.env.RAPIDAPI_KEY,
rapidApiHostZillow: process.env.RAPIDAPI_HOST_ZILLOW,
rentcastApiKey: process.env.RENTCAST_API_KEY,
rentcastBaseUrl: process.env.RENTCAST_BASE_URL,
nodeEnv: process.env.NODE_ENV,
logLevel: process.env.LOG_LEVEL,
apiTimeout: process.env.API_TIMEOUT,
cacheTtl: process.env.CACHE_TTL,
zillowRateLimit: process.env.ZILLOW_RATE_LIMIT,
rentcastRateLimit: process.env.RENTCAST_RATE_LIMIT,
});
} catch (error) {
if (error instanceof z.ZodError) {
console.error('Configuration validation failed:');
error.issues.forEach(issue => {
console.error(`- ${issue.path.join('.')}: ${issue.message}`);
});
console.error('\nPlease check your .env file and ensure all required variables are set.');
console.error('See .env.example for reference.');
}
process.exit(1);
}
};
export const appConfig = parseConfig();
export type AppConfig = typeof appConfig;