diff --git a/lib/manager/npm/lookup/index.js b/lib/manager/npm/lookup/index.js index 2e25482e8baa4ae5860b61ee18562e48ffd427ff..5bf108c9a65cb6bdbf5b0aa5ba8b769cdeec7310 100644 --- a/lib/manager/npm/lookup/index.js +++ b/lib/manager/npm/lookup/index.js @@ -1,7 +1,7 @@ const versioning = require('../../../versioning/semver'); const moment = require('moment'); const { getRollbackUpdate } = require('./rollback'); - +const { getRangeStrategy } = require('./range'); const { filterVersions } = require('./filter'); const { @@ -20,7 +20,7 @@ module.exports = { }; function lookupUpdates(dependency, config) { - const { currentVersion, lockedVersion, rangeStrategy } = config; + const { currentVersion, lockedVersion } = config; const { latestVersion } = dependency; const allVersions = Object.keys(dependency.versions); if (allVersions.length === 0) { @@ -41,7 +41,7 @@ function lookupUpdates(dependency, config) { } const fromVersion = getFromVersion( currentVersion, - rangeStrategy, + getRangeStrategy(config), lockedVersion, allVersions ); diff --git a/lib/manager/npm/lookup/range.js b/lib/manager/npm/lookup/range.js new file mode 100644 index 0000000000000000000000000000000000000000..796226788710110c891e1c4a597e456962fea7fe --- /dev/null +++ b/lib/manager/npm/lookup/range.js @@ -0,0 +1,45 @@ +const { parseRange } = require('semver-utils'); + +module.exports = { + getRangeStrategy, +}; + +function getRangeStrategy(config) { + const { + depType, + depName, + packageJsonType, + currentVersion, + rangeStrategy, + } = config; + const isComplexRange = parseRange(currentVersion).length > 1; + if (rangeStrategy === 'bump' && isComplexRange) { + logger.info( + { currentVersion }, + 'Replacing bump strategy for complex range with widen' + ); + return 'widen'; + } + if (rangeStrategy !== 'auto') { + return rangeStrategy; + } + if (depType === 'devDependencies') { + // Always pin devDependencies + logger.debug({ depName }, 'Pinning devDependency'); + return 'pin'; + } + if (depType === 'dependencies' && packageJsonType === 'app') { + // Pin dependencies if we're pretty sure it's not a browser library + logger.debug('Pinning app dependency'); + return 'pin'; + } + if (depType === 'peerDependencies') { + // Widen peer dependencies + logger.debug('Widening peer dependencies'); + return 'widen'; + } + if (isComplexRange) { + return 'widen'; + } + return 'replace'; +} diff --git a/lib/manager/npm/package.js b/lib/manager/npm/package.js index d6cae10aa65cdc02c91d8b81fc3205308b41aa4c..19963ff9ec8f89bf4d8bc5b7a42b7b0b5f076922 100644 --- a/lib/manager/npm/package.js +++ b/lib/manager/npm/package.js @@ -2,53 +2,11 @@ const npmApi = require('../../datasource/npm'); const lookup = require('./lookup'); const { isValid } = require('../../versioning/semver'); const nodeManager = require('../_helpers/node/package'); -const { parseRange } = require('semver-utils'); module.exports = { - getRangeStrategy, getPackageUpdates, }; -function getRangeStrategy(config) { - const { - depType, - depName, - packageJsonType, - currentVersion, - rangeStrategy, - } = config; - const isComplexRange = parseRange(currentVersion).length > 1; - if (rangeStrategy === 'bump' && isComplexRange) { - logger.info( - { currentVersion }, - 'Replacing bump strategy for complex range with widen' - ); - return 'widen'; - } - if (rangeStrategy !== 'auto') { - return rangeStrategy; - } - if (depType === 'devDependencies') { - // Always pin devDependencies - logger.debug({ depName }, 'Pinning devDependency'); - return 'pin'; - } - if (depType === 'dependencies' && packageJsonType === 'app') { - // Pin dependencies if we're pretty sure it's not a browser library - logger.debug('Pinning app dependency'); - return 'pin'; - } - if (depType === 'peerDependencies') { - // Widen peer dependencies - logger.debug('Widening peer dependencies'); - return 'widen'; - } - if (isComplexRange) { - return 'widen'; - } - return 'replace'; -} - async function getPackageUpdates(config) { logger.trace({ config }, `npm.getPackageUpdates()`); const { depType, depName, currentVersion } = config; @@ -76,17 +34,13 @@ async function getPackageUpdates(config) { logger.debug(results[0].message); return results; } - const rangeStrategy = getRangeStrategy(config); npmApi.setNpmrc( config.npmrc, config.global ? config.global.exposeEnv : false ); const npmDep = await npmApi.getDependency(depName); if (npmDep) { - results = lookup.lookupUpdates(npmDep, { - ...config, - rangeStrategy, - }); + results = lookup.lookupUpdates(npmDep, config); if (results.length > 0) { logger.info( { dependency: depName }, diff --git a/test/manager/npm/lookup/range.spec.js b/test/manager/npm/lookup/range.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..3891f1778b7918142b4d67b84605402c6dfa7960 --- /dev/null +++ b/test/manager/npm/lookup/range.spec.js @@ -0,0 +1,46 @@ +const { + getRangeStrategy, +} = require('../../../../lib/manager/npm/lookup/range'); + +describe('getRangeStrategy', () => { + it('returns same if not auto', () => { + const config = { rangeStrategy: 'widen' }; + expect(getRangeStrategy(config)).toEqual('widen'); + }); + it('pins devDependencies', () => { + const config = { rangeStrategy: 'auto', depType: 'devDependencies' }; + expect(getRangeStrategy(config)).toEqual('pin'); + }); + it('pins app dependencies', () => { + const config = { + rangeStrategy: 'auto', + depType: 'dependencies', + packageJsonType: 'app', + }; + expect(getRangeStrategy(config)).toEqual('pin'); + }); + it('widens peerDependencies', () => { + const config = { rangeStrategy: 'auto', depType: 'peerDependencies' }; + expect(getRangeStrategy(config)).toEqual('widen'); + }); + it('widens complex ranges', () => { + const config = { + rangeStrategy: 'auto', + depType: 'dependencies', + currentVersion: '^1.6.0 || ^2.0.0', + }; + expect(getRangeStrategy(config)).toEqual('widen'); + }); + it('widens complex bump', () => { + const config = { + rangeStrategy: 'bump', + depType: 'dependencies', + currentVersion: '^1.6.0 || ^2.0.0', + }; + expect(getRangeStrategy(config)).toEqual('widen'); + }); + it('defaults to replace', () => { + const config = { rangeStrategy: 'auto', depType: 'dependencies' }; + expect(getRangeStrategy(config)).toEqual('replace'); + }); +}); diff --git a/test/manager/npm/package.spec.js b/test/manager/npm/package.spec.js index 162124db68579f70a7797ae56572f5b803740c71..7db607dcbf519bfb0d6489e01b73e472de38599e 100644 --- a/test/manager/npm/package.spec.js +++ b/test/manager/npm/package.spec.js @@ -8,48 +8,6 @@ jest.mock('../../../lib/manager/_helpers/node/package'); npmApi.getDependency = jest.fn(); describe('lib/manager/npm/package', () => { - describe('getRangeStrategy', () => { - it('returns same if not auto', () => { - const config = { rangeStrategy: 'widen' }; - expect(npm.getRangeStrategy(config)).toEqual('widen'); - }); - it('pins devDependencies', () => { - const config = { rangeStrategy: 'auto', depType: 'devDependencies' }; - expect(npm.getRangeStrategy(config)).toEqual('pin'); - }); - it('pins app dependencies', () => { - const config = { - rangeStrategy: 'auto', - depType: 'dependencies', - packageJsonType: 'app', - }; - expect(npm.getRangeStrategy(config)).toEqual('pin'); - }); - it('widens peerDependencies', () => { - const config = { rangeStrategy: 'auto', depType: 'peerDependencies' }; - expect(npm.getRangeStrategy(config)).toEqual('widen'); - }); - it('widens complex ranges', () => { - const config = { - rangeStrategy: 'auto', - depType: 'dependencies', - currentVersion: '^1.6.0 || ^2.0.0', - }; - expect(npm.getRangeStrategy(config)).toEqual('widen'); - }); - it('widens complex bump', () => { - const config = { - rangeStrategy: 'bump', - depType: 'dependencies', - currentVersion: '^1.6.0 || ^2.0.0', - }; - expect(npm.getRangeStrategy(config)).toEqual('widen'); - }); - it('defaults to replace', () => { - const config = { rangeStrategy: 'auto', depType: 'dependencies' }; - expect(npm.getRangeStrategy(config)).toEqual('replace'); - }); - }); describe('getPackageUpdates', () => { let config; beforeEach(() => {