170 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
#!/usr/bin/env node
 | 
						|
/**
 | 
						|
 * Script pour remplacer les couleurs hardcodées par des tokens CSS
 | 
						|
 * Usage: node scripts/refactor-colors.mjs
 | 
						|
 */
 | 
						|
 | 
						|
import { readFileSync, writeFileSync, readdirSync, statSync } from 'fs';
 | 
						|
import { join, extname } from 'path';
 | 
						|
 | 
						|
// Mapping des classes Tailwind hardcodées vers les tokens
 | 
						|
const COLOR_REPLACEMENTS = [
 | 
						|
  // Dark mode backgrounds
 | 
						|
  { from: /\bdark:bg-slate-700\b/g, to: 'dark:bg-surface2' },
 | 
						|
  { from: /\bdark:bg-slate-800\b/g, to: 'dark:bg-card' },
 | 
						|
  { from: /\bdark:bg-slate-900\b/g, to: 'dark:bg-main' },
 | 
						|
  { from: /\bdark:bg-gray-700\b/g, to: 'dark:bg-surface2' },
 | 
						|
  { from: /\bdark:bg-gray-800\b/g, to: 'dark:bg-card' },
 | 
						|
  { from: /\bdark:bg-gray-900\b/g, to: 'dark:bg-main' },
 | 
						|
  { from: /\bdark:bg-zinc-700\b/g, to: 'dark:bg-surface2' },
 | 
						|
  { from: /\bdark:bg-zinc-800\b/g, to: 'dark:bg-card' },
 | 
						|
  { from: /\bdark:bg-zinc-900\b/g, to: 'dark:bg-main' },
 | 
						|
  
 | 
						|
  // Dark mode text
 | 
						|
  { from: /\bdark:text-slate-200\b/g, to: 'dark:text-main' },
 | 
						|
  { from: /\bdark:text-slate-300\b/g, to: 'dark:text-main' },
 | 
						|
  { from: /\bdark:text-slate-400\b/g, to: 'dark:text-muted' },
 | 
						|
  { from: /\bdark:text-gray-200\b/g, to: 'dark:text-main' },
 | 
						|
  { from: /\bdark:text-gray-300\b/g, to: 'dark:text-main' },
 | 
						|
  { from: /\bdark:text-gray-400\b/g, to: 'dark:text-muted' },
 | 
						|
  { from: /\bdark:text-zinc-200\b/g, to: 'dark:text-main' },
 | 
						|
  { from: /\bdark:text-zinc-300\b/g, to: 'dark:text-main' },
 | 
						|
  { from: /\bdark:text-zinc-400\b/g, to: 'dark:text-muted' },
 | 
						|
  
 | 
						|
  // Dark mode borders
 | 
						|
  { from: /\bdark:border-slate-600\b/g, to: 'dark:border-border' },
 | 
						|
  { from: /\bdark:border-slate-700\b/g, to: 'dark:border-border' },
 | 
						|
  { from: /\bdark:border-gray-600\b/g, to: 'dark:border-border' },
 | 
						|
  { from: /\bdark:border-gray-700\b/g, to: 'dark:border-border' },
 | 
						|
  { from: /\bdark:border-zinc-600\b/g, to: 'dark:border-border' },
 | 
						|
  { from: /\bdark:border-zinc-700\b/g, to: 'dark:border-border' },
 | 
						|
  
 | 
						|
  // Dark hover states
 | 
						|
  { from: /\bdark:hover:bg-slate-700\b/g, to: 'dark:hover:bg-surface2' },
 | 
						|
  { from: /\bdark:hover:bg-slate-800\b/g, to: 'dark:hover:bg-card' },
 | 
						|
  { from: /\bdark:hover:bg-gray-700\b/g, to: 'dark:hover:bg-surface2' },
 | 
						|
  { from: /\bdark:hover:bg-gray-800\b/g, to: 'dark:hover:bg-card' },
 | 
						|
  { from: /\bdark:hover:text-slate-200\b/g, to: 'dark:hover:text-main' },
 | 
						|
  { from: /\bdark:hover:text-gray-200\b/g, to: 'dark:hover:text-main' },
 | 
						|
  
 | 
						|
  // Backgrounds
 | 
						|
  { from: /\bbg-slate-50\b/g, to: 'bg-surface1' },
 | 
						|
  { from: /\bbg-slate-100\b/g, to: 'bg-surface1' },
 | 
						|
  { from: /\bbg-slate-200\b/g, to: 'bg-surface2' },
 | 
						|
  { from: /\bbg-slate-300\b/g, to: 'bg-muted' },
 | 
						|
  { from: /\bbg-gray-50\b/g, to: 'bg-surface1' },
 | 
						|
  { from: /\bbg-gray-100\b/g, to: 'bg-surface1' },
 | 
						|
  { from: /\bbg-gray-200\b/g, to: 'bg-surface2' },
 | 
						|
  { from: /\bbg-gray-300\b/g, to: 'bg-muted' },
 | 
						|
  { from: /\bbg-gray-800\b/g, to: 'bg-card' },
 | 
						|
  { from: /\bbg-gray-900\b/g, to: 'bg-main' },
 | 
						|
  { from: /\bbg-zinc-50\b/g, to: 'bg-surface1' },
 | 
						|
  { from: /\bbg-zinc-100\b/g, to: 'bg-surface1' },
 | 
						|
  { from: /\bbg-zinc-800\b/g, to: 'bg-card' },
 | 
						|
  { from: /\bbg-zinc-900\b/g, to: 'bg-main' },
 | 
						|
  { from: /\bbg-white\b/g, to: 'bg-card' },
 | 
						|
  
 | 
						|
  // Text colors
 | 
						|
  { from: /\btext-slate-400\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-slate-500\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-slate-600\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-slate-700\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-slate-800\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-slate-900\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-gray-400\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-gray-500\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-gray-600\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-gray-700\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-gray-800\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-gray-900\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-zinc-400\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-zinc-500\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-zinc-600\b/g, to: 'text-muted' },
 | 
						|
  { from: /\btext-zinc-700\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-zinc-800\b/g, to: 'text-main' },
 | 
						|
  { from: /\btext-zinc-900\b/g, to: 'text-main' },
 | 
						|
  
 | 
						|
  // Borders
 | 
						|
  { from: /\bborder-slate-200\b/g, to: 'border-border' },
 | 
						|
  { from: /\bborder-slate-300\b/g, to: 'border-border' },
 | 
						|
  { from: /\bborder-gray-200\b/g, to: 'border-border' },
 | 
						|
  { from: /\bborder-gray-300\b/g, to: 'border-border' },
 | 
						|
  { from: /\bborder-zinc-200\b/g, to: 'border-border' },
 | 
						|
  { from: /\bborder-zinc-300\b/g, to: 'border-border' },
 | 
						|
  
 | 
						|
  // Hover states
 | 
						|
  { from: /\bhover:bg-slate-100\b/g, to: 'hover:bg-surface1' },
 | 
						|
  { from: /\bhover:bg-slate-200\b/g, to: 'hover:bg-surface2' },
 | 
						|
  { from: /\bhover:bg-gray-100\b/g, to: 'hover:bg-surface1' },
 | 
						|
  { from: /\bhover:bg-gray-200\b/g, to: 'hover:bg-surface2' },
 | 
						|
  { from: /\bhover:bg-zinc-100\b/g, to: 'hover:bg-surface1' },
 | 
						|
  { from: /\bhover:text-slate-900\b/g, to: 'hover:text-main' },
 | 
						|
  { from: /\bhover:text-gray-900\b/g, to: 'hover:text-main' },
 | 
						|
  
 | 
						|
  // Focus states
 | 
						|
  { from: /\bfocus:border-slate-400\b/g, to: 'focus:border-primary' },
 | 
						|
  { from: /\bfocus:border-gray-400\b/g, to: 'focus:border-primary' },
 | 
						|
  { from: /\bfocus:ring-slate-500\b/g, to: 'focus:ring-ring' },
 | 
						|
  { from: /\bfocus:ring-gray-500\b/g, to: 'focus:ring-ring' },
 | 
						|
];
 | 
						|
 | 
						|
