UNPKG

mrlib-ui

Version:

Modern React UI component library with TypeScript, Tailwind CSS, and multi-language support

157 lines (128 loc) 4.49 kB
#!/usr/bin/env node 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'); }