11import path from "path" ;
2- import os from "os" ;
32import crypto from "crypto" ;
43
5- import webpack from "webpack" ;
64import { validate } from "schema-utils" ;
75import pLimit from "p-limit" ;
86import globby from "globby" ;
9- import findCacheDir from "find-cache-dir" ;
107import serialize from "serialize-javascript" ;
11- import cacache from "cacache" ;
128import loaderUtils from "loader-utils" ;
139import normalizePath from "normalize-path" ;
1410import globParent from "glob-parent" ;
@@ -19,11 +15,6 @@ import { version } from "../package.json";
1915import schema from "./options.json" ;
2016import { readFile , stat } from "./utils/promisify" ;
2117
22- // webpack 5 exposes the sources property to ensure the right version of webpack-sources is used
23- const { RawSource } =
24- // eslint-disable-next-line global-require
25- webpack . sources || require ( "webpack-sources" ) ;
26-
2718const template = / ( \[ e x t \] ) | ( \[ n a m e \] ) | ( \[ p a t h \] ) | ( \[ f o l d e r \] ) | ( \[ e m o j i (?: : ( \d + ) ) ? \] ) | ( \[ (?: ( [ ^ : \] ] + ) : ) ? (?: h a s h | c o n t e n t h a s h ) (?: : ( [ a - z ] + \d * ) ) ? (?: : ( \d + ) ) ? \] ) | ( \[ \d + \] ) / ;
2819
2920class CopyPlugin {
@@ -38,10 +29,6 @@ class CopyPlugin {
3829 }
3930
4031 static async createSnapshot ( compilation , startTime , dependency ) {
41- if ( ! compilation . fileSystemInfo ) {
42- return ;
43- }
44-
4532 // eslint-disable-next-line consistent-return
4633 return new Promise ( ( resolve , reject ) => {
4734 compilation . fileSystemInfo . createSnapshot (
@@ -66,10 +53,6 @@ class CopyPlugin {
6653 }
6754
6855 static async checkSnapshotValid ( compilation , snapshot ) {
69- if ( ! compilation . fileSystemInfo ) {
70- return ;
71- }
72-
7356 // eslint-disable-next-line consistent-return
7457 return new Promise ( ( resolve , reject ) => {
7558 compilation . fileSystemInfo . checkSnapshotValid (
@@ -95,6 +78,7 @@ class CopyPlugin {
9578 inputPattern ,
9679 index
9780 ) {
81+ const { RawSource } = compiler . webpack . sources ;
9882 const pattern =
9983 typeof inputPattern === "string"
10084 ? { from : inputPattern }
@@ -111,6 +95,13 @@ class CopyPlugin {
11195 : pattern . compilerContext
11296 ) ;
11397
98+ pattern . transform =
99+ typeof pattern . transform !== "undefined"
100+ ? typeof pattern . transform === "function"
101+ ? { transformer : pattern . transform }
102+ : pattern . transform
103+ : { } ;
104+
114105 logger . log (
115106 `starting to process a pattern from '${ pattern . from } ' using '${ pattern . context } ' context`
116107 ) ;
@@ -152,17 +143,7 @@ class CopyPlugin {
152143 ...{ cwd : pattern . context , objectMode : true } ,
153144 } ;
154145
155- // TODO remove after drop webpack@4
156- if (
157- inputFileSystem . lstat &&
158- inputFileSystem . stat &&
159- inputFileSystem . lstatSync &&
160- inputFileSystem . statSync &&
161- inputFileSystem . readdir &&
162- inputFileSystem . readdirSync
163- ) {
164- pattern . globOptions . fs = inputFileSystem ;
165- }
146+ pattern . globOptions . fs = inputFileSystem ;
166147
167148 switch ( pattern . fromType ) {
168149 case "dir" :
@@ -327,9 +308,7 @@ class CopyPlugin {
327308 `'to' option '${ pattern . to } ' determinated as '${ pattern . toType } '`
328309 ) ;
329310
330- const relativeFrom = pattern . flatten
331- ? path . basename ( absoluteFilename )
332- : path . relative ( pattern . context , absoluteFilename ) ;
311+ const relativeFrom = path . relative ( pattern . context , absoluteFilename ) ;
333312 let filename =
334313 pattern . toType === "dir"
335314 ? path . join ( pattern . to , relativeFrom )
@@ -481,67 +460,41 @@ class CopyPlugin {
481460 }
482461 }
483462
484- if ( pattern . transform ) {
463+ if ( pattern . transform . transformer ) {
485464 logger . log ( `transforming content for '${ absoluteFilename } '...` ) ;
486465
487466 const buffer = result . source . source ( ) ;
488467
489- if ( pattern . cacheTransform ) {
468+ if ( pattern . transform . cache ) {
490469 const defaultCacheKeys = {
491470 version,
492471 sourceFilename,
493- transform : pattern . transform ,
472+ transform : pattern . transform . transformer ,
494473 contentHash : crypto
495474 . createHash ( "md4" )
496475 . update ( buffer )
497476 . digest ( "hex" ) ,
498477 index,
499478 } ;
500479 const cacheKeys = `transform|${ serialize (
501- typeof pattern . cacheTransform . keys === "function"
502- ? await pattern . cacheTransform . keys (
480+ typeof pattern . transform . cache . keys === "function"
481+ ? await pattern . transform . cache . keys (
503482 defaultCacheKeys ,
504483 absoluteFilename
505484 )
506- : { ...defaultCacheKeys , ...pattern . cacheTransform . keys }
485+ : { ...defaultCacheKeys , ...pattern . transform . cache . keys }
507486 ) } `;
508487
509- let cacheItem ;
510- let cacheDirectory ;
511-
512488 logger . debug (
513489 `getting transformation cache for '${ absoluteFilename } '...`
514490 ) ;
515491
516- // webpack@5 API
517- if ( cache ) {
518- cacheItem = cache . getItemCache (
519- cacheKeys ,
520- cache . getLazyHashedEtag ( result . source )
521- ) ;
522-
523- result . source = await cacheItem . getPromise ( ) ;
524- } else {
525- cacheDirectory = pattern . cacheTransform . directory
526- ? pattern . cacheTransform . directory
527- : typeof pattern . cacheTransform === "string"
528- ? pattern . cacheTransform
529- : findCacheDir ( { name : "copy-webpack-plugin" } ) ||
530- os . tmpdir ( ) ;
531-
532- let cached ;
492+ const cacheItem = cache . getItemCache (
493+ cacheKeys ,
494+ cache . getLazyHashedEtag ( result . source )
495+ ) ;
533496
534- try {
535- cached = await cacache . get ( cacheDirectory , cacheKeys ) ;
536- } catch ( error ) {
537- logger . debug (
538- `no transformation cache for '${ absoluteFilename } '...`
539- ) ;
540- }
541-
542- // eslint-disable-next-line no-undefined
543- result . source = cached ? new RawSource ( cached . data ) : undefined ;
544- }
497+ result . source = await cacheItem . getPromise ( ) ;
545498
546499 logger . debug (
547500 result . source
@@ -550,7 +503,7 @@ class CopyPlugin {
550503 ) ;
551504
552505 if ( ! result . source ) {
553- const transformed = await pattern . transform (
506+ const transformed = await pattern . transform . transformer (
554507 buffer ,
555508 absoluteFilename
556509 ) ;
@@ -561,24 +514,13 @@ class CopyPlugin {
561514 `caching transformation for '${ absoluteFilename } '...`
562515 ) ;
563516
564- // webpack@5 API
565- if ( cache ) {
566- await cacheItem . storePromise ( result . source ) ;
567- } else {
568- try {
569- await cacache . put ( cacheDirectory , cacheKeys , transformed ) ;
570- } catch ( error ) {
571- compilation . errors . push ( error ) ;
572-
573- return ;
574- }
575- }
517+ await cacheItem . storePromise ( result . source ) ;
576518
577519 logger . debug ( `cached transformation for '${ absoluteFilename } '` ) ;
578520 }
579521 } else {
580522 result . source = new RawSource (
581- await pattern . transform ( buffer , absoluteFilename )
523+ await pattern . transform . transformer ( buffer , absoluteFilename )
582524 ) ;
583525 }
584526 }
@@ -619,23 +561,6 @@ class CopyPlugin {
619561 ) ;
620562 }
621563
622- if ( pattern . transformPath ) {
623- logger . log (
624- `transforming '${ result . filename } ' for '${ absoluteFilename } '...`
625- ) ;
626-
627- // eslint-disable-next-line no-param-reassign
628- result . immutable = false ;
629- // eslint-disable-next-line no-param-reassign
630- result . filename = await pattern . transformPath (
631- result . filename ,
632- absoluteFilename
633- ) ;
634- logger . log (
635- `transformed new '${ result . filename } ' for '${ absoluteFilename } '...`
636- ) ;
637- }
638-
639564 // eslint-disable-next-line no-param-reassign
640565 result . filename = normalizePath ( result . filename ) ;
641566
@@ -663,14 +588,14 @@ class CopyPlugin {
663588
664589 compiler . hooks . thisCompilation . tap ( pluginName , ( compilation ) => {
665590 const logger = compilation . getLogger ( "copy-webpack-plugin" ) ;
666- const cache = compilation . getCache
667- ? compilation . getCache ( "CopyWebpackPlugin" )
668- : // eslint-disable-next-line no-undefined
669- undefined ;
670-
671- compilation . hooks . additionalAssets . tapAsync (
672- "copy-webpack-plugin" ,
673- async ( callback ) => {
591+ const cache = compilation . getCache ( "CopyWebpackPlugin" ) ;
592+
593+ compilation . hooks . processAssets . tapAsync (
594+ {
595+ name : "copy-webpack-plugin" ,
596+ stage : compiler . webpack . Compilation . PROCESS_ASSETS_STAGE_ADDITIONS ,
597+ } ,
598+ async ( unusedAssets , callback ) => {
674599 logger . log ( "starting to add additional assets..." ) ;
675600
676601 let assets ;
@@ -712,15 +637,6 @@ class CopyPlugin {
712637 force,
713638 } = asset ;
714639
715- // For old version webpack 4
716- /* istanbul ignore if */
717- if ( typeof compilation . emitAsset !== "function" ) {
718- // eslint-disable-next-line no-param-reassign
719- compilation . assets [ filename ] = source ;
720-
721- return ;
722- }
723-
724640 const existingAsset = compilation . getAsset ( filename ) ;
725641
726642 if ( existingAsset ) {
0 commit comments