From c43f4d1bd437371732eb60f4654afae4d353ac2e Mon Sep 17 00:00:00 2001 From: Regev Brody Date: Sun, 2 Jun 2024 15:05:00 +0300 Subject: [PATCH] fix: Is there a way to not upgrade a package if it's peer depndencies are not currently met #1418 --- src/lib/upgradePackageDefinitions.ts | 27 ++++++++++++------- test/peer.test.ts | 15 +++++++++++ test/test-data/peer-post-upgrade/package.json | 10 +++++++ 3 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 test/test-data/peer-post-upgrade/package.json diff --git a/src/lib/upgradePackageDefinitions.ts b/src/lib/upgradePackageDefinitions.ts index 1e48ab5d..61fa3fe3 100644 --- a/src/lib/upgradePackageDefinitions.ts +++ b/src/lib/upgradePackageDefinitions.ts @@ -16,14 +16,23 @@ import upgradeDependencies from './upgradeDependencies' * * @returns */ -const checkIfInPeerViolation = ( +const checkIfInPeerViolation = async ( currentDependencies: Index, filteredUpgradedDependencies: Index, upgradedPeerDependencies: Index>, - latestVersionResults: Index, + options: Options, ) => { const upgradedDependencies = { ...currentDependencies, ...filteredUpgradedDependencies } - const filteredLatestDependencies = pickBy(latestVersionResults, (spec, dep) => upgradedDependencies[dep]) + const currentVersionResults = await queryVersions(upgradedDependencies, { + ...options, + target: 'semver', + peer: false, + pre: true, + deprecated: true, + enginesNode: false, + peerDependencies: undefined, + }) + const filteredLatestDependencies = pickBy(currentVersionResults, (spec, dep) => upgradedDependencies[dep]) const filteredUpgradedPeerDependencies = { ...upgradedPeerDependencies } let wereUpgradedDependenceFiltered = false const filteredUpgradedDependenciesAfterPeers = pickBy(filteredUpgradedDependencies, (spec, dep) => { @@ -113,11 +122,11 @@ export async function upgradePackageDefinitions( if (options.peer && Object.keys(filteredLatestDependencies).length > 0) { const upgradedPeerDependencies = await getPeerDependenciesFromRegistry(filteredLatestDependencies, options) - const checkPeerViolationResult = checkIfInPeerViolation( + const checkPeerViolationResult = await checkIfInPeerViolation( currentDependencies, filteredUpgradedDependencies, upgradedPeerDependencies, - latestVersionResults, + options, ) if (checkPeerViolationResult.issuesFound) { const fullRerunResult = await rerunUpgradeIfChangedPeers( @@ -128,11 +137,11 @@ export async function upgradePackageDefinitions( options, ) if (fullRerunResult) { - const checkPeerViolationResultFullRerun = checkIfInPeerViolation( + const checkPeerViolationResultFullRerun = await checkIfInPeerViolation( currentDependencies, fullRerunResult[0], fullRerunResult[2]!, - fullRerunResult[1], + options, ) if (!checkPeerViolationResultFullRerun.issuesFound) { return fullRerunResult @@ -146,11 +155,11 @@ export async function upgradePackageDefinitions( options, ) if (partialRerunResult) { - const checkPeerViolationResultPartialRerun = checkIfInPeerViolation( + const checkPeerViolationResultPartialRerun = await checkIfInPeerViolation( currentDependencies, partialRerunResult[0], partialRerunResult[2]!, - partialRerunResult[1], + options, ) if (!checkPeerViolationResultPartialRerun.issuesFound) { return partialRerunResult diff --git a/test/peer.test.ts b/test/peer.test.ts index bd654336..b66a4cac 100644 --- a/test/peer.test.ts +++ b/test/peer.test.ts @@ -35,4 +35,19 @@ describe('peer dependencies', function () { const upgrades = await ncu({ cwd, peer: true }) upgrades!.should.contain.keys('@vitest/ui', 'vitest') }) + + it('ignores if post upgrade peers are unmet', async () => { + const cwd = path.join(__dirname, 'test-data/peer-post-upgrade/') + const upgrades = await ncu({ + cwd, + peer: true, + target: packageName => { + return packageName === 'eslint-plugin-unused-imports' ? 'latest' : 'semver' + }, + }) + upgrades!.should.deep.equal({ + '@vitest/ui': '^1.6.0', + vitest: '^1.6.0', + }) + }) }) diff --git a/test/test-data/peer-post-upgrade/package.json b/test/test-data/peer-post-upgrade/package.json new file mode 100644 index 00000000..5a5b4a30 --- /dev/null +++ b/test/test-data/peer-post-upgrade/package.json @@ -0,0 +1,10 @@ +{ + "license": "MIT", + "dependencies": { + "@vitest/ui": "^1.3.1", + "vitest": "^1.3.1", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-unused-imports": "^3" + } +}