agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
86 lines (75 loc) • 3.08 kB
JavaScript
/**
* @file Repeated DOM query detector
* @description Detects repeated DOM queries that could be cached
*/
/**
* Detects repeated DOM queries
* @param {string} content - File content
* @param {string} filePath - Path to the file
* @returns {Array} Array of repeated DOM query issues
*/
function detectRepeatedDomQueries(content, filePath) {
const issues = [];
const lines = content.split('\n');
const { PERFORMANCE_PATTERNS } = require('./performancePatterns');
// Track DOM queries
const queryMap = new Map();
lines.forEach((line, index) => {
const lineNumber = index + 1;
// DOM query patterns
const domPatterns = [
{ pattern: /document\.getElementById\s*\(['"`]([^'"`]+)['"`]\)/, type: 'getElementById' },
{ pattern: /document\.getElementsByClassName\s*\(['"`]([^'"`]+)['"`]\)/, type: 'getElementsByClassName' },
{ pattern: /document\.querySelector\s*\(['"`]([^'"`]+)['"`]\)/, type: 'querySelector' },
{ pattern: /document\.querySelectorAll\s*\(['"`]([^'"`]+)['"`]\)/, type: 'querySelectorAll' },
{ pattern: /\$\s*\(['"`]([^'"`]+)['"`]\)/, type: 'jQuery' },
{ pattern: /jQuery\s*\(['"`]([^'"`]+)['"`]\)/, type: 'jQuery' }
];
domPatterns.forEach(({ pattern, type }) => {
const match = line.match(pattern);
if (match) {
const selector = match[1];
const key = `${type}:${selector}`;
if (!queryMap.has(key)) {
queryMap.set(key, []);
}
queryMap.get(key).push({ lineNumber, code: line.trim() });
}
});
});
// Find repeated queries
queryMap.forEach((occurrences, key) => {
if (occurrences.length > 1) {
const pattern = PERFORMANCE_PATTERNS['repeated_dom_query'];
const [type, selector] = key.split(':');
// Check if queries are in the same function scope (within ~20 lines)
for (let i = 0; i < occurrences.length - 1; i++) {
for (let j = i + 1; j < occurrences.length; j++) {
if (Math.abs(occurrences[i].lineNumber - occurrences[j].lineNumber) <= 20) {
issues.push({
type: 'repeated_dom_query',
severity: pattern.severity,
category: pattern.category,
location: `${filePath}:${occurrences[i].lineNumber},${occurrences[j].lineNumber}`,
line: occurrences[i].lineNumber,
selector: selector,
queryType: type,
code: occurrences[i].code,
description: `DOM query for "${selector}" repeated ${occurrences.length} times`,
summary: `Repeated DOM query for "${selector}"`,
recommendation: 'Cache DOM query result in a variable to avoid repeated lookups',
effort: pattern.effort,
impact: pattern.impact,
estimatedSavings: '30-60% DOM performance improvement'
});
break; // Only report once per selector
}
}
}
}
});
return issues;
}
module.exports = {
detectRepeatedDomQueries
};