UNPKG

agentsqripts

Version:

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

65 lines (58 loc) 2.29 kB
/** * @file Detect useEffect issues * @description Single responsibility: Identify performance problems with React useEffect */ const { iterateLines } = require('../../utils/patternDetector'); const checkForDependencyArray = require('./checkForDependencyArray'); const extractDependencyArray = require('./extractDependencyArray'); /** * Detect useEffect issues */ function detectUseEffectIssues(lines, filePath) { const issues = []; iterateLines(lines, (line, lineNumber, trimmed, i) => { // useEffect without dependency array if (/useEffect\s*\(\s*\(\s*\)\s*=>/.test(trimmed) || /useEffect\s*\(\s*function/.test(trimmed)) { // Check if dependency array is present const hasDepArray = checkForDependencyArray(lines, i); if (!hasDepArray) { issues.push({ type: 'missing_effect_deps', severity: 'HIGH', category: 'React', location: `${filePath}:${lineNumber}`, line: lineNumber, code: trimmed, description: 'useEffect without dependency array runs on every render', summary: 'useEffect missing dependency array', recommendation: 'Add dependency array to control when effect runs', effort: 1, impact: 'Prevents unnecessary effect executions', estimatedSavings: '50-80% effect optimization' }); } } // useEffect with object in dependency array if (/useEffect\s*\(/.test(trimmed)) { const depArray = extractDependencyArray(lines, i); if (depArray && /\{|\[/.test(depArray)) { issues.push({ type: 'object_in_effect_deps', severity: 'MEDIUM', category: 'React', location: `${filePath}:${lineNumber}`, line: lineNumber, code: trimmed, description: 'Object or array in useEffect dependencies causes effect to run on every render', summary: 'Object in useEffect dependency array', recommendation: 'Use useMemo for objects or destructure specific properties', effort: 2, impact: 'Prevents unnecessary effect executions', estimatedSavings: '40-60% effect optimization' }); } } }); return issues; } module.exports = detectUseEffectIssues;