mirror of https://github.com/webpack/webpack.git
98 lines
2.4 KiB
JavaScript
98 lines
2.4 KiB
JavaScript
|
/*
|
||
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
|
Author Tobias Koppers @sokra
|
||
|
*/
|
||
|
function FlagDependencyExportsPlugin() {
|
||
|
|
||
|
}
|
||
|
module.exports = FlagDependencyExportsPlugin;
|
||
|
|
||
|
FlagDependencyExportsPlugin.prototype.apply = function(compiler) {
|
||
|
compiler.plugin("compilation", function(compilation) {
|
||
|
compilation.plugin("optimize-modules-advanced", function(modules) {
|
||
|
|
||
|
modules.forEach(function(module) {
|
||
|
module.used = false;
|
||
|
})
|
||
|
|
||
|
var dependencies = {};
|
||
|
|
||
|
var module, moduleWithExports;
|
||
|
var queue = modules.slice();
|
||
|
for(var i = 0; i < queue.length; i++) {
|
||
|
module = queue[i];
|
||
|
|
||
|
if(module.providedExports !== true) {
|
||
|
moduleWithExports = false;
|
||
|
processDependenciesBlock(module);
|
||
|
if(!moduleWithExports) {
|
||
|
module.providedExports = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function processDependenciesBlock(depBlock) {
|
||
|
depBlock.dependencies.forEach(function(dep) {
|
||
|
processDependency(dep);
|
||
|
});
|
||
|
depBlock.variables.forEach(function(variable) {
|
||
|
variable.dependencies.forEach(function(dep) {
|
||
|
processDependency(dep);
|
||
|
});
|
||
|
});
|
||
|
depBlock.blocks.forEach(function(block) {
|
||
|
processDependenciesBlock(block);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function processDependency(dep, usedExports) {
|
||
|
var exportDesc = dep.getExports && dep.getExports();
|
||
|
if(!exportDesc) return;
|
||
|
moduleWithExports = true;
|
||
|
var exports = exportDesc.exports;
|
||
|
var exportDeps = exportDesc.dependencies;
|
||
|
if(exportDeps) {
|
||
|
exportDeps.forEach(function(dep) {
|
||
|
var depIdent = dep.identifier();
|
||
|
var array = dependencies["$" + depIdent];
|
||
|
if(!array) array = dependencies["$" + depIdent] = [];
|
||
|
if(array.indexOf(module) < 0)
|
||
|
array.push(module);
|
||
|
});
|
||
|
}
|
||
|
var changed = false;
|
||
|
if(exports === true) {
|
||
|
module.providedExports = true;
|
||
|
changed = true;
|
||
|
} else if(Array.isArray(exports)) {
|
||
|
if(Array.isArray(module.providedExports)) {
|
||
|
changed = addToSet(module.providedExports, exports);
|
||
|
} else {
|
||
|
module.providedExports = exports.slice();
|
||
|
changed = true;
|
||
|
}
|
||
|
};
|
||
|
if(changed) {
|
||
|
var deps = dependencies["$" + module.identifier()];
|
||
|
if(deps) {
|
||
|
deps.forEach(function(dep) {
|
||
|
queue.push(dep);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function addToSet(a, b) {
|
||
|
var changed = false;
|
||
|
b.forEach(function(item) {
|
||
|
if(a.indexOf(item) < 0) {
|
||
|
a.push(item);
|
||
|
changed = true;
|
||
|
}
|
||
|
});
|
||
|
return changed;
|
||
|
}
|
||
|
});
|
||
|
};
|