sonarqube-issues-exporter
Version:
Enterprise-level SonarQube issues exporter with TypeScript support for generating comprehensive HTML reports with dark theme
66 lines • 2.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.escapeHtml = escapeHtml;
exports.formatDate = formatDate;
exports.extractFilename = extractFilename;
exports.calculateMetrics = calculateMetrics;
exports.createProgressBar = createProgressBar;
exports.delay = delay;
exports.validateUrl = validateUrl;
function escapeHtml(str) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
function formatDate(date) {
const d = typeof date === 'string' ? new Date(date) : date;
// Use proper local timezone formatting with full date and time
return d.toLocaleString('en-US', {
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: true,
});
}
function extractFilename(component) {
const parts = component.split(':');
const path = parts.length > 1 ? parts[1] : parts[0];
const filename = path?.split('/').pop();
return filename || path || component;
}
function calculateMetrics(items, keyExtractors) {
const metrics = {};
for (const [metricName, extractor] of Object.entries(keyExtractors)) {
metrics[metricName] = {};
for (const item of items) {
const key = extractor(item);
metrics[metricName][key] = (metrics[metricName][key] || 0) + 1;
}
}
return metrics;
}
function createProgressBar(current, total, width = 50) {
const progress = Math.floor((current / total) * width);
const remaining = width - progress;
return `[${'='.repeat(progress)}${' '.repeat(remaining)}] ${current}/${total}`;
}
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function validateUrl(url) {
try {
new URL(url);
return true;
}
catch {
return false;
}
}
//# sourceMappingURL=helpers.js.map