woaru
Version:
Universal Project Setup Autopilot - Analyze and automatically configure development tools for ANY programming language
123 lines (119 loc) • 4.74 kB
JavaScript
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