const pluginCompat = require('./util/plugin-compat'); const mixinCssDependency = function(CssDependency) { const Dependency = Object.getPrototypeOf(CssDependency.prototype).constructor; CssDependency.prototype.updateHash = function(hash) { Dependency.prototype.updateHash.call(this, hash); hash.update(this.content); }; }; class SupportMiniCssExtractPlugin { apply(compiler) { let CssDependency; pluginCompat.tap( compiler, 'make', 'SupportMiniCssExtractPlugin', ({ dependencyFactories }) => { const Dependencies = dependencyFactories.keys(); for (const Dep of Dependencies) { if (Dep.name === 'CssDependency') { CssDependency = Dep; mixinCssDependency(CssDependency); break; } } }, ); pluginCompat.tap( compiler, '_hardSourceFreezeDependency', 'HardMiniCssExtractPlugin freeze', (frozen, dependency, extra) => { if (dependency.constructor === CssDependency) { return { type: 'CssDependency', line: { identifier: dependency.identifier, content: dependency.content, media: dependency.media, sourceMap: dependency.sourceMap, }, context: dependency.context, identifierIndex: dependency.identifierIndex, }; } return frozen; }, ); pluginCompat.tap( compiler, '_hardSourceThawDependency', 'HardMiniCssExtractPlugin', (dependency, { type, line, context, identifierIndex }, extra) => { if (type === 'CssDependency') { return new CssDependency(line, context, identifierIndex); } return dependency; }, ); } } module.exports = SupportMiniCssExtractPlugin;