From ae6664dcc7cb371097bc86b450734123d394b336 Mon Sep 17 00:00:00 2001 From: Fabrizio Castellarin Date: Sun, 11 Dec 2016 10:01:20 +0100 Subject: [PATCH] Use "commander" for cli argv handling (#1195) * Use "commander" for cli argv handling * Handle different scripts version forms and exits without a name given * Revert comment about min supported node version * Check sooner for the minimal node version * Add travis test for node <4 * Parse stderr in node versions <4 --- .travis.yml | 1 + packages/create-react-app/index.js | 53 +++++++++++++++----------- packages/create-react-app/package.json | 2 +- tasks/e2e.sh | 21 +++++++--- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/.travis.yml b/.travis.yml index ec44c3294da..bb9c8112081 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ --- language: node_js node_js: + - 0.10 - 4 - 6 cache: diff --git a/packages/create-react-app/index.js b/packages/create-react-app/index.js index 0fb61d60f1d..d6e89e906eb 100644 --- a/packages/create-react-app/index.js +++ b/packages/create-react-app/index.js @@ -38,38 +38,47 @@ 'use strict'; +var chalk = require('chalk'); + +var currentNodeVersion = process.versions.node +if (currentNodeVersion.split('.')[0] < 4) { + console.error(chalk.red('You are currently running Node v' + currentNodeVersion + + ' but create-react-app requires >=4. Please use a supported version of Node.\n')); + process.exit(1); +} + var fs = require('fs'); var path = require('path'); var execSync = require('child_process').execSync; var spawn = require('cross-spawn'); -var chalk = require('chalk'); var semver = require('semver'); -var argv = require('minimist')(process.argv.slice(2)); var pathExists = require('path-exists'); -/** - * Arguments: - * --version - to print current version - * --verbose - to print logs while init - * --scripts-version - * Example of valid values: - * - a specific npm version: "0.22.0-rc1" - * - a .tgz archive from any npm repo: "https://registry.npmjs.org/react-scripts/-/react-scripts-0.20.0.tgz" - * - a package prepared with `tasks/clean_pack.sh`: "/Users/home/vjeux/create-react-app/react-scripts-0.22.0.tgz" - */ -var commands = argv._; -if (commands.length === 0) { - if (argv.version) { - console.log('create-react-app version: ' + require('./package.json').version); - process.exit(); - } - console.error( - 'Usage: create-react-app [--verbose]' - ); +var projectName; + +var program = require('commander') + .version(require('./package.json').version) + .arguments('') + .action(function (name) { + projectName = name; + }) + .option('-v, --verbose', 'print logs while init') + .option('-s, --scripts-version ', 'select a react script variant') + .on('--help', function () { + console.log('Example of valid script version values:') + console.log(' - a specific npm version: "0.22.0-rc1"') + console.log(' - a .tgz archive from any npm repo: "https://registry.npmjs.org/react-scripts/-/react-scripts-0.20.0.tgz"') + console.log(' - a package prepared with `tasks/clean_pack.sh`: "/Users/home/vjeux/create-react-app/react-scripts-0.22.0.tgz"') + }) + .parse(process.argv) + +if (typeof projectName === 'undefined') { + console.error('Error: no name given!'); + console.log('Usage: ' + program.name() + ' ' + program.usage()); process.exit(1); } -createApp(commands[0], argv.verbose, argv['scripts-version']); +createApp(projectName, program.verbose, program.scriptsVersion); function createApp(name, verbose, version) { var root = path.resolve(name); diff --git a/packages/create-react-app/package.json b/packages/create-react-app/package.json index 01492e71cde..d02e06cdcae 100644 --- a/packages/create-react-app/package.json +++ b/packages/create-react-app/package.json @@ -21,8 +21,8 @@ }, "dependencies": { "chalk": "^1.1.1", + "commander": "^2.9.0", "cross-spawn": "^4.0.0", - "minimist": "^1.2.0", "path-exists": "^2.1.0", "semver": "^5.0.3" } diff --git a/tasks/e2e.sh b/tasks/e2e.sh index ce7b50f35b5..c4f4a4b1b83 100755 --- a/tasks/e2e.sh +++ b/tasks/e2e.sh @@ -14,6 +14,11 @@ # Start in tasks/ even if run from root directory cd "$(dirname "$0")" +# CLI and app temporary locations +# http://unix.stackexchange.com/a/84980 +temp_cli_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_cli_path'` +temp_app_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_app_path'` + function cleanup { echo 'Cleaning up.' cd $root_path @@ -53,6 +58,16 @@ set -x cd .. root_path=$PWD +npm install + +# If the node version is < 4, the script should just give an error. +if [ `node --version | sed -e 's/^v//' -e 's/\..\+//g'` -lt 4 ] +then + cd $temp_app_path + err_output=`node "$root_path"/packages/create-react-app/index.js test-node-version 2>&1 > /dev/null || echo ''` + [[ $err_output =~ You\ are\ currently\ running\ Node\ v.+\ but\ create-react-app\ requires\ \>=4\. ]] && exit 0 || exit 1 +fi + if [ "$USE_YARN" = "yes" ] then # Install Yarn so that the test can use it to install packages. @@ -60,8 +75,6 @@ then yarn cache clean fi -npm install - # Lint own code ./node_modules/.bin/eslint --ignore-path .gitignore ./ @@ -117,13 +130,10 @@ mv package.json.orig package.json # ****************************************************************************** # Install the CLI in a temporary location -# http://unix.stackexchange.com/a/84980 -temp_cli_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_cli_path'` cd $temp_cli_path npm install $cli_path # Install the app in a temporary location -temp_app_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_app_path'` cd $temp_app_path create_react_app --scripts-version=$scripts_path test-app @@ -185,7 +195,6 @@ npm test -- --watch=no # Test the server npm start -- --smoke-test - # ****************************************************************************** # Test --scripts-version with a version number # ******************************************************************************