@@ -87,7 +87,14 @@ class CopyPlugin {
87
87
} ) ;
88
88
}
89
89
90
- static async runPattern ( compiler , compilation , logger , cache , inputPattern ) {
90
+ static async runPattern (
91
+ compiler ,
92
+ compilation ,
93
+ logger ,
94
+ cache ,
95
+ inputPattern ,
96
+ index
97
+ ) {
91
98
const pattern =
92
99
typeof inputPattern === 'string'
93
100
? { from : inputPattern }
@@ -357,7 +364,10 @@ class CopyPlugin {
357
364
logger . debug ( `getting cache for '${ absoluteFilename } '...` ) ;
358
365
359
366
try {
360
- cacheEntry = await cache . getPromise ( sourceFilename , null ) ;
367
+ cacheEntry = await cache . getPromise (
368
+ `${ sourceFilename } |${ index } ` ,
369
+ null
370
+ ) ;
361
371
} catch ( error ) {
362
372
compilation . errors . push ( error ) ;
363
373
@@ -417,71 +427,6 @@ class CopyPlugin {
417
427
418
428
logger . debug ( `read '${ absoluteFilename } '` ) ;
419
429
420
- if ( pattern . transform ) {
421
- logger . log ( `transforming content for '${ absoluteFilename } '...` ) ;
422
-
423
- if ( pattern . cacheTransform ) {
424
- const cacheDirectory = pattern . cacheTransform . directory
425
- ? pattern . cacheTransform . directory
426
- : typeof pattern . cacheTransform === 'string'
427
- ? pattern . cacheTransform
428
- : findCacheDir ( { name : 'copy-webpack-plugin' } ) ||
429
- os . tmpdir ( ) ;
430
- let defaultCacheKeys = {
431
- version,
432
- transform : pattern . transform ,
433
- contentHash : crypto
434
- . createHash ( 'md4' )
435
- . update ( data )
436
- . digest ( 'hex' ) ,
437
- } ;
438
-
439
- defaultCacheKeys =
440
- typeof pattern . cacheTransform . keys === 'function'
441
- ? await pattern . cacheTransform . keys (
442
- defaultCacheKeys ,
443
- absoluteFilename
444
- )
445
- : {
446
- ...defaultCacheKeys ,
447
- ...pattern . cacheTransform . keys ,
448
- } ;
449
-
450
- const cacheKeys = serialize ( defaultCacheKeys ) ;
451
-
452
- try {
453
- logger . debug (
454
- `getting transformation cache for '${ absoluteFilename } '...`
455
- ) ;
456
-
457
- const cachedResult = await cacache . get (
458
- cacheDirectory ,
459
- cacheKeys
460
- ) ;
461
-
462
- ( { data } = cachedResult ) ;
463
- } catch ( _ignoreError ) {
464
- logger . debug (
465
- `no transformation cache for '${ absoluteFilename } '...`
466
- ) ;
467
-
468
- data = await pattern . transform ( data , absoluteFilename ) ;
469
-
470
- logger . debug (
471
- `caching transformation for '${ absoluteFilename } '`
472
- ) ;
473
-
474
- await cacache . put ( cacheDirectory , cacheKeys , data ) ;
475
-
476
- logger . debug (
477
- `cached transformation for '${ absoluteFilename } '`
478
- ) ;
479
- }
480
- } else {
481
- data = await pattern . transform ( data , absoluteFilename ) ;
482
- }
483
- }
484
-
485
430
result . source = new RawSource ( data ) ;
486
431
487
432
if ( cache ) {
@@ -506,7 +451,7 @@ class CopyPlugin {
506
451
logger . debug ( `storing cache for '${ absoluteFilename } '...` ) ;
507
452
508
453
try {
509
- await cache . storePromise ( sourceFilename , null , {
454
+ await cache . storePromise ( ` ${ sourceFilename } | ${ index } ` , null , {
510
455
source : result . source ,
511
456
snapshot,
512
457
} ) ;
@@ -521,6 +466,108 @@ class CopyPlugin {
521
466
}
522
467
}
523
468
469
+ if ( pattern . transform ) {
470
+ logger . log ( `transforming content for '${ absoluteFilename } '...` ) ;
471
+
472
+ const buffer = result . source . source ( ) ;
473
+
474
+ if ( pattern . cacheTransform ) {
475
+ const defaultCacheKeys = {
476
+ version,
477
+ sourceFilename,
478
+ transform : pattern . transform ,
479
+ contentHash : crypto
480
+ . createHash ( 'md4' )
481
+ . update ( buffer )
482
+ . digest ( 'hex' ) ,
483
+ index,
484
+ } ;
485
+ const cacheKeys = `transform|${ serialize (
486
+ typeof pattern . cacheTransform . keys === 'function'
487
+ ? await pattern . cacheTransform . keys (
488
+ defaultCacheKeys ,
489
+ absoluteFilename
490
+ )
491
+ : { ...defaultCacheKeys , ...pattern . cacheTransform . keys }
492
+ ) } `;
493
+
494
+ let cacheItem ;
495
+ let cacheDirectory ;
496
+
497
+ logger . debug (
498
+ `getting transformation cache for '${ absoluteFilename } '...`
499
+ ) ;
500
+
501
+ // webpack@5 API
502
+ if ( cache ) {
503
+ cacheItem = cache . getItemCache (
504
+ cacheKeys ,
505
+ cache . getLazyHashedEtag ( result . source )
506
+ ) ;
507
+
508
+ result . source = await cacheItem . getPromise ( ) ;
509
+ } else {
510
+ cacheDirectory = pattern . cacheTransform . directory
511
+ ? pattern . cacheTransform . directory
512
+ : typeof pattern . cacheTransform === 'string'
513
+ ? pattern . cacheTransform
514
+ : findCacheDir ( { name : 'copy-webpack-plugin' } ) ||
515
+ os . tmpdir ( ) ;
516
+
517
+ let cached ;
518
+
519
+ try {
520
+ cached = await cacache . get ( cacheDirectory , cacheKeys ) ;
521
+ } catch ( error ) {
522
+ logger . debug (
523
+ `no transformation cache for '${ absoluteFilename } '...`
524
+ ) ;
525
+ }
526
+
527
+ // eslint-disable-next-line no-undefined
528
+ result . source = cached ? new RawSource ( cached . data ) : undefined ;
529
+ }
530
+
531
+ logger . debug (
532
+ result . source
533
+ ? `found transformation cache for '${ absoluteFilename } '`
534
+ : `no transformation cache for '${ absoluteFilename } '`
535
+ ) ;
536
+
537
+ if ( ! result . source ) {
538
+ const transformed = await pattern . transform (
539
+ buffer ,
540
+ absoluteFilename
541
+ ) ;
542
+
543
+ result . source = new RawSource ( transformed ) ;
544
+
545
+ logger . debug (
546
+ `caching transformation for '${ absoluteFilename } '...`
547
+ ) ;
548
+
549
+ // webpack@5 API
550
+ if ( cache ) {
551
+ await cacheItem . storePromise ( result . source ) ;
552
+ } else {
553
+ try {
554
+ await cacache . put ( cacheDirectory , cacheKeys , transformed ) ;
555
+ } catch ( error ) {
556
+ compilation . errors . push ( error ) ;
557
+
558
+ return ;
559
+ }
560
+ }
561
+
562
+ logger . debug ( `cached transformation for '${ absoluteFilename } '` ) ;
563
+ }
564
+ } else {
565
+ result . source = new RawSource (
566
+ await pattern . transform ( buffer , absoluteFilename )
567
+ ) ;
568
+ }
569
+ }
570
+
524
571
if ( pattern . toType === 'template' ) {
525
572
logger . log (
526
573
`interpolating template '${ filename } ' for '${ sourceFilename } '...`
@@ -615,14 +662,15 @@ class CopyPlugin {
615
662
616
663
try {
617
664
assets = await Promise . all (
618
- this . patterns . map ( ( item ) =>
665
+ this . patterns . map ( ( item , index ) =>
619
666
limit ( async ( ) =>
620
667
CopyPlugin . runPattern (
621
668
compiler ,
622
669
compilation ,
623
670
logger ,
624
671
cache ,
625
- item
672
+ item ,
673
+ index
626
674
)
627
675
)
628
676
)
0 commit comments