git-kloc-analyzer
Version:
A powerful TypeScript tool for analyzing KLOC (Kilo Lines of Code) statistics from Git repositories with email-based contributor grouping
139 lines • 4.3 kB
JavaScript
"use strict";
/**
* Utility functions for Git KLOC Statistics Tool
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatNumber = formatNumber;
exports.escapeCsvField = escapeCsvField;
exports.validateDateFormat = validateDateFormat;
exports.validateDateRange = validateDateRange;
exports.calculateSummary = calculateSummary;
exports.sortStatsByKloc = sortStatsByKloc;
exports.filterStatsByMinKloc = filterStatsByMinKloc;
exports.getCurrentDate = getCurrentDate;
exports.formatDuration = formatDuration;
exports.validateRepositoryPath = validateRepositoryPath;
/**
* Formats a number with thousand separators
* @param num - Number to format
* @returns Formatted string with commas as thousand separators
*/
function formatNumber(num) {
return num.toLocaleString();
}
/**
* Escapes special characters in CSV fields
* @param field - Field value to escape
* @returns Escaped field value
*/
function escapeCsvField(field) {
if (field.includes(',') || field.includes('"') || field.includes('\n')) {
return `"${field.replace(/"/g, '""')}"`;
}
return field;
}
/**
* Validates date format (YYYY-MM-DD)
* @param date - Date string to validate
* @returns True if date format is valid
*/
function validateDateFormat(date) {
const regex = /^\d{4}-\d{2}-\d{2}$/;
return regex.test(date) && !isNaN(Date.parse(date));
}
/**
* Validates date range (from <= to)
* @param fromDate - Start date
* @param toDate - End date
* @returns True if date range is valid
*/
function validateDateRange(fromDate, toDate) {
if (!validateDateFormat(fromDate) || !validateDateFormat(toDate)) {
return false;
}
return new Date(fromDate) <= new Date(toDate);
}
/**
* Calculates summary statistics from contributor stats
* @param stats - Array of contributor statistics
* @param executionTime - Analysis execution time in seconds
* @returns Summary statistics
*/
function calculateSummary(stats, executionTime) {
const totalContributors = stats.length;
const totalKloc = stats.reduce((sum, stat) => sum + stat.kloc, 0);
const totalCommits = stats.reduce((sum, stat) => sum + stat.commits, 0);
const averageKloc = totalContributors > 0 ? totalKloc / totalContributors : 0;
const averageCommits = totalContributors > 0 ? totalCommits / totalContributors : 0;
const topContributor = stats.length > 0 ? stats[0] : null;
return {
totalContributors,
totalKloc,
totalCommits,
averageKloc,
averageCommits,
topContributor,
executionTime,
};
}
/**
* Sorts contributor stats by KLOC in descending order
* @param stats - Array of contributor statistics
* @returns Sorted array
*/
function sortStatsByKloc(stats) {
return stats.sort((a, b) => b.kloc - a.kloc);
}
/**
* Filters stats by minimum KLOC threshold
* @param stats - Array of contributor statistics
* @param minKloc - Minimum KLOC threshold
* @returns Filtered array
*/
function filterStatsByMinKloc(stats, minKloc) {
return stats.filter(stat => stat.kloc >= minKloc);
}
/**
* Gets current date in YYYY-MM-DD format
* @returns Current date string
*/
function getCurrentDate() {
return new Date().toISOString().split('T')[0];
}
/**
* Converts seconds to human-readable duration
* @param seconds - Duration in seconds
* @returns Human-readable duration string
*/
function formatDuration(seconds) {
if (seconds < 60) {
return `${seconds.toFixed(2)} seconds`;
}
else if (seconds < 3600) {
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
return `${minutes}m ${remainingSeconds.toFixed(0)}s`;
}
else {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
return `${hours}h ${minutes}m`;
}
}
/**
* Validates repository path
* @param repoPath - Path to validate
* @returns True if path exists and is a git repository
*/
function validateRepositoryPath(repoPath) {
const fs = require('fs');
const path = require('path');
if (!fs.existsSync(repoPath)) {
return false;
}
if (!fs.existsSync(path.join(repoPath, '.git'))) {
return false;
}
return true;
}
//# sourceMappingURL=utils.js.map