UNPKG

expression-evaluation

Version:
102 lines (101 loc) 4.63 kB
"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');