Files
renovate/lib/workers/repository/common.ts
Felipe Santos 3032c960b3 fix: avoid proposing replacements when the new dependency already exists (#40149)
* fix(npm): remove old dependency when replacement exists

* Add coverage ignore comments

* Simplify implementation

* Rename to removeAsString

* Move it after replaceAsString

* Improve test case

* Improve error message of replaceAsString

* Fix coverage

* Fix coverage again

* Only remove dependency at depType like replaceAsString

* Refactor tests

* Fix tsc

* fix(npm): skip update when replacement dependency already exists

* Simplify else

* Avoid returning an error

* fix(flatten): skip replacement updates when a sibling dependency already exists

* Revert the other changes

* Also handle it in the Dependency Dashboard

* Filter out earlier

* Try some other way

* Try fix dep dashboard

* Try fix again

* Extract helper

* Improve some stuff

* Improve assertion

* Remove misleading comment

* Address review comments
2026-07-13 18:13:53 +00:00

52 lines
1.4 KiB
TypeScript

import { DEBUG, ERROR, FATAL, INFO, TRACE, WARN, nameFromLevel } from 'bunyan';
import { getProblems } from '../../logger/index.ts';
import type { PackageDependency } from '../../modules/manager/types.ts';
import { emojify } from '../../util/emoji.ts';
/**
* Checks whether a replacement target already exists as a sibling dependency
* in the same package file.
*/
export function replacementAlreadyExists(
deps: PackageDependency[],
currentDep: PackageDependency,
newName: string,
): boolean {
return deps.some(
(sibling) =>
sibling !== currentDep &&
(sibling.depName === newName || sibling.packageName === newName),
);
}
export function extractRepoProblems(
repository: string | undefined,
): Set<string> {
return new Set(
getProblems()
.filter(
(problem) =>
problem.repository === repository && !problem.artifactErrors,
)
.map((problem) => `${formatProblemLevel(problem.level)}: ${problem.msg}`),
);
}
type EmojiLogLevelMapping = Record<number, string>;
const logLevelEmojis: EmojiLogLevelMapping = {
[TRACE]: ':microscope:',
[DEBUG]: ':mag:',
[INFO]: ':information_source:',
[WARN]: ':warning:',
[ERROR]: ':x:',
[FATAL]: ':skull:',
};
export function formatProblemLevel(level: number): string {
const name = nameFromLevel[level].toUpperCase();
const emojiName = logLevelEmojis[level];
return `${emojify(emojiName)} ${name}`;
}