This commit is contained in:
58
src/commands/validate.ts
Normal file
58
src/commands/validate.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import { Command } from 'commander';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import { parseEnvFile } from '../core/parser';
|
||||
import { validateEnv, parseSchemaFromEnv } from '../core/validator';
|
||||
import { EnvSchema } from '../core/types';
|
||||
|
||||
export function createValidateCommand(): Command {
|
||||
const cmd = new Command('validate');
|
||||
|
||||
cmd
|
||||
.description('Validate .env files against a schema')
|
||||
.option('-e, --env <path>', 'Path to .env file', '.env')
|
||||
.option('-s, --schema <path>', 'Path to schema.json file')
|
||||
.action(async (options) => {
|
||||
try {
|
||||
const envPath = path.resolve(options.env);
|
||||
|
||||
if (!fs.existsSync(envPath)) {
|
||||
console.error(`Error: .env file not found at ${envPath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const parsedEnv = parseEnvFile(envPath);
|
||||
let schema: EnvSchema;
|
||||
|
||||
if (options.schema) {
|
||||
const schemaPath = path.resolve(options.schema);
|
||||
if (!fs.existsSync(schemaPath)) {
|
||||
console.error(`Error: Schema file not found at ${schemaPath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
const schemaContent = fs.readFileSync(schemaPath, 'utf-8');
|
||||
schema = JSON.parse(schemaContent);
|
||||
} else {
|
||||
schema = parseSchemaFromEnv(parsedEnv.flat);
|
||||
}
|
||||
|
||||
const result = validateEnv(parsedEnv.flat, schema);
|
||||
|
||||
if (result.valid) {
|
||||
console.log('✓ Validation passed successfully!');
|
||||
process.exit(0);
|
||||
} else {
|
||||
console.error('✗ Validation failed:');
|
||||
for (const error of result.errors) {
|
||||
console.error(` - ${error.field}: ${error.message}`);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error during validation:', (error as Error).message);
|
||||
process.exit(1);
|
||||
}
|
||||
});
|
||||
|
||||
return cmd;
|
||||
}
|
||||
Reference in New Issue
Block a user