function processFile(filePath) {
 | 
						|
  try {
 | 
						|
    let content = readFileSync(filePath, 'utf-8');
 | 
						|
    let modified = false;
 | 
						|
    
 | 
						|
    for (const { from, to } of COLOR_REPLACEMENTS) {
 | 
						|
      if (from.test(content)) {
 | 
						|
        content = content.replace(from, to);
 | 
						|
        modified = true;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    
 | 
						|
    if (modified) {
 | 
						|
      writeFileSync(filePath, content, 'utf-8');
 | 
						|
      console.log(`✓ Updated: ${filePath}`);
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
    
 | 
						|
    return 0;
 | 
						|
  } catch (error) {
 | 
						|
    console.error(`✗ Error processing ${filePath}:`, error.message);
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function walkDirectory(dir, extensions = ['.ts', '.html']) {
 | 
						|
  let filesUpdated = 0;
 | 
						|
  
 | 
						|
  const items = readdirSync(dir);
 | 
						|
  
 | 
						|
  for (const item of items) {
 | 
						|
    const fullPath = join(dir, item);
 | 
						|
    const stat = statSync(fullPath);
 | 
						|
    
 | 
						|
    if (stat.isDirectory()) {
 | 
						|
      // Skip node_modules, .angular, dist, etc.
 | 
						|
      if (!['node_modules', '.angular', 'dist', '.git'].includes(item)) {
 | 
						|
        filesUpdated += walkDirectory(fullPath, extensions);
 | 
						|
      }
 | 
						|
    } else if (stat.isFile()) {
 | 
						|
      const ext = extname(fullPath);
 | 
						|
      if (extensions.includes(ext)) {
 | 
						|
        filesUpdated += processFile(fullPath);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  return filesUpdated;
 | 
						|
}
 | 
						|
 | 
						|
// Main execution
 | 
						|
const srcDir = join(process.cwd(), 'src');
 | 
						|
console.log('🎨 Starting color refactoring...\n');
 | 
						|
console.log(`Scanning: ${srcDir}\n`);
 | 
						|
 | 
						|
const filesUpdated = walkDirectory(srcDir);
 | 
						|
 | 
						|
console.log(`\n✨ Refactoring complete!`);
 | 
						|
console.log(`📝 Files updated: ${filesUpdated}`);
 |