| 
									
										
										
										
											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 10:44:18 +08:00
										 |  |  | 							// if this was not yet initialized
 | 
					
						
							|  |  |  | 							// initialize it as an array containing the module and stop
 | 
					
						
							| 
									
										
										
										
											2017-02-08 16:01:59 +08:00
										 |  |  | 							const array = dependencies[depIdent]; | 
					
						
							|  |  |  | 							if(!array) { | 
					
						
							| 
									
										
										
										
											2017-02-05 10:44:18 +08:00
										 |  |  | 								dependencies[depIdent] = [module]; | 
					
						
							|  |  |  | 								return; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							// check if this module is known
 | 
					
						
							|  |  |  | 							// if not, add it to the dependencies for this identifier
 | 
					
						
							| 
									
										
										
										
											2017-02-08 16:01:59 +08:00
										 |  |  | 							if(array.indexOf(module) < 0) | 
					
						
							|  |  |  | 								array.push(module); | 
					
						
							| 
									
										
										
										
											2017-01-10 18:59:56 +08:00
										 |  |  | 						}); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					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; |