Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const jph = require('json-parse-helpfulerror')
const vm = require('./versionmanager')
const doctor = require('./doctor')
const packageManagers = require('./package-managers')
const { print, printJson, printUpgrades } = require('./logging')
const { print, printJson, printUpgrades, printIgnoredUpdates } = require('./logging')
const { deepPatternPrefix, doctorHelpText } = require('./constants')
const cliOptions = require('./cli-options')

Expand Down Expand Up @@ -199,6 +199,12 @@ async function analyzeProjectDependencies(options, pkgData, pkgFile) {
total: Object.keys(upgraded).length,
ownersChangedDeps
})
if (options.peer) {
const ignoredUpdates = await vm.getIgnoredUpgrades(current, upgraded, upgradedPeerDependencies, options)
if (!_.isEmpty(ignoredUpdates)) {
printIgnoredUpdates(options, ignoredUpdates)
}
}
}

if (numUpgraded > 0) {
Expand Down
15 changes: 14 additions & 1 deletion lib/logging.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,17 @@ function printUpgrades(options, { current, upgraded, numUpgraded, total, ownersC
}
}

module.exports = { print, printJson, printUpgrades, toDependencyTable }
function printIgnoredUpdates(options, ignoredUpdates) {
print(options, `\nIgnored incompatible updates (peer dependencies):\n`)
const table = createDependencyTable()
const rows = Object.entries(ignoredUpdates).map(([pkgName, { from, to, reason }]) => {
const strReason = 'reason: ' + Object.entries(reason)
.map(([pkgReason, requirement]) => pkgReason + ' requires ' + requirement)
.join(', ')
return [pkgName, from, '→', colorizeDiff(from, to), strReason]
})
rows.forEach(row => table.push(row)) // eslint-disable-line fp/no-mutating-methods
print(options, table.toString())
}

module.exports = { print, printJson, printUpgrades, toDependencyTable, printIgnoredUpdates }
21 changes: 21 additions & 0 deletions lib/versionmanager.js
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,26 @@ function getCurrentDependencies(pkgData = {}, options = {}) {
return allDependencies
}

async function getIgnoredUpgrades(current, upgraded, upgradedPeerDependencies, options = {}) {
const [upgradedLatestVersions, latestVersions] = await upgradePackageDefinitions(
current,
{ ...options, peer: false, peerDependencies: undefined, loglevel: 'silent' }
)

return Object.entries(upgradedLatestVersions)
.filter(([pkgName, newVersion]) => upgraded[pkgName] !== newVersion)
.reduce((accum, [pkgName, newVersion]) => ({
...accum,
[pkgName]: {
from: current[pkgName],
to: newVersion,
reason: Object.entries(upgradedPeerDependencies)
.filter(([, peers]) => peers[pkgName] !== undefined && !semver.satisfies(latestVersions[pkgName], peers[pkgName]))
.reduce((accumReason, [peerPkg, peers]) => ({ ...accumReason, [peerPkg]: peers[pkgName] }), {})
}
}), {})
}

/**
* @param [options]
* @param options.cwd
Expand Down Expand Up @@ -576,4 +596,5 @@ module.exports = {
upgradeDependencies,
getPackageManager,
getPeerDependenciesFromRegistry,
getIgnoredUpgrades,
}
25 changes: 25 additions & 0 deletions test/versionmanager.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,31 @@ describe('versionmanager', () => {
})
})

describe('getIgnoredUpgrades', function () {
it('ncu-test-peer-update', async () => {
const data = await vm.getIgnoredUpgrades({
'ncu-test-return-version': '1.0.0',
'ncu-test-peer': '1.0.0',
}, {
'ncu-test-return-version': '1.1.0',
'ncu-test-peer': '1.1.0',
}, {
'ncu-test-peer': {
'ncu-test-return-version': '1.1.x'
}
}, {})
data.should.deep.equal({
'ncu-test-return-version': {
from: '1.0.0',
to: '2.0.0',
reason: {
'ncu-test-peer': '1.1.x'
}
}
})
})
})

describe('getPeerDependenciesFromRegistry', function () {
it('single package', async () => {
const data = await vm.getPeerDependenciesFromRegistry({ 'ncu-test-peer': '1.0' }, {})
Expand Down