| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BasicEvaluatedExpression { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	constructor() { | 
					
						
							|  |  |  | 		this.range = null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isNull() { | 
					
						
							|  |  |  | 		return !!this.null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isString() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "string"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isNumber() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "number"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isBoolean() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "bool"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isRegExp() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "regExp"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isConditional() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "options"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isArray() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "items"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isConstArray() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "array"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isIdentifier() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "identifier"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isWrapped() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "prefix") || Object.prototype.hasOwnProperty.call(this, "postfix"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isTemplateString() { | 
					
						
							|  |  |  | 		return Object.prototype.hasOwnProperty.call(this, "quasis"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-20 21:58:24 +08:00
										 |  |  | 	isTruthy() { | 
					
						
							|  |  |  | 		return this.truthy; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isFalsy() { | 
					
						
							|  |  |  | 		return this.falsy; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | 	asBool() { | 
					
						
							| 
									
										
										
										
											2017-06-02 19:24:47 +08:00
										 |  |  | 		if(this.truthy) return true; | 
					
						
							|  |  |  | 		else if(this.falsy) return false; | 
					
						
							|  |  |  | 		else if(this.isBoolean()) return this.bool; | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | 		else if(this.isNull()) return false; | 
					
						
							|  |  |  | 		else if(this.isString()) return !!this.string; | 
					
						
							|  |  |  | 		else if(this.isNumber()) return !!this.number; | 
					
						
							|  |  |  | 		else if(this.isRegExp()) return true; | 
					
						
							|  |  |  | 		else if(this.isArray()) return true; | 
					
						
							|  |  |  | 		else if(this.isConstArray()) return true; | 
					
						
							|  |  |  | 		else if(this.isWrapped()) return this.prefix && this.prefix.asBool() || this.postfix && this.postfix.asBool() ? true : undefined; | 
					
						
							|  |  |  | 		else if(this.isTemplateString()) { | 
					
						
							|  |  |  | 			if(this.quasis.length === 1) return this.quasis[0].asBool(); | 
					
						
							| 
									
										
										
										
											2017-03-02 22:09:09 +08:00
										 |  |  | 			for(let i = 0; i < this.quasis.length; i++) { | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | 				if(this.quasis[i].asBool()) return true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			// can't tell if string will be empty without executing
 | 
					
						
							| 
									
										
										
										
											2016-11-15 21:03:53 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | 		return undefined; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setString(str) { | 
					
						
							|  |  |  | 		if(str === null) | 
					
						
							|  |  |  | 			delete this.string; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.string = str; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setNull() { | 
					
						
							|  |  |  | 		this.null = true; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setNumber(num) { | 
					
						
							|  |  |  | 		if(num === null) | 
					
						
							|  |  |  | 			delete this.number; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.number = num; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setBoolean(bool) { | 
					
						
							|  |  |  | 		if(bool === null) | 
					
						
							|  |  |  | 			delete this.bool; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.bool = bool; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setRegExp(regExp) { | 
					
						
							|  |  |  | 		if(regExp === null) | 
					
						
							|  |  |  | 			delete this.regExp; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.regExp = regExp; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setIdentifier(identifier) { | 
					
						
							|  |  |  | 		if(identifier === null) | 
					
						
							|  |  |  | 			delete this.identifier; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.identifier = identifier; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setWrapped(prefix, postfix) { | 
					
						
							|  |  |  | 		this.prefix = prefix; | 
					
						
							|  |  |  | 		this.postfix = postfix; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unsetWrapped() { | 
					
						
							|  |  |  | 		delete this.prefix; | 
					
						
							|  |  |  | 		delete this.postfix; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setOptions(options) { | 
					
						
							|  |  |  | 		if(options === null) | 
					
						
							|  |  |  | 			delete this.options; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.options = options; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setItems(items) { | 
					
						
							|  |  |  | 		if(items === null) | 
					
						
							|  |  |  | 			delete this.items; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.items = items; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setArray(array) { | 
					
						
							|  |  |  | 		if(array === null) | 
					
						
							|  |  |  | 			delete this.array; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.array = array; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setTemplateString(quasis) { | 
					
						
							|  |  |  | 		if(quasis === null) | 
					
						
							|  |  |  | 			delete this.quasis; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			this.quasis = quasis; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-02 19:24:47 +08:00
										 |  |  | 	setTruthy() { | 
					
						
							|  |  |  | 		this.falsy = false; | 
					
						
							|  |  |  | 		this.truthy = true; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setFalsy() { | 
					
						
							|  |  |  | 		this.falsy = true; | 
					
						
							|  |  |  | 		this.truthy = false; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | 	addOptions(options) { | 
					
						
							|  |  |  | 		if(!this.options) this.options = []; | 
					
						
							|  |  |  | 		options.forEach(item => { | 
					
						
							|  |  |  | 			this.options.push(item); | 
					
						
							| 
									
										
										
										
											2017-11-09 03:49:41 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setRange(range) { | 
					
						
							|  |  |  | 		this.range = range; | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-15 21:03:53 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-03 05:32:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | module.exports = BasicEvaluatedExpression; |