@@ -3289,24 +3289,46 @@ class WebpackCLI {
32893289 }
32903290 }
32913291
3292+ // Options for the whole MultiCompiler, such as `parallelism`, are set on the
3293+ // exported array itself, so carry them over whenever the array is rebuilt.
3294+ const keepMultiCompilerOptions = < T extends Configuration [ ] > (
3295+ source : Configuration | MultiConfiguration ,
3296+ target : T ,
3297+ ) : T => {
3298+ if ( Array . isArray ( source ) ) {
3299+ for ( const key of Object . keys ( source ) ) {
3300+ if ( ! / ^ \d + $ / . test ( key ) ) {
3301+ ( target as unknown as Record < string , unknown > ) [ key ] = (
3302+ source as unknown as Record < string , unknown >
3303+ ) [ key ] ;
3304+ }
3305+ }
3306+ }
3307+
3308+ return target ;
3309+ } ;
3310+
32923311 if ( options . configName ) {
32933312 const notFoundConfigNames : string [ ] = [ ] ;
32943313
3295- config . options = options . configName . map ( ( configName ) => {
3296- let found ;
3314+ config . options = keepMultiCompilerOptions (
3315+ config . options ,
3316+ options . configName . map ( ( configName ) => {
3317+ let found ;
32973318
3298- if ( this . isMultipleConfiguration ( config . options ) ) {
3299- found = config . options . find ( ( options ) => options . name === configName ) ;
3300- } else {
3301- found = config . options . name === configName ? config . options : undefined ;
3302- }
3319+ if ( this . isMultipleConfiguration ( config . options ) ) {
3320+ found = config . options . find ( ( options ) => options . name === configName ) ;
3321+ } else {
3322+ found = config . options . name === configName ? config . options : undefined ;
3323+ }
33033324
3304- if ( ! found ) {
3305- notFoundConfigNames . push ( configName ) ;
3306- }
3325+ if ( ! found ) {
3326+ notFoundConfigNames . push ( configName ) ;
3327+ }
33073328
3308- return found ;
3309- } ) as MultiConfiguration ;
3329+ return found ;
3330+ } ) as Configuration [ ] ,
3331+ ) ;
33103332
33113333 if ( notFoundConfigNames . length > 0 ) {
33123334 this . logger . error (
@@ -3366,8 +3388,11 @@ class WebpackCLI {
33663388 const extendsPaths = options . extends ;
33673389
33683390 if ( this . isMultipleConfiguration ( config . options ) ) {
3369- config . options = await Promise . all (
3370- config . options . map ( ( options ) => resolveExtends ( options , config . path , extendsPaths ) ) ,
3391+ config . options = keepMultiCompilerOptions (
3392+ config . options ,
3393+ await Promise . all (
3394+ config . options . map ( ( options ) => resolveExtends ( options , config . path , extendsPaths ) ) ,
3395+ ) ,
33713396 ) ;
33723397 } else {
33733398 // load the config from the extends option
@@ -3379,17 +3404,20 @@ class WebpackCLI {
33793404 this . isMultipleConfiguration ( config . options ) &&
33803405 config . options . some ( ( options ) => options . extends )
33813406 ) {
3382- config . options = await Promise . all (
3383- config . options . map ( ( options ) => {
3384- if ( options . extends ) {
3385- return resolveExtends (
3386- options ,
3387- config . path ,
3388- typeof options . extends === "string" ? [ options . extends ] : options . extends ,
3389- ) ;
3390- }
3391- return options ;
3392- } ) ,
3407+ config . options = keepMultiCompilerOptions (
3408+ config . options ,
3409+ await Promise . all (
3410+ config . options . map ( ( options ) => {
3411+ if ( options . extends ) {
3412+ return resolveExtends (
3413+ options ,
3414+ config . path ,
3415+ typeof options . extends === "string" ? [ options . extends ] : options . extends ,
3416+ ) ;
3417+ }
3418+ return options ;
3419+ } ) ,
3420+ ) ,
33933421 ) ;
33943422 } else if ( ! this . isMultipleConfiguration ( config . options ) && config . options . extends ) {
33953423 config . options = await resolveExtends (
0 commit comments