simple-body-validator
Version:
This package is inspired by Laravel validation, and aims to make body validation easier for Javascript developers
165 lines (164 loc) • 4.45 kB
JavaScript
;
import RuleContract from '../rules/ruleContract';
import BaseRule from '../rules/baseRule';
import ImplicitRuleContract from '../rules/implicitRuleContract';
const implicitRues = [
'accepted', 'accepted_if', 'declined', 'declined_if',
'filled', 'present', 'required', 'required_if', 'required_unless',
'required_with', 'required_with_all', 'required_without', 'required_without_all'
];
/**
* Get the size of a value based on its type
*/
export function getSize(value, hasNumericRule = false) {
if (typeof value === 'number' || (isNaN(value) === false && hasNumericRule === true)) {
return Number(value);
}
else if (typeof value === 'string' || Array.isArray(value)) {
return value.length;
}
else if (typeof value === 'object' && value !== null) {
return Object.keys(value).length;
}
return -1;
}
;
/**
* Check if two values are of the same type
*/
export function sameType(value, otherValue) {
const valueType = Array.isArray(value) ? 'array' : (value === null ? null : typeof value);
const otherValueType = Array.isArray(otherValue) ? 'array' : (otherValue === null ? null : typeof otherValue);
return valueType === otherValueType;
}
;
/**
* Check if Value is an Ineteger
*/
export function isInteger(value) {
return value !== null && isNaN(value) === false && value % 1 === 0;
}
;
/**
* Check if the value can be considered as rule
*/
export function isRule(value) {
return typeof value === 'string' ||
typeof value === 'function' ||
value instanceof RuleContract ||
value instanceof BaseRule;
}
;
/**
* Check if the array contain any potentiel valid rule
*/
export function isArrayOfRules(values) {
for (let i = 0; i < values.length; i++) {
if (isRule(values[i])) {
return true;
}
}
return false;
}
/**
* Check if the rule is related to size
*/
export function isSizeRule(rule) {
const sizeRules = [
'size', 'between', 'min', 'max', 'gt', 'lt', 'gte', 'lte'
];
return sizeRules.indexOf(rule) !== -1;
}
;
/**
* Check if rule implies that the field is required
*/
export function isImplicitRule(rule) {
if (rule instanceof ImplicitRuleContract) {
return true;
}
if (typeof rule === 'string') {
return implicitRues.indexOf(rule) !== -1;
}
return false;
}
;
/**
* Add a new implicit rule
*/
export function addImplicitRule(rule) {
implicitRues.push(rule);
}
/**
* Returns the numeric rules
*/
export function getNumericRules() {
return ['numeric', 'integer'];
}
;
/**
* Check if the rule is numeric
*/
export function isNumericRule(rule) {
const numericRules = getNumericRules();
return numericRules.indexOf(rule) !== -1;
}
;
/**
* Determine if a comparison passes between the given values.
*/
export function compare(first, second, operator, strict = false) {
switch (operator) {
case '<':
return first < second;
case '>':
return first > second;
case '<=':
return first <= second;
case '>=':
return first >= second;
case '=':
if (strict === true) {
return first === second;
}
return first == second;
default:
throw 'Invalid operator parameter';
}
}
/**
* Convert the given values to boolean if they are string "true" / "false".
*/
export function convertValuesToBoolean(values) {
return values.map(value => {
if (value === 'true') {
return true;
}
else if (value === 'false') {
return false;
}
return value;
});
}
/**
* Convert the given values to numbers if they are numbers in a string "1", "2"
*/
export function convertValuesToNumber(values) {
return values.map(value => {
if (!isNaN(Number(value))) {
return Number(value);
}
return value;
});
}
/**
* Convert the given values to null if they have null values in a string "null", "NULL"
*/
export function convertValuesToNull(values) {
return values.map(value => {
if (value.toLowerCase() === 'null') {
return null;
}
return value;
});
}