-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoptions.js
More file actions
111 lines (100 loc) · 2.95 KB
/
options.js
File metadata and controls
111 lines (100 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Copyright 2015 Red Hat Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
var util = require('util');
var minimist = require('minimist');
function describe (optdef) {
var desc = ' --' + optdef.name;
if (optdef.alias) desc += ' (-' + optdef.alias + ')';
if (optdef.describe) desc += ' ' + optdef.describe;
if (optdef.default) desc += ' (default=' + optdef.default +')';
return desc;
}
function print (s) {
console.log(s);
}
function usage (options, usage) {
console.log(usage || 'options:');
options.map(describe).forEach(print);
}
function as_array (options) {
var out = [];
for (var o in options) {
var definition = options[o];
if (definition.alias) {
if (definition.alias.length > o.length) {
definition.name = definition.alias;
definition.alias = o;
} else {
definition.name = o;
}
} else {
definition.name = o;
}
out.push(definition);
}
return out;
}
function get_type(o) {
if (typeof o == 'number' || o instanceof Number) {
return 'number';
} else if (util.isArray(o)) {
return get_type(o[0]);
} else {
return 'string';
}
}
function Options (options) {
this.options = options;
var minimist_opts = {
'string': [],
'number': [],
'boolean': [],
'alias': {},
'default' : {}
};
this.options.forEach(function (definition) {
if (definition.alias) {
minimist_opts.alias[definition.name] = definition.alias;
}
if (definition.default !== undefined) {
minimist_opts.default[definition.name] = definition.default;
}
if (definition.type === 'boolean') {
minimist_opts.boolean.push(definition.name);
} else if (definition.default !== undefined) {
minimist_opts[get_type(definition.default)].push(definition.name);
}
});
this.argv = minimist(process.argv.slice(2), minimist_opts);
}
Options.prototype.help = function (name) {
var field = name || 'help';
if (this.argv[name]) {
usage(this.options, this.usage_text);
process.exit(0);
}
return this;
}
Options.prototype.usage = function (usage) {
this.usage_text = usage;
return this;
}
module.exports = {
options : function (options) {
return new Options(as_array(options));
}
};