UNPKG

woaru

Version:

Universal Project Setup Autopilot - Analyze and automatically configure development tools for ANY programming language

123 lines (119 loc) 4.74 kB
import { BaseAction } from './BaseAction.js'; import { t } from '../config/i18n.js'; import * as path from 'path'; export class PrettierAction extends BaseAction { name = 'prettier'; description = 'Install and configure Prettier for code formatting'; async canExecute(projectPath) { const packageJsonPath = path.join(projectPath, 'package.json'); const packageJson = await this.readJsonFile(packageJsonPath); if (!packageJson) return false; // Check if prettier is already installed const hasPrettier = packageJson.devDependencies?.prettier || packageJson.dependencies?.prettier; return !hasPrettier; } async execute(projectPath, options) { try { const packageJsonPath = path.join(projectPath, 'package.json'); const prettierrcPath = path.join(projectPath, '.prettierrc'); const prettierIgnorePath = path.join(projectPath, '.prettierignore'); if (options.dryRun) { console.log(t('actions.prettier.dry_run_install')); console.log(t('actions.prettier.dry_run_create_config')); console.log(t('actions.prettier.dry_run_create_ignore')); return true; } // Create backups if (!options.skipBackup) { await this.createBackup(packageJsonPath); } // Detect if Tailwind is present const packageJson = await this.readJsonFile(packageJsonPath); const hasTailwind = packageJson?.dependencies?.tailwindcss || packageJson?.devDependencies?.tailwindcss; // Install prettier packages const packages = ['prettier']; if (hasTailwind) { packages.push('prettier-plugin-tailwindcss'); } const installResult = await this.runCommand('npm', ['install', '--save-dev', ...packages], projectPath); if (!installResult.success) { throw new Error(t('actions.failed_to_install_packages', { output: installResult.output, })); } // Create .prettierrc configuration const prettierConfig = { semi: true, trailingComma: 'es5', singleQuote: true, printWidth: 80, tabWidth: 2, useTabs: false, ...(hasTailwind && { plugins: ['prettier-plugin-tailwindcss'] }), }; await this.writeJsonFile(prettierrcPath, prettierConfig); // Create .prettierignore const prettierIgnoreContent = `# Dependencies node_modules/ # Build outputs dist/ build/ .next/ # Environment files .env* # Logs *.log # OS files .DS_Store Thumbs.db `; const fs = await import('fs-extra'); await fs.writeFile(prettierIgnorePath, prettierIgnoreContent); // Add scripts to package.json if (packageJson) { if (!packageJson.scripts) { packageJson.scripts = {}; } packageJson.scripts['format'] = 'prettier --write .'; packageJson.scripts['format:check'] = 'prettier --check .'; await this.writeJsonFile(packageJsonPath, packageJson); } console.log(t('actions.prettier.setup_success')); return true; } catch (error) { console.error(t('actions.prettier.setup_failed'), error); return false; } } async rollback(projectPath) { try { const fs = await import('fs-extra'); const glob = await import('glob'); // Find backup files const backupFiles = await glob.glob(path.join(projectPath, '*.woaru-backup-*')); for (const backupFile of backupFiles) { const originalFile = backupFile.replace(/\.woaru-backup-\d+$/, ''); await fs.move(backupFile, originalFile, { overwrite: true }); } // Remove created files const filesToRemove = ['.prettierrc', '.prettierignore']; for (const file of filesToRemove) { const filePath = path.join(projectPath, file); if (await fs.pathExists(filePath)) { await fs.remove(filePath); } } console.log(t('actions.prettier.rollback_success')); return true; } catch (error) { console.error(t('actions.prettier.rollback_failed'), error); return false; } } } //# sourceMappingURL=PrettierAction.js.map