diff --git a/src/WebpackAssetsManifest.js b/src/WebpackAssetsManifest.js index 0e00796..e8fe0b0 100644 --- a/src/WebpackAssetsManifest.js +++ b/src/WebpackAssetsManifest.js @@ -82,7 +82,7 @@ class WebpackAssetsManifest // This is what gets JSON stringified this.assets = this.options.assets; - // hashed filename : original filename + // original filename : hashed filename this.assetNames = new Map(); // This is passed to the customize() hook @@ -357,7 +357,7 @@ class WebpackAssetsManifest maybeArrayWrap( assets[ chunkName ] ) .filter( f => ! this.isHMR(f) ) // Remove hot module replacement files .forEach( filename => { - this.assetNames.set( filename, chunkName + this.getExtension( filename ) ); + this.assetNames.set( chunkName + this.getExtension( filename ), filename ); }); }); @@ -449,7 +449,7 @@ class WebpackAssetsManifest this.processAssetsByChunkName( this.stats.assetsByChunkName ); - for ( const [ hashedFile, filename ] of this.assetNames ) { + for ( const [ filename, hashedFile ] of this.assetNames ) { this.currentAsset = compilation.assets[ hashedFile ]; // `integrity` may have already been set by another plugin, like `webpack-subresource-integrity`. @@ -511,7 +511,7 @@ class WebpackAssetsManifest */ handleAfterEmit(compilation) { - // Reset the internal mapping of hashed name to original name after every compilation. + // Reset the internal mapping of original name to hashed name after every compilation. this.assetNames.clear(); if ( ! this.options.writeToDisk ) { @@ -542,13 +542,15 @@ class WebpackAssetsManifest loaderContext.emitFile = (...args) => { const [ name ] = args; - if ( ! this.assetNames.has( name ) ) { - const originalName = path.join( - path.dirname(name), - path.basename(module.userRequest) - ); + const originalName = path.join( + path.dirname(name), + path.basename(module.userRequest) + ); - this.assetNames.set(name, originalName); + // ignore emitFile calls from mini-css-extract-plugin + // https://github.com/webpack-contrib/mini-css-extract-plugin/pull/177 + if (!module.identifier().includes('/mini-css-extract-plugin/')) { + this.assetNames.set(originalName, name); } return emitFile.apply(module, args); diff --git a/test/WebpackAssetsManifest-test.js b/test/WebpackAssetsManifest-test.js index 8be296d..75f6e2a 100644 --- a/test/WebpackAssetsManifest-test.js +++ b/test/WebpackAssetsManifest-test.js @@ -1064,7 +1064,13 @@ describe('WebpackAssetsManifest', function() { function(err, content) { assert.isNull(err, 'Error found reading manifest.json'); - assert.include(content.toString(), 'images/Ginger.jpg'); + const manifest = JSON.parse(content.toString()); + const manifestKeys = Object.keys(manifest); + + // despite being emitted to the same file, both image names should appear in manifest + assert.equal(manifest['images/Ginger.jpg'], manifest['images/Ginger-duplicate.jpg']); + assert.include(manifestKeys, 'images/Ginger.jpg'); + assert.include(manifestKeys, 'images/Ginger-duplicate.jpg'); done(); } @@ -1277,9 +1283,9 @@ describe('WebpackAssetsManifest', function() { main: [ 'main.123456.js', '0.123456.hot-update.js' ], }); - assert.equal( manifest.assetNames.get('main.123456.js'), 'main.js' ); + assert.equal( manifest.assetNames.get('main.js'), 'main.123456.js' ); - assert.isFalse( manifest.assetNames.has('0.123456.hot-update.js') ); + assert.notInclude( Object.values(manifest.assetNames), '0.123456.hot-update.js' ); }); it('isHMR should return false when hotUpdateChunkFilename is ambiguous', function() { diff --git a/test/fixtures/Ginger-duplicate.jpg b/test/fixtures/Ginger-duplicate.jpg new file mode 100644 index 0000000..e175f56 Binary files /dev/null and b/test/fixtures/Ginger-duplicate.jpg differ diff --git a/test/fixtures/client.js b/test/fixtures/client.js index 464dff8..a94c27c 100644 --- a/test/fixtures/client.js +++ b/test/fixtures/client.js @@ -1,3 +1,5 @@ console.log('Client'); +// despite having the same hash, both files should appear in manifest require('./Ginger.jpg'); +require('./Ginger-duplicate.jpg'); diff --git a/test/fixtures/configs.js b/test/fixtures/configs.js index 8989869..f6d2aca 100644 --- a/test/fixtures/configs.js +++ b/test/fixtures/configs.js @@ -58,7 +58,7 @@ function client() rules: [ { test: /\.jpg$/i, - loader: 'file-loader?name=images/[name].[ext]', + loader: 'file-loader?name=images/[hash].[ext]', }, ], },