@@ -204,41 +204,46 @@ class ProvideSharedPlugin {
204
204
}
205
205
206
206
// Process normal prefix matches
207
- for ( const [ prefix , config ] of prefixMatchProvides ) {
208
- const lookup = config . request || prefix ;
209
- if ( request . startsWith ( lookup ) && resource ) {
210
- const remainder = request . slice ( lookup . length ) ;
207
+ for ( const [ prefixKey , originalPrefixConfig ] of prefixMatchProvides ) {
208
+ const lookupPrefix = originalPrefixConfig . request || prefixKey ;
209
+
210
+ if ( request . startsWith ( lookupPrefix ) && resource ) {
211
+ const remainder = request . slice ( lookupPrefix . length ) ;
211
212
if (
212
- config . include &&
213
- config . include . request &&
214
- ! ( config . include . request instanceof RegExp
215
- ? config . include . request . test ( remainder )
216
- : remainder === config . include . request )
213
+ originalPrefixConfig . include &&
214
+ originalPrefixConfig . include . request &&
215
+ ! ( originalPrefixConfig . include . request instanceof RegExp
216
+ ? originalPrefixConfig . include . request . test ( remainder )
217
+ : remainder === originalPrefixConfig . include . request )
217
218
) {
218
- // console.log(`[ProvideSharedPlugin-DEBUG] Include filter passed for request: '${request}'`);
219
219
continue ; // Skip if include doesn't match
220
220
}
221
221
222
- // Then check exclude if it exists - skip if request matches exclude pattern
223
222
if (
224
- config . exclude &&
225
- config . exclude . request &&
226
- ( config . exclude . request instanceof RegExp
227
- ? config . exclude . request . test ( remainder )
228
- : remainder === config . exclude . request )
223
+ originalPrefixConfig . exclude &&
224
+ originalPrefixConfig . exclude . request &&
225
+ ( originalPrefixConfig . exclude . request instanceof RegExp
226
+ ? originalPrefixConfig . exclude . request . test ( remainder )
227
+ : remainder === originalPrefixConfig . exclude . request )
229
228
) {
230
- // console.log(`[ProvideSharedPlugin-DEBUG] Exclude filter passed for request: '${request}'`);
231
229
continue ; // Skip if exclude matches
232
230
}
233
231
232
+ const finalShareKey = originalPrefixConfig . shareKey + remainder ;
233
+ const configForSpecificModule : ProvidesConfig = {
234
+ ...originalPrefixConfig ,
235
+ shareKey : finalShareKey ,
236
+ request : request , // Full matched request
237
+ // Clear request-based include/exclude as they were for the remainder
238
+ include : originalPrefixConfig . include ? { ...originalPrefixConfig . include , request : undefined } : undefined ,
239
+ exclude : originalPrefixConfig . exclude ? { ...originalPrefixConfig . exclude , request : undefined } : undefined ,
240
+ } ;
241
+
234
242
this . provideSharedModule (
235
243
compilation ,
236
244
resolvedProvideMap ,
237
- resource ,
238
- {
239
- ...config ,
240
- shareKey : config . shareKey + remainder ,
241
- } ,
245
+ request , // key for error reporting
246
+ configForSpecificModule ,
242
247
resource ,
243
248
resourceResolveData ,
244
249
) ;
@@ -280,30 +285,30 @@ class ProvideSharedPlugin {
280
285
}
281
286
282
287
// Also check for prefix matches with the module path after node_modules
283
- for ( const [ prefix , config ] of prefixMatchProvides ) {
284
- const lookup = config . request || prefix ;
285
- if ( modulePathAfterNodeModules . startsWith ( lookup ) ) {
286
- const remainder = modulePathAfterNodeModules . slice (
287
- lookup . length ,
288
+ for ( const [ prefixKeyPM , originalPrefixConfigPM ] of prefixMatchProvides ) {
289
+ const lookupPM = originalPrefixConfigPM . request || prefixKeyPM ;
290
+ if ( modulePathAfterNodeModules . startsWith ( lookupPM ) ) {
291
+ const remainderPM = modulePathAfterNodeModules . slice (
292
+ lookupPM . length ,
288
293
) ;
289
294
290
- // Apply include/exclude filters
295
+ // Apply include/exclude filters based on remainderPM
291
296
if (
292
- config . include &&
293
- config . include . request &&
294
- ! ( config . include . request instanceof RegExp
295
- ? config . include . request . test ( remainder )
296
- : remainder === config . include . request )
297
+ originalPrefixConfigPM . include &&
298
+ originalPrefixConfigPM . include . request &&
299
+ ! ( originalPrefixConfigPM . include . request instanceof RegExp
300
+ ? originalPrefixConfigPM . include . request . test ( remainderPM )
301
+ : remainderPM === originalPrefixConfigPM . include . request )
297
302
) {
298
303
continue ; // Skip if include doesn't match
299
304
}
300
305
301
306
if (
302
- config . exclude &&
303
- config . exclude . request &&
304
- ( config . exclude . request instanceof RegExp
305
- ? config . exclude . request . test ( remainder )
306
- : remainder === config . exclude . request )
307
+ originalPrefixConfigPM . exclude &&
308
+ originalPrefixConfigPM . exclude . request &&
309
+ ( originalPrefixConfigPM . exclude . request instanceof RegExp
310
+ ? originalPrefixConfigPM . exclude . request . test ( remainderPM )
311
+ : remainderPM === originalPrefixConfigPM . exclude . request )
307
312
) {
308
313
continue ; // Skip if exclude matches
309
314
}
@@ -313,8 +318,8 @@ class ProvideSharedPlugin {
313
318
resolvedProvideMap ,
314
319
modulePathAfterNodeModules ,
315
320
{
316
- ...config ,
317
- shareKey : config . shareKey + remainder ,
321
+ ...originalPrefixConfigPM ,
322
+ shareKey : originalPrefixConfigPM . shareKey + remainderPM ,
318
323
} ,
319
324
resource ,
320
325
resourceResolveData ,
@@ -419,58 +424,63 @@ class ProvideSharedPlugin {
419
424
}
420
425
}
421
426
422
- // --- Add Include Check ---
423
- // Only include if the determined version satisfies the include.version constraint
424
- if (
425
- config . include &&
426
- typeof config . include . version === 'string' &&
427
- typeof version === 'string' &&
428
- version &&
429
- ! satisfy ( version , config . include . version )
430
- ) {
431
- // Version doesn't satisfy the include range, so skip providing this module version
432
- return ;
433
- }
427
+ // Check include/exclude conditions
428
+ if ( config . include ) {
429
+ let versionIncludeFailed = false ;
430
+ if ( typeof config . include . version === 'string' ) {
431
+ if ( typeof version === 'string' && version ) {
432
+ if ( ! satisfy ( version , config . include . version ) ) {
433
+ versionIncludeFailed = true ;
434
+ }
435
+ } else {
436
+ versionIncludeFailed = true ;
437
+ }
438
+ }
434
439
435
- // Check if the request matches the include.request pattern
436
- if (
437
- config . include &&
438
- config . include . request &&
439
- ! ( config . include . request instanceof RegExp
440
- ? config . include . request . test ( resource )
441
- : resource === config . include . request )
442
- ) {
443
- // Request doesn't match the include pattern, so skip providing this module
444
- return ;
445
- }
446
- // --- End Include Check ---
447
-
448
- // --- Add Exclude Check ---
449
- // Check if the determined version should be excluded based on exclude.version
450
- if (
451
- config . exclude &&
452
- typeof config . exclude . version === 'string' &&
453
- typeof version === 'string' &&
454
- version &&
455
- satisfy ( version , config . exclude . version )
456
- ) {
457
- // Version matches the exclude range, so skip providing this module version
458
- return ;
440
+ let requestIncludeFailed = false ;
441
+ if ( config . include . request ) {
442
+ const includeRequestValue = config . include . request ;
443
+ const requestActuallyMatches = ( includeRequestValue instanceof RegExp )
444
+ ? includeRequestValue . test ( resource )
445
+ : resource === includeRequestValue ;
446
+ if ( ! requestActuallyMatches ) {
447
+ requestIncludeFailed = true ;
448
+ }
449
+ }
450
+
451
+ // Skip if any specified include condition failed
452
+ const shouldSkipVersion = typeof config . include . version === 'string' && versionIncludeFailed ;
453
+ const shouldSkipRequest = config . include . request && requestIncludeFailed ;
454
+
455
+ if ( shouldSkipVersion || shouldSkipRequest ) {
456
+ return ;
457
+ }
459
458
}
460
459
461
- // Check if the request matches the exclude.request pattern
462
- // This check was added in previous steps, ensure it uses 'exclude'
463
- if (
464
- config . exclude &&
465
- config . exclude . request &&
466
- ( config . exclude . request instanceof RegExp
467
- ? config . exclude . request . test ( resource )
468
- : resource === config . exclude . request )
469
- ) {
470
- // Request matches the exclude pattern, so skip providing this module
471
- return ;
460
+ if ( config . exclude ) {
461
+ let versionExcludeMatches = false ;
462
+ if ( typeof config . exclude . version === 'string' && typeof version === 'string' && version ) {
463
+ if ( satisfy ( version , config . exclude . version ) ) {
464
+ versionExcludeMatches = true ;
465
+ }
466
+ }
467
+
468
+ let requestExcludeMatches = false ;
469
+ if ( config . exclude . request ) {
470
+ const excludeRequestValue = config . exclude . request ;
471
+ const requestActuallyMatchesExclude = ( excludeRequestValue instanceof RegExp )
472
+ ? excludeRequestValue . test ( resource )
473
+ : resource === excludeRequestValue ;
474
+ if ( requestActuallyMatchesExclude ) {
475
+ requestExcludeMatches = true ;
476
+ }
477
+ }
478
+
479
+ // Skip if any specified exclude condition matched
480
+ if ( versionExcludeMatches || requestExcludeMatches ) {
481
+ return ;
482
+ }
472
483
}
473
- // --- End Exclude Check ---
474
484
475
485
const lookupKey = createLookupKey ( resource , config ) ;
476
486
resolvedProvideMap . set ( lookupKey , {
0 commit comments