From da75c11d051aad223df51a97909f9b15f3fcc3c4 Mon Sep 17 00:00:00 2001 From: Johann Hubert Sonntagbauer Date: Mon, 27 Feb 2017 21:11:46 +0100 Subject: [PATCH 1/2] fix react dependency versions during initial install --- packages/create-react-app/index.js | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/create-react-app/index.js b/packages/create-react-app/index.js index d5afee43b8f..eaac1899f91 100755 --- a/packages/create-react-app/index.js +++ b/packages/create-react-app/index.js @@ -212,8 +212,9 @@ function run(root, appName, version, verbose, originalDirectory, template) { checkNodeVersion(packageName); // Since react-scripts has been installed with --save - // We need to move it into devDependencies and rewrite package.json - moveReactScriptsToDev(packageName); + // we need to move it into devDependencies and rewrite package.json + // also ensure react dependencies have caret version range + fixDependencies(packageName); var scriptsPath = path.resolve( process.cwd(), @@ -325,7 +326,24 @@ function checkAppName(appName) { } } -function moveReactScriptsToDev(packageName) { +function patchReactDependencyVersion(name, version) { + if (typeof version === 'undefined') { + console.error( + chalk.red('Missing ' + name + ' dependency in package.json') + ); + process.exit(1); + } + var patchedVersion = '^' + version; + if (!semver.validRange(patchedVersion)) { + console.error( + 'Unable to patch ' + name + ' dependency version because version ' + chalk.red(version) + ' will become invalid ' + chalk.red(patchedVersion) + ); + patchedVersion = version; + } + return patchedVersion; +} + +function fixDependencies(packageName) { var packagePath = path.join(process.cwd(), 'package.json'); var packageJson = require(packagePath); @@ -349,6 +367,9 @@ function moveReactScriptsToDev(packageName) { packageJson.devDependencies[packageName] = packageVersion; delete packageJson.dependencies[packageName]; + packageJson.dependencies['react'] = patchReactDependencyVersion('react', packageJson.dependencies['react']); + packageJson.dependencies['react-dom'] = patchReactDependencyVersion('react-dom', packageJson.dependencies['react-dom']); + fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2)); } From 8951bef213491dc7b7ae3836b469c29f8140c076 Mon Sep 17 00:00:00 2001 From: Johann Hubert Sonntagbauer Date: Mon, 27 Feb 2017 21:50:45 +0100 Subject: [PATCH 2/2] add review remarks --- packages/create-react-app/index.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/create-react-app/index.js b/packages/create-react-app/index.js index eaac1899f91..bb1fab6fdec 100755 --- a/packages/create-react-app/index.js +++ b/packages/create-react-app/index.js @@ -326,21 +326,26 @@ function checkAppName(appName) { } } -function patchReactDependencyVersion(name, version) { +function makeCaretRange(dependencies, name) { + var version = dependencies[name]; + if (typeof version === 'undefined') { console.error( chalk.red('Missing ' + name + ' dependency in package.json') ); process.exit(1); } + var patchedVersion = '^' + version; + if (!semver.validRange(patchedVersion)) { console.error( 'Unable to patch ' + name + ' dependency version because version ' + chalk.red(version) + ' will become invalid ' + chalk.red(patchedVersion) ); patchedVersion = version; } - return patchedVersion; + + dependencies[name] = patchedVersion; } function fixDependencies(packageName) { @@ -367,8 +372,8 @@ function fixDependencies(packageName) { packageJson.devDependencies[packageName] = packageVersion; delete packageJson.dependencies[packageName]; - packageJson.dependencies['react'] = patchReactDependencyVersion('react', packageJson.dependencies['react']); - packageJson.dependencies['react-dom'] = patchReactDependencyVersion('react-dom', packageJson.dependencies['react-dom']); + makeCaretRange(packageJson.dependencies, 'react'); + makeCaretRange(packageJson.dependencies, 'react-dom'); fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2)); }