sicua
Version:
A tool for analyzing project structure and dependencies
75 lines (74 loc) • 2.73 kB
JavaScript
;
/**
* Utility for calculating aggregated metrics from individual file analysis
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.aggregateLineMetrics = aggregateLineMetrics;
exports.calculateCodeToCommentRatio = calculateCodeToCommentRatio;
exports.aggregateMagicNumbers = aggregateMagicNumbers;
exports.buildCodeMetrics = buildCodeMetrics;
exports.validateLineMetrics = validateLineMetrics;
/**
* Aggregates line metrics from multiple files
* @param fileMetrics Array of line metrics from individual files
* @returns Aggregated line metrics
*/
function aggregateLineMetrics(fileMetrics) {
return fileMetrics.reduce((total, current) => ({
totalLines: total.totalLines + current.totalLines,
codeLines: total.codeLines + current.codeLines,
commentLines: total.commentLines + current.commentLines,
blankLines: total.blankLines + current.blankLines,
}), {
totalLines: 0,
codeLines: 0,
commentLines: 0,
blankLines: 0,
});
}
/**
* Calculates the code-to-comment ratio from aggregated metrics
* @param lineMetrics The aggregated line metrics
* @returns The ratio of code lines to comment lines
*/
function calculateCodeToCommentRatio(lineMetrics) {
if (lineMetrics.commentLines === 0) {
return lineMetrics.codeLines > 0 ? Infinity : 0;
}
return Number((lineMetrics.codeLines / lineMetrics.commentLines).toFixed(2));
}
/**
* Aggregates magic numbers from multiple files
* @param fileMagicNumbers Array of magic number arrays from individual files
* @returns Flattened array of all magic numbers
*/
function aggregateMagicNumbers(fileMagicNumbers) {
return fileMagicNumbers.flat();
}
/**
* Builds the complete code metrics object
* @param lineMetrics Aggregated line metrics
* @param magicNumbers All detected magic numbers
* @returns Complete code metrics object
*/
function buildCodeMetrics(lineMetrics, magicNumbers) {
return {
lineMetrics,
codeToCommentRatio: calculateCodeToCommentRatio(lineMetrics),
magicNumbers,
totalMagicNumbers: magicNumbers.length,
};
}
/**
* Validates that line metrics are consistent
* @param lineMetrics The line metrics to validate
* @returns True if metrics are valid
*/
function validateLineMetrics(lineMetrics) {
const { totalLines, codeLines, commentLines, blankLines } = lineMetrics;
// Total should equal sum of parts
const calculatedTotal = codeLines + commentLines + blankLines;
// Allow for small discrepancies due to mixed lines (code + comments)
const tolerance = Math.ceil(totalLines * 0.01); // 1% tolerance
return Math.abs(totalLines - calculatedTotal) <= tolerance;
}