agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
103 lines (94 loc) • 4.12 kB
JavaScript
/**
* @file Individual file scalability analyzer for performance bottleneck detection
* @description Single responsibility: Perform comprehensive scalability analysis on individual JavaScript files
*
* This analyzer implements multi-dimensional scalability analysis to identify performance
* bottlenecks, blocking operations, inefficient algorithms, and scalability anti-patterns
* that could impact application performance under load or with large datasets. It provides
* detailed analysis with actionable recommendations for improving application scalability.
*
* Design rationale:
* - Comprehensive detector coverage identifies diverse scalability bottlenecks from I/O to algorithms
* - Modular detector architecture enables focused testing and maintenance of individual patterns
* - Issue severity classification helps prioritize scalability improvements based on impact
* - Quantitative scoring provides measurable scalability assessment for tracking improvements
* - Context-aware analysis considers file type and framework patterns for accurate detection
*
* Scalability analysis scope:
* - Blocking operations: Synchronous I/O, CPU-intensive loops, blocking database calls
* - Algorithmic inefficiencies: O(n²) patterns, inefficient data structures, nested iterations
* - Memory issues: Memory leaks, inefficient object creation, large array operations
* - Framework patterns: React rendering issues, inefficient event handling, DOM manipulation
* - Database anti-patterns: N+1 queries, missing indexes, inefficient query patterns
*/
// Import all detector modules
const { detectBlockingSync } = require('./blockingSyncDetector');
const { detectNPlusOne } = require('./nPlusOneDetector');
const { detectFileIO } = require('./fileIODetector');
const { detectUnboundedMemory } = require('./unboundedMemoryDetector');
const { detectHeavyLoops } = require('./heavyLoopDetector');
const { detectExcessiveDBConnections } = require('./databaseConnectionDetector');
const { detectGlobalVariables } = require('./globalVariableDetector');
const { calculateScalabilityScore, getScalabilityGrade } = require('./scalabilityScoreCalculator');
/**
* Analyzes a single file for scalability issues
* @param {string} filePath - Path to the file
* @param {string} content - File content (optional)
* @returns {Object} Scalability analysis results for the file
*/
async function analyzeFileScalability(filePath, content = null) {
const { promises: fsPromises } = require('fs');
if (!content) {
try {
content = await fsPromises.readFile(filePath, 'utf8');
} catch (error) {
return {
file: filePath,
error: `Could not read file: ${error.message}`,
issues: [],
summary: { totalIssues: 0, score: 100, grade: 'A' }
};
}
}
// Run all scalability detectors
const issues = [];
issues.push(...detectBlockingSync(content, filePath));
issues.push(...detectNPlusOne(content, filePath));
issues.push(...detectFileIO(content, filePath));
issues.push(...detectUnboundedMemory(content, filePath));
issues.push(...detectHeavyLoops(content, filePath));
issues.push(...detectExcessiveDBConnections(content, filePath));
issues.push(...detectGlobalVariables(content, filePath));
// Calculate metrics
const score = calculateScalabilityScore(issues);
const grade = getScalabilityGrade(score);
// Calculate category breakdown
const categoryBreakdown = {};
const severityBreakdown = { HIGH: 0, MEDIUM: 0, LOW: 0 };
issues.forEach(issue => {
categoryBreakdown[issue.category] = (categoryBreakdown[issue.category] || 0) + 1;
severityBreakdown[issue.severity] = (severityBreakdown[issue.severity] || 0) + 1;
});
return {
file: filePath,
issues,
scalabilityScore: score,
metrics: {
totalIssues: issues.length,
score,
grade,
categoryBreakdown,
severityBreakdown
},
summary: {
totalIssues: issues.length,
score,
grade,
categoryBreakdown,
severityBreakdown
}
};
}
module.exports = {
analyzeFileScalability
};