@logistically/i18n-cli
Version:
Enterprise-grade CLI tool for extracting and managing translations in Logistically microservices
179 lines (157 loc) • 5.78 kB
text/typescript
import { Command } from 'commander';
import { ConfigManager } from '../utils/config';
import { Logger } from '../utils/logger';
import { Validator } from '../utils/validator';
import { SecurityContext, CLIConfig } from '../types';
const logger = Logger.getInstance();
export async function showConfig(options: { verbose: boolean }): Promise<void> {
const configManager = ConfigManager.getInstance();
const config = await configManager.loadConfig();
logger.header('Configuration');
logger.info(`Config file: ${configManager.getConfigValue('configPath')}`);
logger.info(`Environment: ${config.environment}`);
logger.info(`Version: ${config.version}`);
if (options.verbose) {
logger.section('Logging Configuration');
logger.info(`Level: ${config.logging.level}`);
logger.info(`Format: ${config.logging.format}`);
logger.info(`Output: ${config.logging.output}`);
if (config.logging.filePath) {
logger.info(`Log file: ${config.logging.filePath}`);
}
logger.section('Performance Configuration');
logger.info(`Max concurrency: ${config.performance.maxConcurrency}`);
logger.info(`Max file size: ${config.performance.maxFileSize}MB`);
logger.info(`Timeout: ${config.performance.timeout}s`);
logger.section('Security Configuration');
logger.info(`Validate inputs: ${config.security.validateInputs}`);
logger.info(`Sanitize outputs: ${config.security.sanitizeOutputs}`);
logger.info(`Max key length: ${config.security.maxKeyLength}`);
logger.section('Features Configuration');
logger.info(`Enable validation: ${config.features.enableValidation}`);
logger.info(`Enable backup: ${config.features.enableBackup}`);
logger.info(`Enable dry run: ${config.features.enableDryRun}`);
logger.info(`Enable progress bar: ${config.features.enableProgressBar}`);
}
}
export async function validateConfig(): Promise<void> {
const configManager = ConfigManager.getInstance();
const config = await configManager.loadConfig();
const securityContext: SecurityContext = {
inputValidation: true,
outputSanitization: true,
sanitizeOutputs: true,
fileAccessControl: true,
maxFileSize: 100,
maxKeyLength: 200,
allowedFileTypes: ['.json', '.yaml', '.yml']
};
const validator = new Validator(securityContext);
const validation = validator.validateConfiguration(config);
if (validation.isValid) {
logger.success('Configuration is valid');
} else {
logger.error('Configuration validation failed');
logger.logValidationErrors(validation.errors, 'config');
}
if (validation.warnings.length > 0) {
logger.logValidationWarnings(validation.warnings, 'config');
}
}
export async function setConfigValue(key: string, value: string): Promise<void> {
const configManager = ConfigManager.getInstance();
// Parse value based on type
let parsedValue: any = value;
if (value === 'true' || value === 'false') {
parsedValue = value === 'true';
} else if (!isNaN(Number(value))) {
parsedValue = Number(value);
}
configManager.setConfigValue(key, parsedValue);
await configManager.saveConfig({});
logger.success(`Set ${key} = ${value}`);
}
export async function resetConfig(): Promise<void> {
const configManager = ConfigManager.getInstance();
// Create default configuration
const defaultConfig: CLIConfig = {
version: '1.0.0',
environment: 'development',
logging: {
level: 'info',
format: 'text',
output: 'console',
},
performance: {
maxConcurrency: 4,
maxFileSize: 10,
timeout: 300,
},
security: {
validateInputs: true,
sanitizeOutputs: true,
maxKeyLength: 200,
},
features: {
enableValidation: true,
enableBackup: true,
enableDryRun: true,
enableProgressBar: true,
},
};
await configManager.saveConfig(defaultConfig);
logger.success('Configuration reset to defaults');
}
export function createConfigCommand(): Command {
const command = new Command('config')
.description('Manage CLI configuration')
.addCommand(
new Command('show')
.description('Show current configuration')
.option('-v, --verbose', 'Show detailed configuration')
.action(async (options) => {
try {
await showConfig(options);
} catch (error) {
logger.error(`Failed to show config: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
})
)
.addCommand(
new Command('validate')
.description('Validate current configuration')
.action(async () => {
try {
await validateConfig();
} catch (error) {
logger.error(`Failed to validate config: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
})
)
.addCommand(
new Command('set')
.description('Set configuration value')
.argument('<key>', 'Configuration key (e.g., logging.level)')
.argument('<value>', 'Configuration value')
.action(async (key, value) => {
try {
await setConfigValue(key, value);
} catch (error) {
logger.error(`Failed to set config: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
})
)
.addCommand(
new Command('reset')
.description('Reset configuration to defaults')
.action(async () => {
try {
await resetConfig();
} catch (error) {
logger.error(`Failed to reset config: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
})
);
return command;
}