From e7899422fa86501fc9ef7adc810ce1c9956036f0 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 12 Apr 2022 08:07:27 +0100
Subject: [PATCH] fix(manager/npm): deduplicate yarn upgrade strings (#15069)

---
 lib/modules/manager/npm/post-update/yarn.spec.ts | 5 +++++
 lib/modules/manager/npm/post-update/yarn.ts      | 3 +++
 lib/util/string.ts                               | 8 ++++++++
 3 files changed, 16 insertions(+)

diff --git a/lib/modules/manager/npm/post-update/yarn.spec.ts b/lib/modules/manager/npm/post-update/yarn.spec.ts
index 7497948b0d..bdf1c1cf4b 100644
--- a/lib/modules/manager/npm/post-update/yarn.spec.ts
+++ b/lib/modules/manager/npm/post-update/yarn.spec.ts
@@ -151,6 +151,11 @@ describe('modules/manager/npm/post-update/yarn', () => {
           newValue: '^1.0.0',
           isLockfileUpdate: true,
         },
+        {
+          depName: 'some-dep',
+          newValue: '^1.0.0',
+          isLockfileUpdate: true,
+        },
       ]);
       expect(res.lockFile).toBe('package-lock-contents');
       expect(fixSnapshots(execSnapshots)).toMatchSnapshot();
diff --git a/lib/modules/manager/npm/post-update/yarn.ts b/lib/modules/manager/npm/post-update/yarn.ts
index 27fc5e69b6..b76fb9fd30 100644
--- a/lib/modules/manager/npm/post-update/yarn.ts
+++ b/lib/modules/manager/npm/post-update/yarn.ts
@@ -13,6 +13,7 @@ import { exec } from '../../../../util/exec';
 import type { ExecOptions } from '../../../../util/exec/types';
 import { exists, readFile, remove, writeFile } from '../../../../util/fs';
 import { newlineRegex, regEx } from '../../../../util/regex';
+import { uniqueStrings } from '../../../../util/string';
 import { NpmDatasource } from '../../../datasource/npm';
 import type { PostUpdateConfig, Upgrade } from '../../types';
 import { getNodeConstraint } from './node-version';
@@ -178,6 +179,7 @@ export async function generateLockFile(
         commands.push(
           `yarn upgrade ${lockUpdates
             .map((update) => update.depName)
+            .filter(uniqueStrings)
             .join(' ')}${cmdOptions}`
         );
       } else {
@@ -185,6 +187,7 @@ export async function generateLockFile(
         commands.push(
           `yarn up ${lockUpdates
             .map((update) => `${update.depName}@${update.newValue}`)
+            .filter(uniqueStrings)
             .join(' ')}${cmdOptions}`
         );
       }
diff --git a/lib/util/string.ts b/lib/util/string.ts
index d62cbddfc7..a0f455bfe3 100644
--- a/lib/util/string.ts
+++ b/lib/util/string.ts
@@ -37,3 +37,11 @@ export function toBase64(input: string): string {
 export function fromBase64(input: string): string {
   return Buffer.from(input, 'base64').toString();
 }
+
+export function uniqueStrings(
+  element: string,
+  index: number,
+  elements: string[]
+): boolean {
+  return elements.indexOf(element) === index;
+}
-- 
GitLab