Skip to content

Commit 603041d

Browse files
feat: allow to run commands without webpack installation where it is unnecessary (#2907)
1 parent b1a6663 commit 603041d

18 files changed

+318
-256
lines changed

packages/configtest/src/index.ts

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1+
const WEBPACK_PACKAGE = process.env.WEBPACK_PACKAGE || "webpack";
2+
13
class ConfigTestCommand {
24
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
35
async apply(cli: any): Promise<void> {
4-
const { logger, webpack } = cli;
5-
66
await cli.makeCommand(
77
{
88
name: "configtest [config-path]",
99
alias: "t",
1010
description: "Validate a webpack configuration.",
1111
pkg: "@webpack-cli/configtest",
12+
dependencies: [WEBPACK_PACKAGE],
1213
},
1314
[],
1415
async (configPath: string | undefined): Promise<void> => {
16+
cli.webpack = await cli.loadWebpack();
17+
1518
const config = await cli.resolveConfig(configPath ? { config: [configPath] } : {});
1619
const configPaths = new Set<string>();
1720

@@ -28,31 +31,31 @@ class ConfigTestCommand {
2831
}
2932

3033
if (configPaths.size === 0) {
31-
logger.error("No configuration found.");
34+
cli.logger.error("No configuration found.");
3235
process.exit(2);
3336
}
3437

35-
logger.info(`Validate '${Array.from(configPaths).join(" ,")}'.`);
38+
cli.logger.info(`Validate '${Array.from(configPaths).join(" ,")}'.`);
3639

3740
try {
3841
// eslint-disable-next-line @typescript-eslint/no-explicit-any
39-
const error: any = webpack.validate(config.options);
42+
const error: any = cli.webpack.validate(config.options);
4043

4144
// TODO remove this after drop webpack@4
4245
if (error && error.length > 0) {
43-
throw new webpack.WebpackOptionsValidationError(error);
46+
throw new cli.webpack.WebpackOptionsValidationError(error);
4447
}
4548
} catch (error) {
4649
if (cli.isValidationError(error)) {
47-
logger.error(error.message);
50+
cli.logger.error(error.message);
4851
} else {
49-
logger.error(error);
52+
cli.logger.error(error);
5053
}
5154

5255
process.exit(2);
5356
}
5457

55-
logger.success("There are no validation errors in the given webpack configuration.");
58+
cli.logger.success("There are no validation errors in the given webpack configuration.");
5659
},
5760
);
5861
}

packages/generators/src/index.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import initGenerator from "./init-generator";
77
class GeneratorsCommand {
88
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
99
async apply(cli: any): Promise<void> {
10-
const { logger } = cli;
11-
1210
await cli.makeCommand(
1311
{
1412
name: "init [generation-path]",
@@ -51,7 +49,7 @@ class GeneratorsCommand {
5149
env.registerStub(initGenerator, generatorName);
5250

5351
env.run(generatorName, { cli, options }, () => {
54-
logger.success("Project has been initialised with webpack!");
52+
cli.logger.success("Project has been initialised with webpack!");
5553
});
5654
},
5755
);
@@ -83,7 +81,7 @@ class GeneratorsCommand {
8381
env.registerStub(loaderGenerator, generatorName);
8482

8583
env.run(generatorName, { cli, options }, () => {
86-
logger.success("Loader template has been successfully scaffolded.");
84+
cli.logger.success("Loader template has been successfully scaffolded.");
8785
});
8886
},
8987
);
@@ -115,7 +113,7 @@ class GeneratorsCommand {
115113
env.registerStub(pluginGenerator, generatorName);
116114

117115
env.run(generatorName, { cli, options }, () => {
118-
logger.success("Plugin template has been successfully scaffolded.");
116+
cli.logger.success("Plugin template has been successfully scaffolded.");
119117
});
120118
},
121119
);

packages/info/src/index.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ const DEFAULT_DETAILS: Information = {
3232
class InfoCommand {
3333
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
3434
async apply(cli: any): Promise<void> {
35-
const { logger } = cli;
36-
3735
await cli.makeCommand(
3836
{
3937
name: "info",
@@ -71,7 +69,7 @@ class InfoCommand {
7169
envinfoConfig["json"] = true;
7270
break;
7371
default:
74-
logger.error(`'${output}' is not a valid value for output`);
72+
cli.logger.error(`'${output}' is not a valid value for output`);
7573
process.exit(2);
7674
}
7775
}
@@ -81,7 +79,7 @@ class InfoCommand {
8179
info = info.replace(/npmPackages/g, "Packages");
8280
info = info.replace(/npmGlobalPackages/g, "Global Packages");
8381

84-
logger.raw(info);
82+
cli.logger.raw(info);
8583
},
8684
);
8785
}

packages/serve/src/index.ts

+22-20
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
import { devServerOptionsType } from "./types";
22

3+
const WEBPACK_PACKAGE = process.env.WEBPACK_PACKAGE || "webpack";
4+
const WEBPACK_DEV_SERVER_PACKAGE = process.env.WEBPACK_DEV_SERVER_PACKAGE || "webpack-dev-server";
5+
36
class ServeCommand {
47
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
58
async apply(cli: any): Promise<void> {
6-
const { logger, webpack } = cli;
7-
89
const loadDevServerOptions = () => {
910
// TODO simplify this after drop webpack v4 and webpack-dev-server v3
10-
// eslint-disable-next-line @typescript-eslint/no-var-requires, node/no-extraneous-require
11-
const devServer = require("webpack-dev-server");
11+
// eslint-disable-next-line @typescript-eslint/no-var-requires
12+
const devServer = require(WEBPACK_DEV_SERVER_PACKAGE);
1213
const isNewDevServerCLIAPI = typeof devServer.schema !== "undefined";
1314

1415
let options = {};
1516

1617
if (isNewDevServerCLIAPI) {
17-
if (webpack.cli && typeof webpack.cli.getArguments === "function") {
18-
options = webpack.cli.getArguments(devServer.schema);
18+
if (cli.webpack.cli && typeof cli.webpack.cli.getArguments === "function") {
19+
options = cli.webpack.cli.getArguments(devServer.schema);
1920
} else {
2021
options = devServer.cli.getArguments();
2122
}
2223
} else {
23-
// eslint-disable-next-line node/no-extraneous-require
24-
options = require("webpack-dev-server/bin/cli-flags");
24+
options = require(`${WEBPACK_DEV_SERVER_PACKAGE}/bin/cli-flags`);
2525
}
2626

2727
// Old options format
@@ -50,15 +50,17 @@ class ServeCommand {
5050
description: "Run the webpack dev server.",
5151
usage: "[entries...] [options]",
5252
pkg: "@webpack-cli/serve",
53-
dependencies: ["webpack-dev-server"],
53+
dependencies: [WEBPACK_PACKAGE, WEBPACK_DEV_SERVER_PACKAGE],
5454
},
55-
() => {
55+
async () => {
5656
let devServerFlags = [];
5757

58+
cli.webpack = await cli.loadWebpack();
59+
5860
try {
5961
devServerFlags = loadDevServerOptions();
6062
} catch (error) {
61-
logger.error(
63+
cli.logger.error(
6264
`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${error}`,
6365
);
6466
process.exit(2);
@@ -159,17 +161,17 @@ class ServeCommand {
159161
process.stdin.resume();
160162
}
161163

162-
// eslint-disable-next-line @typescript-eslint/no-var-requires, node/no-extraneous-require
163-
const DevServer = require("webpack-dev-server");
164+
// eslint-disable-next-line @typescript-eslint/no-var-requires
165+
const DevServer = require(WEBPACK_DEV_SERVER_PACKAGE);
164166
const isNewDevServerCLIAPI = typeof DevServer.schema !== "undefined";
165167

166168
let devServerVersion;
167169

168170
try {
169-
// eslint-disable-next-line node/no-extraneous-require, @typescript-eslint/no-var-requires
170-
devServerVersion = require("webpack-dev-server/package.json").version;
171+
// eslint-disable-next-line @typescript-eslint/no-var-requires
172+
devServerVersion = require(`${WEBPACK_DEV_SERVER_PACKAGE}/package.json`).version;
171173
} catch (err) {
172-
logger.error(
174+
cli.logger.error(
173175
`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${err}`,
174176
);
175177
process.exit(2);
@@ -200,8 +202,8 @@ class ServeCommand {
200202
}, {});
201203
const result = { ...(compilerForDevServer.options.devServer || {}) };
202204
const problems = (
203-
webpack.cli && typeof webpack.cli.processArguments === "function"
204-
? webpack.cli
205+
cli.webpack.cli && typeof cli.webpack.cli.processArguments === "function"
206+
? cli.webpack.cli
205207
: DevServer.cli
206208
).processArguments(args, result, values);
207209

@@ -335,9 +337,9 @@ class ServeCommand {
335337
servers.push(server);
336338
} catch (error) {
337339
if (cli.isValidationError(error)) {
338-
logger.error(error.message);
340+
cli.logger.error(error.message);
339341
} else {
340-
logger.error(error);
342+
cli.logger.error(error);
341343
}
342344

343345
process.exit(2);

packages/webpack-cli/bin/cli.js

+1-22
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ require("v8-compile-cache");
1010

1111
const importLocal = require("import-local");
1212
const runCLI = require("../lib/bootstrap");
13-
const utils = require("../lib/utils");
1413

1514
if (!process.env.WEBPACK_CLI_SKIP_IMPORT_LOCAL) {
1615
// Prefer the local installation of `webpack-cli`
@@ -21,24 +20,4 @@ if (!process.env.WEBPACK_CLI_SKIP_IMPORT_LOCAL) {
2120

2221
process.title = "webpack";
2322

24-
if (utils.packageExists("webpack")) {
25-
runCLI(process.argv, originalModuleCompile);
26-
} else {
27-
const { promptInstallation, logger, colors } = utils;
28-
29-
promptInstallation("webpack", () => {
30-
utils.logger.error(`It looks like ${colors.bold("webpack")} is not installed.`);
31-
})
32-
.then(() => {
33-
logger.success(`${colors.bold("webpack")} was installed successfully.`);
34-
35-
runCLI(process.argv, originalModuleCompile);
36-
})
37-
.catch(() => {
38-
logger.error(
39-
`Action Interrupted, Please try once again or install ${colors.bold("webpack")} manually.`,
40-
);
41-
42-
process.exit(2);
43-
});
44-
}
23+
runCLI(process.argv, originalModuleCompile);

0 commit comments

Comments
 (0)