From 9f30c1146410ac6f88a966152e41aa1a90c24c1b Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Wed, 3 Jun 2020 07:24:53 +0200 Subject: [PATCH] feat(yarn): dynamic version selection Closes #6281 --- lib/manager/npm/post-update/yarn.spec.ts | 3 +++ lib/manager/npm/post-update/yarn.ts | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts index 2ad39862c9..5d29e4c1ba 100644 --- a/lib/manager/npm/post-update/yarn.spec.ts +++ b/lib/manager/npm/post-update/yarn.spec.ts @@ -40,6 +40,9 @@ describe(getName(__filename), () => { fs.readFile.mockResolvedValue('package-lock-contents' as never); const config = { dockerMapDotfiles: true, + compatibility: { + yarn: '^1.10.0', + }, postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'], }; const res = await yarnHelper.generateLockFile('some-dir', {}, config); diff --git a/lib/manager/npm/post-update/yarn.ts b/lib/manager/npm/post-update/yarn.ts index 899a780cd6..817afd3c81 100644 --- a/lib/manager/npm/post-update/yarn.ts +++ b/lib/manager/npm/post-update/yarn.ts @@ -1,5 +1,7 @@ import is from '@sindresorhus/is'; import { readFile } from 'fs-extra'; +import { validRange } from 'semver'; +import { quote } from 'shlex'; import { join } from 'upath'; import { SYSTEM_INSUFFICIENT_DISK_SPACE } from '../../../constants/error-messages'; import { DatasourceError } from '../../../datasource'; @@ -43,7 +45,12 @@ export async function generateLockFile( logger.debug(`Spawning yarn install to create ${cwd}/yarn.lock`); let lockFile = null; try { - const preCommands = ['npm i -g yarn']; + let installYarn = 'npm i -g npm'; + const yarnCompatibility = config.compatibility?.yarn; + if (validRange(yarnCompatibility)) { + installYarn += `@${quote(yarnCompatibility)}`; + } + const preCommands = [installYarn]; if ( config.skipInstalls !== false && (await hasYarnOfflineMirror(cwd)) === false -- GitLab