UNPKG

yarn-berry-deduplicate

Version:
61 lines 3.16 kB
"use strict"; 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