yarn-berry-deduplicate
Version:
Deduplication tool for yarn.lock files
61 lines • 3.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.fixDuplicates = exports.listDuplicates = exports.getDuplicates = exports.getBest = void 0;
const core_1 = require("@yarnpkg/core");
const yarnlock_1 = require("./yarnlock");
const extractPackages_1 = require("./extractPackages");
const computePackageInstances_1 = require("./computePackageInstances");
const getBest = (packages, options = {}) => {
const bestPackages = [];
Object.keys(packages)
.forEach((name) => {
bestPackages.push(...(0, computePackageInstances_1.computePackageInstances)(packages, name, options));
});
// eliminate candidates that were not selected on the previous run
if (!options.strategy || options.strategy === 'fewerHighest') {
(0, computePackageInstances_1.selectBestVersionFromPackageInstances)(bestPackages);
}
return bestPackages;
};
exports.getBest = getBest;
const getDuplicates = (packages, options = {}) => {
return (0, exports.getBest)(packages, options)
.filter(({ bestVersion, installedVersion }) => bestVersion !== installedVersion);
};
exports.getDuplicates = getDuplicates;
const listDuplicates = (yarnLock, options = {}) => {
const yarnEntries = (0, yarnlock_1.parseYarnLock)(yarnLock);
const packages = (0, extractPackages_1.extractPackages)(yarnEntries, options);
const duplicates = (0, exports.getDuplicates)(packages, options);
const result = duplicates.map(({ bestVersion, packageName, installedVersion, requestedVersion }) => {
return `Package "${packageName}" wants ${requestedVersion} and could get ${bestVersion}, but got ${installedVersion}`;
});
return result;
};
exports.listDuplicates = listDuplicates;
const fixDuplicates = (yarnLock, options = {}) => {
const yarnEntries = (0, yarnlock_1.parseYarnLock)(yarnLock);
const packages = (0, extractPackages_1.extractPackages)(yarnEntries, options);
const bestPackages = (0, exports.getBest)(packages, options);
const packageResolutions = {};
for (const bestPackage of bestPackages) {
const { descriptorString, bestVersion, requestedProtocol, installedVersion, pkg, actualDescriptor, ignored, packageKey } = bestPackage;
const keyWithBestVersion = ignored ? packageKey : core_1.structUtils.stringifyDescriptor({
...actualDescriptor,
range: requestedProtocol + ':' + bestVersion
});
packageResolutions[keyWithBestVersion] = packageResolutions[keyWithBestVersion] || { keys: [] };
packageResolutions[keyWithBestVersion].keys.push(descriptorString);
if (bestVersion === installedVersion)
packageResolutions[keyWithBestVersion].pkg = pkg;
}
const newYarnEntries = { __metadata: yarnEntries.__metadata };
for (const packageResolution of Object.values(packageResolutions)) {
//TODO packageResolution.keys.sort();
const key = packageResolution.keys.join(', ');
newYarnEntries[key] = packageResolution.pkg;
}
return (0, yarnlock_1.stringifyYarnLock)(newYarnEntries);
};
exports.fixDuplicates = fixDuplicates;
//# sourceMappingURL=index.js.map