From fd1b04665a4723a8f6188f899094d70fbbd8e6fd Mon Sep 17 00:00:00 2001
From: ylemkimon <mail@ylem.kim>
Date: Thu, 10 Sep 2020 14:00:21 +0900
Subject: [PATCH] fix(npm): fix lockfileUpdate commands for Yarn 2 (#7230)

---
 .../__snapshots__/yarn.spec.ts.snap           |  2 +-
 lib/manager/npm/post-update/yarn.spec.ts      |  1 +
 lib/manager/npm/post-update/yarn.ts           | 25 +++++++++++++------
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap b/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap
index b6faad3034..117b963fb1 100644
--- a/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap
+++ b/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap
@@ -458,7 +458,7 @@ Array [
     },
   },
   Object {
-    "cmd": "yarn up some-dep",
+    "cmd": "yarn up some-dep@^1.0.0",
     "options": Object {
       "cwd": "some-dir",
       "encoding": "utf-8",
diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts
index c4afb5bd4c..926b6c189e 100644
--- a/lib/manager/npm/post-update/yarn.spec.ts
+++ b/lib/manager/npm/post-update/yarn.spec.ts
@@ -84,6 +84,7 @@ describe(getName(__filename), () => {
       const res = await yarnHelper.generateLockFile('some-dir', {}, config, [
         {
           depName: 'some-dep',
+          newValue: '^1.0.0',
           isLockfileUpdate: true,
         },
       ]);
diff --git a/lib/manager/npm/post-update/yarn.ts b/lib/manager/npm/post-update/yarn.ts
index c8e61624b1..d91b73b70a 100644
--- a/lib/manager/npm/post-update/yarn.ts
+++ b/lib/manager/npm/post-update/yarn.ts
@@ -119,16 +119,25 @@ export async function generateLockFile(
     commands.push(`yarn install ${cmdOptions}`.trim());
 
     // rangeStrategy = update-lockfile
-    const lockUpdates = upgrades
-      .filter((upgrade) => upgrade.isLockfileUpdate)
-      .map((upgrade) => upgrade.depName); // note - this can hit a yarn bug, see https://github.com/yarnpkg/yarn/issues/8236
+    const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);
     if (lockUpdates.length) {
       logger.debug('Performing lockfileUpdate (yarn)');
-      commands.push(
-        `yarn ${isYarn1 ? 'upgrade' : 'up'} ${lockUpdates.join(
-          ' '
-        )} ${cmdOptions}`.trim()
-      );
+      if (isYarn1) {
+        // `yarn upgrade` updates based on the version range specified in the package file
+        // note - this can hit a yarn bug, see https://github.com/yarnpkg/yarn/issues/8236
+        commands.push(
+          `yarn upgrade ${lockUpdates
+            .map((update) => update.depName)
+            .join(' ')} ${cmdOptions}`.trim()
+        );
+      } else {
+        // `yarn up` updates to the latest release, so the range should be specified
+        commands.push(
+          `yarn up ${lockUpdates
+            .map((update) => `${update.depName}@${update.newValue}`)
+            .join(' ')}`
+        );
+      }
     }
 
     // postUpdateOptions
-- 
GitLab