agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
62 lines (60 loc) • 2.75 kB
JavaScript
/**
* @file Calculate severity counts for issue aggregation
* @description Single responsibility: Count issues by severity level for reporting
*
* This utility aggregates issues by their severity levels to provide statistical
* summaries for analysis reports. The function handles missing severity properties
* gracefully and maintains consistent counting across all analyzers.
*
* Design rationale:
* - Uses reduce for efficient single-pass counting
* - Defaults missing severity to 'INFO' for consistent categorization
* - Returns object for O(1) lookup performance in reporting
* - Handles edge cases like null/undefined severity gracefully
*/
/**
* Calculate counts of issues grouped by severity level
*
* Technical function: Aggregates issue array into severity-keyed count object
*
* Implementation rationale:
* - reduce() provides efficient single-pass aggregation over forEach + object updates
* - Default severity fallback ('INFO') ensures all issues are counted
* - Object accumulator pattern enables dynamic key creation for unknown severities
* - Logical OR (||) handles falsy values (null, undefined, empty string)
*
* Severity handling strategy:
* - Uses issue.severity property as primary categorization key
* - Defaults to 'INFO' when severity is missing/falsy for graceful degradation
* - Supports any severity string (not limited to predefined set)
* - Maintains case sensitivity for accurate categorization
*
* Performance considerations:
* - O(n) time complexity for single pass through issues
* - O(k) space complexity where k is number of unique severities
* - No sorting or additional iterations required
* - Efficient object property access for counting
*
* Edge cases handled:
* - Empty issues array: Returns empty object {}
* - Issues without severity property: Counted as 'INFO'
* - Null/undefined severity values: Counted as 'INFO'
* - Unknown severity levels: Creates new count categories dynamically
*
* Alternative approaches considered:
* - forEach with external object: Rejected as less functional and more verbose
* - Map/Set based counting: Rejected as objects provide better serialization
* - Predefined severity validation: Rejected to support analyzer flexibility
*
* @param {Array<Object>} issues - Array of issue objects with optional severity property
* @returns {Object<string, number>} Object mapping severity levels to counts
* Example: { "LOW": 5, "MEDIUM": 3, "HIGH": 1, "INFO": 2 }
*/
function calculateSeverityCounts(issues) {
return issues.reduce((counts, issue) => {
const severity = issue.severity || 'INFO';
counts[severity] = (counts[severity] || 0) + 1;
return counts;
}, {});
}
module.exports = calculateSeverityCounts;