| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 | 
							- /*
 
- 	MIT License http://www.opensource.org/licenses/mit-license.php
 
- 	Author Tobias Koppers @sokra
 
- */
 
- "use strict";
 
- const TypeUnknown = 0;
 
- const TypeNull = 1;
 
- const TypeString = 2;
 
- const TypeNumber = 3;
 
- const TypeBoolean = 4;
 
- const TypeRegExp = 5;
 
- const TypeConditional = 6;
 
- const TypeArray = 7;
 
- const TypeConstArray = 8;
 
- const TypeIdentifier = 9;
 
- const TypeWrapped = 10;
 
- const TypeTemplateString = 11;
 
- class BasicEvaluatedExpression {
 
- 	constructor() {
 
- 		this.type = TypeUnknown;
 
- 		this.range = null;
 
- 		this.falsy = false;
 
- 		this.truthy = false;
 
- 		this.bool = null;
 
- 		this.number = null;
 
- 		this.regExp = null;
 
- 		this.string = null;
 
- 		this.quasis = null;
 
- 		this.parts = null;
 
- 		this.array = null;
 
- 		this.items = null;
 
- 		this.options = null;
 
- 		this.prefix = null;
 
- 		this.postfix = null;
 
- 		this.wrappedInnerExpressions = null;
 
- 		this.expression = null;
 
- 	}
 
- 	isNull() {
 
- 		return this.type === TypeNull;
 
- 	}
 
- 	isString() {
 
- 		return this.type === TypeString;
 
- 	}
 
- 	isNumber() {
 
- 		return this.type === TypeNumber;
 
- 	}
 
- 	isBoolean() {
 
- 		return this.type === TypeBoolean;
 
- 	}
 
- 	isRegExp() {
 
- 		return this.type === TypeRegExp;
 
- 	}
 
- 	isConditional() {
 
- 		return this.type === TypeConditional;
 
- 	}
 
- 	isArray() {
 
- 		return this.type === TypeArray;
 
- 	}
 
- 	isConstArray() {
 
- 		return this.type === TypeConstArray;
 
- 	}
 
- 	isIdentifier() {
 
- 		return this.type === TypeIdentifier;
 
- 	}
 
- 	isWrapped() {
 
- 		return this.type === TypeWrapped;
 
- 	}
 
- 	isTemplateString() {
 
- 		return this.type === TypeTemplateString;
 
- 	}
 
- 	isTruthy() {
 
- 		return this.truthy;
 
- 	}
 
- 	isFalsy() {
 
- 		return this.falsy;
 
- 	}
 
- 	asBool() {
 
- 		if (this.truthy) return true;
 
- 		if (this.falsy) return false;
 
- 		if (this.isBoolean()) return this.bool;
 
- 		if (this.isNull()) return false;
 
- 		if (this.isString()) return this.string !== "";
 
- 		if (this.isNumber()) return this.number !== 0;
 
- 		if (this.isRegExp()) return true;
 
- 		if (this.isArray()) return true;
 
- 		if (this.isConstArray()) return true;
 
- 		if (this.isWrapped()) {
 
- 			return (this.prefix && this.prefix.asBool()) ||
 
- 				(this.postfix && this.postfix.asBool())
 
- 				? true
 
- 				: undefined;
 
- 		}
 
- 		if (this.isTemplateString()) {
 
- 			const str = this.asString();
 
- 			if (typeof str === "string") return str !== "";
 
- 		}
 
- 		return undefined;
 
- 	}
 
- 	asString() {
 
- 		if (this.isBoolean()) return `${this.bool}`;
 
- 		if (this.isNull()) return "null";
 
- 		if (this.isString()) return this.string;
 
- 		if (this.isNumber()) return `${this.number}`;
 
- 		if (this.isRegExp()) return `${this.regExp}`;
 
- 		if (this.isArray()) {
 
- 			let array = [];
 
- 			for (const item of this.items) {
 
- 				const itemStr = item.asString();
 
- 				if (itemStr === undefined) return undefined;
 
- 				array.push(itemStr);
 
- 			}
 
- 			return `${array}`;
 
- 		}
 
- 		if (this.isConstArray()) return `${this.array}`;
 
- 		if (this.isTemplateString()) {
 
- 			let str = "";
 
- 			for (const part of this.parts) {
 
- 				const partStr = part.asString();
 
- 				if (partStr === undefined) return undefined;
 
- 				str += partStr;
 
- 			}
 
- 			return str;
 
- 		}
 
- 		return undefined;
 
- 	}
 
- 	setString(string) {
 
- 		this.type = TypeString;
 
- 		this.string = string;
 
- 		return this;
 
- 	}
 
- 	setNull() {
 
- 		this.type = TypeNull;
 
- 		return this;
 
- 	}
 
- 	setNumber(number) {
 
- 		this.type = TypeNumber;
 
- 		this.number = number;
 
- 		return this;
 
- 	}
 
- 	setBoolean(bool) {
 
- 		this.type = TypeBoolean;
 
- 		this.bool = bool;
 
- 		return this;
 
- 	}
 
- 	setRegExp(regExp) {
 
- 		this.type = TypeRegExp;
 
- 		this.regExp = regExp;
 
- 		return this;
 
- 	}
 
- 	setIdentifier(identifier) {
 
- 		this.type = TypeIdentifier;
 
- 		this.identifier = identifier;
 
- 		return this;
 
- 	}
 
- 	setWrapped(prefix, postfix, innerExpressions) {
 
- 		this.type = TypeWrapped;
 
- 		this.prefix = prefix;
 
- 		this.postfix = postfix;
 
- 		this.wrappedInnerExpressions = innerExpressions;
 
- 		return this;
 
- 	}
 
- 	setOptions(options) {
 
- 		this.type = TypeConditional;
 
- 		this.options = options;
 
- 		return this;
 
- 	}
 
- 	addOptions(options) {
 
- 		if (!this.options) {
 
- 			this.type = TypeConditional;
 
- 			this.options = [];
 
- 		}
 
- 		for (const item of options) {
 
- 			this.options.push(item);
 
- 		}
 
- 		return this;
 
- 	}
 
- 	setItems(items) {
 
- 		this.type = TypeArray;
 
- 		this.items = items;
 
- 		return this;
 
- 	}
 
- 	setArray(array) {
 
- 		this.type = TypeConstArray;
 
- 		this.array = array;
 
- 		return this;
 
- 	}
 
- 	setTemplateString(quasis, parts, kind) {
 
- 		this.type = TypeTemplateString;
 
- 		this.quasis = quasis;
 
- 		this.parts = parts;
 
- 		this.templateStringKind = kind;
 
- 		return this;
 
- 	}
 
- 	setTruthy() {
 
- 		this.falsy = false;
 
- 		this.truthy = true;
 
- 		return this;
 
- 	}
 
- 	setFalsy() {
 
- 		this.falsy = true;
 
- 		this.truthy = false;
 
- 		return this;
 
- 	}
 
- 	setRange(range) {
 
- 		this.range = range;
 
- 		return this;
 
- 	}
 
- 	setExpression(expression) {
 
- 		this.expression = expression;
 
- 		return this;
 
- 	}
 
- }
 
- module.exports = BasicEvaluatedExpression;
 
 
  |