expression-evaluation
Version:
Expression Evaluation
102 lines (101 loc) • 4.63 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.typeValid = exports.typeJson = exports.typeIterable = exports.typeEnumerable = exports.typeOptionalArrayOrObject = exports.typeArrayOrObject = exports.typeNumberOrString = exports.typeStringOrArray = exports.typeBufferOrArray = exports.typeNumberOrArray = exports.typeBooleanOrArray = exports.typeOptionalFunction = exports.typeOptionalObject = exports.typeOptionalArray = exports.typeOptionalString = exports.typeOptionalBuffer = exports.typeOptionalNumber = exports.typeOptionalBoolean = exports.typeFunction = exports.typeObject = exports.typeArray = exports.typeString = exports.typeBuffer = exports.typeNumber = exports.typeBoolean = exports.typeVoid = exports.typeUnknown = exports.Type = void 0;
const VALUE_TYPE_NAMES = ['void', 'boolean', 'number', 'buffer', 'string', 'array', 'object', 'function'];
const VALUE_TYPE_COUNT = VALUE_TYPE_NAMES.length;
class Type {
_vtypes;
constructor(...args) {
this._vtypes = new Set(args.length ? args : VALUE_TYPE_NAMES);
}
get isSpecific() {
return this._vtypes.size === 1;
}
get isBoolean() {
return this.isSpecific && this._vtypes.has('boolean');
}
get isNumber() {
return this.isSpecific && this._vtypes.has('number');
}
get isBuffer() {
return this.isSpecific && this._vtypes.has('buffer');
}
get isString() {
return this.isSpecific && this._vtypes.has('string');
}
get isArray() {
return this.isSpecific && this._vtypes.has('array');
}
get isObject() {
return this.isSpecific && this._vtypes.has('object');
}
get isFunction() {
return this.isSpecific && this._vtypes.has('function');
}
get isVoid() {
return this.isSpecific && this._vtypes.has('void');
}
reduce(mask) {
if (mask.isVoid) {
return this;
}
const vtypes = Array.from(this._vtypes.values()).filter((t) => mask._vtypes.has(t));
return vtypes.length === 0
? undefined
: vtypes.length === this._vtypes.size
? this
: new Type(...vtypes);
}
toOptional() {
return new Type('void', ...this._vtypes);
}
toString() {
return this._vtypes.size < VALUE_TYPE_COUNT ? Array.from(this._vtypes.values()).join('|') : '??';
}
static of(value) {
const vtype = value == null
? 'void'
: typeof value === 'boolean'
? 'boolean'
: typeof value === 'number'
? 'number'
: value instanceof ArrayBuffer
? 'buffer'
: typeof value === 'string'
? 'string'
: Array.isArray(value)
? 'array'
: typeof value === 'object'
? 'object'
: 'function';
return new Type(vtype);
}
}
exports.Type = Type;
exports.typeUnknown = new Type();
exports.typeVoid = new Type('void');
exports.typeBoolean = new Type('boolean');
exports.typeNumber = new Type('number');
exports.typeBuffer = new Type('buffer');
exports.typeString = new Type('string');
exports.typeArray = new Type('array');
exports.typeObject = new Type('object');
exports.typeFunction = new Type('function');
exports.typeOptionalBoolean = new Type('void', 'boolean');
exports.typeOptionalNumber = new Type('void', 'number');
exports.typeOptionalBuffer = new Type('void', 'buffer');
exports.typeOptionalString = new Type('void', 'string');
exports.typeOptionalArray = new Type('void', 'array');
exports.typeOptionalObject = new Type('void', 'object');
exports.typeOptionalFunction = new Type('void', 'function');
exports.typeBooleanOrArray = new Type('boolean', 'array');
exports.typeNumberOrArray = new Type('number', 'array');
exports.typeBufferOrArray = new Type('buffer', 'array');
exports.typeStringOrArray = new Type('string', 'array');
exports.typeNumberOrString = new Type('number', 'string');
exports.typeArrayOrObject = new Type('array', 'object');
exports.typeOptionalArrayOrObject = new Type('void', 'array', 'object');
exports.typeEnumerable = new Type('buffer', 'string', 'array');
exports.typeIterable = new Type('buffer', 'string', 'array', 'object');
exports.typeJson = new Type('void', 'boolean', 'number', 'string', 'array', 'object');
exports.typeValid = new Type('boolean', 'number', 'buffer', 'string', 'array', 'object', 'function');