UNPKG

3.02 kBJavaScriptView Raw
1const chalk = require('chalk');
2const merge = require('merge-options');
3const strip = require('strip-ansi');
4const table = require('text-table');
5
6const advanced = require('./advanced.js');
7const config = require('./config.js'); // eslint
8const general = require('./general.js');
9const modul = require('./module.js'); // eslint
10const optimization = require('./optimization.js'); // eslint
11const output = require('./output.js'); // eslint
12const resolver = require('./resolver.js'); // eslint
13const { validateFlags } = require('./util');
14
15const allFlags = [
16 general,
17 advanced,
18 config,
19 modul,
20 optimization,
21 output,
22 resolver,
23];
24
25function getGroupHelp(group) {
26 const rows = [];
27 const { name } = group;
28
29 if (name !== 'General') {
30 rows.push([chalk`{underline ${group.name}}`, '']);
31 }
32
33 for (const flagName of Object.keys(group.flags)) {
34 const flag = group.flags[flagName];
35 let { desc } = flag;
36 const { deprecated } = flag;
37
38 if (deprecated) {
39 desc = chalk`{bold Deprecated.} Please use ${deprecated}.\n${desc}`;
40 }
41
42 const lines = desc.split('\n');
43 const [description] = lines.splice(0, 1);
44
45 rows.push([` --${flagName}`, description]);
46
47 if (lines.length > 0) {
48 for (const line of lines) {
49 rows.push(['', line]);
50 }
51 }
52 }
53
54 return rows;
55}
56
57module.exports = {
58 apply(argv, options) {
59 const groups = allFlags.slice(0);
60 const { getFlags } = module.exports;
61 const flags = getFlags();
62 let result = merge({}, options);
63
64 // two loops may seem silly, but it's good UX to validate all the flags at
65 // once. this is also familiar to users of linters.
66 /* istanbul ignore if */
67 if (!validateFlags(flags, argv)) {
68 return null;
69 }
70
71 for (const group of groups) {
72 result = group.apply(argv, result);
73 }
74
75 return result;
76 },
77
78 help() {
79 let rows = [];
80 const groups = allFlags.slice(0);
81 const options = {
82 align: ['l', 'l'],
83 stringLength(str) {
84 return strip(str).length;
85 },
86 };
87
88 for (const group of groups) {
89 rows = rows.concat(getGroupHelp(group));
90 rows.push(['', '']);
91 }
92
93 return table(rows, options);
94 },
95
96 getFlags(includeAlias = true) {
97 const groups = allFlags.slice(0);
98 let result = {};
99
100 for (const group of groups) {
101 const { flags } = group;
102 result = Object.assign(result, flags);
103
104 if (includeAlias) {
105 const aliases = {};
106 for (const flag of Object.values(flags).filter((f) => !!f.alias)) {
107 aliases[flag.alias] = flag;
108 }
109
110 result = Object.assign(result, aliases);
111 }
112 }
113
114 return result;
115 },
116
117 opts() {
118 const result = {};
119 const groups = allFlags.slice(0);
120
121 for (const group of groups) {
122 for (const key of Object.keys(group.flags)) {
123 const flag = Object.assign({}, group.flags[key]);
124
125 delete flag.desc;
126 delete flag.deprecated;
127
128 result[key] = flag;
129 }
130 }
131
132 return result;
133 },
134};