55const path = require ( 'path' ) ;
66const ansis = require ( 'ansis' ) ;
77
8- const plugin = 'remove-empty-scripts' ;
8+ const { outToConsole } = require ( './utils' ) ;
9+
10+ const pluginName = 'remove-empty-scripts' ;
911const defaultOptions = {
1012 enabled : true ,
1113 verbose : false ,
@@ -19,6 +21,9 @@ const defaultOptions = {
1921let dependencyId = 1 ;
2022
2123class WebpackRemoveEmptyScriptsPlugin {
24+ outputPath = '' ;
25+ trash = [ ] ;
26+
2227 constructor ( options ) {
2328 this . apply = this . apply . bind ( this ) ;
2429 this . options = Object . assign ( { } , defaultOptions , options ) ;
@@ -40,26 +45,29 @@ class WebpackRemoveEmptyScriptsPlugin {
4045 apply ( compiler ) {
4146 if ( ! this . enabled ) return ;
4247
43- const { remove : removeAssets , ignore : ignoreEntryResource , extensions : styleExtensionRegexp } = this . options ;
48+ // clear cache for webpack dev server
49+ this . trash = [ ] ;
50+ this . outputPath = compiler . options . output . path ;
4451
45- compiler . hooks . compilation . tap ( plugin , compilation => {
52+ compiler . hooks . thisCompilation . tap ( pluginName , compilation => {
4653 const resourcesCache = [ ] ;
4754
48- compilation . hooks . chunkAsset . tap ( plugin , ( chunk , filename ) => {
55+ compilation . hooks . chunkAsset . tap ( pluginName , ( chunk , filename ) => {
56+ const { remove : removeAssets , ignore : ignoreEntryResource , extensions : styleExtensionRegexp } = this . options ;
4957 if ( ! removeAssets . test ( filename ) ) return ;
5058
51- const outputPath = compiler . options . output . path ;
5259 const chunkGraph = compilation . chunkGraph ;
5360 let entryResources = [ ] ;
5461
5562 for ( const module of chunkGraph . getChunkEntryModulesIterable ( chunk ) ) {
5663 if ( ! compilation . modules . has ( module ) ) {
5764 throw new Error (
58- `\n${ ansis . black . bgRed ( `[${ plugin } ]` ) } entry module in chunk but not in compilation ${ chunk . debugId } ${ module . debugId } `
65+ `\n${ ansis . black . bgRed (
66+ `[${ pluginName } ]` ) } entry module in chunk but not in compilation ${ chunk . debugId } ${ module . debugId } `,
5967 ) ;
6068 }
6169
62- const moduleResources = collectEntryResources ( compilation , module , resourcesCache ) ;
70+ const moduleResources = getEntryResources ( compilation , module , resourcesCache ) ;
6371 entryResources = entryResources . concat ( moduleResources ) ;
6472 }
6573
@@ -72,24 +80,29 @@ class WebpackRemoveEmptyScriptsPlugin {
7280
7381 if ( isEmptyScript ) {
7482 if ( this . verbose ) {
75- const outputFile = path . join ( outputPath , filename ) ;
76- console . log (
77- `${ ansis . black . bgYellow ( `[${ plugin } ]` ) } remove ${ ansis . cyan ( outputFile ) } ` ,
83+ const outputFile = path . join ( this . outputPath , filename ) ;
84+ outToConsole (
85+ `${ ansis . black . bgYellow ( `[${ pluginName } ]` ) } remove ${ ansis . cyan ( outputFile ) } \n ` ,
7886 ) ;
7987 }
80-
81- chunk . files . delete ( filename ) ;
82- compilation . deleteAsset ( filename ) ;
88+ // note: do not delete here compilation empty assets, do it in 'afterProcessAssets' only
89+ this . trash . push ( filename ) ;
8390 }
8491 } ) ;
92+
93+ // Delete empty scripts only after processing all plugins,
94+ // otherwise, by usage some plugins, the necessary files may be not created.
95+ compilation . hooks . afterProcessAssets . tap ( pluginName , ( ) => {
96+ this . trash . forEach ( file => compilation . deleteAsset ( file ) ) ;
97+ } ) ;
8598 } ) ;
8699 }
87100}
88101
89- function collectEntryResources ( compilation , module , cache ) {
102+ function getEntryResources ( compilation , module , cache ) {
90103 const moduleGraph = compilation . moduleGraph ,
91104 index = moduleGraph . getPreOrderIndex ( module ) ,
92- propNameDependencyId = '__dependencyWebpackRemoveEmptyScriptsUniqueId ' ,
105+ propNameDependencyId = '__webpackRemoveEmptyScriptsUniqueId ' ,
93106 resources = [ ] ;
94107
95108 // the index can be null
@@ -108,7 +121,6 @@ function collectEntryResources (compilation, module, cache) {
108121
109122 if ( module . dependencies ) {
110123 module . dependencies . forEach ( dependency => {
111-
112124 let module = moduleGraph . getModule ( dependency ) ,
113125 originModule = moduleGraph . getParentModule ( dependency ) ,
114126 nextModule = module || originModule ,
@@ -119,11 +131,8 @@ function collectEntryResources (compilation, module, cache) {
119131 useNextModule = true ;
120132 }
121133
122- // debug info
123- //console.log('::: module ::: ', useNextModule ? '' : '-----', dependency[propNameDependencyId]);
124-
125134 if ( nextModule && useNextModule ) {
126- const dependencyResources = collectEntryResources ( compilation , nextModule , cache ) ;
135+ const dependencyResources = getEntryResources ( compilation , nextModule , cache ) ;
127136
128137 for ( let i = 0 , length = dependencyResources . length ; i !== length ; i ++ ) {
129138 const file = dependencyResources [ i ] ;
0 commit comments