From 6333646e6d96e182e8ea61f82eef7433fcc90c69 Mon Sep 17 00:00:00 2001
From: azu <azu@users.noreply.github.com>
Date: Sat, 20 Jul 2019 16:46:47 +0900
Subject: [PATCH] fix(npm): fix detecting logic of npmClient (#4130)

fix(npm): fix detecting logic of npmClient
---
 lib/manager/npm/extract/index.js              |   3 +-
 .../extract/__snapshots__/index.spec.js.snap  | 194 ++++++++++++++++++
 test/manager/npm/extract/index.spec.js        |  28 +++
 3 files changed, 224 insertions(+), 1 deletion(-)

diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.js
index abbcb449a1..2a80716a56 100644
--- a/lib/manager/npm/extract/index.js
+++ b/lib/manager/npm/extract/index.js
@@ -131,7 +131,8 @@ async function extractPackageFile(content, fileName, config) {
   if (lernaJson) {
     lernaDir = path.dirname(fileName);
     lernaPackages = lernaJson.packages;
-    lernaClient = lernaJson.npmClient || lockFiles.yarnLock ? 'yarn' : 'npm';
+    lernaClient =
+      lernaJson.npmClient === 'yarn' || lockFiles.yarnLock ? 'yarn' : 'npm';
   }
 
   const depTypes = {
diff --git a/test/manager/npm/extract/__snapshots__/index.spec.js.snap b/test/manager/npm/extract/__snapshots__/index.spec.js.snap
index af8d3a841b..0029c6f67f 100644
--- a/test/manager/npm/extract/__snapshots__/index.spec.js.snap
+++ b/test/manager/npm/extract/__snapshots__/index.spec.js.snap
@@ -337,6 +337,200 @@ Object {
 }
 `;
 
+exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"npm" in lerna.json 1`] = `
+Object {
+  "deps": Array [
+    Object {
+      "currentValue": "6.5.0",
+      "datasource": "npm",
+      "depName": "autoprefixer",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "~1.6.0",
+      "datasource": "npm",
+      "depName": "bower",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "13.1.0",
+      "datasource": "npm",
+      "depName": "browserify",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "0.9.2",
+      "datasource": "npm",
+      "depName": "browserify-css",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "=0.22.0",
+      "datasource": "npm",
+      "depName": "cheerio",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "1.21.0",
+      "datasource": "npm",
+      "depName": "config",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "depName": "enabled",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+      "skipReason": "invalid-value",
+    },
+    Object {
+      "currentValue": "^1.5.8",
+      "datasource": "npm",
+      "depName": "angular",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+    Object {
+      "currentValue": "1.5.8",
+      "datasource": "npm",
+      "depName": "angular-touch",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+    Object {
+      "currentValue": "1.5.8",
+      "datasource": "npm",
+      "depName": "angular-sanitize",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+    Object {
+      "currentValue": "4.0.0-beta.1",
+      "datasource": "npm",
+      "depName": "@angular/core",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+  ],
+  "ignoreNpmrcFile": undefined,
+  "lernaClient": "npm",
+  "lernaDir": ".",
+  "lernaPackages": undefined,
+  "npmLock": undefined,
+  "npmrc": undefined,
+  "packageJsonName": "renovate",
+  "packageJsonType": "app",
+  "packageJsonVersion": "1.0.0",
+  "pnpmShrinkwrap": undefined,
+  "skipInstalls": true,
+  "yarnLock": undefined,
+  "yarnWorkspacesPackages": undefined,
+  "yarnrc": undefined,
+}
+`;
+
+exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"yarn" in lerna.json 1`] = `
+Object {
+  "deps": Array [
+    Object {
+      "currentValue": "6.5.0",
+      "datasource": "npm",
+      "depName": "autoprefixer",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "~1.6.0",
+      "datasource": "npm",
+      "depName": "bower",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "13.1.0",
+      "datasource": "npm",
+      "depName": "browserify",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "0.9.2",
+      "datasource": "npm",
+      "depName": "browserify-css",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "=0.22.0",
+      "datasource": "npm",
+      "depName": "cheerio",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "currentValue": "1.21.0",
+      "datasource": "npm",
+      "depName": "config",
+      "depType": "dependencies",
+      "prettyDepType": "dependency",
+    },
+    Object {
+      "depName": "enabled",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+      "skipReason": "invalid-value",
+    },
+    Object {
+      "currentValue": "^1.5.8",
+      "datasource": "npm",
+      "depName": "angular",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+    Object {
+      "currentValue": "1.5.8",
+      "datasource": "npm",
+      "depName": "angular-touch",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+    Object {
+      "currentValue": "1.5.8",
+      "datasource": "npm",
+      "depName": "angular-sanitize",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+    Object {
+      "currentValue": "4.0.0-beta.1",
+      "datasource": "npm",
+      "depName": "@angular/core",
+      "depType": "devDependencies",
+      "prettyDepType": "devDependency",
+    },
+  ],
+  "ignoreNpmrcFile": undefined,
+  "lernaClient": "yarn",
+  "lernaDir": ".",
+  "lernaPackages": undefined,
+  "npmLock": undefined,
+  "npmrc": undefined,
+  "packageJsonName": "renovate",
+  "packageJsonType": "app",
+  "packageJsonVersion": "1.0.0",
+  "pnpmShrinkwrap": undefined,
+  "skipInstalls": true,
+  "yarnLock": undefined,
+  "yarnWorkspacesPackages": undefined,
+  "yarnrc": undefined,
+}
+`;
+
 exports[`manager/npm/extract .extractPackageFile() finds a lock file 1`] = `
 Object {
   "deps": Array [
diff --git a/test/manager/npm/extract/index.spec.js b/test/manager/npm/extract/index.spec.js
index 8957543bb4..0fa99863b7 100644
--- a/test/manager/npm/extract/index.spec.js
+++ b/test/manager/npm/extract/index.spec.js
@@ -137,6 +137,34 @@ describe('manager/npm/extract', () => {
       );
       expect(res).toMatchSnapshot();
     });
+    it('finds "npmClient":"npm" in lerna.json', async () => {
+      platform.getFile = jest.fn(fileName => {
+        if (fileName === 'lerna.json') {
+          return '{ "npmClient": "npm" }';
+        }
+        return null;
+      });
+      const res = await npmExtract.extractPackageFile(
+        input01Content,
+        'package.json',
+        defaultConfig
+      );
+      expect(res).toMatchSnapshot();
+    });
+    it('finds "npmClient":"yarn" in lerna.json', async () => {
+      platform.getFile = jest.fn(fileName => {
+        if (fileName === 'lerna.json') {
+          return '{ "npmClient": "yarn" }';
+        }
+        return null;
+      });
+      const res = await npmExtract.extractPackageFile(
+        input01Content,
+        'package.json',
+        defaultConfig
+      );
+      expect(res).toMatchSnapshot();
+    });
     it('finds complex yarn workspaces', async () => {
       platform.getFile = jest.fn(fileName => {
         if (fileName === 'lerna.json') {
-- 
GitLab