diff --git a/lib/modules/manager/npm/post-update/yarn.spec.ts b/lib/modules/manager/npm/post-update/yarn.spec.ts index a965b7d9624498cd371005312f362cdb19abd0f1..18f4c63c617a77375d62aa2594b821e7216edd34 100644 --- a/lib/modules/manager/npm/post-update/yarn.spec.ts +++ b/lib/modules/manager/npm/post-update/yarn.spec.ts @@ -403,6 +403,55 @@ describe('modules/manager/npm/post-update/yarn', () => { expect(res.lockFile).toBe('package-lock-contents'); }); + it('supports corepack on grouping', async () => { + process.env.BUILDPACK = 'true'; + GlobalConfig.set({ + localDir: '.', + binarySource: 'install', + cacheDir: '/tmp/cache', + }); + Fixtures.mock( + { + 'package.json': '{ "packageManager": "yarn@3.0.0" }', + 'yarn.lock': 'package-lock-contents', + }, + 'some-dir' + ); + mockedFunction(getPkgReleases).mockResolvedValueOnce({ + releases: [{ version: '0.10.0' }], + }); + const execSnapshots = mockExecAll({ + stdout: '2.1.0', + stderr: '', + }); + const config = partial<PostUpdateConfig<NpmManagerData>>({ + constraints: { + yarn: '^3.0.0', + }, + }); + const res = await yarnHelper.generateLockFile('some-dir', {}, config, [ + { + managerData: { hasPackageManager: true }, + }, + ]); + expect(execSnapshots).toMatchObject([ + { cmd: 'install-tool node 16.16.0', options: { cwd: 'some-dir' } }, + { cmd: 'install-tool corepack 0.10.0', options: { cwd: 'some-dir' } }, + { + cmd: 'yarn install --mode=update-lockfile', + options: { + cwd: 'some-dir', + env: { + YARN_ENABLE_GLOBAL_CACHE: '1', + YARN_ENABLE_IMMUTABLE_INSTALLS: 'false', + YARN_HTTP_TIMEOUT: '100000', + }, + }, + }, + ]); + expect(res.lockFile).toBe('package-lock-contents'); + }); + it('uses slim yarn instead of corepack', async () => { // sanity check for later refactorings expect(plocktest1YarnLockV1).toBeTruthy(); diff --git a/lib/modules/manager/npm/post-update/yarn.ts b/lib/modules/manager/npm/post-update/yarn.ts index 4b7b269ee06e1591f5c4efc8d924f38adfa8614f..896d3a42f55d40676c918ce45f740cffe3bdc683 100644 --- a/lib/modules/manager/npm/post-update/yarn.ts +++ b/lib/modules/manager/npm/post-update/yarn.ts @@ -113,7 +113,12 @@ export async function generateLockFile( constraint: '^1.22.18', // needs to be a v1 yarn, otherwise v2 will be installed }; - if (!isYarn1 && config.managerData?.hasPackageManager) { + // check first upgrade, see #17786 + const hasPackageManager = + !!config.managerData?.hasPackageManager || + !!upgrades[0]?.managerData?.hasPackageManager; + + if (!isYarn1 && hasPackageManager) { toolConstraints.push({ toolName: 'corepack' }); } else { toolConstraints.push(yarnTool);