UNPKG

2.99 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 if (!validateFlags(flags, argv)) {
67 return null;
68 }
69
70 for (const group of groups) {
71 result = group.apply(argv, result);
72 }
73
74 return result;
75 },
76
77 help() {
78 let rows = [];
79 const groups = allFlags.slice(0);
80 const options = {
81 align: ['l', 'l'],
82 stringLength(str) {
83 return strip(str).length;
84 },
85 };
86
87 for (const group of groups) {
88 rows = rows.concat(getGroupHelp(group));
89 rows.push(['', '']);
90 }
91
92 return table(rows, options);
93 },
94
95 getFlags(includeAlias = true) {
96 const groups = allFlags.slice(0);
97 let result = {};
98
99 for (const group of groups) {
100 const { flags } = group;
101 result = Object.assign(result, flags);
102
103 if (includeAlias) {
104 const aliases = {};
105 for (const flag of Object.values(flags).filter((f) => !!f.alias)) {
106 aliases[flag.alias] = flag;
107 }
108
109 result = Object.assign(result, aliases);
110 }
111 }
112
113 return result;
114 },
115
116 opts() {
117 const result = {};
118 const groups = allFlags.slice(0);
119
120 for (const group of groups) {
121 for (const key of Object.keys(group.flags)) {
122 const flag = Object.assign({}, group.flags[key]);
123
124 delete flag.desc;
125 delete flag.deprecated;
126
127 result[key] = flag;
128 }
129 }
130
131 return result;
132 },
133};