UNPKG

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