UNPKG

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