1 | const chalk = require('chalk');
|
2 | const merge = require('merge-options');
|
3 | const strip = require('strip-ansi');
|
4 | const table = require('text-table');
|
5 |
|
6 | const advanced = require('./advanced.js');
|
7 | const config = require('./config.js');
|
8 | const general = require('./general.js');
|
9 | const modul = require('./module.js');
|
10 | const optimization = require('./optimization.js');
|
11 | const output = require('./output.js');
|
12 | const resolver = require('./resolver.js');
|
13 | const { validateFlags } = require('./util');
|
14 |
|
15 | const allFlags = [
|
16 | general,
|
17 | advanced,
|
18 | config,
|
19 | modul,
|
20 | optimization,
|
21 | output,
|
22 | resolver,
|
23 | ];
|
24 |
|
25 | function 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 |
|
57 | module.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 |
|
65 |
|
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 | };
|