eslint-plugin-green
Version:
ESLint plugin for evaluating and promoting green coding practices
99 lines (98 loc) • 2.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatScore = exports.calculateScore = void 0;
const SCORE_CATEGORIES = [
{
name: 'Performance',
weight: 0.3,
rules: [
'no-inefficient-loops',
'prefer-array-methods',
'optimize-animations',
'optimize-data-structures'
]
},
{
name: 'DOM',
weight: 0.2,
rules: [
'optimize-dom-operations',
'optimize-css-selectors'
]
},
{
name: 'Memory',
weight: 0.2,
rules: [
'avoid-memory-leaks'
]
},
{
name: 'Media',
weight: 0.15,
rules: [
'optimize-image-loading'
]
},
{
name: 'Network',
weight: 0.15,
rules: [
'optimize-network-requests'
]
}
];
const calculateScore = (messages) => {
const result = {
total: 0,
categories: {},
issues: messages
};
// Initialize categories
SCORE_CATEGORIES.forEach(category => {
result.categories[category.name] = {
score: 0,
weight: category.weight,
issues: 0
};
});
// Count issues per category
messages.forEach(message => {
const ruleName = message.ruleId.replace('green/', '');
SCORE_CATEGORIES.forEach(category => {
if (category.rules.includes(ruleName)) {
result.categories[category.name].issues++;
}
});
});
// Calculate scores per category
Object.keys(result.categories).forEach(categoryName => {
const category = result.categories[categoryName];
const maxIssues = 10; // Maximum issues before score reaches 0
const issues = Math.min(category.issues, maxIssues);
category.score = Math.max(0, 100 - (issues * 10)) * category.weight;
result.total += category.score;
});
return result;
};
exports.calculateScore = calculateScore;
const formatScore = (score) => {
const lines = [
'Green Code Score Report',
'=====================',
`Total Score: ${score.total.toFixed(1)}/100`,
'',
'Category Breakdown:'
];
Object.entries(score.categories).forEach(([category, data]) => {
lines.push(`${category}:`, ` Score: ${data.score.toFixed(1)}`, ` Weight: ${(data.weight * 100).toFixed(0)}%`, ` Issues: ${data.issues}`);
});
if (score.issues.length > 0) {
lines.push('', 'Issues Found:');
score.issues.forEach(issue => {
lines.push(` - ${issue.message} (${issue.ruleId})`);
});
}
return lines.join('\n');
};
exports.formatScore = formatScore;