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 = [general, advanced, config, modul, optimization, output, resolver];
|
16 |
|
17 | function 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 |
|
49 | module.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 |
|
57 |
|
58 |
|
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 | };
|