UNPKG

26.8 kBJavaScriptView Raw
1"use strict";
2var _ = require("../lodash.custom");
3var CliFlagTypes;
4(function (CliFlagTypes) {
5 CliFlagTypes[CliFlagTypes["Array"] = "array"] = "Array";
6 CliFlagTypes[CliFlagTypes["String"] = "string"] = "String";
7 CliFlagTypes[CliFlagTypes["Boolean"] = "boolean"] = "Boolean";
8 CliFlagTypes[CliFlagTypes["Number"] = "number"] = "Number";
9 CliFlagTypes[CliFlagTypes["Count"] = "count"] = "Count";
10})(CliFlagTypes = exports.CliFlagTypes || (exports.CliFlagTypes = {}));
11/**
12 * Accept either string or array input
13 */
14function parse(input, opts) {
15 opts = opts || {};
16 if (Array.isArray(input)) {
17 return parseArray(input, opts);
18 }
19 // string given
20 return parseArray(tokenize(input), opts);
21}
22Object.defineProperty(exports, "__esModule", { value: true });
23exports.default = parse;
24function parseArray(incoming, opts) {
25 var command = incoming[0];
26 var args = (function () {
27 var _incoming = incoming.slice(1);
28 var _terminator = _incoming.indexOf("--");
29 if (_terminator > -1) {
30 return {
31 args: _incoming.slice(0, _terminator),
32 trailing: _incoming.slice(_terminator + 1).join(" ")
33 };
34 }
35 return {
36 args: _incoming,
37 trailing: ""
38 };
39 })();
40 var split = splitInputFromFlags(args.args);
41 var flagValues = resolveValues(split.flags, opts);
42 var flattened = flattenValues(flagValues.flags);
43 return {
44 command: command,
45 input: [command].concat(split.input, flagValues.input),
46 rawFlags: split.flags,
47 flagValues: flagValues.flags,
48 flags: flattened,
49 trailing: args.trailing
50 };
51}
52function splitInputFromFlags(args) {
53 var firstFlag = firstFlagPos(args);
54 var trailing = [];
55 /**
56 * Input is args directly after the command, or at the end
57 * eg:
58 * $ crossbow run task1 task2 -p 8000
59 * ->
60 * ['task1', 'task2']
61 * eg:
62 * $ crossbow run task1 task2 -p 8000 -- task3 task4
63 * ->
64 * ['task1', 'task2', 'task3', 'task4']
65 */
66 var input = (function () {
67 // no flags given
68 if (firstFlag === -1)
69 return args.slice();
70 // flag given at first position, so no input
71 if (firstFlag === 0)
72 return [];
73 // flag at later point, so slice items upto it
74 return args.slice(0, firstFlag);
75 })();
76 /**
77 * Create the raw flags array
78 * @type {any[][]}
79 */
80 var flags = args
81 .reduce(function groupRight(acc, item, i) {
82 if (isFlag(item)) {
83 return acc.concat([args.slice(i)]);
84 }
85 return acc;
86 }, [])
87 .map(function getSubSection(flag) {
88 /**
89 * Get the slice index (if followed by another flag at some point
90 */
91 var slicePoint = (function () {
92 return flag.slice(1)
93 .reduce(function (acc, item, i) {
94 if (acc === -1) {
95 // not set
96 if (isFlag(item))
97 return i + 1;
98 }
99 return acc;
100 }, -1);
101 })();
102 /**
103 * If no flag followed, check if the first item is itself a flag.
104 * Situations that would lead us here include:
105 * eg:
106 * [ '-pc' ]
107 */
108 if (slicePoint === -1) {
109 if (isFlag(flag[0])) {
110 if (hasSetter(flag[0])) {
111 /**
112 * Slice everything to the end and add to the input array
113 */
114 input = input.concat(flag.slice(1));
115 return flag.slice(0, 1);
116 }
117 }
118 /**
119 * At this point, there was NO FLAG FOLLOWING this flag, so any items
120 * after it are considered to be belong to this item.
121 * eg:
122 *
123 * 'run -p 8000 -v $(pwd):/var/www --before task1 task2
124 *
125 * -> task1 & task2 are values of --before & not program inputs
126 */
127 return flag;
128 }
129 /**
130 * Outgoing array is the sliced subsection,
131 * eg:
132 * [ '--before', 'task2', 'task3' ]
133 */
134 var outgoing = flag.slice(0, slicePoint);
135 /**
136 * A final check if the first item was a setter (ie, it contained an equals = sign).
137 * If so, we only want that item and again shove the other items into the input
138 * eg:
139 *
140 * [ '--beep=boop', 'task1', 'task2' ]
141 *
142 * -> task1 & task2 go to the input and --beep=boop used separately
143 */
144 if (hasSetter(outgoing[0])) {
145 input = input.concat(outgoing.slice(1));
146 return [outgoing[0]];
147 }
148 /**
149 * Standard use-case when we reach here, like
150 * [ '-p' ]
151 * [ '--before', 'task2', 'task3' ]
152 * [ '-pc', 'another' ]
153 * etc
154 */
155 return flag.slice(0, slicePoint);
156 })
157 .map(function splitSetters(item) {
158 if (item.length === 1) {
159 return item[0].split(/=/);
160 }
161 return item;
162 })
163 .reduce(function normalizeFormat(acc, item) {
164 if (item.length === 1) {
165 // Double flag
166 if (item[0].slice(0, 2) === "--") {
167 return acc.concat([item]);
168 }
169 // Single flag
170 var current = item[0].slice(1);
171 return acc.concat(current.split("").map(function (x) { return ["-" + x]; }));
172 }
173 /**
174 * If -- encountered at the end, push items onto input
175 */
176 if (item[0] === "--") {
177 trailing.push.apply(trailing, item.slice(1));
178 return acc;
179 }
180 return acc.concat([item]);
181 }, [])
182 .map(function createObject(x) {
183 return [propName(x[0])].concat(x.slice(1));
184 });
185 return { input: input, flags: flags };
186}
187/**
188 * At this stage, every flag has a values collections.
189 * Depending on the type (if given) - try to set the value to
190 * what the user expects.
191 * eg:
192 * -vvv
193 *
194 * config: {v: {type: count}}
195 *
196 * ->
197 * {v: 3}
198 *
199 * @param flagValues
200 * @returns {{}}
201 */
202var negatedBool = /^no-(.*)/;
203function flattenValues(flagValues) {
204 return Object.keys(flagValues).reduce(function (obj, key) {
205 /**
206 * Here, current would be the values associated with
207 * a flag.
208 * eg: values: [true, true]
209 */
210 var current = flagValues[key];
211 /**
212 * The keyToSet may be the same as the current item,
213 * or if negated could be minus the no-(.*) section
214 * eg:
215 * no-fail -> fail
216 * suppress -> suppress
217 */
218 var keyToSet = key;
219 /**
220 * Now we determine which value should
221 * be set on the current item.
222 */
223 var valueToSet = (function () {
224 /**
225 * Did the used try to negate a boolean.
226 *
227 * eg:
228 *
229 * property name = `fail`
230 * user provided = `--no-fail`
231 *
232 * => fail: false
233 */
234 if (negatedBool.test(key)) {
235 keyToSet = key.slice(3);
236 return false;
237 }
238 var outgoing = current.values;
239 /**
240 * If type is array, never touch the values, return them
241 * directly instead
242 */
243 if (current.type === CliFlagTypes.Array) {
244 return outgoing;
245 }
246 /**
247 * If type === 'count'
248 */
249 if (current.type === CliFlagTypes.Count) {
250 return outgoing.length;
251 }
252 /**
253 * If the users always wants a number
254 */
255 if (current.type === CliFlagTypes.Number) {
256 outgoing = current.values.map(Number);
257 }
258 /**
259 * If the users always wants a number
260 */
261 if (current.type === CliFlagTypes.Boolean) {
262 outgoing = current.values.map(Boolean);
263 }
264 /**
265 * If the users always wants a number
266 */
267 if (current.type === CliFlagTypes.String) {
268 outgoing = current.values.map(String);
269 }
270 /**
271 * If there was only a single value, just return the single value
272 */
273 if (outgoing.length === 1)
274 return outgoing[0];
275 /**
276 * Return everything in the values array (this accounts for multiples)
277 */
278 return outgoing;
279 })();
280 /**
281 * And finally we use the key & value
282 * determined to set this item on the flags
283 */
284 _.set(obj, keyToSet, valueToSet);
285 return obj;
286 }, {});
287}
288/**
289 * Either add a value to an existing values[] or create a new one.
290 */
291function addValuesToKey(key, values, target) {
292 var current = target[key];
293 // add 'true' where there's no value
294 var valuesToAdd = (function () {
295 if (values.length === 0)
296 return [true];
297 return values;
298 })();
299 // new
300 if (current === undefined) {
301 target[key] = { values: valuesToAdd };
302 return;
303 }
304 // existing
305 current.values.push.apply(current.values, valuesToAdd);
306}
307function resolveValues(flags, opts) {
308 var keys = Object.keys(opts);
309 /**
310 * Create a matching object as given options, but with
311 * 'values' array
312 */
313 var output = (function () {
314 return keys.reduce(function (obj, key) {
315 obj[key] = _.assign({}, opts[key]);
316 obj[key].values = [];
317 return obj;
318 }, {});
319 })();
320 var dangling = [];
321 /**
322 * Look at each item and decide how to add this value
323 * (it may be an alias etc)
324 */
325 flags.forEach(function (flag) {
326 var key = flag[0];
327 // key === p
328 var aliasMatch = keys.filter(function (x) {
329 return [].concat(opts[x].alias).indexOf(key) > -1;
330 });
331 var keyToAdd = (function () {
332 if (aliasMatch.length)
333 return aliasMatch[0];
334 return key;
335 })();
336 if (flag.length === 1) {
337 addValuesToKey(keyToAdd, [], output);
338 return;
339 }
340 else if (flag.length > 1) {
341 if (!opts[keyToAdd] || (opts[keyToAdd].type !== CliFlagTypes.Array)) {
342 addValuesToKey(keyToAdd, flag.slice(1, 2), output);
343 dangling.push.apply(dangling, flag.slice(2));
344 return;
345 }
346 }
347 // Here the current flag was not specified
348 // in the options, so just add it
349 addValuesToKey(keyToAdd, flag.slice(1), output);
350 });
351 /**
352 * Finally, strip anything that does not contain a
353 * value. This happens when a user provided an option,
354 * but no flag was given.
355 */
356 var outgoing = Object.keys(output).reduce(function (obj, key) {
357 if (!output[key].values.length)
358 return obj;
359 obj[key] = output[key];
360 return obj;
361 }, {});
362 return { flags: outgoing, input: dangling };
363}
364function isFlag(incoming) {
365 return incoming.slice(0, 2) === "--" || incoming[0] === "-";
366}
367// With thanks to yargs parser
368function tokenize(argString) {
369 if (Array.isArray(argString))
370 return argString;
371 var i = 0;
372 var c = null;
373 var opening = null;
374 var args = [];
375 for (var ii = 0; ii < argString.length; ii++) {
376 c = argString.charAt(ii);
377 // split on spaces unless we're in quotes.
378 if (c === " " && !opening) {
379 i++;
380 continue;
381 }
382 // don't split the string if we're in matching
383 // opening or closing single and double quotes.
384 if (c === opening) {
385 opening = null;
386 continue;
387 }
388 else if ((c === "'" || c === "\"") && !opening) {
389 opening = c;
390 continue;
391 }
392 if (!args[i])
393 args[i] = "";
394 args[i] += c;
395 }
396 return args;
397}
398function firstFlagPos(items) {
399 var i = -1;
400 items.some(function (x, index) {
401 if (isFlag(x)) {
402 i = index;
403 return true;
404 }
405 });
406 return i;
407}
408function hasSetter(incoming) {
409 var equals = incoming.indexOf("=");
410 if (equals === -1)
411 return false;
412 if (incoming.length > equals + 1)
413 return true;
414 return false;
415}
416function propName(incoming) {
417 return incoming.replace(/^--?/, "");
418}
419//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLnBhcnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS5wYXJzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFrQ3RDLElBQVksWUFNWDtBQU5ELFdBQVksWUFBWTtJQUNwQixxQ0FBYSxPQUFPLFdBQUEsQ0FBQTtJQUNwQixzQ0FBYyxRQUFRLFlBQUEsQ0FBQTtJQUN0Qix1Q0FBZSxTQUFTLGFBQUEsQ0FBQTtJQUN4QixzQ0FBYyxRQUFRLFlBQUEsQ0FBQTtJQUN0QixxQ0FBYSxPQUFPLFdBQUEsQ0FBQTtBQUN4QixDQUFDLEVBTlcsWUFBWSxHQUFaLG9CQUFZLEtBQVosb0JBQVksUUFNdkI7QUFnQkQ7O0dBRUc7QUFDSCxlQUE4QixLQUFzQixFQUFFLElBQWtCO0lBQ3BFLElBQUksR0FBRyxJQUFJLElBQWlCLEVBQUUsQ0FBQztJQUUvQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZUFBZTtJQUNmLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdDLENBQUM7O0FBVEQsd0JBU0M7QUFFRCxvQkFBb0IsUUFBa0IsRUFBRSxJQUFpQjtJQUVyRCxJQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBTSxJQUFJLEdBQUcsQ0FBQztRQUNWLElBQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxFQUFFLENB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QUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQyxDQUFDO1NBU0QsTUFBTSxDQUFDLHlCQUF5QixHQUFHLEVBQUUsSUFBSTtRQUN0QyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFcEIsY0FBYztZQUNkLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBRUQsY0FBYztZQUNkLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLE1BQUksQ0FBRyxDQUFDLEVBQVQsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxDQUFDLEdB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
\No newline at end of file