@sun-asterisk/sunlint
Version: 
☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards
89 lines (72 loc) • 2.76 kB
JavaScript
const fs = require('fs');
const path = require('path');
const { SimpleRuleParser } = require('../rules/parser/rule-parser-simple');
/**
 * Generate rules registry from origin-rules
 * This script creates config/rules/rules-registry-generated.json
 * from all *-en.md files in origin-rules/ directory
 */
console.log('📋 Generating rules registry from origin-rules...');
try {
  const parser = new SimpleRuleParser();
  const originRulesDir = path.join(__dirname, '..', 'origin-rules');
  const targetPath = path.join(__dirname, '..', 'config', 'rules', 'rules-registry-generated.json');
  
  console.log(`Source: ${originRulesDir}`);
  console.log(`Target: ${targetPath}`);
  
  // Parse all rules from origin-rules
  const allRules = parser.parseAllRules(originRulesDir);
  
  if (allRules.length === 0) {
    console.error('❌ No rules found in origin-rules directory');
    process.exit(1);
  }
  
  // Convert to registry format
  const registry = {
    rules: {}
  };
  
  allRules.forEach(rule => {
    if (rule.id) {
      registry.rules[rule.id] = {
        name: rule.title || `${rule.id} Rule`,
        description: rule.description || 'No description available',
        category: rule.category || 'quality',
        severity: rule.severity || 'major',
        languages: rule.language ? [rule.language] : ['All languages'],
        version: rule.version || '1.0.0',
        status: rule.status || 'draft',
        tags: [rule.category || 'quality', 'readability', 'code-quality'],
        tools: rule.tools || [],
        framework: rule.framework || 'All',
        principles: rule.principles || []
      };
    }
  });
  
  // Ensure target directory exists
  const targetDir = path.dirname(targetPath);
  if (!fs.existsSync(targetDir)) {
    fs.mkdirSync(targetDir, { recursive: true });
  }
  
  // Write registry file
  fs.writeFileSync(targetPath, JSON.stringify(registry, null, 2), 'utf8');
  
  const rulesCount = Object.keys(registry.rules).length;
  const fileSize = (fs.statSync(targetPath).size / 1024).toFixed(1);
  
  console.log(`✅ Generated registry with ${rulesCount} rules`);
  console.log(`📁 File: ${targetPath} (${fileSize} KB)`);
  console.log('');
  console.log('📊 Rules by category:');
  
  // Stats by category
  const categories = {};
  Object.values(registry.rules).forEach(rule => {
    const cat = rule.category || 'unknown';
    categories[cat] = (categories[cat] || 0) + 1;
  });
  
  Object.entries(categories)
    .sort(([,a], [,b]) => b - a)
    .forEach(([category, count]) => {
      console.log(`   ${category}: ${count} rules`);
    });
    
} catch (error) {
  console.error('❌ Error generating registry:', error.message);
  console.error(error.stack);
  process.exit(1);
}