@syntropysoft/praetorian
Version:
Praetorian CLI – A universal multi-environment configuration validator for DevSecOps teams. Validate, compare, and secure YAML/ENV files with ease.
178 lines • 7.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfigParser = void 0;
const rule_templates_1 = require("../../shared/templates/rule-templates");
const ConfigFileOperations_1 = require("./config-parsing/ConfigFileOperations");
const ConfigValidation_1 = require("./config-parsing/ConfigValidation");
class ConfigParser {
constructor(configPath = 'praetorian.yaml') {
this.config = null;
this.configPath = configPath;
}
/**
* Load configuration from file
*/
load() {
// Guard clause: already loaded
if (this.config) {
return this.config;
}
// Guard clause: file doesn't exist
if (!(0, ConfigFileOperations_1.fileExists)(this.configPath)) {
throw new Error(`Configuration file not found: ${this.configPath}`);
}
const readResult = (0, ConfigFileOperations_1.readFileSync)(this.configPath);
// Guard clause: failed to read file
if (!readResult.success || !readResult.content) {
throw new Error(readResult.error || 'Failed to read configuration file');
}
try {
this.config = (0, ConfigFileOperations_1.parseYamlContent)(readResult.content);
// Validate configuration
const validation = (0, ConfigValidation_1.validatePraetorianConfig)(this.config);
if (!validation.isValid) {
throw new Error(`Configuration validation failed: ${validation.errors.join(', ')}`);
}
return this.config;
}
catch (error) {
throw new Error(`Failed to parse configuration file: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
/**
* Get files to compare from configuration
*/
getFilesToCompare() {
const config = this.load();
// Guard clause: no files to validate
if (!(0, ConfigValidation_1.hasFilesToValidate)(config)) {
throw new Error('No files specified in configuration. Use "files" or "environments" section.');
}
// Return files array if available
if (config.files && Array.isArray(config.files) && config.files.length > 0) {
return config.files;
}
// Return environment files if available
if (config.environments && typeof config.environments === 'object') {
return Object.values(config.environments);
}
throw new Error('No files specified in configuration. Use "files" or "environments" section.');
}
/**
* Get environment-specific files
*/
getEnvironmentFiles(environment) {
const config = this.load();
// Guard clause: specific environment requested
if (environment && config.environments) {
const envFile = config.environments[environment];
if (!envFile) {
throw new Error(`Environment '${environment}' not found in configuration`);
}
return [envFile];
}
// Return all environment files if no specific environment requested
if (config.environments && typeof config.environments === 'object') {
return Object.values(config.environments);
}
// Fallback to files array
return this.getFilesToCompare();
}
/**
* Get keys to ignore during comparison
*/
getIgnoreKeys() {
const config = this.load();
return Array.isArray(config.ignore_keys) ? config.ignore_keys : [];
}
/**
* Get required keys that must be present
*/
getRequiredKeys() {
const config = this.load();
return Array.isArray(config.required_keys) ? config.required_keys : [];
}
/**
* Get schema validation rules
*/
getSchema() {
const config = this.load();
return (config.schema && typeof config.schema === 'object') ? config.schema : {};
}
/**
* Get pattern validation rules
*/
getPatterns() {
const config = this.load();
return (config.patterns && typeof config.patterns === 'object') ? config.patterns : {};
}
/**
* Get forbidden keys
*/
getForbiddenKeys() {
const config = this.load();
return Array.isArray(config.forbidden_keys) ? config.forbidden_keys : [];
}
/**
* Get available environments
*/
getEnvironments() {
const config = this.load();
return (config.environments && typeof config.environments === 'object') ? config.environments : {};
}
/**
* Check if configuration file exists
*/
exists() {
return (0, ConfigFileOperations_1.fileExists)(this.configPath);
}
/**
* Create a default configuration file with new rule system
*/
createDefault() {
// Guard clause: file already exists
if ((0, ConfigFileOperations_1.fileExists)(this.configPath)) {
throw new Error(`Configuration file already exists: ${this.configPath}`);
}
const writeResult = (0, ConfigFileOperations_1.writeFileSync)(this.configPath, rule_templates_1.DEFAULT_PRAETORIAN_CONFIG);
// Guard clause: failed to write file
if (!writeResult.success) {
throw new Error(writeResult.error || 'Failed to create configuration file');
}
// Create example rule files
this.createExampleRuleFiles();
}
/**
* Create example rule files for users to customize
*/
createExampleRuleFiles() {
const rulesDir = (0, ConfigFileOperations_1.joinPath)((0, ConfigFileOperations_1.getDirectoryName)(this.configPath), 'rules');
// Create rules directory if it doesn't exist
const createResult = (0, ConfigFileOperations_1.createDirectorySync)(rulesDir);
if (!createResult.success) {
throw new Error(createResult.error || 'Failed to create rules directory');
}
// Create example rule files
const exampleFiles = [
{ name: 'structure.yaml', template: 'structure' },
{ name: 'security.yaml', template: 'security' },
{ name: 'format.yaml', template: 'format' },
{ name: 'schema.yaml', template: 'schema' }
];
for (const file of exampleFiles) {
const filePath = (0, ConfigFileOperations_1.joinPath)(rulesDir, file.name);
// Guard clause: file already exists
if ((0, ConfigFileOperations_1.fileExists)(filePath)) {
continue;
}
const { getRuleTemplate } = require('../../shared/templates/rule-templates');
const content = getRuleTemplate(file.template);
const writeResult = (0, ConfigFileOperations_1.writeFileSync)(filePath, content);
if (!writeResult.success) {
throw new Error(writeResult.error || `Failed to create ${file.name}`);
}
}
}
}
exports.ConfigParser = ConfigParser;
//# sourceMappingURL=ConfigParser.js.map