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