Skip to content

Commit 39b8ff5

Browse files
refactor!: update minimum required NodeJS version
1 parent 129bb68 commit 39b8ff5

10 files changed

Lines changed: 72 additions & 52 deletions

File tree

.github/workflows/nodejs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ jobs:
6161
fail-fast: true
6262
matrix:
6363
os: [ubuntu-latest, windows-latest, macos-latest]
64-
node-version: [18.x, 20.x, 22.x, 24.x]
64+
node-version: [20.x, 22.x, 24.x, 25.x]
6565
webpack-version: [latest]
6666
dev-server-version: [latest]
6767

package-lock.json

Lines changed: 24 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
"concat-stream": "^2.0.0",
6060
"cspell": "^9.4.0",
6161
"css-loader": "^7.1.2",
62-
"del-cli": "^6.0.0",
62+
"del-cli": "^7.0.0",
6363
"eslint": "^9.29.0",
6464
"eslint-config-webpack": "^4.5.0",
6565
"execa": "^9.6.1",
@@ -87,6 +87,6 @@
8787
"webpack": "5.x.x"
8888
},
8989
"engines": {
90-
"node": ">=18.12.0"
90+
"node": ">=20.9.0"
9191
}
9292
}

packages/create-webpack-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@
5252
"@types/ejs": "^3.1.5"
5353
},
5454
"engines": {
55-
"node": ">=18.12.0"
55+
"node": ">=20.9.0"
5656
}
5757
}

packages/create-webpack-app/tsconfig.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
"exclude": ["src/utils/__tests__"],
44
"compilerOptions": {
55
"outDir": "lib",
6-
"rootDir": "src",
7-
"module": "esnext"
6+
"rootDir": "src"
87
},
9-
"include": ["src"],
8+
"include": ["./src"],
109
"references": [
1110
{
1211
"path": "../webpack-cli"

packages/webpack-cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
}
6363
},
6464
"engines": {
65-
"node": ">=18.12.0"
65+
"node": ">=20.9.0"
6666
},
6767
"gitHead": "fb50f766851f500ca12867a2aa9de81fa6e368f9"
6868
}

packages/webpack-cli/src/plugins/cli-plugin.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export default class CLIPlugin {
1111
}
1212

