@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
JavaScript
;
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}`));
});
}
}
}