From 5d606dba9bd38c0603537b9d1ffab05de0ac3ecf Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Wed, 3 Feb 2021 08:48:31 +0100 Subject: [PATCH] fix(npm): detect npm6/7 for npm install (#8506) --- .../locked-versions.spec.ts.snap | 31 ++++++++++++++++--- .../npm/extract/locked-versions.spec.ts | 30 ++++++++++++++++++ lib/manager/npm/extract/locked-versions.ts | 11 ++++--- lib/manager/npm/post-update/npm.ts | 4 +-- 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap index 809cc5f3aa..70edc75550 100644 --- a/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap +++ b/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap @@ -1,5 +1,28 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`manager/npm/extract/locked-versions .getLockedVersions() appends <7 to npm constraints 1`] = ` +Array [ + Object { + "constraints": Object { + "npm": ">=6.0.0 <7", + }, + "deps": Array [ + Object { + "currentValue": "1.0.0", + "depName": "a", + "lockedVersion": "1.0.0", + }, + Object { + "currentValue": "2.0.0", + "depName": "b", + "lockedVersion": "2.0.0", + }, + ], + "npmLock": "package-lock.json", + }, +] +`; + exports[`manager/npm/extract/locked-versions .getLockedVersions() ignores pnpm 1`] = ` Array [ Object { @@ -21,7 +44,9 @@ Array [ exports[`manager/npm/extract/locked-versions .getLockedVersions() uses package-lock.json with npm v6.0.0 1`] = ` Array [ Object { - "constraints": Object {}, + "constraints": Object { + "npm": "<7", + }, "deps": Array [ Object { "currentValue": "1.0.0", @@ -42,9 +67,7 @@ Array [ exports[`manager/npm/extract/locked-versions .getLockedVersions() uses package-lock.json with npm v7.0.0 1`] = ` Array [ Object { - "constraints": Object { - "npm": ">= 7.0.0", - }, + "constraints": Object {}, "deps": Array [ Object { "currentValue": "1.0.0", diff --git a/lib/manager/npm/extract/locked-versions.spec.ts b/lib/manager/npm/extract/locked-versions.spec.ts index 2a587ce419..9507783895 100644 --- a/lib/manager/npm/extract/locked-versions.spec.ts +++ b/lib/manager/npm/extract/locked-versions.spec.ts @@ -75,6 +75,36 @@ describe('manager/npm/extract/locked-versions', () => { expect(packageFiles).toMatchSnapshot(); } ); + it('appends <7 to npm constraints', async () => { + npm.getNpmLock.mockReturnValue({ + lockedVersions: { + a: '1.0.0', + b: '2.0.0', + c: '3.0.0', + }, + lockfileVersion: 1, + }); + const packageFiles = [ + { + npmLock: 'package-lock.json', + constraints: { + npm: '>=6.0.0', + }, + deps: [ + { + depName: 'a', + currentValue: '1.0.0', + }, + { + depName: 'b', + currentValue: '2.0.0', + }, + ], + }, + ]; + await getLockedVersions(packageFiles); + expect(packageFiles).toMatchSnapshot(); + }); it('ignores pnpm', async () => { const packageFiles = [ { diff --git a/lib/manager/npm/extract/locked-versions.ts b/lib/manager/npm/extract/locked-versions.ts index c12fe9645d..348a826640 100644 --- a/lib/manager/npm/extract/locked-versions.ts +++ b/lib/manager/npm/extract/locked-versions.ts @@ -39,11 +39,12 @@ export async function getLockedVersions( logger.trace('Retrieving/parsing ' + npmLock); lockFileCache[npmLock] = await getNpmLock(npmLock); } - if (!packageFile.constraints.npm) { - // do not override if already set - const { lockfileVersion } = lockFileCache[npmLock]; - if (lockfileVersion >= 2) { - packageFile.constraints.npm = '>= 7.0.0'; + const { lockfileVersion } = lockFileCache[npmLock]; + if (lockfileVersion === 1) { + if (packageFile.constraints.npm) { + packageFile.constraints.npm += ' <7'; + } else { + packageFile.constraints.npm = '<7'; } } for (const dep of packageFile.deps) { diff --git a/lib/manager/npm/post-update/npm.ts b/lib/manager/npm/post-update/npm.ts index 31c557f34f..d63e6c5e09 100644 --- a/lib/manager/npm/post-update/npm.ts +++ b/lib/manager/npm/post-update/npm.ts @@ -27,9 +27,9 @@ export async function generateLockFile( let lockFile = null; try { let installNpm = 'npm i -g npm'; - const npmCompatibility = config.constraints?.npm; + const npmCompatibility = config.constraints?.npm as string; if (validRange(npmCompatibility)) { - installNpm += `@${quote(npmCompatibility)}`; + installNpm = `npm i -g ${quote(`npm@${npmCompatibility}`)}`; } const preCommands = [installNpm, 'hash -d npm']; const commands = []; -- GitLab