From bbff7403fbf46f9ad92240ac213df8d30ef31b64 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 20 Sep 2018 02:56:13 +0200 Subject: update packages --- .../webpack/lib/FlagDependencyUsagePlugin.js | 197 ++++++++++++--------- 1 file changed, 116 insertions(+), 81 deletions(-) (limited to 'node_modules/webpack/lib/FlagDependencyUsagePlugin.js') diff --git a/node_modules/webpack/lib/FlagDependencyUsagePlugin.js b/node_modules/webpack/lib/FlagDependencyUsagePlugin.js index 40e1769b1..85c221608 100644 --- a/node_modules/webpack/lib/FlagDependencyUsagePlugin.js +++ b/node_modules/webpack/lib/FlagDependencyUsagePlugin.js @@ -1,81 +1,116 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -class FlagDependencyUsagePlugin { - apply(compiler) { - compiler.plugin("compilation", compilation => { - compilation.plugin("optimize-modules-advanced", modules => { - - modules.forEach(module => module.used = false); - - const queue = []; - compilation.chunks.forEach(chunk => { - if(chunk.entryModule) { - processModule(chunk.entryModule, true); - } - }); - - while(queue.length) { - const queueItem = queue.pop(); - processDependenciesBlock(queueItem[0], queueItem[1]); - } - - function processModule(module, usedExports) { - module.used = true; - if(module.usedExports === true) - return; - else if(usedExports === true) - module.usedExports = true; - else if(Array.isArray(usedExports)) { - const old = module.usedExports ? module.usedExports.length : -1; - module.usedExports = addToSet(module.usedExports || [], usedExports); - if(module.usedExports.length === old) - return; - } else if(Array.isArray(module.usedExports)) - return; - else - module.usedExports = false; - - queue.push([module, module.usedExports]); - } - - function processDependenciesBlock(depBlock, usedExports) { - depBlock.dependencies.forEach(dep => processDependency(dep)); - depBlock.variables.forEach(variable => variable.dependencies.forEach(dep => processDependency(dep))); - depBlock.blocks.forEach(block => queue.push([block, usedExports])); - } - - function processDependency(dep) { - const reference = dep.getReference && dep.getReference(); - if(!reference) return; - const module = reference.module; - const importedNames = reference.importedNames; - const oldUsed = module.used; - const oldUsedExports = module.usedExports; - if(!oldUsed || (importedNames && (!oldUsedExports || !isSubset(oldUsedExports, importedNames)))) { - processModule(module, importedNames); - } - } - - }); - - function addToSet(a, b) { - b.forEach(item => { - if(a.indexOf(item) < 0) - a.push(item); - }); - return a; - } - - function isSubset(biggerSet, subset) { - if(biggerSet === true) return true; - if(subset === true) return false; - return subset.every(item => biggerSet.indexOf(item) >= 0); - } - }); - } -} -module.exports = FlagDependencyUsagePlugin; +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +"use strict"; + +/** @typedef {import("./Module")} Module */ +/** @typedef {import("./DependenciesBlock")} DependenciesBlock */ + +/** @typedef {false | true | string[]} UsedExports */ + +const addToSet = (a, b) => { + for (const item of b) { + if (!a.includes(item)) a.push(item); + } + return a; +}; + +const isSubset = (biggerSet, subset) => { + if (biggerSet === true) return true; + if (subset === true) return false; + return subset.every(item => biggerSet.indexOf(item) >= 0); +}; + +class FlagDependencyUsagePlugin { + apply(compiler) { + compiler.hooks.compilation.tap("FlagDependencyUsagePlugin", compilation => { + compilation.hooks.optimizeDependencies.tap( + "FlagDependencyUsagePlugin", + modules => { + const processModule = (module, usedExports) => { + module.used = true; + if (module.usedExports === true) return; + if (usedExports === true) { + module.usedExports = true; + } else if (Array.isArray(usedExports)) { + const old = module.usedExports ? module.usedExports.length : -1; + module.usedExports = addToSet( + module.usedExports || [], + usedExports + ); + if (module.usedExports.length === old) { + return; + } + } else if (Array.isArray(module.usedExports)) { + return; + } else { + module.usedExports = false; + } + + // for a module without side effects we stop tracking usage here when no export is used + // This module won't be evaluated in this case + if (module.factoryMeta.sideEffectFree) { + if (module.usedExports === false) return; + if ( + Array.isArray(module.usedExports) && + module.usedExports.length === 0 + ) + return; + } + + queue.push([module, module, module.usedExports]); + }; + + const processDependenciesBlock = (module, depBlock, usedExports) => { + for (const dep of depBlock.dependencies) { + processDependency(module, dep); + } + for (const variable of depBlock.variables) { + for (const dep of variable.dependencies) { + processDependency(module, dep); + } + } + for (const block of depBlock.blocks) { + queue.push([module, block, usedExports]); + } + }; + + const processDependency = (module, dep) => { + const reference = compilation.getDependencyReference(module, dep); + if (!reference) return; + const referenceModule = reference.module; + const importedNames = reference.importedNames; + const oldUsed = referenceModule.used; + const oldUsedExports = referenceModule.usedExports; + if ( + !oldUsed || + (importedNames && + (!oldUsedExports || !isSubset(oldUsedExports, importedNames))) + ) { + processModule(referenceModule, importedNames); + } + }; + + for (const module of modules) { + module.used = false; + } + + /** @type {[Module, DependenciesBlock, UsedExports][]} */ + const queue = []; + for (const preparedEntrypoint of compilation._preparedEntrypoints) { + if (preparedEntrypoint.module) { + processModule(preparedEntrypoint.module, true); + } + } + + while (queue.length) { + const queueItem = queue.pop(); + processDependenciesBlock(queueItem[0], queueItem[1], queueItem[2]); + } + } + ); + }); + } +} +module.exports = FlagDependencyUsagePlugin; -- cgit v1.2.3