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/FlagDependencyExportsPlugin.js | 247 ++++++++++++--------- 1 file changed, 146 insertions(+), 101 deletions(-) (limited to 'node_modules/webpack/lib/FlagDependencyExportsPlugin.js') diff --git a/node_modules/webpack/lib/FlagDependencyExportsPlugin.js b/node_modules/webpack/lib/FlagDependencyExportsPlugin.js index ff5e11255..0aafb0b4a 100644 --- a/node_modules/webpack/lib/FlagDependencyExportsPlugin.js +++ b/node_modules/webpack/lib/FlagDependencyExportsPlugin.js @@ -1,101 +1,146 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -class FlagDependencyExportsPlugin { - - apply(compiler) { - compiler.plugin("compilation", (compilation) => { - compilation.plugin("finish-modules", (modules) => { - const dependencies = Object.create(null); - - let module; - let moduleWithExports; - let moduleProvidedExports; - const queue = modules.filter((m) => !m.providedExports); - for(let i = 0; i < queue.length; i++) { - module = queue[i]; - - if(module.providedExports !== true) { - moduleWithExports = module.meta && module.meta.harmonyModule; - moduleProvidedExports = Array.isArray(module.providedExports) ? new Set(module.providedExports) : new Set(); - processDependenciesBlock(module); - if(!moduleWithExports) { - module.providedExports = true; - notifyDependencies(); - } else if(module.providedExports !== true) { - module.providedExports = Array.from(moduleProvidedExports); - } - } - } - - function processDependenciesBlock(depBlock) { - depBlock.dependencies.forEach((dep) => processDependency(dep)); - depBlock.variables.forEach((variable) => { - variable.dependencies.forEach((dep) => processDependency(dep)); - }); - depBlock.blocks.forEach(processDependenciesBlock); - } - - function processDependency(dep) { - const exportDesc = dep.getExports && dep.getExports(); - if(!exportDesc) return; - moduleWithExports = true; - const exports = exportDesc.exports; - const exportDeps = exportDesc.dependencies; - if(exportDeps) { - exportDeps.forEach((dep) => { - const depIdent = dep.identifier(); - // if this was not yet initialized - // initialize it as an array containing the module and stop - const array = dependencies[depIdent]; - if(!array) { - dependencies[depIdent] = [module]; - return; - } - - // check if this module is known - // if not, add it to the dependencies for this identifier - if(array.indexOf(module) < 0) - array.push(module); - }); - } - let changed = false; - if(module.providedExports !== true) { - if(exports === true) { - module.providedExports = true; - changed = true; - } else if(Array.isArray(exports)) { - changed = addToSet(moduleProvidedExports, exports); - } - } - if(changed) { - notifyDependencies(); - } - } - - function notifyDependencies() { - const deps = dependencies[module.identifier()]; - if(deps) { - deps.forEach((dep) => queue.push(dep)); - } - } - }); - - function addToSet(a, b) { - let changed = false; - b.forEach((item) => { - if(!a.has(item)) { - a.add(item); - changed = true; - } - }); - return changed; - } - }); - } -} - -module.exports = FlagDependencyExportsPlugin; +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +"use strict"; + +const Queue = require("./util/Queue"); + +const addToSet = (a, b) => { + let changed = false; + for (const item of b) { + if (!a.has(item)) { + a.add(item); + changed = true; + } + } + return changed; +}; + +class FlagDependencyExportsPlugin { + apply(compiler) { + compiler.hooks.compilation.tap( + "FlagDependencyExportsPlugin", + compilation => { + compilation.hooks.finishModules.tap( + "FlagDependencyExportsPlugin", + modules => { + const dependencies = new Map(); + + const queue = new Queue(); + + let module; + let moduleWithExports; + let moduleProvidedExports; + + const processDependenciesBlock = depBlock => { + for (const dep of depBlock.dependencies) { + if (processDependency(dep)) return true; + } + for (const variable of depBlock.variables) { + for (const dep of variable.dependencies) { + if (processDependency(dep)) return true; + } + } + for (const block of depBlock.blocks) { + if (processDependenciesBlock(block)) return true; + } + return false; + }; + + const processDependency = dep => { + const exportDesc = dep.getExports && dep.getExports(); + if (!exportDesc) return; + moduleWithExports = true; + const exports = exportDesc.exports; + // break early if it's only in the worst state + if (module.buildMeta.providedExports === true) { + return true; + } + // break if it should move to the worst state + if (exports === true) { + module.buildMeta.providedExports = true; + notifyDependencies(); + return true; + } + // merge in new exports + if (Array.isArray(exports)) { + if (addToSet(moduleProvidedExports, exports)) { + notifyDependencies(); + } + } + // store dependencies + const exportDeps = exportDesc.dependencies; + if (exportDeps) { + for (const exportDependency of exportDeps) { + // add dependency for this module + const set = dependencies.get(exportDependency); + if (set === undefined) { + dependencies.set(exportDependency, new Set([module])); + } else { + set.add(module); + } + } + } + return false; + }; + + const notifyDependencies = () => { + const deps = dependencies.get(module); + if (deps !== undefined) { + for (const dep of deps) { + queue.enqueue(dep); + } + } + }; + + // Start with all modules without provided exports + for (const module of modules) { + if (!module.buildMeta.providedExports) { + queue.enqueue(module); + } + } + + while (queue.length > 0) { + module = queue.dequeue(); + + if (module.buildMeta.providedExports !== true) { + moduleWithExports = + module.buildMeta && module.buildMeta.exportsType; + moduleProvidedExports = Array.isArray( + module.buildMeta.providedExports + ) + ? new Set(module.buildMeta.providedExports) + : new Set(); + processDependenciesBlock(module); + if (!moduleWithExports) { + module.buildMeta.providedExports = true; + notifyDependencies(); + } else if (module.buildMeta.providedExports !== true) { + module.buildMeta.providedExports = Array.from( + moduleProvidedExports + ); + } + } + } + } + ); + const providedExportsCache = new WeakMap(); + compilation.hooks.rebuildModule.tap( + "FlagDependencyExportsPlugin", + module => { + providedExportsCache.set(module, module.buildMeta.providedExports); + } + ); + compilation.hooks.finishRebuildingModule.tap( + "FlagDependencyExportsPlugin", + module => { + module.buildMeta.providedExports = providedExportsCache.get(module); + } + ); + } + ); + } +} + +module.exports = FlagDependencyExportsPlugin; -- cgit v1.2.3