UNPKG

agentsqripts

Version:

Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems

102 lines (92 loc) 3.74 kB
/** * @file Individual file UI/UX analyzer for comprehensive user experience assessment * @description Single responsibility: Detect UI problems and user experience issues in individual frontend files * * This analyzer examines individual frontend files to identify user interface and user experience * problems that could negatively impact usability, accessibility, and maintainability. It provides * comprehensive detection of common UI anti-patterns, excessive inline styling, and interface * inconsistencies that reduce code quality and user satisfaction. * * Design rationale: * - File-level analysis enables focused UI improvements for specific components * - Multiple specialized detectors cover different categories of UI problems * - Scoring system provides quantitative UI quality assessment for tracking improvements * - Pattern-based detection identifies common anti-patterns across different frameworks * - Recommendation system provides actionable guidance for UI quality improvements * * UI problem detection scope: * - Ambiguous labels that confuse users and reduce accessibility * - Icon inconsistencies that break visual design patterns * - Excessive inline styles that reduce maintainability and reusability * - Framework-specific UI anti-patterns and accessibility issues * - Performance-impacting UI patterns and rendering inefficiencies */ const { promises: fsPromises } = require('fs'); const { detectAmbiguousLabels } = require('./ambiguousLabelDetector'); const { detectIconInconsistencies } = require('./inconsistentIconDetector'); /** * Analyze UI problems in a file (async version for better scalability) * @param {string} filePath - File to analyze * @param {Object} options - Analysis options * @returns {Promise<Object>} UI problem analysis results */ async function analyzeFileUIProblems(filePath, options = {}) { try { const content = await fsPromises.readFile(filePath, 'utf8'); const issues = []; // Detect various UI problems issues.push(...detectAmbiguousLabels(content, filePath)); issues.push(...detectIconInconsistencies(content, filePath)); // Detect inline styles const inlineStyleMatches = content.match(/style\s*=\s*\{[^}]*\}/g); if (inlineStyleMatches && inlineStyleMatches.length > 2) { issues.push({ type: 'excessive_inline_styles', severity: 'MEDIUM', category: 'Maintainability', count: inlineStyleMatches.length, description: `${inlineStyleMatches.length} inline styles found`, file: filePath, recommendation: 'Move styles to CSS classes for better maintainability' }); } const criticalIssues = issues.filter(i => i.severity === 'HIGH').length; const totalIssues = issues.length; const uiScore = Math.max(0, 100 - (criticalIssues * 20) - (totalIssues * 5)); return { file: filePath, issues, uiScore, grade: getUIGrade(uiScore), metrics: { totalIssues, criticalIssues, mediumIssues: issues.filter(i => i.severity === 'MEDIUM').length }, recommendations: generateUIRecommendations(issues) }; } catch (error) { return { file: filePath, issues: [], uiScore: 100, grade: 'A', metrics: { totalIssues: 0, criticalIssues: 0 }, recommendations: [] }; } } const { getLetterGrade } = require('../utils/gradeUtils'); function getUIGrade(score) { return getLetterGrade(score); } function generateUIRecommendations(issues) { return issues.map(issue => ({ type: issue.type, priority: issue.severity, recommendation: issue.recommendation })); } module.exports = { analyzeFileUIProblems };