diff --git a/lib/manager/npm/lookup/filter.js b/lib/manager/npm/lookup/filter.js index 2d3b17b10ac7a63aa03fe71d318506ecb92e2650..1b89d770350217fd0ec587ef2acb88d5a7cdae89 100644 --- a/lib/manager/npm/lookup/filter.js +++ b/lib/manager/npm/lookup/filter.js @@ -12,6 +12,9 @@ module.exports = { function filterVersions(config, fromVersion, latestVersion, versions) { const { ignoreUnstable, respectLatest } = config; + if (!fromVersion) { + return []; + } // Leave only versions greater than current let filteredVersions = versions.filter(version => isGreaterThan(version, fromVersion) diff --git a/lib/manager/npm/lookup/index.js b/lib/manager/npm/lookup/index.js index 5bf108c9a65cb6bdbf5b0aa5ba8b769cdeec7310..50394b6df31a023b7973eb953f938d3886fb2c87 100644 --- a/lib/manager/npm/lookup/index.js +++ b/lib/manager/npm/lookup/index.js @@ -36,8 +36,9 @@ function lookupUpdates(dependency, config) { const allSatisfyingVersions = allVersions.filter(version => matches(version, currentVersion) ); + const updates = []; if (!allSatisfyingVersions.length) { - return getRollbackUpdate(config, allVersions); + updates.push(getRollbackUpdate(config, allVersions)); } const fromVersion = getFromVersion( currentVersion, @@ -45,7 +46,6 @@ function lookupUpdates(dependency, config) { lockedVersion, allVersions ); - const updates = []; if (isRange(currentVersion) && config.rangeStrategy === 'pin') { updates.push({ type: 'pin', diff --git a/lib/manager/npm/lookup/rollback.js b/lib/manager/npm/lookup/rollback.js index 92724ed0d89ffab62e04543d3a6c7e6ae969e868..921207541bee3762e7f5acfceeb9166b28e4b053 100644 --- a/lib/manager/npm/lookup/rollback.js +++ b/lib/manager/npm/lookup/rollback.js @@ -30,17 +30,15 @@ function getRollbackUpdate(config, versions) { const toVersion = lessThanVersions.pop(); let fromVersion; const newVersion = rangify(config, currentVersion, fromVersion, toVersion); - return [ - { - type: 'rollback', - branchName: - '{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x', - commitMessageAction: 'Roll back', - isRollback: true, - newVersion, - newVersionMajor: getMajor(toVersion), - semanticCommitType: 'fix', - unpublishable: false, - }, - ]; + return { + type: 'rollback', + branchName: + '{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x', + commitMessageAction: 'Roll back', + isRollback: true, + newVersion, + newVersionMajor: getMajor(toVersion), + semanticCommitType: 'fix', + unpublishable: false, + }; } diff --git a/lib/versioning/semver/range.js b/lib/versioning/semver/range.js index e55ade1c2437f38425b1253cb09a810489f384dc..3e95cb254a07d74e2c32f06aa8a71c64f439d740 100644 --- a/lib/versioning/semver/range.js +++ b/lib/versioning/semver/range.js @@ -56,7 +56,10 @@ function rangify(config, currentVersion, fromVersion, toVersion) { return null; } if (element.operator === '^') { - if (fromVersion && major(toVersion) === major(fromVersion)) { + if (!fromVersion) { + return `^${toVersion}`; + } + if (major(toVersion) === major(fromVersion)) { if (major(toVersion) === 0) { if (minor(toVersion) === 0) { return `^${toVersion}`; diff --git a/test/manager/npm/__snapshots__/lookup.spec.js.snap b/test/manager/npm/__snapshots__/lookup.spec.js.snap index dbff4230ba8f5d387b7059b8dc21aade96a97cf4..74e9abc55674c966d8ef31c444e7bbbcdc3ec54e 100644 --- a/test/manager/npm/__snapshots__/lookup.spec.js.snap +++ b/test/manager/npm/__snapshots__/lookup.spec.js.snap @@ -352,29 +352,38 @@ Array [ ] `; -exports[`manager/npm/lookup .lookupUpdates() returns rollback if range not found 1`] = ` +exports[`manager/npm/lookup .lookupUpdates() returns rollback for pinned version 1`] = ` Array [ Object { "branchName": "{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x", "commitMessageAction": "Roll back", "isRollback": true, - "newVersion": "^2.0.0", - "newVersionMajor": 2, + "newVersion": "0.9.7", + "newVersionMajor": 0, "semanticCommitType": "fix", "type": "rollback", "unpublishable": false, }, + Object { + "fromVersion": "0.9.99", + "newVersion": "1.4.1", + "newVersionMajor": 1, + "newVersionMinor": 4, + "toVersion": "1.4.1", + "type": "major", + "unpublishable": false, + }, ] `; -exports[`manager/npm/lookup .lookupUpdates() should allow unstable versions if ignoreUnstable is false 1`] = ` +exports[`manager/npm/lookup .lookupUpdates() returns rollback for ranged version 1`] = ` Array [ Object { "branchName": "{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x", "commitMessageAction": "Roll back", "isRollback": true, - "newVersion": "1.0.0-beta", - "newVersionMajor": 1, + "newVersion": "^0.9.7", + "newVersionMajor": 0, "semanticCommitType": "fix", "type": "rollback", "unpublishable": false, diff --git a/test/manager/npm/lookup.spec.js b/test/manager/npm/lookup.spec.js index 19f01519aa6e6e93fd442eb6bec31e67729e23d2..95c5f310b490437c3ac8b51d7947ac3fb3a0c89e 100644 --- a/test/manager/npm/lookup.spec.js +++ b/test/manager/npm/lookup.spec.js @@ -27,8 +27,12 @@ describe('manager/npm/lookup', () => { expect(res).toHaveLength(1); expect(res[0]).toMatchSnapshot(); }); - it('returns rollback if range not found', () => { - config.currentVersion = '^8.4.0'; + it('returns rollback for pinned version', () => { + config.currentVersion = '0.9.99'; + expect(lookup.lookupUpdates(qJson, config)).toMatchSnapshot(); + }); + it('returns rollback for ranged version', () => { + config.currentVersion = '^0.9.99'; expect(lookup.lookupUpdates(qJson, config)).toMatchSnapshot(); }); it('supports minor and major upgrades for tilde ranges', () => { @@ -355,19 +359,19 @@ describe('manager/npm/lookup', () => { it('should allow unstable versions if the ignoreUnstable=false', () => { config.currentVersion = '1.0.0'; config.ignoreUnstable = false; - expect( - lookup.lookupUpdates( - { - name: 'amazing-package', - versions: { - '1.0.0-beta': {}, - '1.0.0': {}, - '1.1.0-beta': {}, - }, + const res = lookup.lookupUpdates( + { + name: 'amazing-package', + versions: { + '1.0.0-beta': {}, + '1.0.0': {}, + '1.1.0-beta': {}, }, - config - ) - ).toMatchSnapshot(); + }, + config + ); + expect(res).toMatchSnapshot(); + expect(res).toHaveLength(1); }); it('should allow unstable versions if the current version is unstable', () => { config.currentVersion = '1.0.0-beta'; @@ -384,22 +388,6 @@ describe('manager/npm/lookup', () => { ) ).toMatchSnapshot(); }); - it('should allow unstable versions if ignoreUnstable is false', () => { - config.currentVersion = '1.0.0'; - config.ignoreUnstable = false; - expect( - lookup.lookupUpdates( - { - name: 'amazing-package', - versions: { - '1.0.0-beta': {}, - '1.1.0-beta': {}, - }, - }, - config - ) - ).toMatchSnapshot(); - }); it('should treat zero zero tilde ranges as 0.0.x', () => { config.rangeStrategy = 'replace'; config.currentVersion = '~0.0.34';