1313
async setupBundleAnalyzerPlugin(compiler: Compiler) {
14-
const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");
14+
// @ts-expect-error No types right now
15+
const { BundleAnalyzerPlugin } = (await import("webpack-bundle-analyzer")).default;
1516

1617
const bundleAnalyzerPlugin = compiler.options.plugins.some(
1718
(plugin) => plugin instanceof BundleAnalyzerPlugin,
@@ -25,7 +26,7 @@ export default class CLIPlugin {
2526
static #progressStates: [number, ...string[]][] = [];
2627

2728
setupProgressPlugin(compiler: Compiler) {
28-
const { ProgressPlugin } = compiler.webpack || require("webpack");
29+
const { ProgressPlugin } = compiler.webpack;
2930
const progressPlugin = compiler.options.plugins.some(
3031
(plugin) => plugin instanceof ProgressPlugin,
3132
);

packages/webpack-cli/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ interface IWebpackCLI {
4747
capitalizeFirstLetter: StringFormatter;
4848
checkPackageExists(packageName: string): boolean;
4949
getAvailablePackageManagers(): PackageManager[];
50-
getDefaultPackageManager(): PackageManager | undefined;
50+
getDefaultPackageManager(): Promise<PackageManager | undefined>;
5151
doInstall(packageName: string, options?: PackageInstallOptions): Promise<string>;
5252
loadJSONFile<T = unknown>(path: Path, handleError: boolean): Promise<T>;
5353
tryRequireThenImport<T = unknown>(module: ModuleName, handleError: boolean): Promise<T>;

packages/webpack-cli/src/webpack-cli.ts

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ class WebpackCLI implements IWebpackCLI {
226226
return false;
227227
}
228228

229+
// TODO remove me
229230
getAvailablePackageManagers(): PackageManager[] {
230231
const { sync } = require("cross-spawn");
231232

@@ -252,9 +253,10 @@ class WebpackCLI implements IWebpackCLI {
252253
return availableInstallers;
253254
}
254255

255-
getDefaultPackageManager(): PackageManager | undefined {
256-
const { sync } = require("cross-spawn");
256+
async getDefaultPackageManager(): Promise<PackageManager | undefined> {
257+
const { sync } = await import("cross-spawn");
257258

259+
// TODO use async methods
258260
const hasLocalNpm = fs.existsSync(path.resolve(process.cwd(), "package-lock.json"));
259261

260262
if (hasLocalNpm) {
@@ -307,7 +309,7 @@ class WebpackCLI implements IWebpackCLI {
307309
}
308310

309311
async doInstall(packageName: string, options: PackageInstallOptions = {}): Promise<string> {
310-
const packageManager = this.getDefaultPackageManager();
312+
const packageManager = await this.getDefaultPackageManager();
311313

312314
if (!packageManager) {
313315
this.logger.error("Can't find package manager");
@@ -319,10 +321,10 @@ class WebpackCLI implements IWebpackCLI {
319321
options.preMessage();
320322
}
321323

322-
const prompt = ({ message, defaultResponse, stream }: PromptOptions) => {
323-
const readline = require("node:readline");
324+
const { createInterface } = await import("node:readline");
324325

325-
const rl = readline.createInterface({
326+
const prompt = ({ message, defaultResponse, stream }: PromptOptions) => {
327+
const rl = createInterface({
326328
input: process.stdin,
327329
output: stream,
328330
});
@@ -470,6 +472,7 @@ class WebpackCLI implements IWebpackCLI {
470472
return result || {};
471473
}
472474

475+
// TODO remove me
473476
loadJSONFile<T = unknown>(pathToFile: Path, handleError = true): T {
474477
let result;
475478

@@ -1231,8 +1234,8 @@ class WebpackCLI implements IWebpackCLI {
12311234
},
12321235
);
12331236
} else if (this.#isCommand(commandName, WebpackCLI.#commands.serve)) {
1234-
const loadDevServerOptions = () => {
1235-
const devServer = require(WEBPACK_DEV_SERVER_PACKAGE);
1237+
const loadDevServerOptions = async () => {
1238+
const devServer = (await import(WEBPACK_DEV_SERVER_PACKAGE)).default;
12361239

12371240
// eslint-disable-next-line @typescript-eslint/no-explicit-any
12381241
const options: Record<string, any> = this.webpack.cli.getArguments(devServer.schema);
@@ -1254,7 +1257,7 @@ class WebpackCLI implements IWebpackCLI {
12541257
this.webpack = await this.loadWebpack();
12551258

12561259
try {
1257-
devServerFlags = loadDevServerOptions();
1260+
devServerFlags = await loadDevServerOptions();
12581261
} catch (error) {
12591262
this.logger.error(
12601263
`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${error}`,
@@ -1271,7 +1274,7 @@ class WebpackCLI implements IWebpackCLI {
12711274
let devServerFlags = [];
12721275

12731276
try {
1274-
devServerFlags = loadDevServerOptions();
1277+
devServerFlags = await loadDevServerOptions();
12751278
} catch {
12761279
// Nothing, to prevent future updates
12771280
}
@@ -1327,7 +1330,19 @@ class WebpackCLI implements IWebpackCLI {
13271330
return;
13281331
}
13291332

1330-
const servers: (typeof DevServer)[] = [];
1333+
type DevServerConstructor = typeof import("webpack-dev-server");
1334+
let DevServer: DevServerConstructor;
1335+
1336+
try {
1337+
DevServer = (await import(WEBPACK_DEV_SERVER_PACKAGE)).default;
1338+
} catch (err) {
1339+
this.logger.error(
1340+
`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${err}`,
1341+
);
1342+
process.exit(2);
1343+
}
1344+
1345+
const servers: InstanceType<DevServerConstructor>[] = [];
13311346

13321347
if (this.needWatchStdin(compiler)) {
13331348
process.stdin.on("end", () => {
@@ -1338,18 +1353,6 @@ class WebpackCLI implements IWebpackCLI {
13381353
process.stdin.resume();
13391354
}
13401355

1341-
const DevServer = require(WEBPACK_DEV_SERVER_PACKAGE);
1342-
1343-
try {
1344-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
1345-
require(`${WEBPACK_DEV_SERVER_PACKAGE}/package.json`).version;
1346-
} catch (err) {
1347-
this.logger.error(
1348-
`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${err}`,
1349-
);
1350-
process.exit(2);
1351-
}
1352-
13531356
const compilers = this.isMultipleCompiler(compiler) ? compiler.compilers : [compiler];
13541357
const possibleCompilers = compilers.filter((compiler) => compiler.options.devServer);
13551358
const compilersForDevServer =
@@ -1444,7 +1447,7 @@ class WebpackCLI implements IWebpackCLI {
14441447

14451448
await server.start();
14461449

1447-
servers.push(server);
1450+
servers.push(server as unknown as InstanceType<DevServerConstructor>);
14481451
} catch (error) {
14491452
if (this.isValidationError(error as Error)) {
14501453
this.logger.error((error as Error).message);
@@ -2501,7 +2504,7 @@ class WebpackCLI implements IWebpackCLI {
25012504
process.exit(2);
25022505
}
25032506

2504-
const CLIPlugin = (await import("./plugins/cli-plugin.js")).default;
2507+
const { default: CLIPlugin } = (await import("./plugins/cli-plugin.js")).default;
25052508

25062509
const internalBuildConfig = (item: Configuration) => {
25072510
const originalWatchValue = item.watch;

tsconfig.json

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22
"exclude": ["node_modules", "lib", "__tests__"],
33
"files": [],
44
"compilerOptions": {
5-
"skipLibCheck": true,
5+
"lib": ["es2023"],
6+
"module": "nodenext",
67
"target": "ES2022",
7-
"module": "commonjs",
8-
"lib": ["ES2022"],
8+
99
"strict": true,
10-
"rootDir": ".",
11-
"outDir": "lib",
12-
"moduleResolution": "node",
10+
"esModuleInterop": true,
11+
"skipLibCheck": true,
12+
"moduleResolution": "nodenext",
1313
"resolveJsonModule": true,
1414
"allowSyntheticDefaultImports": true,
15-
"esModuleInterop": true,
15+
16+
"rootDir": ".",
17+
"outDir": "lib",
1618
"baseUrl": ".",
1719
"paths": {
1820
"@webpack-cli/*": ["packages/*/src"]

0 commit comments

Comments
 (0)