From 1f6de6d074ad70718b638ebd0e54c7536f55c1a0 Mon Sep 17 00:00:00 2001
From: Christophe Hurpeau <christophe@hurpeau.com>
Date: Mon, 7 Dec 2020 09:17:23 +0100
Subject: [PATCH] fix: lerna with useWorkspaces: true (#7766)

---
 .../extract/__snapshots__/index.spec.ts.snap  | 23 +++++++++++++++++++
 lib/manager/npm/extract/index.spec.ts         | 14 +++++++++++
 lib/manager/npm/extract/index.ts              |  8 +++++--
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
index 71a9dcc7ce..7fcb294cb7 100644
--- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -1073,6 +1073,29 @@ Object {
 }
 `;
 
+exports[`manager/npm/extract .extractPackageFile() finds simple yarn workspaces with lerna.json and useWorkspaces: true 1`] = `
+Object {
+  "constraints": Object {},
+  "deps": Array [],
+  "ignoreNpmrcFile": undefined,
+  "lernaClient": undefined,
+  "lernaDir": undefined,
+  "lernaPackages": undefined,
+  "npmLock": undefined,
+  "npmrc": undefined,
+  "packageFileVersion": "0.0.8",
+  "packageJsonName": "@a/b",
+  "packageJsonType": "app",
+  "pnpmShrinkwrap": undefined,
+  "skipInstalls": true,
+  "yarnLock": undefined,
+  "yarnWorkspacesPackages": Array [
+    "packages/*",
+  ],
+  "yarnrc": undefined,
+}
+`;
+
 exports[`manager/npm/extract .extractPackageFile() returns an array of dependencies 1`] = `
 Object {
   "constraints": Object {},
diff --git a/lib/manager/npm/extract/index.spec.ts b/lib/manager/npm/extract/index.spec.ts
index 46e6e20ab1..0bb64e0f1b 100644
--- a/lib/manager/npm/extract/index.spec.ts
+++ b/lib/manager/npm/extract/index.spec.ts
@@ -183,6 +183,20 @@ describe('manager/npm/extract', () => {
       );
       expect(res).toMatchSnapshot();
     });
+    it('finds simple yarn workspaces with lerna.json and useWorkspaces: true', async () => {
+      fs.readLocalFile = jest.fn((fileName) => {
+        if (fileName === 'lerna.json') {
+          return '{"useWorkspaces": true}';
+        }
+        return null;
+      });
+      const res = await npmExtract.extractPackageFile(
+        workspacesSimpleContent,
+        'package.json',
+        defaultConfig
+      );
+      expect(res).toMatchSnapshot();
+    });
     it('finds complex yarn workspaces', async () => {
       fs.readLocalFile = jest.fn((fileName) => {
         if (fileName === 'lerna.json') {
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index 1ef0ac0b6e..578051f2b9 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -127,14 +127,18 @@ export async function extractPackageFile(
   let lernaPackages: string[];
   let lernaClient: 'yarn' | 'npm';
   let hasFileRefs = false;
-  let lernaJson: { packages: string[]; npmClient: string };
+  let lernaJson: {
+    packages: string[];
+    npmClient: string;
+    useWorkspaces?: boolean;
+  };
   try {
     const lernaJsonFileName = getSiblingFileName(fileName, 'lerna.json');
     lernaJson = JSON.parse(await readLocalFile(lernaJsonFileName, 'utf8'));
   } catch (err) /* istanbul ignore next */ {
     logger.warn({ err }, 'Could not parse lerna.json');
   }
-  if (lernaJson) {
+  if (lernaJson && !lernaJson.useWorkspaces) {
     lernaDir = dirname(fileName);
     lernaPackages = lernaJson.packages;
     lernaClient =
-- 
GitLab