From 554b2024c39beae4c7de43e6f4b2f6d0b76fc8e2 Mon Sep 17 00:00:00 2001
From: Tom Valorsa <tomvalorsa@gmail.com>
Date: Fri, 22 May 2020 08:36:41 +0100
Subject: [PATCH 1/2] Replace (npm run | npm) globally when adjusting package
 scripts for Yarn users

---
 packages/react-scripts/scripts/init.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/react-scripts/scripts/init.js b/packages/react-scripts/scripts/init.js
index d064e5db1..732c4b40d 100644
--- a/packages/react-scripts/scripts/init.js
+++ b/packages/react-scripts/scripts/init.js
@@ -203,7 +203,7 @@ module.exports = function (
     appPackage.scripts = Object.entries(appPackage.scripts).reduce(
       (acc, [key, value]) => ({
         ...acc,
-        [key]: value.replace(/(npm run |npm )/, 'yarn '),
+        [key]: value.replace(/(npm run |npm )/g, 'yarn '),
       }),
       {}
     );
-- 
GitLab


From 973846419a735fd9b00d8b53a64549cf56a2053a Mon Sep 17 00:00:00 2001
From: Tom Valorsa <tomvalorsa@gmail.com>
Date: Sat, 23 May 2020 09:24:16 +0100
Subject: [PATCH 2/2] Split replaceNpmScriptsWithYarn into separate function,
 add tests

---
 packages/react-scripts/scripts/init.js        |  9 ++---
 .../replaceNpmScriptsWithYarn.test.js         | 33 +++++++++++++++++++
 .../utils/replaceNpmScriptsWithYarn.js        | 13 ++++++++
 3 files changed, 48 insertions(+), 7 deletions(-)
 create mode 100644 packages/react-scripts/scripts/utils/__tests__/replaceNpmScriptsWithYarn.test.js
 create mode 100644 packages/react-scripts/scripts/utils/replaceNpmScriptsWithYarn.js

diff --git a/packages/react-scripts/scripts/init.js b/packages/react-scripts/scripts/init.js
index 732c4b40d..c13515b37 100644
--- a/packages/react-scripts/scripts/init.js
+++ b/packages/react-scripts/scripts/init.js
@@ -22,6 +22,7 @@ const spawn = require('react-dev-utils/crossSpawn');
 const { defaultBrowsers } = require('react-dev-utils/browsersHelper');
 const os = require('os');
 const verifyTypeScriptSetup = require('./utils/verifyTypeScriptSetup');
+const replaceNpmScriptsWithYarn = require('./utils/replaceNpmScriptsWithYarn');
 
 function isInGitRepository() {
   try {
@@ -200,13 +201,7 @@ module.exports = function (
 
   // Update scripts for Yarn users
   if (useYarn) {
-    appPackage.scripts = Object.entries(appPackage.scripts).reduce(
-      (acc, [key, value]) => ({
-        ...acc,
-        [key]: value.replace(/(npm run |npm )/g, 'yarn '),
-      }),
-      {}
-    );
+    appPackage.scripts = replaceNpmScriptsWithYarn(appPackage.scripts);
   }
 
   // Setup the eslint config
diff --git a/packages/react-scripts/scripts/utils/__tests__/replaceNpmScriptsWithYarn.test.js b/packages/react-scripts/scripts/utils/__tests__/replaceNpmScriptsWithYarn.test.js
new file mode 100644
index 000000000..429b01357
--- /dev/null
+++ b/packages/react-scripts/scripts/utils/__tests__/replaceNpmScriptsWithYarn.test.js
@@ -0,0 +1,33 @@
+'use strict';
+
+const replaceNpmScriptsWithYarn = require('../replaceNpmScriptsWithYarn');
+
+describe('replaceNpmScriptsWithYarn util function', () => {
+  test('replaces single npm scripts with yarn', () => {
+    const scripts = {
+      test: 'npm run test',
+      example: 'npm example',
+    };
+
+    const actual = replaceNpmScriptsWithYarn(scripts);
+    const expected = {
+      test: 'yarn test',
+      example: 'yarn example',
+    };
+
+    expect(actual).toEqual(expected);
+  });
+
+  test('replaces chained npm scripts with yarn', () => {
+    const scripts = {
+      'pre-commit': 'npm run prettier && npm run lint && npm test',
+    };
+
+    const actual = replaceNpmScriptsWithYarn(scripts);
+    const expected = {
+      'pre-commit': 'yarn prettier && yarn lint && yarn test',
+    };
+
+    expect(actual).toEqual(expected);
+  });
+});
diff --git a/packages/react-scripts/scripts/utils/replaceNpmScriptsWithYarn.js b/packages/react-scripts/scripts/utils/replaceNpmScriptsWithYarn.js
new file mode 100644
index 000000000..9a309f3f3
--- /dev/null
+++ b/packages/react-scripts/scripts/utils/replaceNpmScriptsWithYarn.js
@@ -0,0 +1,13 @@
+'use strict';
+
+const replaceNpmScriptsWithYarn = scripts => {
+  return Object.entries(scripts).reduce(
+    (acc, [key, value]) => ({
+      ...acc,
+      [key]: value.replace(/(npm run |npm )/g, 'yarn '),
+    }),
+    {}
+  );
+};
+
+module.exports = replaceNpmScriptsWithYarn;
-- 
GitLab