From 8d372fc59478e62c7978c7832c03b31c699c12a8 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Fri, 19 May 2023 10:02:13 +0200
Subject: [PATCH] fix(pnpm): use latest pnpm when upgrading pnpm (#22309)

---
 lib/modules/manager/npm/post-update/pnpm.spec.ts |  1 +
 lib/modules/manager/npm/post-update/pnpm.ts      | 13 ++++++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/lib/modules/manager/npm/post-update/pnpm.spec.ts b/lib/modules/manager/npm/post-update/pnpm.spec.ts
index 5089b185d1..ed632a38c1 100644
--- a/lib/modules/manager/npm/post-update/pnpm.spec.ts
+++ b/lib/modules/manager/npm/post-update/pnpm.spec.ts
@@ -98,6 +98,7 @@ describe('modules/manager/npm/post-update/pnpm', () => {
         depType: 'packageManager',
         depName: 'pnpm',
         newValue: '6.16.1',
+        newVersion: '6.16.1',
       },
     ]);
     expect(fs.readLocalFile).toHaveBeenCalledTimes(1);
diff --git a/lib/modules/manager/npm/post-update/pnpm.ts b/lib/modules/manager/npm/post-update/pnpm.ts
index 8f0845c705..dccc3a5c92 100644
--- a/lib/modules/manager/npm/post-update/pnpm.ts
+++ b/lib/modules/manager/npm/post-update/pnpm.ts
@@ -16,6 +16,15 @@ import type { NpmPackage } from '../extract/types';
 import { getNodeToolConstraint } from './node-version';
 import type { GenerateLockFileResult, PnpmLockFile } from './types';
 
+function getPnpmConstraintFromUpgrades(upgrades: Upgrade[]): string | null {
+  for (const upgrade of upgrades) {
+    if (upgrade.depName === 'pnpm' && upgrade.newVersion) {
+      return upgrade.newVersion;
+    }
+  }
+  return null;
+}
+
 export async function generateLockFile(
   lockFileDir: string,
   env: NodeJS.ProcessEnv,
@@ -32,7 +41,9 @@ export async function generateLockFile(
     const pnpmToolConstraint: ToolConstraint = {
       toolName: 'pnpm',
       constraint:
-        config.constraints?.pnpm ?? (await getPnpmConstraint(lockFileDir)),
+        getPnpmConstraintFromUpgrades(upgrades) ??
+        config.constraints?.pnpm ??
+        (await getPnpmConstraint(lockFileDir)),
     };
 
     const extraEnv: ExtraEnv = {
-- 
GitLab