UNPKG

@qaflag/core

Version:

Base requirements for the QA Flag library

335 lines 11.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Assertion = exports.assert = void 0; const validator_1 = require("validator"); const is_1 = require("@sindresorhus/is"); const levenshtein_1 = require("./utils/levenshtein"); const is_value_interface_1 = require("./utils/is-value-interface"); const assert = (value) => new Assertion(value); exports.assert = assert; const toArray = (value) => { return Array.isArray(value) ? value : [value]; }; class Assertion { constructor(input, opts) { var _a, _b, _c; this.input = (0, is_value_interface_1.isValueInterface)(input) ? input.$ : input; this.isNot = (_a = opts === null || opts === void 0 ? void 0 : opts.isNot) !== null && _a !== void 0 ? _a : false; this.evalType = (_b = opts === null || opts === void 0 ? void 0 : opts.evalType) !== null && _b !== void 0 ? _b : 'standard'; this.howMany = (_c = opts === null || opts === void 0 ? void 0 : opts.howMany) !== null && _c !== void 0 ? _c : 0; } validator(methodName, opts) { const method = validator_1.default[methodName]; return this.execute(item => method(String(item), opts)); } is(methodName) { const method = is_1.default[methodName]; return this.execute(value => { return method(value); }); } execute(assertion) { const result = (() => { if (this.evalType === 'standard') return assertion(this.input); const thisArray = toArray(this.input); if (this.evalType === 'every') { return thisArray.every((item) => assertion(item)); } if (this.evalType === 'some') { return thisArray.some((item) => assertion(item)); } const count = thisArray.filter((item) => assertion(item)).length; if (this.evalType === 'atLeast') return count >= this.howMany; if (this.evalType === 'atMost') return count <= this.howMany; return count === this.howMany; })(); return this.isNot ? !result : result; } equals(value) { return this.execute(item => item == value); } isExactly(value) { return this.execute(item => item === value); } arrayIncludes(value) { return this.execute(item => toArray(item).includes(value)); } isInArray(value) { return this.execute(thisValue => value.includes(thisValue)); } containedIn(value) { return this.execute(thisValue => { if (typeof thisValue == 'string') { return Array.isArray(value) ? value.some(x => validator_1.default.contains(x, thisValue)) : validator_1.default.contains(value, thisValue); } if (Array.isArray(thisValue)) { return thisValue.some(x => value.includes(String(x))); } return Array.isArray(value) ? value.some(x => validator_1.default.contains(String(x), String(thisValue))) : validator_1.default.contains(value, String(thisValue)); }); } contains(value) { return this.execute(thisValue => { if (typeof thisValue == 'string') { return Array.isArray(value) ? value.some(x => validator_1.default.contains(thisValue, x)) : validator_1.default.contains(thisValue, value); } if (Array.isArray(thisValue)) { return Array.isArray(value) ? thisValue.some(x => value.includes(x)) : thisValue.includes(value); } return Array.isArray(value) ? value.some(x => validator_1.default.contains(String(thisValue), x)) : validator_1.default.contains(String(thisValue), value); }); } exists() { return this.execute(value => { if (value === null || value === undefined) return false; if (typeof value == 'number' && value <= 0) return false; if (Array.isArray(value) && value.length == 0) return false; if (value === false) return false; return true; }); } isTrue() { return this.execute(item => item === true); } isFalse() { return this.execute(item => item === false); } isNullOrUndefined() { return this.is('nullOrUndefined'); } isNull() { return this.is('null_'); } isUndefined() { return this.is('undefined'); } isBoolean() { return this.is('boolean'); } isTruthy() { return this.is('truthy'); } isEmpty() { if (is_1.default.array(this.input)) return this.is('emptyArray'); if (is_1.default.object(this.input)) return this.is('emptyObject'); return this.is('emptyString'); } isType(typeName) { return this.execute(value => (0, is_1.default)(value).toLocaleLowerCase() == typeName.toLocaleLowerCase()); } isDate() { return this.validator('isDate'); } isInteger() { return this.validator('isInt'); } isString() { return this.is('string'); } isObject() { return this.is('plainObject'); } isArray() { return this.is('array'); } isNumber() { return this.is('number'); } isNumeric() { return this.is('numericString'); } isLikeString(value) { return this.execute(item => String(item).toLocaleLowerCase().trim() === value.toLocaleLowerCase().trim()); } isSimilarTo(value, maxDistance = 3) { return this.execute(item => (0, levenshtein_1.levenshtein)(String(item).toLocaleLowerCase().trim(), value.toLocaleLowerCase().trim()) <= maxDistance); } startsWith(value) { return this.execute(item => { const str = String(item); return Array.isArray(value) ? value.some(x => str.startsWith(String(x))) : str.startsWith(String(value)); }); } endsWith(value) { return this.execute(item => { const str = String(item); return Array.isArray(value) ? value.some(x => str.endsWith(String(x))) : str.endsWith(String(value)); }); } matchesPattern(value) { return this.execute(item => validator_1.default.matches(String(item), value)); } isEmailAddress() { return this.validator('isEmail'); } isCreditCard() { return this.validator('isCreditCard'); } isNumericString() { return this.is('numericString'); } isIpAddress(version) { return this.validator('isIP', version); } isUrl() { return this.is('urlString'); } isJwt() { return this.validator('isJWT'); } isMd5() { return this.validator('isMD5'); } isPostalCode(countryCode) { return this.validator('isPostalCode', countryCode); } isUuid(version) { return this.validator('isUUID', version); } isUppercase() { return this.validator('isUppercase'); } isLowercase() { return this.validator('isLowercase'); } isSlug() { return this.validator('isSlug'); } isMimeType() { return this.validator('isMimeType'); } isEmptyString() { return this.is('emptyStringOrWhitespace'); } isFalsy() { return this.is('falsy'); } isMongoId() { return this.validator('isMongoId'); } isAlphanumeric() { return this.execute(item => /^[A-Za-z0-9]+$/.test(String(item))); } isOnlyLetters() { return this.execute(item => /^[A-Za-z]+$/.test(String(item))); } isOnlyNumbers() { return this.execute(item => /^[0-9]+$/.test(String(item))); } isGreaterThan(value) { return this.execute(item => Number(item) > value); } isGreaterThanOrEquals(value) { return this.execute(item => Number(item) >= value); } isLessThan(value) { return this.execute(item => Number(item) < value); } isLessThanOrEquals(value) { return this.execute(item => Number(item) <= value); } isInRange(valueA, valueB) { return this.execute(item => is_1.default.inRange(Number(item), [valueA, valueB])); } isCloseTo(value, within = 0.01) { return this.execute(item => is_1.default.inRange(Number(item), [value - within, value + within])); } roundsTo(value) { return this.execute(item => Math.round(Number(item)) == value); } roundsUpTo(value) { return this.execute(item => Math.ceil(Number(item)) == value); } roundsDownTo(value) { return this.execute(item => Math.floor(Number(item)) == value); } isZero() { return this.execute(value => String(value) === '0'); } isNonZeroNumber() { return this.execute(value => is_1.default.number(value) && value != 0); } isNonZeroInteger() { return this.execute(value => is_1.default.integer(value) && value != 0); } isOddInteger() { return this.is('oddInteger'); } isEvenInteger() { return this.is('evenInteger'); } isDivisibleBy(n) { return this.validator('isDivisibleBy', n); } isPositiveNumber() { return this.execute(item => Number(item) > 0); } isPositiveInteger() { return this.execute(value => is_1.default.integer(value) && Number(value) > 0); } isNegativeNumber() { return this.execute(item => Number(item) < 0); } isNegativeInteger() { return this.execute(value => is_1.default.integer(value) && Number(value) < 0); } isNan() { return this.is('nan'); } hasProperty(propertyName) { return this.execute(item => is_1.default.object(item) && item[propertyName] !== undefined); } hasProperties(propertyNames) { return this.execute(item => is_1.default.object(item) && propertyNames.every(prop => item[prop] !== undefined)); } isEmptyObject() { return this.is('emptyObject'); } isArrayOf(typeName) { return this.execute(value => is_1.default.array(value, is_1.default[typeName])); } isEmptyArray() { return this.is('emptyArray'); } isBeforeDate(date) { const dateString = typeof date == 'string' ? date : Date.toString(); return this.validator('isBefore', dateString); } isAfterDate(date) { const dateString = typeof date == 'string' ? date : Date.toString(); return this.validator('isAfter', dateString); } inThePast() { return this.validator('isBefore'); } inTheFuture() { return this.validator('isAfter'); } } exports.Assertion = Assertion; //# sourceMappingURL=assertion.js.map