From 57df9e8db40225e96f0f7a3078ed6e722a4fc871 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 29 Oct 2017 14:53:43 -0400 Subject: [PATCH 01/16] re-enable yarn on non-windows machines --- packages/react-scripts/scripts/eject.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index c8438f5d156..82ea0c25453 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -236,21 +236,17 @@ inquirer } if (fs.existsSync(paths.yarnLockFile)) { - // TODO: this is disabled for three reasons. + // TODO: this is disabled on Windows for two reasons. // // 1. It produces garbage warnings on Windows on some systems: // https://github.com/facebookincubator/create-react-app/issues/2030 // // 2. For the above reason, it breaks Windows CI: // https://github.com/facebookincubator/create-react-app/issues/2624 - // - // 3. It is wrong anyway: re-running yarn will respect the lockfile - // rather than package.json we just updated. Instead we should have - // updated the lockfile. So we might as well not do it while it's broken. - // https://github.com/facebookincubator/create-react-app/issues/2627 - // - // console.log(cyan('Running yarn...')); - // spawnSync('yarnpkg', [], { stdio: 'inherit' }); + if (process.platform !== 'win32') { + console.log(cyan('Running yarn...')); + spawnSync('yarnpkg', [], { stdio: 'inherit' }); + } } else { console.log(cyan('Running npm install...')); spawnSync('npm', ['install', '--loglevel', 'error'], { From 849a35cb4cc13afeffeaa35d5824ab4a00e74f8f Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 10:46:03 -0500 Subject: [PATCH 02/16] Adjust packages using package managers --- packages/react-scripts/scripts/eject.js | 51 ++++++++++--------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 82ea0c25453..486a01a22f2 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -37,6 +37,22 @@ function getGitStatus() { } } +function adjustPackages(packages, append, dev = false) { + if (fs.existsSync(paths.yarnLockFile)) { + spawnSync('yarnpkg', [append ? 'add' : 'remove', ...packages], { + stdio: 'inherit', + }); + } else { + spawnSync( + 'npm', + [append ? 'install' : 'uninstall', dev ? '-D' : '-S', ...packages], + { + stdio: 'inherit', + } + ); + } +} + inquirer .prompt({ type: 'confirm', @@ -144,7 +160,7 @@ inquirer console.log(); const ownPackage = require(path.join(ownPath, 'package.json')); - const appPackage = require(path.join(appPath, 'package.json')); + let appPackage = require(path.join(appPath, 'package.json')); console.log(cyan('Updating the dependencies')); const ownPackageName = ownPackage.name; @@ -152,13 +168,13 @@ inquirer // We used to put react-scripts in devDependencies if (appPackage.devDependencies[ownPackageName]) { console.log(` Removing ${cyan(ownPackageName)} from devDependencies`); - delete appPackage.devDependencies[ownPackageName]; + adjustPackages(ownPackageName, false, true); } } appPackage.dependencies = appPackage.dependencies || {}; if (appPackage.dependencies[ownPackageName]) { console.log(` Removing ${cyan(ownPackageName)} from dependencies`); - delete appPackage.dependencies[ownPackageName]; + adjustPackages(ownPackageName, false); } Object.keys(ownPackage.dependencies).forEach(key => { // For some reason optionalDependencies end up in dependencies after install @@ -166,18 +182,11 @@ inquirer return; } console.log(` Adding ${cyan(key)} to dependencies`); - appPackage.dependencies[key] = ownPackage.dependencies[key]; + adjustPackages(key, true); }); - // Sort the deps - const unsortedDependencies = appPackage.dependencies; - appPackage.dependencies = {}; - Object.keys(unsortedDependencies) - .sort() - .forEach(key => { - appPackage.dependencies[key] = unsortedDependencies[key]; - }); console.log(); + appPackage = require(path.join(appPath, 'package.json')); console.log(cyan('Updating the scripts')); delete appPackage.scripts['eject']; Object.keys(appPackage.scripts).forEach(key => { @@ -235,24 +244,6 @@ inquirer } } - if (fs.existsSync(paths.yarnLockFile)) { - // TODO: this is disabled on Windows for two reasons. - // - // 1. It produces garbage warnings on Windows on some systems: - // https://github.com/facebookincubator/create-react-app/issues/2030 - // - // 2. For the above reason, it breaks Windows CI: - // https://github.com/facebookincubator/create-react-app/issues/2624 - if (process.platform !== 'win32') { - console.log(cyan('Running yarn...')); - spawnSync('yarnpkg', [], { stdio: 'inherit' }); - } - } else { - console.log(cyan('Running npm install...')); - spawnSync('npm', ['install', '--loglevel', 'error'], { - stdio: 'inherit', - }); - } console.log(green('Ejected successfully!')); console.log(); From f5d28e0dfd340406bbc818a761b3772caf136980 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 10:54:10 -0500 Subject: [PATCH 03/16] oops --- packages/react-scripts/scripts/eject.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 486a01a22f2..b14dc88f6ca 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -38,6 +38,9 @@ function getGitStatus() { } function adjustPackages(packages, append, dev = false) { + if (!Array.isArray(packages)) { + packages = [packages]; + } if (fs.existsSync(paths.yarnLockFile)) { spawnSync('yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'inherit', @@ -176,14 +179,16 @@ inquirer console.log(` Removing ${cyan(ownPackageName)} from dependencies`); adjustPackages(ownPackageName, false); } + let appendList = []; Object.keys(ownPackage.dependencies).forEach(key => { // For some reason optionalDependencies end up in dependencies after install if (ownPackage.optionalDependencies[key]) { return; } console.log(` Adding ${cyan(key)} to dependencies`); - adjustPackages(key, true); + appendList.push(key); }); + adjustPackages(appendList, true); console.log(); appPackage = require(path.join(appPath, 'package.json')); From c2eb722c65d14ed8bbd080e83a84c31148156480 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 10:55:41 -0500 Subject: [PATCH 04/16] Specific versions --- packages/react-scripts/scripts/eject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index b14dc88f6ca..8b1aafbf8fa 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -186,7 +186,7 @@ inquirer return; } console.log(` Adding ${cyan(key)} to dependencies`); - appendList.push(key); + appendList.push(`${key}@${ownPackage.dependencies[key]}`); }); adjustPackages(appendList, true); console.log(); From 9c57ba76fc04685df785f4e157ebe81555ce7358 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 11:00:34 -0500 Subject: [PATCH 05/16] Avoid magic values --- packages/react-scripts/scripts/eject.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 8b1aafbf8fa..a6cb74568f4 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -37,13 +37,18 @@ function getGitStatus() { } } -function adjustPackages(packages, append, dev = false) { +const ADD_PACKAGE = true, + REMOVE_PACKAGE = false; +const PROD_PACKAGE = true, + DEV_PACKAGE = false; +function adjustPackages(cwd, packages, append, dev) { if (!Array.isArray(packages)) { packages = [packages]; } if (fs.existsSync(paths.yarnLockFile)) { spawnSync('yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'inherit', + cwd, }); } else { spawnSync( @@ -51,6 +56,7 @@ function adjustPackages(packages, append, dev = false) { [append ? 'install' : 'uninstall', dev ? '-D' : '-S', ...packages], { stdio: 'inherit', + cwd, } ); } @@ -171,13 +177,13 @@ inquirer // We used to put react-scripts in devDependencies if (appPackage.devDependencies[ownPackageName]) { console.log(` Removing ${cyan(ownPackageName)} from devDependencies`); - adjustPackages(ownPackageName, false, true); + adjustPackages(appPath, ownPackageName, REMOVE_PACKAGE, DEV_PACKAGE); } } appPackage.dependencies = appPackage.dependencies || {}; if (appPackage.dependencies[ownPackageName]) { console.log(` Removing ${cyan(ownPackageName)} from dependencies`); - adjustPackages(ownPackageName, false); + adjustPackages(appPath, ownPackageName, REMOVE_PACKAGE, PROD_PACKAGE); } let appendList = []; Object.keys(ownPackage.dependencies).forEach(key => { @@ -188,7 +194,7 @@ inquirer console.log(` Adding ${cyan(key)} to dependencies`); appendList.push(`${key}@${ownPackage.dependencies[key]}`); }); - adjustPackages(appendList, true); + adjustPackages(appPath, appendList, ADD_PACKAGE, PROD_PACKAGE); console.log(); appPackage = require(path.join(appPath, 'package.json')); From b52f311b9a0095d0bd64e874bdd53ce44cd60b27 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 11:10:04 -0500 Subject: [PATCH 06/16] Check status of process --- packages/react-scripts/scripts/eject.js | 33 +++++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index a6cb74568f4..bd40c14919d 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -45,20 +45,37 @@ function adjustPackages(cwd, packages, append, dev) { if (!Array.isArray(packages)) { packages = [packages]; } + let status; if (fs.existsSync(paths.yarnLockFile)) { - spawnSync('yarnpkg', [append ? 'add' : 'remove', ...packages], { - stdio: 'inherit', - cwd, - }); + ({ status } = spawnSync( + 'yarnpkg', + [append ? 'add' : 'remove', ...packages], + { + stdio: 'pipe', + cwd, + } + )); } else { - spawnSync( + ({ status } = spawnSync( 'npm', - [append ? 'install' : 'uninstall', dev ? '-D' : '-S', ...packages], + [ + append ? 'install' : 'uninstall', + dev ? '-D' : '-S', + '--loglevel', + 'error', + ...packages, + ], { - stdio: 'inherit', + stdio: 'pipe', cwd, } - ); + )); + } + + if (status !== 0) { + console.error(chalk.red('Failed to update the dependencies.')); + + process.exit(status); } } From 48c343b0f73801007c7a8a0b5a7659e8f832f6b6 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 13:36:30 -0500 Subject: [PATCH 07/16] Output error when command fails --- packages/react-scripts/scripts/eject.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index bd40c14919d..38ec3160433 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -45,10 +45,10 @@ function adjustPackages(cwd, packages, append, dev) { if (!Array.isArray(packages)) { packages = [packages]; } - let status; + let status, output; if (fs.existsSync(paths.yarnLockFile)) { - ({ status } = spawnSync( - 'yarnpkg', + ({ status, output } = spawnSync( + process.platform === 'win32' ? 'yarnpkg.cmd' : 'yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'pipe', @@ -56,7 +56,7 @@ function adjustPackages(cwd, packages, append, dev) { } )); } else { - ({ status } = spawnSync( + ({ status, output } = spawnSync( 'npm', [ append ? 'install' : 'uninstall', @@ -74,7 +74,8 @@ function adjustPackages(cwd, packages, append, dev) { if (status !== 0) { console.error(chalk.red('Failed to update the dependencies.')); - + console.error(); + console.error(output.join(process.platform === 'win32' ? '\r\n' : '\n')); process.exit(status); } } From 51dc5545fcfbf1f0e1959b78c1b8c1c823088b8e Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 13:39:12 -0500 Subject: [PATCH 08/16] Rename vars --- packages/react-scripts/scripts/eject.js | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 38ec3160433..3edb70ed239 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -187,19 +187,19 @@ inquirer console.log(); const ownPackage = require(path.join(ownPath, 'package.json')); - let appPackage = require(path.join(appPath, 'package.json')); + const ejectingAppPackage = require(path.join(appPath, 'package.json')); console.log(cyan('Updating the dependencies')); const ownPackageName = ownPackage.name; - if (appPackage.devDependencies) { + if (ejectingAppPackage.devDependencies) { // We used to put react-scripts in devDependencies - if (appPackage.devDependencies[ownPackageName]) { + if (ejectingAppPackage.devDependencies[ownPackageName]) { console.log(` Removing ${cyan(ownPackageName)} from devDependencies`); adjustPackages(appPath, ownPackageName, REMOVE_PACKAGE, DEV_PACKAGE); } } - appPackage.dependencies = appPackage.dependencies || {}; - if (appPackage.dependencies[ownPackageName]) { + ejectingAppPackage.dependencies = ejectingAppPackage.dependencies || {}; + if (ejectingAppPackage.dependencies[ownPackageName]) { console.log(` Removing ${cyan(ownPackageName)} from dependencies`); adjustPackages(appPath, ownPackageName, REMOVE_PACKAGE, PROD_PACKAGE); } @@ -215,16 +215,16 @@ inquirer adjustPackages(appPath, appendList, ADD_PACKAGE, PROD_PACKAGE); console.log(); - appPackage = require(path.join(appPath, 'package.json')); + const ejectedAppPackage = require(path.join(appPath, 'package.json')); console.log(cyan('Updating the scripts')); - delete appPackage.scripts['eject']; - Object.keys(appPackage.scripts).forEach(key => { + delete ejectedAppPackage.scripts['eject']; + Object.keys(ejectedAppPackage.scripts).forEach(key => { Object.keys(ownPackage.bin).forEach(binKey => { const regex = new RegExp(binKey + ' (\\w+)', 'g'); - if (!regex.test(appPackage.scripts[key])) { + if (!regex.test(ejectedAppPackage.scripts[key])) { return; } - appPackage.scripts[key] = appPackage.scripts[key].replace( + ejectedAppPackage.scripts[key] = ejectedAppPackage.scripts[key].replace( regex, 'node scripts/$1.js' ); @@ -240,23 +240,23 @@ inquirer console.log(cyan('Configuring package.json')); // Add Jest config console.log(` Adding ${cyan('Jest')} configuration`); - appPackage.jest = jestConfig; + ejectedAppPackage.jest = jestConfig; // Add Babel config console.log(` Adding ${cyan('Babel')} preset`); - appPackage.babel = { + ejectedAppPackage.babel = { presets: ['react-app'], }; // Add ESlint config console.log(` Adding ${cyan('ESLint')} configuration`); - appPackage.eslintConfig = { + ejectedAppPackage.eslintConfig = { extends: 'react-app', }; fs.writeFileSync( path.join(appPath, 'package.json'), - JSON.stringify(appPackage, null, 2) + '\n' + JSON.stringify(ejectedAppPackage, null, 2) + '\n' ); console.log(); From 1332a190edac8adc94733bda2f42bc4a12382f6f Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 5 Nov 2017 14:06:44 -0500 Subject: [PATCH 09/16] try yarn.cmd explicitly --- packages/react-scripts/scripts/eject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 3edb70ed239..3d16c4ee52a 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -48,7 +48,7 @@ function adjustPackages(cwd, packages, append, dev) { let status, output; if (fs.existsSync(paths.yarnLockFile)) { ({ status, output } = spawnSync( - process.platform === 'win32' ? 'yarnpkg.cmd' : 'yarnpkg', + process.platform === 'win32' ? 'yarn.cmd' : 'yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'pipe', From 9e7833c05b3a168a4da2b2eb351135710d5e3086 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 19 Nov 2017 15:18:38 -0500 Subject: [PATCH 10/16] Use Node's spawn behavior except default to a shell on Windows --- packages/react-dev-utils/crossSpawn.js | 32 ++++++++++++++++++++++++- packages/react-dev-utils/openBrowser.js | 2 +- packages/react-dev-utils/package.json | 1 - 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/react-dev-utils/crossSpawn.js b/packages/react-dev-utils/crossSpawn.js index b772086f21a..dddef818b87 100644 --- a/packages/react-dev-utils/crossSpawn.js +++ b/packages/react-dev-utils/crossSpawn.js @@ -7,6 +7,36 @@ 'use strict'; -var crossSpawn = require('cross-spawn'); +const { spawn } = require('child_process'); + +function crossSpawn(file, args, options) { + if (typeof file !== 'string' || file.length === 0) { + throw new TypeError('"file" argument must be a non-empty string'); + } + + if (Array.isArray(args)) { + args = args.slice(0); + } else if ( + args !== undefined && + (args === null || typeof args !== 'object') + ) { + throw new TypeError('Incorrect value of args option'); + } else { + options = args; + args = []; + } + + if (options === undefined) { + options = {}; + } else if (options === null || typeof options !== 'object') { + throw new TypeError('"options" argument must be an object'); + } + + // Default to using a shell on Windows + if (options.shell === undefined && process.platform === 'win32') { + options.shell = true; + } + return spawn(file, args, options); +} module.exports = crossSpawn; diff --git a/packages/react-dev-utils/openBrowser.js b/packages/react-dev-utils/openBrowser.js index cb9f32c6a85..d6a459eab0e 100644 --- a/packages/react-dev-utils/openBrowser.js +++ b/packages/react-dev-utils/openBrowser.js @@ -9,7 +9,7 @@ var chalk = require('chalk'); var execSync = require('child_process').execSync; -var spawn = require('cross-spawn'); +var spawn = require('./crossSpawn'); var opn = require('opn'); // https://github.com/sindresorhus/opn#app diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index 54606f33fe8..a1def4bfa10 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -39,7 +39,6 @@ "address": "1.0.3", "babel-code-frame": "6.26.0", "chalk": "1.1.3", - "cross-spawn": "5.1.0", "detect-port-alt": "1.1.3", "escape-string-regexp": "1.0.5", "filesize": "3.5.11", From f702accaf6d0e86547a8f422a788b64a5ec9b0d4 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 19 Nov 2017 15:23:40 -0500 Subject: [PATCH 11/16] Support sync spawn, too --- packages/react-dev-utils/crossSpawn.js | 15 +++++++++++++-- packages/react-scripts/scripts/eject.js | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/react-dev-utils/crossSpawn.js b/packages/react-dev-utils/crossSpawn.js index dddef818b87..1b5b7e5fa48 100644 --- a/packages/react-dev-utils/crossSpawn.js +++ b/packages/react-dev-utils/crossSpawn.js @@ -7,9 +7,9 @@ 'use strict'; -const { spawn } = require('child_process'); +const { spawn, spawnSync } = require('child_process'); -function crossSpawn(file, args, options) { +function normalizeSpawnArguments(file, args, options) { if (typeof file !== 'string' || file.length === 0) { throw new TypeError('"file" argument must be a non-empty string'); } @@ -36,7 +36,18 @@ function crossSpawn(file, args, options) { if (options.shell === undefined && process.platform === 'win32') { options.shell = true; } + + return { file, args, options }; +} + +function crossSpawn(file, args, options) { + ({ file, args, options } = normalizeSpawnArguments(file, args, options)); return spawn(file, args, options); } +crossSpawn.sync = function crossSpawnSync(file, args, options) { + ({ file, args, options } = normalizeSpawnArguments(file, args, options)); + return spawnSync(file, args, options); +}; + module.exports = crossSpawn; diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 3d16c4ee52a..e3e4024d061 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -48,7 +48,7 @@ function adjustPackages(cwd, packages, append, dev) { let status, output; if (fs.existsSync(paths.yarnLockFile)) { ({ status, output } = spawnSync( - process.platform === 'win32' ? 'yarn.cmd' : 'yarnpkg', + 'yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'pipe', From 90045fb80f6aed0beb1057dcb51a66a24230df68 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 19 Nov 2017 15:26:53 -0500 Subject: [PATCH 12/16] Don't clobber user's options object --- packages/react-dev-utils/crossSpawn.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/react-dev-utils/crossSpawn.js b/packages/react-dev-utils/crossSpawn.js index 1b5b7e5fa48..6f118a10533 100644 --- a/packages/react-dev-utils/crossSpawn.js +++ b/packages/react-dev-utils/crossSpawn.js @@ -9,6 +9,8 @@ const { spawn, spawnSync } = require('child_process'); +// Based on Node's internal normalizeSpawnArguments +// See https://github.com/nodejs/node/blob/97ba69f91543f89d389a4f3fef57c5c6c734df34/lib/child_process.js#L378-L489 function normalizeSpawnArguments(file, args, options) { if (typeof file !== 'string' || file.length === 0) { throw new TypeError('"file" argument must be a non-empty string'); @@ -32,6 +34,9 @@ function normalizeSpawnArguments(file, args, options) { throw new TypeError('"options" argument must be an object'); } + // Make a shallow copy so we don't clobber the user's options object. + options = Object.assign({}, options); + // Default to using a shell on Windows if (options.shell === undefined && process.platform === 'win32') { options.shell = true; From 65d335eb9ca95cd567453be6678d14336959632c Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 19 Nov 2017 15:45:14 -0500 Subject: [PATCH 13/16] Revert "Use Node's spawn behavior except default to a shell on Windows" This reverts commit 9e7833c05b3a168a4da2b2eb351135710d5e3086. --- packages/react-dev-utils/crossSpawn.js | 48 +------------------------ packages/react-dev-utils/openBrowser.js | 2 +- packages/react-dev-utils/package.json | 1 + packages/react-scripts/scripts/eject.js | 2 +- 4 files changed, 4 insertions(+), 49 deletions(-) diff --git a/packages/react-dev-utils/crossSpawn.js b/packages/react-dev-utils/crossSpawn.js index 6f118a10533..b772086f21a 100644 --- a/packages/react-dev-utils/crossSpawn.js +++ b/packages/react-dev-utils/crossSpawn.js @@ -7,52 +7,6 @@ 'use strict'; -const { spawn, spawnSync } = require('child_process'); - -// Based on Node's internal normalizeSpawnArguments -// See https://github.com/nodejs/node/blob/97ba69f91543f89d389a4f3fef57c5c6c734df34/lib/child_process.js#L378-L489 -function normalizeSpawnArguments(file, args, options) { - if (typeof file !== 'string' || file.length === 0) { - throw new TypeError('"file" argument must be a non-empty string'); - } - - if (Array.isArray(args)) { - args = args.slice(0); - } else if ( - args !== undefined && - (args === null || typeof args !== 'object') - ) { - throw new TypeError('Incorrect value of args option'); - } else { - options = args; - args = []; - } - - if (options === undefined) { - options = {}; - } else if (options === null || typeof options !== 'object') { - throw new TypeError('"options" argument must be an object'); - } - - // Make a shallow copy so we don't clobber the user's options object. - options = Object.assign({}, options); - - // Default to using a shell on Windows - if (options.shell === undefined && process.platform === 'win32') { - options.shell = true; - } - - return { file, args, options }; -} - -function crossSpawn(file, args, options) { - ({ file, args, options } = normalizeSpawnArguments(file, args, options)); - return spawn(file, args, options); -} - -crossSpawn.sync = function crossSpawnSync(file, args, options) { - ({ file, args, options } = normalizeSpawnArguments(file, args, options)); - return spawnSync(file, args, options); -}; +var crossSpawn = require('cross-spawn'); module.exports = crossSpawn; diff --git a/packages/react-dev-utils/openBrowser.js b/packages/react-dev-utils/openBrowser.js index d6a459eab0e..cb9f32c6a85 100644 --- a/packages/react-dev-utils/openBrowser.js +++ b/packages/react-dev-utils/openBrowser.js @@ -9,7 +9,7 @@ var chalk = require('chalk'); var execSync = require('child_process').execSync; -var spawn = require('./crossSpawn'); +var spawn = require('cross-spawn'); var opn = require('opn'); // https://github.com/sindresorhus/opn#app diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index a1def4bfa10..54606f33fe8 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -39,6 +39,7 @@ "address": "1.0.3", "babel-code-frame": "6.26.0", "chalk": "1.1.3", + "cross-spawn": "5.1.0", "detect-port-alt": "1.1.3", "escape-string-regexp": "1.0.5", "filesize": "3.5.11", diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index e3e4024d061..3d16c4ee52a 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -48,7 +48,7 @@ function adjustPackages(cwd, packages, append, dev) { let status, output; if (fs.existsSync(paths.yarnLockFile)) { ({ status, output } = spawnSync( - 'yarnpkg', + process.platform === 'win32' ? 'yarn.cmd' : 'yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'pipe', From 814da9e733aaa644d583d3541513c0ee7385da8e Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 19 Nov 2017 15:46:12 -0500 Subject: [PATCH 14/16] Skip cross spawn --- packages/react-scripts/scripts/eject.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 3d16c4ee52a..56ffca4e0f7 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -16,12 +16,11 @@ process.on('unhandledRejection', err => { const fs = require('fs-extra'); const path = require('path'); -const execSync = require('child_process').execSync; +const { spawnSync, execSync } = require('child_process').execSync; const chalk = require('chalk'); const paths = require('../config/paths'); const createJestConfig = require('./utils/createJestConfig'); const inquirer = require('react-dev-utils/inquirer'); -const spawnSync = require('react-dev-utils/crossSpawn').sync; const green = chalk.green; const cyan = chalk.cyan; @@ -48,7 +47,7 @@ function adjustPackages(cwd, packages, append, dev) { let status, output; if (fs.existsSync(paths.yarnLockFile)) { ({ status, output } = spawnSync( - process.platform === 'win32' ? 'yarn.cmd' : 'yarnpkg', + process.platform === 'win32' ? 'yarnpkg.cmd' : 'yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'pipe', @@ -57,7 +56,7 @@ function adjustPackages(cwd, packages, append, dev) { )); } else { ({ status, output } = spawnSync( - 'npm', + process.platform === 'win32' ? 'npm.cmd' : 'npm', [ append ? 'install' : 'uninstall', dev ? '-D' : '-S', From 012d821f69d4f7f3e0bab35d3ce2b2538384d75e Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 19 Nov 2017 16:04:50 -0500 Subject: [PATCH 15/16] whoops --- packages/react-scripts/scripts/eject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 56ffca4e0f7..8f08d66fe87 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -16,7 +16,7 @@ process.on('unhandledRejection', err => { const fs = require('fs-extra'); const path = require('path'); -const { spawnSync, execSync } = require('child_process').execSync; +const { spawnSync, execSync } = require('child_process'); const chalk = require('chalk'); const paths = require('../config/paths'); const createJestConfig = require('./utils/createJestConfig'); From 6a26e5706f9363ba68349a26c212c56d0c14f99c Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 19 Nov 2017 16:12:15 -0500 Subject: [PATCH 16/16] No append cmd --- packages/react-scripts/scripts/eject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 8f08d66fe87..a279646ba33 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -47,7 +47,7 @@ function adjustPackages(cwd, packages, append, dev) { let status, output; if (fs.existsSync(paths.yarnLockFile)) { ({ status, output } = spawnSync( - process.platform === 'win32' ? 'yarnpkg.cmd' : 'yarnpkg', + 'yarnpkg', [append ? 'add' : 'remove', ...packages], { stdio: 'pipe',