| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | function OptionsDefaulter() { | 
					
						
							|  |  |  | 	this.defaults = {}; | 
					
						
							|  |  |  | 	this.config = {}; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = OptionsDefaulter; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getProperty(obj, name) { | 
					
						
							|  |  |  | 	name = name.split("."); | 
					
						
							|  |  |  | 	for(var i = 0; i < name.length - 1; i++) { | 
					
						
							|  |  |  | 		obj = obj[name[i]]; | 
					
						
							|  |  |  | 		if(typeof obj != "object" || !obj) return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return obj[name.pop()]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function setProperty(obj, name, value) { | 
					
						
							|  |  |  | 	name = name.split("."); | 
					
						
							|  |  |  | 	for(var i = 0; i < name.length - 1; i++) { | 
					
						
							| 
									
										
										
										
											2016-01-04 04:42:56 +08:00
										 |  |  | 		if(typeof(obj[name[i]]) !== "object" || !obj[name[i]]) obj[name[i]] = {}; | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 		obj = obj[name[i]]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	obj[name.pop()] = value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function hasProperty(obj, name, value) { | 
					
						
							|  |  |  | 	name = name.split("."); | 
					
						
							|  |  |  | 	for(var i = 0; i < name.length - 1; i++) { | 
					
						
							|  |  |  | 		obj = obj[name[i]]; | 
					
						
							|  |  |  | 		if(typeof obj != "object" || !obj) return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return Object.prototype.hasOwnProperty.call(obj, name.pop()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OptionsDefaulter.prototype.process = function(options) { | 
					
						
							| 
									
										
										
										
											2016-10-29 17:11:44 +08:00
										 |  |  | 	var addItemTo = function addItemTo(list) { | 
					
						
							|  |  |  | 		return function(item) { | 
					
						
							|  |  |  | 			list.push(item); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 	for(var name in this.defaults) { | 
					
						
							|  |  |  | 		switch(this.config[name]) { | 
					
						
							| 
									
										
										
										
											2016-01-04 04:42:56 +08:00
										 |  |  | 			case undefined: | 
					
						
							|  |  |  | 				if(getProperty(options, name) === undefined) | 
					
						
							|  |  |  | 					setProperty(options, name, this.defaults[name]); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case "call": | 
					
						
							| 
									
										
										
										
											2016-01-15 02:40:04 +08:00
										 |  |  | 				setProperty(options, name, this.defaults[name].call(this, getProperty(options, name), options), options); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case "make": | 
					
						
							|  |  |  | 				if(getProperty(options, name) === undefined) | 
					
						
							|  |  |  | 					setProperty(options, name, this.defaults[name].call(this, options), options); | 
					
						
							| 
									
										
										
										
											2016-01-04 04:42:56 +08:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			case "append": | 
					
						
							|  |  |  | 				var oldValue = getProperty(options, name); | 
					
						
							|  |  |  | 				if(!Array.isArray(oldValue)) oldValue = []; | 
					
						
							| 
									
										
										
										
											2016-10-29 17:11:44 +08:00
										 |  |  | 				this.defaults[name].forEach(addItemTo(oldValue)); | 
					
						
							| 
									
										
										
										
											2016-01-04 04:42:56 +08:00
										 |  |  | 				setProperty(options, name, oldValue); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				throw new Error("OptionsDefaulter cannot process " + this.config[name]); | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OptionsDefaulter.prototype.set = function(name, config, def) { | 
					
						
							|  |  |  | 	if(arguments.length === 3) { | 
					
						
							|  |  |  | 		this.defaults[name] = def; | 
					
						
							|  |  |  | 		this.config[name] = config; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		this.defaults[name] = config; | 
					
						
							|  |  |  | 		delete this.config[name]; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-01-15 02:40:04 +08:00
										 |  |  | }; |