| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const getProperty = (obj, name) => { | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 	name = name.split("."); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	for (let i = 0; i < name.length - 1; i++) { | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 		obj = obj[name[i]]; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (typeof obj !== "object" || !obj || Array.isArray(obj)) return; | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return obj[name.pop()]; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const setProperty = (obj, name, value) => { | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 	name = name.split("."); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	for (let i = 0; i < name.length - 1; i++) { | 
					
						
							|  |  |  | 		if (typeof obj[name[i]] !== "object" && typeof obj[name[i]] !== "undefined") | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		if (Array.isArray(obj[name[i]])) return; | 
					
						
							|  |  |  | 		if (!obj[name[i]]) obj[name[i]] = {}; | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 		obj = obj[name[i]]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	obj[name.pop()] = value; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | class OptionsDefaulter { | 
					
						
							|  |  |  | 	constructor() { | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		this.defaults = {}; | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 		this.config = {}; | 
					
						
							| 
									
										
										
										
											2016-10-29 17:11:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 	process(options) { | 
					
						
							| 
									
										
										
										
											2017-09-14 15:22:29 +08:00
										 |  |  | 		options = Object.assign({}, options); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (let name in this.defaults) { | 
					
						
							|  |  |  | 			switch (this.config[name]) { | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 				case undefined: | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (getProperty(options, name) === undefined) | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 						setProperty(options, name, this.defaults[name]); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case "call": | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					setProperty( | 
					
						
							|  |  |  | 						options, | 
					
						
							|  |  |  | 						name, | 
					
						
							| 
									
										
										
										
											2018-03-27 13:57:25 +08:00
										 |  |  | 						this.defaults[name].call(this, getProperty(options, name), options) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				case "make": | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (getProperty(options, name) === undefined) | 
					
						
							| 
									
										
										
										
											2018-03-27 16:19:13 +08:00
										 |  |  | 						setProperty(options, name, this.defaults[name].call(this, options)); | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				case "append": { | 
					
						
							|  |  |  | 					let oldValue = getProperty(options, name); | 
					
						
							|  |  |  | 					if (!Array.isArray(oldValue)) oldValue = []; | 
					
						
							|  |  |  | 					oldValue.push(...this.defaults[name]); | 
					
						
							|  |  |  | 					setProperty(options, name, oldValue); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 				default: | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					throw new Error( | 
					
						
							|  |  |  | 						"OptionsDefaulter cannot process " + this.config[name] | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-14 15:22:29 +08:00
										 |  |  | 		return options; | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 	set(name, config, def) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (def !== undefined) { | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | 			this.defaults[name] = def; | 
					
						
							|  |  |  | 			this.config[name] = config; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			this.defaults[name] = config; | 
					
						
							|  |  |  | 			delete this.config[name]; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-12-30 00:44:55 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-03 00:45:44 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = OptionsDefaulter; |