UNPKG

@code-pushup/js-packages-plugin

Version:
60 lines 2.92 kB
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