react-native-cli
Advanced tools
Comparing version 1.0.0 to 1.2.0
101
index.js
@@ -41,2 +41,3 @@ #!/usr/bin/env node | ||
var exec = require('child_process').exec; | ||
var execSync = require('child_process').execSync; | ||
var spawn = require('child_process').spawn; | ||
@@ -78,2 +79,29 @@ var chalk = require('chalk'); | ||
// Use Yarn if available, it's much faster than the npm client. | ||
// Return the version of yarn installed on the system, null if yarn is not available. | ||
function getYarnVersionIfAvailable() { | ||
let yarnVersion; | ||
try { | ||
// execSync returns a Buffer -> convert to string | ||
if (process.platform.startsWith('win')) { | ||
yarnVersion = (execSync('yarn --version').toString() || '').trim(); | ||
} else { | ||
yarnVersion = (execSync('yarn --version 2>/dev/null').toString() || '').trim(); | ||
} | ||
} catch (error) { | ||
return null; | ||
} | ||
// yarn < 0.16 has a 'missing manifest' bug | ||
try { | ||
if (semver.gte(yarnVersion, '0.16.0')) { | ||
return yarnVersion; | ||
} else { | ||
return null; | ||
} | ||
} catch (error) { | ||
console.error('Cannot parse yarn version: ' + yarnVersion); | ||
return null; | ||
} | ||
} | ||
checkForVersionArgument(); | ||
@@ -107,3 +135,4 @@ | ||
} else { | ||
init(commands[1], argv.verbose, argv.version); | ||
const rnPackage = argv.version; | ||
init(commands[1], argv.verbose, rnPackage, argv.npm); | ||
} | ||
@@ -114,3 +143,3 @@ break; | ||
'Command `%s` unrecognized. ' + | ||
'Did you mean to run this inside a react-native project?', | ||
'Make sure that you have run `npm install` and that you are inside a react-native project.', | ||
commands[0] | ||
@@ -123,3 +152,3 @@ ); | ||
function validatePackageName(name) { | ||
function validateProjectName(name) { | ||
if (!name.match(/^[$A-Z_][0-9A-Z_$]*$/i)) { | ||
@@ -144,13 +173,20 @@ console.error( | ||
function init(name, verbose, rnPackage) { | ||
validatePackageName(name); | ||
/** | ||
* @param name Project name, e.g. 'AwesomeApp'. | ||
* @param verbose If true, will run 'npm install' in verbose mode (for debugging). | ||
* @param rnPackage Version of React Native to install, e.g. '0.38.0'. | ||
* @param forceNpmClient If true, always use the npm command line client, | ||
* don't use yarn even if available. | ||
*/ | ||
function init(name, verbose, rnPackage, forceNpmClient) { | ||
validateProjectName(name); | ||
if (fs.existsSync(name)) { | ||
createAfterConfirmation(name, verbose, rnPackage); | ||
createAfterConfirmation(name, verbose, rnPackage, forceNpmClient); | ||
} else { | ||
createProject(name, verbose, rnPackage); | ||
createProject(name, verbose, rnPackage, forceNpmClient); | ||
} | ||
} | ||
function createAfterConfirmation(name, verbose, rnPackage) { | ||
function createAfterConfirmation(name, verbose, rnPackage, forceNpmClient) { | ||
prompt.start(); | ||
@@ -168,3 +204,3 @@ | ||
if (result.yesno[0] === 'y') { | ||
createProject(name, verbose, rnPackage); | ||
createProject(name, verbose, rnPackage, forceNpmClient); | ||
} else { | ||
@@ -177,3 +213,3 @@ console.log('Project initialization canceled'); | ||
function createProject(name, verbose, rnPackage) { | ||
function createProject(name, verbose, rnPackage, forceNpmClient) { | ||
var root = path.resolve(name); | ||
@@ -202,8 +238,6 @@ var projectName = path.basename(root); | ||
console.log('Installing react-native package from npm...'); | ||
if (verbose) { | ||
runVerbose(root, projectName, rnPackage); | ||
runVerbose(root, projectName, rnPackage, forceNpmClient); | ||
} else { | ||
run(root, projectName, rnPackage); | ||
run(root, projectName, rnPackage, forceNpmClient); | ||
} | ||
@@ -214,5 +248,5 @@ } | ||
var packageToInstall = 'react-native'; | ||
var valideSemver = semver.valid(rnPackage); | ||
if (valideSemver) { | ||
packageToInstall += '@' + valideSemver; | ||
var isValidSemver = semver.valid(rnPackage); | ||
if (isValidSemver) { | ||
packageToInstall += '@' + isValidSemver; | ||
} else if (rnPackage) { | ||
@@ -225,14 +259,25 @@ // for tar.gz or alternative paths | ||
function run(root, projectName, rnPackage) { | ||
exec('npm install --save --save-exact ' + getInstallPackage(rnPackage), function(e, stdout, stderr) { | ||
if (e) { | ||
function run(root, projectName, rnPackage, forceNpmClient) { | ||
const yarnVersion = (!forceNpmClient) && getYarnVersionIfAvailable(); | ||
let installCommand; | ||
if (yarnVersion) { | ||
console.log('Using yarn v' + yarnVersion); | ||
console.log('Installing ' + getInstallPackage(rnPackage) + '...'); | ||
installCommand = 'yarn add ' + getInstallPackage(rnPackage) + ' --exact'; | ||
} else { | ||
console.log('Installing ' + getInstallPackage(rnPackage) + ' from npm...'); | ||
if (!forceNpmClient) { | ||
console.log('Consider installing yarn to make this faster: https://yarnpkg.com'); | ||
} | ||
installCommand = 'npm install --save --save-exact ' + getInstallPackage(rnPackage); | ||
} | ||
exec(installCommand, function(err, stdout, stderr) { | ||
if (err) { | ||
console.log(stdout); | ||
console.error(stderr); | ||
console.error('`npm install --save --save-exact react-native` failed'); | ||
console.error('Command `' + installCommand + '` failed.'); | ||
process.exit(1); | ||
} | ||
checkNodeVersion(); | ||
var cli = require(CLI_MODULE_PATH()); | ||
cli = require(CLI_MODULE_PATH()); | ||
cli.init(root, projectName); | ||
@@ -242,4 +287,6 @@ }); | ||
function runVerbose(root, projectName, rnPackage) { | ||
var proc = spawn('npm', ['install', '--verbose', '--save', '--save-exact', getInstallPackage(rnPackage)], {stdio: 'inherit'}); | ||
function runVerbose(root, projectName, rnPackage, forceNpmClient) { | ||
// Use npm client, yarn doesn't support --verbose yet | ||
console.log('Installing ' + getInstallPackage(rnPackage) + ' from npm. This might take a while...'); | ||
var proc = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['install', '--verbose', '--save', '--save-exact', getInstallPackage(rnPackage)], {stdio: 'inherit'}); | ||
proc.on('close', function (code) { | ||
@@ -278,3 +325,3 @@ if (code !== 0) { | ||
} catch (e) { | ||
console.log('react-native: n/a - not inside a React Native project directory') | ||
console.log('react-native: n/a - not inside a React Native project directory'); | ||
} | ||
@@ -281,0 +328,0 @@ process.exit(); |
{ | ||
"name": "react-native-cli", | ||
"version": "1.0.0", | ||
"version": "1.2.0", | ||
"license": "BSD-3-Clause", | ||
@@ -5,0 +5,0 @@ "description": "The React Native CLI tools", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
14777
288
3