2016-09-06 05:41:03 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
2017-01-10 18:59:56 +08:00
|
|
|
"use strict";
|
2016-09-06 05:41:03 +08:00
|
|
|
|
2017-01-10 18:59:56 +08:00
|
|
|
class FlagDependencyExportsPlugin {
|
2016-09-06 05:41:03 +08:00
|
|
|
|
2017-01-10 18:59:56 +08:00
|
|
|
apply(compiler) {
|
|
|
|
compiler.plugin("compilation", (compilation) => {
|
|
|
|
compilation.plugin("finish-modules", (modules) => {
|
2016-09-06 05:41:03 +08:00
|
|
|
|
2017-01-26 06:23:20 +08:00
|
|
|
const dependencies = Object.create(null);
|
2016-09-06 05:41:03 +08:00
|
|
|
|
2017-01-10 18:59:56 +08:00
|
|
|
let module;
|
|
|
|
let moduleWithExports;
|
|
|
|
const queue = modules.filter((m) => !m.providedExports);
|
|
|
|
for(let i = 0; i < queue.length; i++) {
|
|
|
|
module = queue[i];
|
2016-09-06 05:41:03 +08:00
|
|
|
|
2017-01-10 18:59:56 +08:00
|
|
|
if(module.providedExports !== true) {
|
|
|
|
moduleWithExports = false;
|
|
|
|
processDependenciesBlock(module);
|
|
|
|
if(!moduleWithExports) {
|
|
|
|
module.providedExports = true;
|
|
|
|
notifyDependencies();
|
|
|
|
}
|
2016-09-06 05:41:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-10 18:59:56 +08:00
|
|
|
function processDependenciesBlock(depBlock) {
|
|
|
|
depBlock.dependencies.forEach((dep) => processDependency(dep));
|
|
|
|
depBlock.variables.forEach((variable) => {
|
|
|
|
variable.dependencies.forEach((dep) => processDependency(dep));
|
2016-09-06 05:41:03 +08:00
|
|
|
});
|
2017-01-26 06:23:20 +08:00
|
|
|
depBlock.blocks.forEach(processDependenciesBlock);
|
2016-09-06 05:41:03 +08:00
|
|
|
}
|
2017-01-10 18:59:56 +08:00
|
|
|
|
|
|
|
function processDependency(dep, usedExports) {
|
|
|
|
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();
|
2017-02-05 07:25:12 +08:00
|
|
|
const array = dependencies[depIdent] = dependencies[depIdent] || [];
|
2017-01-10 18:59:56 +08:00
|
|
|
if(array.indexOf(module) < 0)
|
|
|
|
array.push(module);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
let changed = false;
|
|
|
|
if(module.providedExports !== true) {
|
|
|
|
if(exports === true) {
|
|
|
|
module.providedExports = true;
|
2016-09-09 20:20:29 +08:00
|
|
|
changed = true;
|
2017-01-10 18:59:56 +08:00
|
|
|
} else if(Array.isArray(exports)) {
|
|
|
|
if(Array.isArray(module.providedExports)) {
|
|
|
|
changed = addToSet(module.providedExports, exports);
|
|
|
|
} else {
|
|
|
|
module.providedExports = exports.slice();
|
|
|
|
changed = true;
|
|
|
|
}
|
2016-09-09 20:20:29 +08:00
|
|
|
}
|
2016-11-21 08:00:25 +08:00
|
|
|
}
|
2017-01-10 18:59:56 +08:00
|
|
|
if(changed) {
|
|
|
|
notifyDependencies();
|
|
|
|
}
|
2016-09-09 20:20:29 +08:00
|
|
|
}
|
2016-09-09 20:50:14 +08:00
|
|
|
|
2017-01-10 18:59:56 +08:00
|
|
|
function notifyDependencies() {
|
2017-01-26 06:23:20 +08:00
|
|
|
const deps = dependencies[module.identifier()];
|
2017-01-10 18:59:56 +08:00
|
|
|
if(deps) {
|
|
|
|
deps.forEach((dep) => queue.push(dep));
|
|
|
|
}
|
2016-09-06 05:41:03 +08:00
|
|
|
}
|
2017-01-10 18:59:56 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
function addToSet(a, b) {
|
|
|
|
let changed = false;
|
|
|
|
b.forEach((item) => {
|
|
|
|
if(a.indexOf(item) < 0) {
|
|
|
|
a.push(item);
|
|
|
|
changed = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return changed;
|
2016-09-06 05:41:03 +08:00
|
|
|
}
|
|
|
|
});
|
2017-01-10 18:59:56 +08:00
|
|
|
}
|
|
|
|
}
|
2016-09-06 05:41:03 +08:00
|
|
|
|
2017-01-10 18:59:56 +08:00
|
|
|
module.exports = FlagDependencyExportsPlugin;
|