diff --git a/lib/manager/npm/post-update/pnpm.spec.ts b/lib/manager/npm/post-update/pnpm.spec.ts index 0c2991a401..ce28dd90ef 100644 --- a/lib/manager/npm/post-update/pnpm.spec.ts +++ b/lib/manager/npm/post-update/pnpm.spec.ts @@ -20,7 +20,7 @@ delete process.env.NPM_CONFIG_CACHE; describe('generateLockFile', () => { let config: PostUpdateConfig; beforeEach(() => { - config = { cacheDir: 'some-cache-dir' }; + config = { cacheDir: 'some-cache-dir', compatibility: { pnpm: '^2.0.0' } }; env.getChildProcessEnv.mockReturnValue(envMock.basic); }); it('generates lock files', async () => { diff --git a/lib/manager/npm/post-update/pnpm.ts b/lib/manager/npm/post-update/pnpm.ts index bec674a9b4..c3ea779307 100644 --- a/lib/manager/npm/post-update/pnpm.ts +++ b/lib/manager/npm/post-update/pnpm.ts @@ -1,4 +1,6 @@ import { readFile } from 'fs-extra'; +import { validRange } from 'semver'; +import { quote } from 'shlex'; import { join } from 'upath'; import { logger } from '../../../logger'; import { ExecOptions, exec } from '../../../util/exec'; @@ -23,7 +25,12 @@ export async function generateLockFile( let stderr: string; let cmd = 'pnpm'; try { - const preCommands = ['npm i -g pnpm']; + let installPnpm = 'npm i -g pnpm'; + const pnpmCompatibility = config.compatibility?.pnpm; + if (validRange(pnpmCompatibility)) { + installPnpm += `@${quote(pnpmCompatibility)}`; + } + const preCommands = [installPnpm]; const tagConstraint = await getNodeConstraint(config); const execOptions: ExecOptions = { cwd,