UNPKG

@re-shell/cli

Version:

Full-stack development platform uniting microservices and microfrontends. Build complete applications with .NET (ASP.NET Core Web API, Minimal API), Java (Spring Boot, Quarkus, Micronaut, Vert.x), Rust (Actix-Web, Warp, Rocket, Axum), Python (FastAPI, Dja

274 lines (273 loc) • 11.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateConfiguration = validateConfiguration; const chalk_1 = __importDefault(require("chalk")); const prompts_1 = __importDefault(require("prompts")); const validation_1 = require("../utils/validation"); const config_1 = require("../utils/config"); async function validateConfiguration(options = {}) { const { spinner, verbose, json } = options; try { if (options.file) { await validateSpecificFile(options.file, options, spinner); return; } if (options.global) { await validateGlobalConfiguration(options, spinner); return; } if (options.project) { await validateProjectConfiguration(options, spinner); return; } if (options.interactive) { await interactiveValidation(options, spinner); return; } // Default: validate both global and project configurations await validateAllConfigurations(options, spinner); } catch (error) { if (spinner) spinner.fail(chalk_1.default.red('Configuration validation failed')); throw error; } } async function validateSpecificFile(filePath, options, spinner) { if (spinner) spinner.setText(`Validating file: ${filePath}...`); const configType = filePath.includes('global') || filePath.includes('.re-shell/config') ? 'project' : 'global'; const result = await (0, validation_1.validateConfigFile)(filePath, configType); if (spinner) spinner.stop(); if (options.json) { console.log(JSON.stringify(result, null, 2)); } else { displayValidationResult(result, filePath, options); } } async function validateGlobalConfiguration(options, spinner) { if (spinner) spinner.setText('Validating global configuration...'); const globalConfig = await config_1.configManager.loadGlobalConfig(); const result = (0, validation_1.validateGlobalConfig)(globalConfig); if (spinner) spinner.stop(); if (options.json) { console.log(JSON.stringify(result, null, 2)); } else { displayValidationResult(result, 'Global Configuration', options); } } async function validateProjectConfiguration(options, spinner) { if (spinner) spinner.setText('Validating project configuration...'); const projectConfig = await config_1.configManager.loadProjectConfig(); if (!projectConfig) { if (spinner) spinner.fail(chalk_1.default.red('No project configuration found')); console.log(chalk_1.default.yellow('āš ļø No project configuration found. Initialize a project first.')); return; } const result = (0, validation_1.validateProjectConfig)(projectConfig); if (spinner) spinner.stop(); if (options.json) { console.log(JSON.stringify(result, null, 2)); } else { displayValidationResult(result, 'Project Configuration', options); } } async function validateAllConfigurations(options, spinner) { if (spinner) spinner.setText('Validating all configurations...'); const globalConfig = await config_1.configManager.loadGlobalConfig(); const projectConfig = await config_1.configManager.loadProjectConfig(); const globalResult = (0, validation_1.validateGlobalConfig)(globalConfig); const projectResult = projectConfig ? (0, validation_1.validateProjectConfig)(projectConfig) : null; if (spinner) spinner.stop(); if (options.json) { console.log(JSON.stringify({ global: globalResult, project: projectResult }, null, 2)); } else { console.log(chalk_1.default.cyan('\nšŸ” Configuration Validation Report')); console.log(chalk_1.default.gray('═'.repeat(50))); console.log(chalk_1.default.cyan('\n🌐 Global Configuration:')); displayValidationResult(globalResult, 'Global', options); if (projectResult) { console.log(chalk_1.default.cyan('\nšŸ—ļø Project Configuration:')); displayValidationResult(projectResult, 'Project', options); } else { console.log(chalk_1.default.yellow('\nšŸ—ļø Project Configuration: Not found')); } // Summary const totalErrors = globalResult.errors.filter(e => e.severity === 'error').length + (projectResult?.errors.filter(e => e.severity === 'error').length || 0); const totalWarnings = globalResult.warnings.length + (projectResult?.warnings.length || 0); console.log(chalk_1.default.cyan('\nšŸ“Š Summary:')); console.log(` Errors: ${totalErrors > 0 ? chalk_1.default.red(totalErrors) : chalk_1.default.green('0')}`); console.log(` Warnings: ${totalWarnings > 0 ? chalk_1.default.yellow(totalWarnings) : chalk_1.default.green('0')}`); if (totalErrors === 0 && totalWarnings === 0) { console.log(chalk_1.default.green('\nāœ… All configurations are valid!')); } else if (totalErrors === 0) { console.log(chalk_1.default.yellow('\nāš ļø Configurations are valid but have warnings')); } else { console.log(chalk_1.default.red('\nāŒ Configuration validation failed')); } } } async function interactiveValidation(options, spinner) { if (spinner) spinner.stop(); const response = await (0, prompts_1.default)([ { type: 'select', name: 'action', message: 'What would you like to validate?', choices: [ { title: 'šŸ” Validate All Configurations', value: 'all' }, { title: '🌐 Validate Global Configuration Only', value: 'global' }, { title: 'šŸ—ļø Validate Project Configuration Only', value: 'project' }, { title: 'šŸ“ Validate Specific File', value: 'file' }, { title: 'šŸ”§ Advanced Validation Options', value: 'advanced' } ] } ]); if (!response.action) return; const newOptions = { ...options, interactive: false }; switch (response.action) { case 'all': await validateAllConfigurations(newOptions); break; case 'global': await validateGlobalConfiguration(newOptions); break; case 'project': await validateProjectConfiguration(newOptions); break; case 'file': await interactiveFileValidation(newOptions); break; case 'advanced': await interactiveAdvancedValidation(newOptions); break; } } async function interactiveFileValidation(options) { const response = await (0, prompts_1.default)([ { type: 'text', name: 'filePath', message: 'Enter the path to the configuration file:', validate: (value) => { if (!value.trim()) return 'File path is required'; return true; } } ]); if (response.filePath) { await validateSpecificFile(response.filePath, options); } } async function interactiveAdvancedValidation(options) { const response = await (0, prompts_1.default)([ { type: 'multiselect', name: 'features', message: 'Select validation features:', choices: [ { title: 'Show warnings', value: 'warnings', selected: true }, { title: 'Show suggestions', value: 'suggestions', selected: true }, { title: 'Auto-fix issues', value: 'fix', selected: false }, { title: 'Verbose output', value: 'verbose', selected: false } ] } ]); const enhancedOptions = { ...options, warnings: response.features.includes('warnings'), suggestions: response.features.includes('suggestions'), fix: response.features.includes('fix'), verbose: response.features.includes('verbose') }; await validateAllConfigurations(enhancedOptions); } function displayValidationResult(result, title, options) { const status = result.valid ? chalk_1.default.green('āœ… Valid') : chalk_1.default.red('āŒ Invalid'); console.log(` Status: ${status}`); // Display errors if (result.errors.length > 0) { const errors = result.errors.filter((e) => e.severity === 'error'); const warnings = result.errors.filter((e) => e.severity === 'warning'); if (errors.length > 0) { console.log(chalk_1.default.red('\n āŒ Errors:')); errors.forEach((error) => { console.log(chalk_1.default.red(` • ${error.field}: ${error.message}`)); if (error.value !== undefined) { console.log(chalk_1.default.gray(` Current value: ${JSON.stringify(error.value)}`)); } if (error.expectedValue !== undefined) { console.log(chalk_1.default.gray(` Expected: ${JSON.stringify(error.expectedValue)}`)); } if (error.suggestions && error.suggestions.length > 0) { console.log(chalk_1.default.cyan(' Suggestions:')); error.suggestions.forEach((suggestion) => { console.log(chalk_1.default.cyan(` - ${suggestion}`)); }); } }); } if (warnings.length > 0 && options.warnings !== false) { console.log(chalk_1.default.yellow('\n āš ļø Warnings:')); warnings.forEach((warning) => { console.log(chalk_1.default.yellow(` • ${warning.field}: ${warning.message}`)); }); } } // Display warnings if (result.warnings && result.warnings.length > 0 && options.warnings !== false) { console.log(chalk_1.default.yellow('\n āš ļø Additional Warnings:')); result.warnings.forEach((warning) => { console.log(chalk_1.default.yellow(` • ${warning.field}: ${warning.message}`)); console.log(chalk_1.default.gray(` Suggestion: ${warning.suggestion}`)); console.log(chalk_1.default.gray(` Impact: ${warning.impact}`)); }); } // Display suggestions if (result.suggestions && result.suggestions.length > 0 && options.suggestions !== false) { console.log(chalk_1.default.cyan('\n šŸ’” Suggestions:')); result.suggestions.forEach((suggestion) => { console.log(chalk_1.default.cyan(` • ${suggestion.field}: ${suggestion.suggestion}`)); console.log(chalk_1.default.gray(` Reason: ${suggestion.reason}`)); if (suggestion.autoFixable) { console.log(chalk_1.default.green(' Auto-fixable: Yes')); } }); } // Auto-fix prompt if (options.fix && result.suggestions) { const autoFixable = result.suggestions.filter((s) => s.autoFixable); if (autoFixable.length > 0) { console.log(chalk_1.default.cyan('\nšŸ”§ Auto-fix functionality coming soon...')); console.log(chalk_1.default.gray('The following issues can be automatically fixed:')); autoFixable.forEach((suggestion) => { console.log(chalk_1.default.gray(` • ${suggestion.field}: ${suggestion.suggestion}`)); }); } } }