Skip to content

Commit c74574b

Browse files
authored
feat(webpack-cli): create a cli executer (#1255)
* feat: create cli executer * chore: remove unused variables * fix: code style * chore: use for await * chore: add descriptions for options
1 parent 8f3259e commit c74574b

File tree

4 files changed

+74
-6
lines changed

4 files changed

+74
-6
lines changed

packages/webpack-cli/bin/cli.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
'use strict';
44
require('v8-compile-cache');
5-
const execa = require('execa');
65
const importLocal = require('import-local');
76
const parseArgs = require('../lib/utils/parse-args');
7+
const runner = require('../lib/runner');
88

99
// Prefer the local installation of webpack-cli
1010
if (importLocal(__filename)) {
@@ -14,8 +14,5 @@ process.title = 'webpack';
1414

1515
const [, , ...rawArgs] = process.argv;
1616
const { cliArgs, nodeArgs } = parseArgs(rawArgs);
17-
const bootstrapPath = require.resolve('../lib/bootstrap');
1817

19-
execa('node', [...nodeArgs, bootstrapPath, ...cliArgs], { stdio: 'inherit' }).catch(e => {
20-
process.exit(e.exitCode);
21-
});
18+
runner(nodeArgs, cliArgs);

packages/webpack-cli/lib/bootstrap.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const WebpackCLI = require('./webpack-cli');
22
const { core, commands } = require('./utils/cli-flags');
33
const logger = require('./utils/logger');
4+
const cliExecuter = require('./utils/cli-executer');
45

56
require('./utils/process-log');
67

@@ -68,7 +69,8 @@ async function runCLI(cli, commandIsUsed) {
6869
.forEach(unknown => {
6970
logger.warn('Unknown argument:', unknown);
7071
});
71-
return cli.runHelp(process.argv);
72+
cliExecuter();
73+
return;
7274
}
7375
const result = await cli.run(args, core);
7476
if (!result) {

packages/webpack-cli/lib/runner.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const execa = require('execa');
2+
const cliPath = require.resolve('./bootstrap.js');
3+
4+
function runner(nodeArgs, cliArgs) {
5+
execa("node", [...nodeArgs, cliPath, ...cliArgs], {stdio: 'inherit'}).catch(e => {
6+
process.exit(e.exitCode);
7+
});
8+
}
9+
10+
module.exports = runner;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const { MultiSelect, Input } = require('enquirer');
2+
const runner = require('../runner');
3+
const logger = require('./logger');
4+
const cliArgs = require('./cli-flags').core;
5+
6+
async function prompter() {
7+
const args = [];
8+
9+
const typePrompt = new MultiSelect({
10+
name: 'type',
11+
message: 'Which flags do you want to use?',
12+
choices: cliArgs.reduce((prev, curr) => {
13+
return [...prev, `--${curr.name}: ${curr.description}`];
14+
}, []),
15+
result: (value) => {
16+
return value.map((flag) => flag.split(":")[0]);
17+
}
18+
});
19+
20+
const selections = await typePrompt.run();
21+
22+
const boolArgs = [];
23+
const questions = [];
24+
selections.forEach(selection => {
25+
const options = cliArgs.find(flag => {
26+
return flag.name === selection.slice(2);
27+
});
28+
29+
if (options.type === Boolean) {
30+
boolArgs.push(selection);
31+
return;
32+
}
33+
34+
const valuePrompt = new Input({
35+
name: 'value',
36+
message: `Enter value of the ${selection} flag`,
37+
initial: options.defaultValue,
38+
result: (value) => [selection, value]
39+
});
40+
questions.push(valuePrompt);
41+
});
42+
43+
// Create promise chain to force synchronous prompt of question
44+
for await (question of questions) {
45+
const flagArgs = await question.run();
46+
args.push(...flagArgs);
47+
}
48+
49+
return [...args, ...boolArgs];
50+
}
51+
52+
async function run() {
53+
const args = await prompter();
54+
process.stdout.write('\n');
55+
logger.info(`Executing CLI\n`);
56+
runner([], args);
57+
}
58+
59+
module.exports = run;

0 commit comments

Comments
 (0)