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 |
|
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 | };
|