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
JavaScript
/**
* @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
};