1 | ;
|
2 | var _ = require("../lodash.custom");
|
3 | var 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 | */
|
14 | function 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 | }
|
22 | Object.defineProperty(exports, "__esModule", { value: true });
|
23 | exports.default = parse;
|
24 | function 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 | }
|
52 | function 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 | */
|
202 | var negatedBool = /^no-(.*)/;
|
203 | function 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 | */
|
291 | function 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 | }
|
307 | function 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 | }
|
364 | function isFlag(incoming) {
|
365 | return incoming.slice(0, 2) === "--" || incoming[0] === "-";
|
366 | }
|
367 | // With thanks to yargs parser
|
368 | function 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 | }
|
398 | function 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 | }
|
408 | function 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 | }
|
416 | function 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 |