@code-pushup/js-packages-plugin
Version:
Code PushUp plugin for JavaScript packages 🛡️
60 lines • 2.92 kB
JavaScript
import { md } from 'build-md';
import { clean, diff, neq } from 'semver';
import { objectFromEntries, pluralize } from '@code-pushup/utils';
import { dependencyGroupToLong } from '../../constants.js';
import { RELEASE_TYPES, outdatedSeverity } from './constants.js';
export function outdatedResultToAuditOutput(result, packageManager, depGroup, totalDeps) {
const relevantDependencies = result.filter(dep => dep.type === dependencyGroupToLong[depGroup]);
const validDependencies = relevantDependencies
.map(dep => ({
...dep,
current: clean(dep.current),
latest: clean(dep.latest),
}))
.filter((dep) => dep.current != null && dep.latest != null);
const outdatedDependencies = validDependencies.filter(dep => neq(dep.current, dep.latest));
const outdatedStats = outdatedDependencies.reduce((acc, dep) => {
const outdatedLevel = diff(dep.current, dep.latest);
if (outdatedLevel == null) {
return acc;
}
return { ...acc, [outdatedLevel]: acc[outdatedLevel] + 1 };
}, objectFromEntries(RELEASE_TYPES.map(versionType => [versionType, 0])));
const issues = outdatedDependencies.length === 0
? []
: outdatedToIssues(outdatedDependencies);
return {
slug: `${packageManager}-outdated-${depGroup}`,
score: calculateOutdatedScore(outdatedStats.major, totalDeps),
value: outdatedDependencies.length,
displayValue: outdatedToDisplayValue(outdatedStats),
details: { issues },
};
}
export function calculateOutdatedScore(majorOutdated, totalDeps) {
return totalDeps > 0 ? (totalDeps - majorOutdated) / totalDeps : 1;
}
export function outdatedToDisplayValue(stats) {
const total = Object.values(stats).reduce((acc, value) => acc + value, 0);
const versionBreakdown = RELEASE_TYPES.map(version => stats[version] > 0 ? `${stats[version]} ${version}` : '').filter(text => text !== '');
if (versionBreakdown.length === 0) {
return 'all dependencies are up to date';
}
if (versionBreakdown.length > 1) {
return `${total} outdated package versions (${versionBreakdown.join(', ')})`;
}
return `${versionBreakdown[0]} outdated package ${pluralize('version', total)}`;
}
export function outdatedToIssues(dependencies) {
return dependencies.map(dep => {
const { name, current, latest, url } = dep;
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const outdatedLevel = diff(current, latest);
const packageReference = url == null ? md.code(name) : md.link(url, md.code(name));
return {
message: md `Package ${packageReference} requires a ${md.bold(outdatedLevel)} update from ${md.bold(current)} to ${md.bold(latest)}.`.toString(),
severity: outdatedSeverity[outdatedLevel],
};
});
}
//# sourceMappingURL=transform.js.map