UNPKG

2.67 kBJavaScriptView Raw
1var Parameter, _, settings, state, yargsParser;
2
3_ = require('lodash');
4
5_.str = require('underscore.string');
6
7yargsParser = require('yargs-parser');
8
9settings = require('./settings');
10
11state = require('./state');
12
13Parameter = require('./parameter');
14
15exports.normalizeInput = function(argv) {
16 if (argv === process.argv) {
17 argv = argv.slice(2);
18 }
19 if (_.isArray(argv)) {
20 return argv;
21 }
22 if (_.isString(argv)) {
23 return exports.split(argv);
24 }
25 throw new Error('Invalid argument list');
26};
27
28exports.parse = function(argv) {
29 var options, output, result;
30 argv = exports.normalizeInput(argv);
31 output = yargsParser(argv, {
32 configuration: {
33 'parse-numbers': false
34 }
35 });
36 options = _.omit(output, '_');
37 result = {};
38 result.options = _.mapValues(options, function(value) {
39 if (/^[\d\.]+$/.test(value)) {
40 return parseFloat(value);
41 }
42 return value;
43 });
44 result.global = exports.parseOptions(state.globalOptions, options);
45 if (!_.isEmpty(output._)) {
46 output._ = _.map(output._, function(word) {
47 var wordParameter;
48 wordParameter = new Parameter(word);
49 return wordParameter.toString();
50 });
51 result.command = output._.join(' ');
52 }
53 return result;
54};
55
56exports.split = function(string) {
57 var pair, regex, result;
58 if (string == null) {
59 return [];
60 }
61 regex = '';
62 pair = function(arg) {
63 var end, start;
64 start = arg[0], end = arg[1];
65 start = '\\' + start;
66 end = '\\' + end;
67 return regex += start + "[^" + end + "]+" + end + "|";
68 };
69 pair('[]');
70 pair('<>');
71 pair('""');
72 pair("''");
73 regex += '\\S+';
74 result = string.match(new RegExp(regex, 'g')) || [];
75 return _.map(result, function(word) {
76 word = _.str.unquote(word, '\'');
77 word = _.str.unquote(word, '"');
78 return word;
79 });
80};
81
82exports.parseOptions = function(definedOptions, options) {
83 var definedOption, i, len, result, signature, value;
84 if (options == null) {
85 options = {};
86 }
87 result = {};
88 for (i = 0, len = definedOptions.length; i < len; i++) {
89 definedOption = definedOptions[i];
90 signature = definedOption.signature;
91 value = definedOption.getOptionsValue(options);
92 if ((definedOption.required != null) && (value == null)) {
93 if (_.isString(definedOption.required)) {
94 throw new Error(definedOption.required);
95 } else if (definedOption.required) {
96 throw new Error("Option " + definedOption.signature + " is required");
97 }
98 }
99 if (!definedOption.matches(value)) {
100 continue;
101 }
102 if (/^\d+$/.test(value)) {
103 value = _.parseInt(value);
104 }
105 result[signature] = value;
106 }
107 return result;
108};