| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | var ConstDependency = require("./dependencies/ConstDependency"); | 
					
						
							|  |  |  | var BasicEvaluatedExpression = require("./BasicEvaluatedExpression"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function DefinePlugin(definitions) { | 
					
						
							|  |  |  | 	this.definitions = definitions; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = DefinePlugin; | 
					
						
							|  |  |  | DefinePlugin.prototype.apply = function(compiler) { | 
					
						
							| 
									
										
										
										
											2013-09-24 21:07:55 +08:00
										 |  |  | 	(function walkDefinitions(definitions, prefix) { | 
					
						
							|  |  |  | 		Object.keys(definitions).forEach(function(key) { | 
					
						
							|  |  |  | 			var code = definitions[key]; | 
					
						
							| 
									
										
										
										
											2013-10-14 21:30:39 +08:00
										 |  |  | 			if(code === undefined || code === null) code = code + ""; | 
					
						
							|  |  |  | 			else if(typeof code === "object") { | 
					
						
							| 
									
										
										
										
											2013-09-24 21:07:55 +08:00
										 |  |  | 				walkDefinitions(code, key + "."); | 
					
						
							|  |  |  | 				applyObjectDefine(key, code); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-10-14 21:30:39 +08:00
										 |  |  | 			else code = code.toString(); | 
					
						
							| 
									
										
										
										
											2013-09-24 21:07:55 +08:00
										 |  |  | 			applyDefine(prefix + key, code); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}(this.definitions, "")); | 
					
						
							| 
									
										
										
										
											2013-09-24 20:49:39 +08:00
										 |  |  | 	function applyDefine(key, code) { | 
					
						
							|  |  |  | 		var recurse = false; | 
					
						
							|  |  |  | 		var recurseTypeof = false; | 
					
						
							| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | 		compiler.parser.plugin("evaluate Identifier " + key, function(expr) { | 
					
						
							| 
									
										
										
										
											2013-09-24 20:49:39 +08:00
										 |  |  | 			if(recurse) return; | 
					
						
							|  |  |  | 			recurse = true; | 
					
						
							|  |  |  | 			var res = compiler.parser.evaluate(code); | 
					
						
							|  |  |  | 			recurse = false; | 
					
						
							| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | 			res.setRange(expr.range); | 
					
						
							|  |  |  | 			return res; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.parser.plugin("evaluate typeof " + key, function(expr) { | 
					
						
							| 
									
										
										
										
											2013-09-24 20:49:39 +08:00
										 |  |  | 			if(recurseTypeof) return; | 
					
						
							|  |  |  | 			recurseTypeof = true; | 
					
						
							|  |  |  | 			var res = compiler.parser.evaluate("typeof (" + code + ")"); | 
					
						
							|  |  |  | 			recurseTypeof = false; | 
					
						
							| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | 			res.setRange(expr.range); | 
					
						
							|  |  |  | 			return res; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.parser.plugin("expression " + key, function(expr) { | 
					
						
							| 
									
										
										
										
											2013-09-24 20:49:39 +08:00
										 |  |  | 			var dep = new ConstDependency("("+code+")", expr.range); | 
					
						
							| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | 			dep.loc = expr.loc; | 
					
						
							|  |  |  | 			this.state.current.addDependency(dep); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.parser.plugin("typeof " + key, function(expr) { | 
					
						
							| 
									
										
										
										
											2013-09-24 20:49:39 +08:00
										 |  |  | 			var res = compiler.parser.evaluate("typeof (" + code + ")"); | 
					
						
							|  |  |  | 			if(!res.isString()) return; | 
					
						
							|  |  |  | 			var dep = new ConstDependency(JSON.stringify(res.string), expr.range); | 
					
						
							| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | 			dep.loc = expr.loc; | 
					
						
							|  |  |  | 			this.state.current.addDependency(dep); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-09-24 20:49:39 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-09-24 21:07:55 +08:00
										 |  |  | 	function applyObjectDefine(key, obj) { | 
					
						
							|  |  |  | 		var code = "{" + Object.keys(obj).map(function(key) { | 
					
						
							|  |  |  | 			var code = obj[key]; | 
					
						
							|  |  |  | 			if(typeof code !== "string" && code.toString) code = code.toString(); | 
					
						
							|  |  |  | 			else if(typeof code !== "string") code = code + ""; | 
					
						
							|  |  |  | 			return JSON.stringify(key) + ":" + code; | 
					
						
							|  |  |  | 		}).join(",") + "}"; | 
					
						
							|  |  |  | 		compiler.parser.plugin("evaluate Identifier " + key, function(expr) { | 
					
						
							|  |  |  | 			return new BasicEvaluatedExpression().setRange(expr.range); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.parser.plugin("evaluate typeof " + key, function(expr) { | 
					
						
							|  |  |  | 			return new BasicEvaluatedExpression().setString("object").setRange(expr.range); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.parser.plugin("expression " + key, function(expr) { | 
					
						
							|  |  |  | 			var dep = new ConstDependency("("+code+")", expr.range); | 
					
						
							|  |  |  | 			dep.loc = expr.loc; | 
					
						
							|  |  |  | 			this.state.current.addDependency(dep); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.parser.plugin("typeof " + key, function(expr) { | 
					
						
							|  |  |  | 			var dep = new ConstDependency("\"object\"", expr.range); | 
					
						
							|  |  |  | 			dep.loc = expr.loc; | 
					
						
							|  |  |  | 			this.state.current.addDependency(dep); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | }; |