UNPKG

3.07 kBJavaScriptView Raw
1"use strict";
2
3/**
4 * Module dependencies.
5 */
6
7var _ = require("lodash")
8 ;
9
10var util = {
11
12 /**
13 * Parses command arguments from multiple
14 * sources.
15 *
16 * @param {String} value
17 * @param {String} env
18 * @param {String} file
19 * @return {Array}
20 * @api private
21 */
22
23 parseArgs: function(value, env, file) {
24 var reg = /[^\s'"]+|['"]([^'"]*)['"]/gi, str = value, arr = [], match;
25 if (env) { arr.push(env); }
26 if (file) { arr.push(file); }
27 do {
28 match = reg.exec(str);
29 if (match !== null) {
30 arr.push(match[1] ? match[1] : match[0]);
31 }
32 } while (match !== null);
33 return arr;
34 },
35
36 /**
37 * Makes an argument name pretty for help.
38 *
39 * @param {String} arg
40 * @return {String}
41 * @api private
42 */
43
44 humanReadableArgName: function(arg) {
45 var nameOutput = arg.name + (arg.variadic === true ? "..." : "");
46 return arg.required
47 ? "<" + nameOutput + ">"
48 : "[" + nameOutput + "]";
49 },
50
51 /**
52 * Formats an array to display in a TTY
53 * in a pretty fashion.
54 *
55 * @param {Array} arr
56 * @return {String}
57 * @api public
58 */
59
60 prettifyArray: function(arr) {
61 arr = arr || [];
62 var width = process.stdout.columns;
63 var longest = (arr.sort(function(a, b) { return b.length - a.length; })[0] || "").length + 2;
64 var fullWidth = String(arr.join("")).length;
65 var fitsOneLine = ((fullWidth + (arr.length * 2)) <= width) ? true : false;
66 var cols = Math.floor(width / longest);
67 cols = (cols < 1) ? 1 : cols;
68 if (fitsOneLine) {
69 return arr.join(" ");
70 } else {
71 arr = arr.sort();
72 var col = 1;
73 var lines = [];
74 var line = "";
75 for (var i = 0; i < arr.length; ++i) {
76 if (col < cols) {
77 col++;
78 } else {
79 lines.push(line);
80 line = "";
81 col = 1;
82 }
83 line += this.pad(arr[i], longest, " ");
84 }
85 if (line != "") {
86 lines.push(line);
87 }
88 return lines.join("\n");
89 }
90 },
91
92 /**
93 * Pads a value with with space or
94 * a specified delimiter to match a
95 * given width.
96 *
97 * @param {String} str
98 * @param {Integer} width
99 * @param {String} delimiter
100 * @return {String}
101 * @api private
102 */
103
104 pad: function(str, width, delimiter) {
105 width = Math.floor(width);
106 delimiter = delimiter || " ";
107 var len = Math.max(0, width - str.length);
108 return str + Array(len + 1).join(delimiter);
109 },
110
111 // When passing down applied args, we need to turn
112 // them from `{ '0': 'foo', '1': 'bar' }` into ["foo", "bar"]
113 // instead.
114 fixArgsForApply: function(obj) {
115 if (!_.isObject(obj)) {
116 if (!_.isArray(obj)) {
117 return [obj];
118 } else {
119 return obj;
120 }
121 }
122 var argArray = [];
123 _.each(obj, function(aarg) {
124 argArray.push(aarg);
125 });
126 return argArray;
127 }
128};
129
130/**
131 * Expose `util`.
132 */
133
134module.exports = exports = util;
135
136