@@ -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 ;
0 commit comments