nx
Version:
46 lines (45 loc) • 2.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.filterDowngradedUpdates = filterDowngradedUpdates;
const semver_1 = require("semver");
const version_utils_1 = require("./version-utils");
/**
* Drop entries from `packageUpdates` that would either downgrade the package
* (move resolved version backward) or rewrite a specifier that is already
* exactly pinned to the resolved version (a no-op write). Keep genuine
* upgrades and narrowing rewrites where the user's range covers a version
* lower than what's resolved (the migrator's traditional "lock to recommended
* exact pin" behavior).
*/
function filterDowngradedUpdates(packageUpdates, packageJson, getInstalledVersion) {
const result = {};
for (const [name, update] of Object.entries(packageUpdates)) {
const resolved = getInstalledVersion(name);
if (!resolved) {
// Not installed; let downstream logic decide whether to add it.
result[name] = update;
continue;
}
const proposed = (0, version_utils_1.normalizeVersion)(update.version);
const resolvedNorm = (0, version_utils_1.normalizeVersion)(resolved);
if ((0, semver_1.gt)(proposed, resolvedNorm)) {
result[name] = update;
continue;
}
if ((0, semver_1.lt)(proposed, resolvedNorm)) {
continue;
}
// proposed === resolved: keep when narrowing a looser specifier to an
// exact pin; drop when the specifier is already exact at resolved.
const specifier = packageJson?.dependencies?.[name] ?? packageJson?.devDependencies?.[name];
if (!specifier) {
continue;
}
// Skip specifiers that aren't semver ranges (workspace:/npm:/git/file).
const floor = (0, semver_1.validRange)(specifier) ? (0, semver_1.minVersion)(specifier) : null;
if (floor && (0, semver_1.lt)(floor.version, resolvedNorm)) {
result[name] = update;
}
}
return result;
}