import { z } from 'zod';
import 'dotenv/config';
/**
* Configuration schema with validation
*/
const configSchema = z.object({
// Git configuration
gitRepoUrl: z.string().url('Valid Git repository URL required'),
gitBranch: z.string().default('main'),
gitToken: z.string().min(1, 'Git token required for private repositories'),
// Server configuration
port: z.coerce.number().default(3000),
nodeEnv: z.enum(['development', 'production', 'test']).default('production'),
// Authentication
apiKey: z.string().optional(),
oauthClientId: z.string().optional(),
oauthClientSecret: z.string().optional(),
// Deployment
baseUrl: z.string().url().optional(),
});
export type Config = z.infer<typeof configSchema>;
/**
* Load and validate configuration from environment variables
*/
export function loadConfig(): Config {
const rawConfig = {
gitRepoUrl: process.env.GIT_REPO_URL,
gitBranch: process.env.GIT_BRANCH,
gitToken: process.env.GIT_TOKEN,
port: process.env.PORT,
nodeEnv: process.env.NODE_ENV,
apiKey: process.env.API_KEY,
oauthClientId: process.env.OAUTH_CLIENT_ID,
oauthClientSecret: process.env.OAUTH_CLIENT_SECRET,
baseUrl: process.env.BASE_URL,
};
try {
return configSchema.parse(rawConfig);
} catch (error) {
if (error instanceof z.ZodError) {
console.error('❌ Configuration validation failed:');
error.errors.forEach(err => {
console.error(` - ${err.path.join('.')}: ${err.message}`);
});
process.exit(1);
}
throw error;
}
}
/**
* Global configuration instance
*/
export const config = loadConfig();