1 | var Parameter, _, minimist, settings, state;
|
2 |
|
3 | _ = require('lodash');
|
4 |
|
5 | _.str = require('underscore.string');
|
6 |
|
7 | minimist = require('minimist');
|
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 = minimist(argv);
|
32 | options = _.omit(output, '_');
|
33 | result = {};
|
34 | result.options = options;
|
35 | result.global = exports.parseOptions(state.globalOptions, options);
|
36 | if (!_.isEmpty(output._)) {
|
37 | output._ = _.map(output._, function(word) {
|
38 | var wordParameter;
|
39 | wordParameter = new Parameter(word);
|
40 | return wordParameter.toString();
|
41 | });
|
42 | result.command = output._.join(' ');
|
43 | }
|
44 | return result;
|
45 | };
|
46 |
|
47 | exports.split = function(string) {
|
48 | var pair, regex, result;
|
49 | if (string == null) {
|
50 | return [];
|
51 | }
|
52 | regex = '';
|
53 | pair = function(arg) {
|
54 | var end, start;
|
55 | start = arg[0], end = arg[1];
|
56 | start = '\\' + start;
|
57 | end = '\\' + end;
|
58 | return regex += start + "[^" + end + "]+" + end + "|";
|
59 | };
|
60 | pair('[]');
|
61 | pair('<>');
|
62 | pair('""');
|
63 | pair("''");
|
64 | regex += '\\S+';
|
65 | result = string.match(new RegExp(regex, 'g')) || [];
|
66 | return _.map(result, function(word) {
|
67 | word = _.str.unquote(word, '\'');
|
68 | word = _.str.unquote(word, '"');
|
69 | return word;
|
70 | });
|
71 | };
|
72 |
|
73 | exports.parseOptions = function(definedOptions, options) {
|
74 | var definedOption, i, len, result, signature, value;
|
75 | if (options == null) {
|
76 | options = {};
|
77 | }
|
78 | result = {};
|
79 | for (i = 0, len = definedOptions.length; i < len; i++) {
|
80 | definedOption = definedOptions[i];
|
81 | signature = definedOption.signature;
|
82 | value = definedOption.getOptionsValue(options);
|
83 | if ((definedOption.required != null) && (value == null)) {
|
84 | if (_.isString(definedOption.required)) {
|
85 | throw new Error(definedOption.required);
|
86 | } else if (definedOption.required) {
|
87 | throw new Error("Option " + definedOption.signature + " is required");
|
88 | }
|
89 | }
|
90 | if (!definedOption.matches(value)) {
|
91 | continue;
|
92 | }
|
93 | if (/^\d+$/.test(value)) {
|
94 | value = _.parseInt(value);
|
95 | }
|
96 | result[signature] = value;
|
97 | }
|
98 | return result;
|
99 | };
|