From 98097caa6f6e9967c64cdaa3c750d14ac0761710 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Thu, 19 Mar 2015 17:46:43 -0700 Subject: [PATCH] react-native-cli initial commit A cli package that is responsible for: * starting a new react-native project * forwarding all other commands to a cli module in react-native * currently cli.js knows how to start the webserver, in the future it may do things like build the app etc. --- cli.js | 48 ++++++++++++++++++++ react-native-cli/index.js | 82 +++++++++++++++++++++++++++++++++++ react-native-cli/package.json | 9 ++++ 3 files changed, 139 insertions(+) create mode 100644 cli.js create mode 100755 react-native-cli/index.js create mode 100644 react-native-cli/package.json diff --git a/cli.js b/cli.js new file mode 100644 index 00000000000000..8a1a306b6dbf4e --- /dev/null +++ b/cli.js @@ -0,0 +1,48 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + */ + +'use strict'; + +var spawn = require('child_process').spawn; +var path = require('path'); + +function printUsage() { + console.log([ + 'Usage: react-native ', + '', + 'Commands:', + ' start: starts the webserver', + ].join('\n')); + process.exit(1); +} + +function run() { + var args = process.argv.slice(2); + if (args.length === 0) { + printUsage(); + } + + switch (args[0]) { + case 'start': + spawn('sh', [ + path.resolve(__dirname, 'packager', 'packager.sh'), + '--projectRoots', + process.cwd(), + ], {stdio: 'inherit'}); + break; + default: + console.error('Command `%s` unrecognized', args[0]); + printUsage(); + } + // Here goes any cli commands we need to +} + +function init() { + spawn('sh', [path.resolve(__dirname, 'init.sh')], {stdio:'inherit'}); +} + +module.exports = { + run: run, + init: init, +}; diff --git a/react-native-cli/index.js b/react-native-cli/index.js new file mode 100755 index 00000000000000..cc69da9d5b2051 --- /dev/null +++ b/react-native-cli/index.js @@ -0,0 +1,82 @@ +#!/usr/bin/env node + +/** + * Copyright 2004-present Facebook. All Rights Reserved. + */ + +var spawn = require('child_process').spawn; +var path = require('path'); + +var CLI_MODULE_PATH = path.resolve( + process.cwd(), + 'node_modules', + 'react-native', + 'cli' +); + +var cli; +try { + cli = require(CLI_MODULE_PATH); +} catch(e) {} + +if (cli) { + cli.run(); +} else { + var args = process.argv.slice(2); + if (args.length === 0) { + console.error( + 'You did not pass any commands, did you mean to run init?' + ); + process.exit(1); + } + + if (args[0] === 'init') { + init(); + } else { + console.error( + 'Command `%s` unrecognized.' + + 'Did you mean to run this inside a react-native project?', + args[0] + ); + process.exit(1); + } +} + +function init() { + console.log( + 'This will walk you through creating a new react-native project', + 'in the current directory' + ); + + console.log('Running npm init'); + run('npm init', function(e) { + if (e) { + console.error('npm init failed'); + process.exit(1); + } + + run('npm install --save react-native', function(e) { + if (e) { + console.error('`npm install --save react-native` failed'); + process.exit(1); + } + + var cli = require(CLI_MODULE_PATH); + cli.init(); + }); + }); +} + +function run(command, cb) { + var parts = command.split(/\s+/); + var cmd = parts[0]; + var args = parts.slice(1); + var proc = spawn(cmd, args, {stdio: 'inherit'}); + proc.on('close', function(code) { + if (code !== 0) { + cb(new Error('Command exited with a non-zero status')); + } else { + cb(null); + } + }); +} diff --git a/react-native-cli/package.json b/react-native-cli/package.json new file mode 100644 index 00000000000000..e0e19dd721667e --- /dev/null +++ b/react-native-cli/package.json @@ -0,0 +1,9 @@ +{ + "name": "react-native-cli", + "version": "0.0.0", + "description": "The ReactNative cli tools", + "main": "index.js", + "bin": { + "react-native": "index.js" + } +}