| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | const RequireResolveDependency = require("./RequireResolveDependency"); | 
					
						
							|  |  |  | const RequireResolveContextDependency = require("./RequireResolveContextDependency"); | 
					
						
							|  |  |  | const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency"); | 
					
						
							|  |  |  | const ContextDependencyHelpers = require("./ContextDependencyHelpers"); | 
					
						
							| 
									
										
										
										
											2014-03-11 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | class RequireResolveDependencyParserPlugin { | 
					
						
							|  |  |  | 	constructor(options) { | 
					
						
							|  |  |  | 		this.options = options; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-03-11 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 	apply(parser) { | 
					
						
							|  |  |  | 		const options = this.options; | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const process = (expr, weak) => { | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 			if(expr.arguments.length !== 1) return; | 
					
						
							|  |  |  | 			const param = parser.evaluateExpression(expr.arguments[0]); | 
					
						
							|  |  |  | 			if(param.isConditional()) { | 
					
						
							|  |  |  | 				param.options.forEach((option) => { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 					const result = processItem(expr, option, weak); | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 					if(result === undefined) { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 						processContext(expr, option, weak); | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2017-02-05 08:35:29 +08:00
										 |  |  | 				const dep = new RequireResolveHeaderDependency(expr.callee.range); | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 				dep.loc = expr.loc; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 				const result = processItem(expr, param, weak); | 
					
						
							| 
									
										
										
										
											2015-07-16 06:19:23 +08:00
										 |  |  | 				if(result === undefined) { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 					processContext(expr, param, weak); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-02-05 08:35:29 +08:00
										 |  |  | 				const dep = new RequireResolveHeaderDependency(expr.callee.range); | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 				dep.loc = expr.loc; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 		const processItem = (expr, param, weak) => { | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 			if(param.isString()) { | 
					
						
							|  |  |  | 				const dep = new RequireResolveDependency(param.string, param.range); | 
					
						
							|  |  |  | 				dep.loc = expr.loc; | 
					
						
							|  |  |  | 				dep.optional = !!parser.scope.inTry; | 
					
						
							|  |  |  | 				dep.weak = weak; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 		const processContext = (expr, param, weak) => { | 
					
						
							| 
									
										
										
										
											2017-10-16 18:52:04 +08:00
										 |  |  | 			const dep = ContextDependencyHelpers.create(RequireResolveContextDependency, param.range, param, expr, options, { | 
					
						
							| 
									
										
										
										
											2017-10-16 20:49:51 +08:00
										 |  |  | 				mode: weak ? "weak" : "sync" | 
					
						
							| 
									
										
										
										
											2017-10-16 18:52:04 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 			if(!dep) return; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			dep.loc = expr.loc; | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 			dep.optional = !!parser.scope.inTry; | 
					
						
							|  |  |  | 			parser.state.current.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-19 21:35:30 +08:00
										 |  |  | 		parser.hooks.call.for("require.resolve").tap("RequireResolveDependencyParserPlugin", (expr) => { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 			return process(expr, false); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-12-19 21:35:30 +08:00
										 |  |  | 		parser.hooks.call.for("require.resolveWeak").tap("RequireResolveDependencyParserPlugin", (expr) => { | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:41 +08:00
										 |  |  | 			return process(expr, true); | 
					
						
							| 
									
										
										
										
											2017-01-12 03:55:39 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = RequireResolveDependencyParserPlugin; |