env-sentinel
Version:
Zero-dependency tool that auto-validates .env files against schema.env, with optional fallback and secure warnings.
50 lines (49 loc) • 2.1 kB
JavaScript
export class ErrorFormatter {
static formatIssue(issue, context = {}) {
const parts = [];
if (context.filePath) {
const lineNumber = context.lineNumber || issue.line;
const lineInfo = lineNumber ? `:${lineNumber}` : '';
parts.push(`${context.filePath}${lineInfo}`);
}
const severity = issue.severity || 'error';
const rule = issue.rule || 'unknown';
parts.push(`[${severity}] ${rule}`);
const message = this.formatMessage(issue, context);
parts.push(`→ ${message}`);
return parts.join(' ');
}
static formatMessage(issue, context) {
let message = issue.message;
if (issue.key && !message.includes(issue.key)) {
message = `${issue.key}: ${message}`;
}
if (context.actualValue && context.expectedValue) {
message += ` (expected: ${context.expectedValue}, got: ${context.actualValue})`;
}
else if (context.actualValue) {
message += ` (got: ${context.actualValue})`;
}
else if (issue.value) {
message += ` (value: ${issue.value})`;
}
return message;
}
static formatIssues(issues, context = {}) {
return issues.map(issue => this.formatIssue(issue, context));
}
static formatSummary(issues, context = {}) {
const errorCount = issues.filter(i => i.severity === 'error').length;
const warningCount = issues.filter(i => i.severity === 'warning').length;
const noticeCount = issues.filter(i => i.severity === 'notice').length;
const parts = [];
if (errorCount > 0)
parts.push(`${errorCount} error${errorCount !== 1 ? 's' : ''}`);
if (warningCount > 0)
parts.push(`${warningCount} warning${warningCount !== 1 ? 's' : ''}`);
if (noticeCount > 0)
parts.push(`${noticeCount} notice${noticeCount !== 1 ? 's' : ''}`);
const summary = parts.join(', ');
return context.filePath ? `${context.filePath}: ${summary}` : summary;
}
}