const NormalModule = require('webpack/lib/NormalModule'); const cachePrefix = require('./util').cachePrefix; const pluginCompat = require('./util/plugin-compat'); function wrapSource(source, methods) { Object.keys(methods).forEach(key => { const _method = source[key]; source[key] = function(...args) { methods[key].apply(this, args); _method && _method.apply(this, args); }; }); return source; } function spyMethod(name, mods) { return function(...args) { mods.push([name].concat([].slice.call(args))); }; } function isEqual(a, b) { if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) { return a.reduce( (carry, value, index) => carry && isEqual(value, b[index]), true, ); } else if (a === b) { return true; } return false; } class HardModuleConcatenationPlugin { apply(compiler) { let store; let freeze; pluginCompat.tap( compiler, '_hardSourceMethods', 'HardModuleConcatenationPlugin', methods => { store = methods.store; // fetch = methods.fetch; freeze = methods.freeze; // thaw = methods.thaw; // mapFreeze = methods.mapFreeze; // mapThaw = methods.mapThaw; }, ); pluginCompat.tap( compiler, '_hardSourceFreezeModule', 'HardModuleConcatenationPlugin', (frozen, { modules }, extra) => { if (modules) { const compilation = extra.compilation; modules.forEach(module => { if ( (module.cacheable || (module.buildInfo && module.buildInfo.cacheable)) && module instanceof NormalModule ) { const identifierPrefix = cachePrefix(compilation); if (identifierPrefix === null) { return; } const identifier = identifierPrefix + module.identifier(); store('Module', identifier, module, { id: identifier, compilation, }); } }); } return frozen; }, ); pluginCompat.tap( compiler, '_hardSourceAfterFreezeModule', 'HardModuleConcatenationPlugin', (frozen, module, { compilation }) => { return frozen; if (frozen && module.__hardSource_concatedSource) { const source = module.__hardSource_concatedSource; frozen.source = source.source(); frozen.sourceMap = freeze('SourceMap', null, source, { module, compilation: compilation, }); frozen.concatenatedSourceMods = module.__hardSource_sourceMods; } return frozen; }, ); } } module.exports = HardModuleConcatenationPlugin;