From fac38a1dae5ce41f5a320a824313f2d7ea16dbaf Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Wed, 3 Jun 2020 06:38:20 +0200
Subject: [PATCH] feat(npm): dynamic npm version install (#6415)

Closes #6360
---
 lib/manager/npm/post-update/npm.spec.ts | 2 +-
 lib/manager/npm/post-update/npm.ts      | 9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/manager/npm/post-update/npm.spec.ts b/lib/manager/npm/post-update/npm.spec.ts
index 83081050bd..ddfb3666f3 100644
--- a/lib/manager/npm/post-update/npm.spec.ts
+++ b/lib/manager/npm/post-update/npm.spec.ts
@@ -166,7 +166,7 @@ describe('generateLockFile', () => {
       'some-dir',
       {},
       'package-lock.json',
-      { binarySource: BinarySource.Docker }
+      { binarySource: BinarySource.Docker, compatibility: { npm: '^6.0.0' } }
     );
     expect(fs.readFile).toHaveBeenCalledTimes(1);
     expect(res.lockFile).toEqual('package-lock-contents');
diff --git a/lib/manager/npm/post-update/npm.ts b/lib/manager/npm/post-update/npm.ts
index d1bd916336..e597371b14 100644
--- a/lib/manager/npm/post-update/npm.ts
+++ b/lib/manager/npm/post-update/npm.ts
@@ -1,4 +1,6 @@
 import { move, pathExists, readFile } from 'fs-extra';
+import { validRange } from 'semver';
+import { quote } from 'shlex';
 import { join } from 'upath';
 import { SYSTEM_INSUFFICIENT_DISK_SPACE } from '../../../constants/error-messages';
 import { logger } from '../../../logger';
@@ -24,7 +26,12 @@ export async function generateLockFile(
 
   let lockFile = null;
   try {
-    const preCommands = ['npm i -g npm'];
+    let installNpm = 'npm i -g npm';
+    const npmCompatibility = config.compatibility?.npm;
+    if (validRange(npmCompatibility)) {
+      installNpm += `@${quote(npmCompatibility)}`;
+    }
+    const preCommands = [installNpm];
     const commands = [];
     let cmdOptions = '';
     if (
-- 
GitLab