rule-filter-validator
Version:
A object and scope validator based on structured rules
86 lines • 3.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isValid = isValid;
/* eslint-disable no-case-declarations */
function isValid(compareValue, fn, testValue, strict = false) {
// When not strict convert all strings and numbers to UPPERCASE strings before comparing
const strictValue = (value) => strict ? value : String(value).toUpperCase();
const strictString = (value) => strictValue(String(value));
const strictArray = (value) => strict ? value : strictValue(value.join(',')).split(',');
function safeCompare(a, b, cb) {
let A = Number(a * 1);
let B = Number(b * 1);
if (Number.isSafeInteger(A) && Number.isSafeInteger(B)) {
return cb(A, B);
}
A = new Date(a);
B = new Date(b);
if (A.toString() !== 'Invalid Date' && B.toString() !== 'Invalid Date') {
return cb(A, B);
}
return cb(strictValue(a), strictValue(b));
}
const stringValue = strictString(compareValue);
switch (fn) {
case '_eq':
return strictValue(compareValue) === strictValue(testValue);
case '_neq':
return strictValue(compareValue) !== strictValue(testValue);
case '_contains':
if (Array.isArray(testValue)) {
return testValue.some(tv => strictString(tv) === stringValue);
}
return strictString(testValue).indexOf(stringValue) > -1;
case '_ncontains':
if (Array.isArray(testValue)) {
return testValue.some(tv => strictString(tv) === stringValue) === false;
}
return strictString(testValue).indexOf(stringValue) === -1;
case '_starts_with':
return strictString(testValue).startsWith(stringValue);
case '_nstarts_with':
return !strictString(testValue).startsWith(stringValue);
case '_ends_with':
return strictString(testValue).endsWith(stringValue);
case '_nends_with':
return !strictString(testValue).endsWith(stringValue);
case '_in':
return strictArray(compareValue).includes(strictValue(testValue));
case '_nin':
return !strictArray(compareValue).includes(strictValue(testValue));
case '_gt':
return safeCompare(compareValue, testValue, (cv, tv) => tv > cv);
case '_gte':
return safeCompare(compareValue, testValue, (cv, tv) => tv >= cv);
case '_lt':
return safeCompare(compareValue, testValue, (cv, tv) => tv < cv);
case '_lte':
return safeCompare(compareValue, testValue, (cv, tv) => tv <= cv);
case '_null':
return testValue === null ? compareValue : !compareValue;
case '_nnull':
return testValue !== null ? compareValue : !compareValue;
case '_empty':
return Array.isArray(testValue)
? testValue.length === 0
: testValue === '';
case '_nempty':
return Array.isArray(testValue) ? testValue.length > 0 : testValue !== '';
case '_between':
return (isValid(compareValue[0], '_gte', testValue, strict) &&
isValid(compareValue[1], '_lte', testValue, strict));
case '_nbetween':
return (isValid(compareValue[0], '_lt', testValue, strict) ||
isValid(compareValue[1], '_gt', testValue, strict));
case '_submitted':
return (typeof testValue !== 'undefined' ? compareValue : !compareValue);
case '_regex':
const regex = compareValue;
const wrapped = regex.startsWith('/') && regex.endsWith('/');
const regResult = new RegExp(wrapped ? regex.slice(1, -1) : regex).exec(testValue);
return regResult ? regResult.length > 0 : false;
default:
return null;
}
}
//# sourceMappingURL=is-valid.js.map