mrlib-ui
Version:
Modern React UI component library with TypeScript, Tailwind CSS, and multi-language support
157 lines (128 loc) • 4.49 kB
JavaScript
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { existsSync, mkdirSync, readdirSync, statSync, readFileSync, writeFileSync } from 'fs';
import { execSync } from 'child_process';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const TEMPLATE_DIR = join(__dirname, '..', 'template');
// Renk kodları
const colors = {
reset: '\x1b[0m',
bright: '\x1b[1m',
dim: '\x1b[2m',
red: '\x1b[31m',
green: '\x1b[32m',
yellow: '\x1b[33m',
blue: '\x1b[34m',
magenta: '\x1b[35m',
cyan: '\x1b[36m',
white: '\x1b[37m'
};
// Yardımcı fonksiyonlar
const log = (message, color = 'white') => {
console.log(`${colors[color]}${message}${colors.reset}`);
};
const error = (message) => {
log(`❌ ${message}`, 'red');
process.exit(1);
};
const success = (message) => {
log(`✅ ${message}`, 'green');
};
const info = (message) => {
log(`ℹ️ ${message}`, 'cyan');
};
const warning = (message) => {
log(`⚠️ ${message}`, 'yellow');
};
// Dosya kopyalama fonksiyonu
const copyRecursive = (src, dest) => {
const stat = statSync(src);
if (stat.isDirectory()) {
if (!existsSync(dest)) {
mkdirSync(dest, { recursive: true });
}
const files = readdirSync(src);
files.forEach(file => {
copyRecursive(join(src, file), join(dest, file));
});
} else {
const content = readFileSync(src);
writeFileSync(dest, content);
}
};
// Template değişkenlerini değiştir
const replaceTemplateVariables = (filePath, projectName) => {
if (filePath.endsWith('.json') || filePath.endsWith('.md') || filePath.endsWith('.html')) {
const content = readFileSync(filePath, 'utf8');
const updatedContent = content
.replace(/\{\{PROJECT_NAME\}\}/g, projectName);
writeFileSync(filePath, updatedContent);
}
};
// Ana fonksiyon
const createProject = (projectName) => {
if (!projectName) {
error('Proje adı belirtilmedi! Kullanım: npx mrlib create <proje-adi>');
}
const targetDir = join(process.cwd(), projectName);
// Hedef dizin kontrolü
if (existsSync(targetDir)) {
error(`'${projectName}' klasörü zaten mevcut!`);
}
// Template dizin kontrolü
if (!existsSync(TEMPLATE_DIR)) {
error('Template dosyaları bulunamadı!');
}
log(`🚀 ${projectName} projesi oluşturuluyor...`, 'bright');
try {
// Template'i kopyala
info('Template dosyaları kopyalanıyor...');
copyRecursive(TEMPLATE_DIR, targetDir);
// Template değişkenlerini değiştir
info('Proje dosyaları yapılandırılıyor...');
const filesToProcess = [
join(targetDir, 'package.json'),
join(targetDir, 'index.html'),
join(targetDir, 'README.md'),
join(targetDir, 'README.en.md')
];
filesToProcess.forEach(file => {
if (existsSync(file)) {
replaceTemplateVariables(file, projectName);
}
});
// README dosyalarını kopyala (template'de zaten var)
const readmeFiles = [join(targetDir, 'README.md'), join(targetDir, 'README.en.md')];
readmeFiles.forEach(readmePath => {
if (existsSync(readmePath)) {
const content = readFileSync(readmePath, 'utf8');
const updatedContent = content.replace(/mrlib/g, projectName);
writeFileSync(readmePath, updatedContent);
}
});
success(`✨ ${projectName} projesi başarıyla oluşturuldu!`);
log('\\n📦 Sonraki adımlar:', 'bright');
log(` cd ${projectName}`);
log(` npm install`);
log(` npm run dev`);
log('\\n🎉 Projeniz hazır! Geliştirme sunucusunu başlatmak için yukarıdaki komutları çalıştırın.', 'green');
log('\\n📚 Daha fazla bilgi için: https://github.com/yourusername/mrlib', 'dim');
} catch (err) {
error(`Proje oluşturulurken hata oluştu: ${err.message}`);
}
};
// Komut satırı argümanları
const args = process.argv.slice(2);
const command = args[0];
const projectName = args[1];
if (command === 'create') {
createProject(projectName);
} else {
log('🎨 mrlib - Modern React UI Component Library', 'bright');
log('\\nKullanım:', 'white');
log(' npx mrlib create <proje-adi> Yeni proje oluştur', 'dim');
log('\\nÖrnek:', 'white');
log(' npx mrlib create my-app', 'dim');
}