diff --git a/src/WebpackAssetsManifest.js b/src/WebpackAssetsManifest.js index b72d9c4..bfca403 100644 --- a/src/WebpackAssetsManifest.js +++ b/src/WebpackAssetsManifest.js @@ -128,7 +128,37 @@ class WebpackAssetsManifest } // compilation.assets contains the results of the build - compiler.hooks.compilation.tap(PLUGIN_NAME, this.handleCompilation.bind(this)); + // compiler.hooks.compilation.tap(PLUGIN_NAME, this.handleCompilation.bind(this)); + + const isCss = (s) => /^.*\.css$/.test(s); + const MINI_EXTRACT_CSS_LOADER_MODULE_TYPE = 'css/mini-extract'; + + compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => + compilation.hooks.normalModuleLoader.tap( + PLUGIN_NAME, + (loaderContext, module) => { + const emitFile = loaderContext.emitFile; + const identifier = module.identifier(); + // TODO: check this, basic we want to skip updating `assetNames` cache + // when using `css/mini-extract` + const isValid = + loaderContext[MINI_EXTRACT_CSS_LOADER_MODULE_TYPE] !== undefined + ? !isCss(identifier) + : true; + + loaderContext.emitFile = (name, content, sourceMap) => { + if (isValid) { + const originalName = path.join( + path.dirname(name), + path.basename(identifier) + ); + this.assetNames.set(name, originalName); + } + return emitFile.call(module, name, content, sourceMap); + }; + } + ) + ); // Add manifest.json to compiler.assets compiler.hooks.emit.tapAsync(PLUGIN_NAME, this.handleEmit.bind(this));