Blame view

node_modules/webpack/lib/FlagDependencyExportsPlugin.js 2.8 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
  /*
  	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;