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