From 1f81469894f24c25e90e9be116c79a4a3b6d02e9 Mon Sep 17 00:00:00 2001 From: Nick McCurdy Date: Mon, 4 May 2020 23:32:08 -0400 Subject: [PATCH] Fix --use-pnp for Yarn 2 (#8460) --- packages/create-react-app/createReactApp.js | 22 +++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/create-react-app/createReactApp.js b/packages/create-react-app/createReactApp.js index f8c50fbd51d..e32a528397f 100755 --- a/packages/create-react-app/createReactApp.js +++ b/packages/create-react-app/createReactApp.js @@ -261,17 +261,26 @@ function createApp( } } else if (usePnp) { const yarnInfo = checkYarnVersion(); - if (!yarnInfo.hasMinYarnPnp) { - if (yarnInfo.yarnVersion) { + if (yarnInfo.yarnVersion) { + if (!yarnInfo.hasMinYarnPnp) { console.log( chalk.yellow( `You are using Yarn ${yarnInfo.yarnVersion} together with the --use-pnp flag, but Plug'n'Play is only supported starting from the 1.12 release.\n\n` + `Please update to Yarn 1.12 or higher for a better, fully supported experience.\n` ) ); + // 1.11 had an issue with webpack-dev-middleware, so better not use PnP with it (never reached stable, but still) + usePnp = false; + } + if (!yarnInfo.hasMaxYarnPnp) { + console.log( + chalk.yellow( + 'The --use-pnp flag is no longer necessary with yarn 2 and will be deprecated and removed in a future release.\n' + ) + ); + // 2 supports PnP by default and breaks when trying to use the flag + usePnp = false; } - // 1.11 had an issue with webpack-dev-middleware, so better not use PnP with it (never reached stable, but still) - usePnp = false; } } @@ -775,7 +784,9 @@ function checkNpmVersion() { function checkYarnVersion() { const minYarnPnp = '1.12.0'; + const maxYarnPnp = '2.0.0'; let hasMinYarnPnp = false; + let hasMaxYarnPnp = false; let yarnVersion = null; try { yarnVersion = execSync('yarnpkg --version') @@ -783,6 +794,7 @@ function checkYarnVersion() { .trim(); if (semver.valid(yarnVersion)) { hasMinYarnPnp = semver.gte(yarnVersion, minYarnPnp); + hasMaxYarnPnp = semver.lt(yarnVersion, maxYarnPnp); } else { // Handle non-semver compliant yarn version strings, which yarn currently // uses for nightly builds. The regex truncates anything after the first @@ -791,6 +803,7 @@ function checkYarnVersion() { if (trimmedYarnVersionMatch) { const trimmedYarnVersion = trimmedYarnVersionMatch.pop(); hasMinYarnPnp = semver.gte(trimmedYarnVersion, minYarnPnp); + hasMaxYarnPnp = semver.lt(trimmedYarnVersion, maxYarnPnp); } } } catch (err) { @@ -798,6 +811,7 @@ function checkYarnVersion() { } return { hasMinYarnPnp: hasMinYarnPnp, + hasMaxYarnPnp: hasMaxYarnPnp, yarnVersion: yarnVersion, }; }