From 5c4bb894bf2fe150b6431d43c881351e8c483bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Bigio?= Date: Tue, 20 Oct 2015 16:58:10 -0700 Subject: [PATCH] Clean up cli.js Reviewed By: frantic Differential Revision: D2546201 fb-gh-sync-id: 214a12213674749e1b7270ccbe90fd3330c9cb1e --- local-cli/cli.js | 150 +++++++++++++++++++++++++++------------------- local-cli/init.js | 41 ------------- 2 files changed, 87 insertions(+), 104 deletions(-) delete mode 100755 local-cli/init.js diff --git a/local-cli/cli.js b/local-cli/cli.js index 58de6edf4..dcb9d3e34 100644 --- a/local-cli/cli.js +++ b/local-cli/cli.js @@ -12,32 +12,70 @@ var bundle = require('../private-cli/src/bundle/bundle'); var Config = require('../private-cli/src/util/Config'); var fs = require('fs'); var generate = require('../private-cli/src/generate/generate'); -var init = require('./init.js'); var library = require('../private-cli/src/library/library'); +var path = require('path'); var runAndroid = require('../private-cli/src/runAndroid/runAndroid'); var server = require('../private-cli/src/server/server'); +var TerminalAdapter = require('yeoman-environment/lib/adapter.js'); +var yeoman = require('yeoman-environment'); -// TODO: remove once we fully roll out the `private-cli` based cli -// var bundle_DEPRECATED = require('./bundle.js'); -// var generateAndroid_DEPRECATED = require('./generate-android.js'); -// var newLibrary_DEPRECATED = require('./new-library.js'); -// var runPackager_DEPRECATED = require('./run-packager.js'); -// var runAndroid_DEPRECATED = require('./run-android.js'); +var availableCommands = { + 'start': [server, 'starts the webserver'], + 'bundle': [bundle, 'builds the javascript bundle for offline use'], + 'new-library': [library, 'generates a native library bridge'], + 'android': [generate, 'generates an Android project for your app'], + 'run-android': [runAndroid, 'builds your app and starts it on a connected Android emulator or device'] +}; + +/** + * Parses the command line and runs a command of the CLI. + */ +function run() { + var args = process.argv.slice(2); + if (args.length === 0) { + printUsage(); + } + + var config = Config.get(__dirname); + switch (args[0]) { + case 'start': return server(args, config).done(); + case 'bundle': return bundle(args, config).done(); + case 'new-library': return library(args, config).done(); + case 'init': return printInitWarning(); + case 'run-android': return runAndroid(args, config).done(); + case 'android': + generate( + [ + '--platform', 'android', + '--project-path', process.cwd(), + '--project-name', JSON.parse( + fs.readFileSync('package.json', 'utf8') + ).name + ], + config + ).done(); + break; + default: + console.error('Command `%s` unrecognized', args[0]); + printUsage(); + } +} function printUsage() { console.log([ 'Usage: react-native ', '', - 'Commands:', - ' start: starts the webserver', - ' bundle: builds the javascript bundle for offline use', - ' new-library: generates a native library bridge', - ' android: generates an Android project for your app', - ' run-android: builds your app and starts it on a connected Android emulator or device' - ].join('\n')); + 'Commands:' + ].concat( + Object.keys(availableCommands).map(function(name){ + return name + ':\t' + availableCommands[name][1]; + }).join('\n') + )); process.exit(1); } +// The user should never get here because projects are inited by +// using `react-native-cli` from outside a project directory. function printInitWarning() { console.log([ 'Looks like React Native project already exists in the current', @@ -46,58 +84,44 @@ function printInitWarning() { process.exit(1); } -function run() { - var args = process.argv.slice(2); - if (args.length === 0) { - printUsage(); +class CreateSuppressingTerminalAdapter extends TerminalAdapter { + constructor() { + super(); + // suppres 'create' output generated by yeoman + this.log.create = function() {}; } +} - var config = Config.get(__dirname); +/** + * Creates the template for a React Native project given the provided + * parameters: + * - projectDir: templates will be copied here. + * - argsOrName: project name or full list of custom arguments to pass to the + * generator. + */ +function init(projectDir, argsOrName) { + console.log('Setting up new React Native app in ' + projectDir); + var env = yeoman.createEnv( + undefined, + undefined, + new CreateSuppressingTerminalAdapter() + ); - switch (args[0]) { - case 'start': - server(args, config).done(); - // runPackager_DEPRECATED(); - break; - case 'bundle': - bundle(args, config).done(); - // bundle_DEPRECATED.init(args); - break; - case 'new-library': - library(args, config).done(); - // newLibrary_DEPRECATED.init(args); - break; - case 'init': - printInitWarning(); - break; - case 'android': - generate( - [ - '--platform', 'android', - '--project-path', process.cwd(), - '--project-name', JSON.parse( - fs.readFileSync('package.json', 'utf8') - ).name - ], - config - ).done(); - // generateAndroid( - // process.cwd(), - // JSON.parse(fs.readFileSync('package.json', 'utf8')).name - // ); - break; - case 'run-android': - runAndroid(args, config).done(); - // runAndroid_DEPRECATED(); default: - break; - case 'help': - printUsage(); - break; - default: - console.error('Command `%s` unrecognized', args[0]); - printUsage(); - } - // Here goes any cli commands we need to + env.register( + require.resolve(path.join(__dirname, 'generator')), + 'react:app' + ); + + // argv is for instance + // ['node', 'react-native', 'init', 'AwesomeApp', '--verbose'] + // args should be ['AwesomeApp', '--verbose'] + var args = Array.isArray(argsOrName) + ? argsOrName + : [argsOrName].concat(process.argv.slice(4)); + + var generator = env.create('react:app', {args: args}); + generator.destinationRoot(projectDir); + generator.run(); } if (require.main === module) { diff --git a/local-cli/init.js b/local-cli/init.js deleted file mode 100755 index 9c45eebf9..000000000 --- a/local-cli/init.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -var path = require('path'); -var yeoman = require('yeoman-environment'); -var TerminalAdapter = require('yeoman-environment/lib/adapter.js'); - -class CreateSuppressingTerminalAdapter extends TerminalAdapter { - constructor() { - super(); - // suppres 'create' output generated by yeoman - this.log.create = function() {}; - } -}; - -// argsOrName can be: -// - A string (e.g. 'AwesomeApp'). This is the common case when -// you run 'react-native init AwesomeApp' from the command line. -// - An array with all the arguments. This can be useful when you -// need to pass custom arguments to the generator. -function init(projectDir, argsOrName) { - console.log('Setting up new React Native app in ' + projectDir); - var env = yeoman.createEnv(undefined, undefined, new CreateSuppressingTerminalAdapter()); - env.register(require.resolve(path.join(__dirname, 'generator')), 'react:app'); - // argv is e.g. - // ['node', 'react-native', 'init', 'AwesomeApp', '--verbose'] - // args is ['AwesomeApp', '--verbose'] - var args = Array.isArray(argsOrName) ? argsOrName : [argsOrName].concat(process.argv.slice(4)); - var generator = env.create('react:app', {args: args}); - generator.destinationRoot(projectDir); - generator.run(); -} - -module.exports = init;