@@ -87,7 +87,14 @@ class CopyPlugin {
8787 } ) ;
8888 }
8989
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+ ) {
9198 const pattern =
9299 typeof inputPattern === 'string'
93100 ? { from : inputPattern }
@@ -357,7 +364,10 @@ class CopyPlugin {
357364 logger . debug ( `getting cache for '${ absoluteFilename } '...` ) ;
358365
359366 try {
360- cacheEntry = await cache . getPromise ( sourceFilename , null ) ;
367+ cacheEntry = await cache . getPromise (
368+ `${ sourceFilename } |${ index } ` ,
369+ null
370+ ) ;
361371 } catch ( error ) {
362372 compilation . errors . push ( error ) ;
363373
@@ -417,71 +427,6 @@ class CopyPlugin {
417427
418428 logger . debug ( `read '${ absoluteFilename } '` ) ;
419429
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-
485430 result . source = new RawSource ( data ) ;
486431
487432 if ( cache ) {
@@ -506,7 +451,7 @@ class CopyPlugin {
506451 logger . debug ( `storing cache for '${ absoluteFilename } '...` ) ;
507452
508453 try {
509- await cache . storePromise ( sourceFilename , null , {
454+ await cache . storePromise ( ` ${ sourceFilename } | ${ index } ` , null , {
510455 source : result . source ,
511456 snapshot,
512457 } ) ;
@@ -521,6 +466,108 @@ class CopyPlugin {
521466 }
522467 }
523468
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+
524571 if ( pattern . toType === 'template' ) {
525572 logger . log (
526573 `interpolating template '${ filename } ' for '${ sourceFilename } '...`
@@ -615,14 +662,15 @@ class CopyPlugin {
615662
616663 try {
617664 assets = await Promise . all (
618- this . patterns . map ( ( item ) =>
665+ this . patterns . map ( ( item , index ) =>
619666 limit ( async ( ) =>
620667 CopyPlugin . runPattern (
621668 compiler ,
622669 compilation ,
623670 logger ,
624671 cache ,
625- item
672+ item ,
673+ index
626674 )
627675 )
628676 )
0 commit comments