react-native/local-cli/util/parseCommandLine.js

81 lines
2.4 KiB
JavaScript
Raw Normal View History

2015-01-30 01:10:49 +00:00
/**
* 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.
2015-01-30 01:10:49 +00:00
*
* Wrapper on-top of `optimist` in order to properly support boolean flags
* and have a slightly less awkward API.
2015-01-30 01:10:49 +00:00
*
* Usage example:
* var argv = parseCommandLine([{
* command: 'web',
* description: 'Run in a web browser instead of iOS',
* default: true
* }])
*
* NOTE: This file is used internally at Facebook and not in `local-cli` itself.
* No changes should be made to this file without prior discussion with FB team.
2015-01-30 01:10:49 +00:00
*/
'use strict';
var optimistModule = require('optimist');
2015-01-30 01:10:49 +00:00
function parseCommandLine(config, args) {
var optimist = new optimistModule();
args = args || process.argv;
2015-01-30 01:10:49 +00:00
// optimist default API requires you to write the command name three time
// This is a small wrapper to accept an object instead
for (var i = 0; i < config.length; ++i) {
if (config[i].type === 'string') {
optimist.string(config[i].command);
} else {
optimist.boolean(config[i].command);
}
2015-01-30 01:10:49 +00:00
optimist
.default(config[i].command, config[i].default)
.describe(config[i].command, config[i].description);
if (config[i].required) {
optimist.demand(config[i].command);
}
2015-01-30 01:10:49 +00:00
}
var argv = optimist.parse(args);
2015-01-30 01:10:49 +00:00
// optimist doesn't have support for --dev=false, instead it returns 'false'
for (var i = 0; i < config.length; ++i) {
var command = config[i].command;
if (argv[command] === undefined) {
argv[command] = config[i].default;
}
if (argv[command] === 'true') {
argv[command] = true;
}
if (argv[command] === 'false') {
argv[command] = false;
}
2015-05-21 01:38:55 +00:00
if (config[i].type === 'string') {
// According to https://github.com/substack/node-optimist#numbers,
// every argument that looks like a number should be converted to one.
var strValue = argv[command];
var numValue = strValue ? Number(strValue) : undefined;
if (typeof numValue === 'number' && !isNaN(numValue)) {
argv[command] = numValue;
}
}
2015-01-30 01:10:49 +00:00
}
// Show --help
if (argv.help || argv.h) {
optimist.showHelp();
process.exit();
}
return argv;
}
module.exports = parseCommandLine;