UNPKG

@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
"use strict"; 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