1 | var Parameter, _, settings, state, yargsParser;
|
2 |
|
3 | _ = require('lodash');
|
4 |
|
5 | _.str = require('underscore.string');
|
6 |
|
7 | yargsParser = require('yargs-parser');
|
8 |
|
9 | settings = require('./settings');
|
10 |
|
11 | state = require('./state');
|
12 |
|
13 | Parameter = require('./parameter');
|
14 |
|
15 | exports.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 |
|
28 | exports.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 |
|
56 | exports.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 |
|
82 | exports.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 | };
|