@fe-fast/code-sweeper
Version:
A lightweight JavaScript/TypeScript code cleaning tool
186 lines (166 loc) ⢠6.42 kB
text/typescript
import chalk from 'chalk';
import inquirer from 'inquirer';
import { ConfigManager } from '../core/ConfigManager.js';
import { Logger } from '../utils/Logger.js';
import { defaultConfig } from '../config/default.js';
export async function configCommand(options: any) {
const logger = new Logger();
const configManager = new ConfigManager();
try {
if (options.init) {
await initializeConfig(configManager, logger);
} else if (options.show) {
await showConfig(configManager, logger);
} else {
await interactiveConfig(configManager, logger);
}
} catch (error) {
logger.error('ā Configuration error:', error instanceof Error ? error.message : String(error));
process.exit(1);
}
}
async function initializeConfig(configManager: ConfigManager, logger: Logger) {
logger.info('š§ Initializing Code Sweeper configuration...');
const configExists = await configManager.exists();
if (configExists) {
const { overwrite } = await inquirer.prompt([
{
type: 'confirm',
name: 'overwrite',
message: 'Configuration file already exists. Overwrite?',
default: false
}
]);
if (!overwrite) {
logger.info('Configuration initialization cancelled.');
return;
}
}
// Interactive configuration setup
const answers = await inquirer.prompt([
{
type: 'checkbox',
name: 'rules',
message: 'Select cleanup rules to enable:',
choices: [
{ name: 'Remove unused imports', value: 'removeUnusedImports', checked: true },
{ name: 'Remove unused variables', value: 'removeUnusedVariables', checked: true },
{ name: 'Remove console.log statements', value: 'removeConsoleLog', checked: true },
{ name: 'Remove statements', value: 'removeDebugger', checked: true },
{ name: 'Format code style', value: 'formatCode', checked: false },
{ name: 'Rename variables to camelCase', value: 'renameToCamelCase', checked: false }
]
},
{
type: 'input',
name: 'include',
message: 'File patterns to include (comma-separated):',
default: '**/*.{js,ts,jsx,tsx,vue}'
},
{
type: 'input',
name: 'exclude',
message: 'File patterns to exclude (comma-separated):',
default: 'node_modules/**,dist/**,build/**,*.min.js'
}
]);
// Build configuration
const config = {
...defaultConfig,
rules: {
removeUnusedImports: answers.rules.includes('removeUnusedImports'),
removeUnusedVariables: answers.rules.includes('removeUnusedVariables'),
removeConsoleLog: answers.rules.includes('removeConsoleLog'),
removeDebugger: answers.rules.includes('removeDebugger'),
formatCode: answers.rules.includes('formatCode'),
renameToCamelCase: answers.rules.includes('renameToCamelCase')
},
include: answers.include.split(',').map((s: string) => s.trim()),
exclude: answers.exclude.split(',').map((s: string) => s.trim())
};
await configManager.save(config);
logger.success('ā
Configuration file created successfully!');
logger.info(`š Configuration saved to: ${chalk.cyan(configManager.getConfigPath())}`);
}
async function showConfig(configManager: ConfigManager, logger: Logger) {
logger.info('š Current Code Sweeper Configuration:');
const config = await configManager.load();
logger.info(`\nš Configuration file: ${chalk.cyan(configManager.getConfigPath())}`);
}
async function interactiveConfig(configManager: ConfigManager, logger: Logger) {
logger.info('āļø Code Sweeper Configuration Manager');
const { action } = await inquirer.prompt([
{
type: 'list',
name: 'action',
message: 'What would you like to do?',
choices: [
{ name: 'š§ Initialize new configuration', value: 'init' },
{ name: 'š Show current configuration', value: 'show' },
{ name: 'āļø Edit configuration', value: 'edit' },
{ name: 'šļø Reset to defaults', value: 'reset' }
]
}
]);
switch (action) {
case 'init':
await initializeConfig(configManager, logger);
break;
case 'show':
await showConfig(configManager, logger);
break;
case 'edit':
await editConfig(configManager, logger);
break;
case 'reset':
await resetConfig(configManager, logger);
break;
}
}
async function editConfig(configManager: ConfigManager, logger: Logger) {
const config = await configManager.load();
const answers = await inquirer.prompt([
{
type: 'checkbox',
name: 'rules',
message: 'Select cleanup rules to enable:',
choices: [
{ name: 'Remove unused imports', value: 'removeUnusedImports', checked: config.rules.removeUnusedImports },
{ name: 'Remove unused variables', value: 'removeUnusedVariables', checked: config.rules.removeUnusedVariables },
{ name: 'Remove console.log statements', value: 'removeConsoleLog', checked: config.rules.removeConsoleLog },
{ name: 'Remove statements', value: 'removeDebugger', checked: config.rules.removeDebugger },
{ name: 'Format code style', value: 'formatCode', checked: config.rules.formatCode },
{ name: 'Rename variables to camelCase', value: 'renameToCamelCase', checked: config.rules.renameToCamelCase }
]
}
]);
const updatedConfig = {
...config,
rules: {
removeUnusedImports: answers.rules.includes('removeUnusedImports'),
removeUnusedVariables: answers.rules.includes('removeUnusedVariables'),
removeConsoleLog: answers.rules.includes('removeConsoleLog'),
removeDebugger: answers.rules.includes('removeDebugger'),
formatCode: answers.rules.includes('formatCode'),
renameToCamelCase: answers.rules.includes('renameToCamelCase')
}
};
await configManager.save(updatedConfig);
logger.success('ā
Configuration updated successfully!');
}
async function resetConfig(configManager: ConfigManager, logger: Logger) {
const { confirm } = await inquirer.prompt([
{
type: 'confirm',
name: 'confirm',
message: 'Are you sure you want to reset configuration to defaults?',
default: false
}
]);
if (confirm) {
await configManager.save(defaultConfig);
logger.success('ā
Configuration reset to defaults!');
} else {
logger.info('Reset cancelled.');
}
}