UNPKG

3.24 kBJavaScriptView Raw
1const push = Array.prototype.push
2const SHORTSPLIT = /$|[!-@\[-`{-~]/
3
4module.exports = function(args, opts) {
5 opts = opts || {}
6 return parse(
7 args,
8 aliases(opts.alias),
9 defaults(opts.default, opts.alias),
10 opts.unknown,
11 { _: [] }
12 )
13}
14
15function parse(args, aliases, defaults, unknown, out) {
16 for (var i = 0, j = 0, len = args.length, _ = out._; i < len; i++) {
17 var arg = args[i]
18
19 if ("--" === arg) {
20 push.apply(_, args.slice(i + 1))
21 break
22 } else if ("-" === arg[0]) {
23 if ("-" === arg[1]) {
24 var end = arg.indexOf("=")
25 if (0 <= end) {
26 set(arg.slice(2, end), arg.slice(end + 1), out, aliases, unknown)
27 } else {
28 if ("n" === arg[2] && "o" === arg[3] && "-" === arg[4]) {
29 set(arg.slice(5), false, out, aliases, unknown)
30 } else {
31 set(
32 arg.slice(2),
33 (j = i + 1) === len || "-" === args[j][0] || args[(i = j)],
34 out,
35 aliases,
36 unknown
37 )
38 }
39 }
40 } else {
41 var end = arg.slice(2).search(SHORTSPLIT) + 2
42 var value = end === arg.length
43 ? (j = i + 1) === len || "-" === args[j][0] || args[(i = j)]
44 : arg.slice(end)
45
46 for (j = 1; j < end; ) {
47 set(arg[j], ++j !== end || value, out, aliases, unknown)
48 }
49 }
50 } else {
51 _.push(arg)
52 }
53 }
54
55 for (var key in defaults) {
56 if (undefined === out[key]) {
57 out[key] = defaults[key]
58 }
59 }
60
61 return out
62}
63
64function aliases(aliases) {
65 var out = {}
66
67 for (var key in aliases) {
68 var alias = (out[key] = toArray(aliases[key]))
69
70 for (var i = 0, len = alias.length; i < len; i++) {
71 var name = alias[i]
72 out[name] = [key]
73
74 for (var j = 0; j < len; j++) {
75 var next = alias[j]
76 if (next !== name) {
77 out[name].push(next)
78 }
79 }
80 }
81 }
82
83 return out
84}
85
86function defaults(defaults, aliases) {
87 if (undefined !== defaults) {
88 for (var key in aliases) {
89 var value = defaults[key]
90 var alias = toArray(aliases[key])
91
92 if (undefined !== value) {
93 for (var i = 0, len = alias.length; i < len; i++) {
94 defaults[alias[i]] = value
95 }
96 } else {
97 for (var i = 0, len = alias.length; i < len; i++) {
98 if (undefined !== (value = defaults[alias[i]])) {
99 defaults[key] = value
100
101 for (var j = 0; j < len; j++) {
102 if (i !== j) {
103 defaults[alias[j]] = value
104 }
105 }
106 }
107 }
108 }
109 }
110 }
111 return defaults
112}
113
114function set(key, value, out, aliases, unknown) {
115 var curr = out[key]
116 var alias = aliases[key]
117 var hasAlias = undefined !== alias
118
119 if (hasAlias || undefined === unknown || unknown(key) !== false) {
120 if (undefined === curr) {
121 out[key] = value
122 } else {
123 if (Array.isArray(curr)) {
124 curr.push(value)
125 } else {
126 out[key] = [curr, value]
127 }
128 }
129
130 if (hasAlias) {
131 for (var i = 0, len = alias.length; i < len; ) {
132 out[alias[i++]] = out[key]
133 }
134 }
135 }
136}
137
138function toArray(any) {
139 return Array.isArray(any) ? any : [any]
140}