| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | const CommonJsRequireDependency = require("./CommonJsRequireDependency"); | 
					
						
							|  |  |  | const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency"); | 
					
						
							|  |  |  | const RequireHeaderDependency = require("./RequireHeaderDependency"); | 
					
						
							|  |  |  | const LocalModuleDependency = require("./LocalModuleDependency"); | 
					
						
							|  |  |  | const ContextDependencyHelpers = require("./ContextDependencyHelpers"); | 
					
						
							|  |  |  | const LocalModulesHelpers = require("./LocalModulesHelpers"); | 
					
						
							| 
									
										
										
										
											2017-01-26 06:50:13 +08:00
										 |  |  | const ParserHelpers = require("../ParserHelpers"); | 
					
						
							| 
									
										
										
										
											2014-03-11 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | class CommonJsRequireDependencyParserPlugin { | 
					
						
							|  |  |  | 	constructor(options) { | 
					
						
							|  |  |  | 		this.options = options; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-03-11 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 	apply(parser) { | 
					
						
							|  |  |  | 		const options = this.options; | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const processItem = (expr, param) => { | 
					
						
							|  |  |  | 			if(param.isString()) { | 
					
						
							|  |  |  | 				const dep = new CommonJsRequireDependency(param.string, param.range); | 
					
						
							|  |  |  | 				dep.loc = expr.loc; | 
					
						
							|  |  |  | 				dep.optional = !!parser.scope.inTry; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		const processContext = (expr, param) => { | 
					
						
							|  |  |  | 			const dep = ContextDependencyHelpers.create(CommonJsRequireContextDependency, expr.range, param, expr, options); | 
					
						
							|  |  |  | 			if(!dep) return; | 
					
						
							|  |  |  | 			dep.loc = expr.loc; | 
					
						
							|  |  |  | 			dep.optional = !!parser.scope.inTry; | 
					
						
							|  |  |  | 			parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 06:50:13 +08:00
										 |  |  | 		parser.plugin("expression require.cache", ParserHelpers.toConstantDependency("__webpack_require__.c")); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 		parser.plugin("expression require", (expr) => { | 
					
						
							| 
									
										
										
										
											2017-10-16 19:19:53 +08:00
										 |  |  | 			const dep = new CommonJsRequireContextDependency({ | 
					
						
							|  |  |  | 				request: options.unknownContextRequest, | 
					
						
							|  |  |  | 				recursive: options.unknownContextRecursive, | 
					
						
							| 
									
										
										
										
											2017-10-16 20:49:51 +08:00
										 |  |  | 				regExp: options.unknownContextRegExp, | 
					
						
							|  |  |  | 				mode: "sync" | 
					
						
							| 
									
										
										
										
											2017-10-16 19:19:53 +08:00
										 |  |  | 			}, expr.range); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 			dep.critical = options.unknownContextCritical && "require function is used in a way in which dependencies cannot be statically extracted"; | 
					
						
							| 
									
										
										
										
											2015-05-11 00:31:58 +08:00
										 |  |  | 			dep.loc = expr.loc; | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 			dep.optional = !!parser.scope.inTry; | 
					
						
							|  |  |  | 			parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		parser.plugin("call require", (expr) => { | 
					
						
							|  |  |  | 			if(expr.arguments.length !== 1) return; | 
					
						
							| 
									
										
										
										
											2017-02-05 08:34:16 +08:00
										 |  |  | 			let localModule; | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 			const param = parser.evaluateExpression(expr.arguments[0]); | 
					
						
							|  |  |  | 			if(param.isConditional()) { | 
					
						
							|  |  |  | 				let isExpression = false; | 
					
						
							|  |  |  | 				const prevLength = parser.state.current.dependencies.length; | 
					
						
							| 
									
										
										
										
											2017-02-05 08:34:16 +08:00
										 |  |  | 				const dep = new RequireHeaderDependency(expr.callee.range); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 				dep.loc = expr.loc; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				param.options.forEach(param => { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 					const result = processItem(expr, param); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 					if(result === undefined) { | 
					
						
							|  |  |  | 						isExpression = true; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				if(isExpression) { | 
					
						
							|  |  |  | 					parser.state.current.dependencies.length = prevLength; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					return true; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if(param.isString() && (localModule = LocalModulesHelpers.getLocalModule(parser.state, param.string))) { | 
					
						
							| 
									
										
										
										
											2017-02-05 08:34:16 +08:00
										 |  |  | 				const dep = new LocalModuleDependency(localModule, expr.range); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 				dep.loc = expr.loc; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							| 
									
										
										
										
											2015-05-10 19:11:45 +08:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 				const result = processItem(expr, param); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 				if(result === undefined) { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 					processContext(expr, param); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2017-02-05 08:34:16 +08:00
										 |  |  | 					const dep = new RequireHeaderDependency(expr.callee.range); | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 					dep.loc = expr.loc; | 
					
						
							|  |  |  | 					parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-05-10 19:11:45 +08:00
										 |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:04 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = CommonJsRequireDependencyParserPlugin; |