| 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;
 |