@@ -28,7 +28,6 @@ const deleteUnusedEntriesPluginUtil = require('./plugins/delete-unused-entries')
2828const entryFilesManifestPlugin = require ( './plugins/entry-files-manifest' ) ;
2929const manifestPluginUtil = require ( './plugins/manifest' ) ;
3030const variableProviderPluginUtil = require ( './plugins/variable-provider' ) ;
31- const cleanPluginUtil = require ( './plugins/clean' ) ;
3231const definePluginUtil = require ( './plugins/define' ) ;
3332const terserPluginUtil = require ( './plugins/terser' ) ;
3433const optimizeCssAssetsUtil = require ( './plugins/optimize-css-assets' ) ;
@@ -40,6 +39,7 @@ const PluginPriorities = require('./plugins/plugin-priorities');
4039const applyOptionsCallback = require ( './utils/apply-options-callback' ) ;
4140const copyEntryTmpName = require ( './utils/copyEntryTmpName' ) ;
4241const getVueVersion = require ( './utils/get-vue-version' ) ;
42+ const multimatch = require ( 'multimatch' ) ;
4343const tmp = require ( 'tmp' ) ;
4444const fs = require ( 'fs' ) ;
4545const path = require ( 'path' ) ;
@@ -244,6 +244,7 @@ class ConfigGenerator {
244244 }
245245
246246 return {
247+ clean : this . buildCleanConfig ( ) ,
247248 path : this . webpackConfig . outputPath ,
248249 filename : filename ,
249250 // default "asset module" filename
@@ -256,6 +257,26 @@ class ConfigGenerator {
256257 } ;
257258 }
258259
260+ /**
261+ * @returns {import('webpack').CleanOptions|boolean }
262+ */
263+ buildCleanConfig ( ) {
264+ if ( ! this . webpackConfig . cleanupOutput ) {
265+ return false ;
266+ }
267+
268+ const cleanedPaths = [ ] . concat ( this . webpackConfig . cleanWebpackPluginPaths ) ;
269+ // works around a bug where manifest.json is emitted when
270+ // using dev-server... but then CleanWebpackPlugin deletes it
271+ cleanedPaths . push ( '!manifest.json' ) ;
272+
273+ const cleanConfig = {
274+ keep : ( path ) => multimatch ( path , cleanedPaths ) . length === 0
275+ } ;
276+
277+ return applyOptionsCallback ( this . webpackConfig . cleanWebpackPluginOptionsCallback , cleanConfig ) ;
278+ }
279+
259280 buildRulesConfig ( ) {
260281 const applyRuleConfigurationCallback = ( name , defaultRules ) => {
261282 return applyOptionsCallback ( this . webpackConfig . loaderConfigurationCallbacks [ name ] , defaultRules ) ;
@@ -457,8 +478,6 @@ class ConfigGenerator {
457478
458479 variableProviderPluginUtil ( plugins , this . webpackConfig ) ;
459480
460- cleanPluginUtil ( plugins , this . webpackConfig ) ;
461-
462481 definePluginUtil ( plugins , this . webpackConfig ) ;
463482
464483 notifierPluginUtil ( plugins , this . webpackConfig ) ;
0 commit comments