UNPKG

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