burhan-req-validator
Version:
A lightweight and customizable field validation library using Joi, inspired by Laravel's validation rules. Simplifies data validation with intuitive rule-based syntax.
95 lines (86 loc) • 3.6 kB
JavaScript
const Joi = require('joi');
/**
* Validate fields based on rules
* @param {Object} data - The data to validate
* @param {Object} rules - The validation rules
* @returns {Object} - Validation result with error if validation fails
*/
const validateFields = (data, rules) => {
const joiSchema = {};
// Loop through each rule and create a Joi validation schema
Object.keys(rules).forEach((field) => {
const rule = rules[field];
const validations = rule.split('|');
// Start with an uninitialized Joi schema
let joiValidation;
validations.forEach((validation) => {
const [ruleType, ruleValue] = validation.split(':');
switch (ruleType) {
case 'required':
joiValidation = (Joi.string()).required();
break;
case 'email':
joiValidation = (Joi.string()).email();
break;
case 'max':
joiValidation = (Joi.string()).max(parseInt(ruleValue, 10));
break;
case 'min':
joiValidation = (Joi.string()).min(parseInt(ruleValue, 10));
break;
case 'string':
joiValidation = Joi.string();
break;
case 'integer':
joiValidation = Joi.number().integer();
break;
case 'number':
joiValidation = Joi.number();
break;
case 'boolean':
joiValidation = Joi.boolean();
break;
case 'date':
joiValidation = Joi.date();
break;
case 'object':
joiValidation = Joi.object();
break;
case 'array':
joiValidation = Joi.array();
break;
case 'nullable':
joiValidation = (joiValidation || Joi.any()).allow(null);
break;
case 'regex':
joiValidation = (joiValidation || Joi.string()).pattern(new RegExp(ruleValue));
break;
case 'items': // Specify array item type, e.g., `array|items:string`
if (joiValidation && joiValidation.type === 'array') {
const itemType = ruleValue;
switch (itemType) {
case 'string':
joiValidation = joiValidation.items(Joi.string());
break;
case 'number':
joiValidation = joiValidation.items(Joi.number());
break;
case 'object':
joiValidation = joiValidation.items(Joi.object());
break;
default:
break;
}
}
break;
default:
break;
}
});
joiSchema[field] = joiValidation;
});
// Validate the data against the Joi schema
const schema = Joi.object(joiSchema);
return schema.validate(data, { abortEarly: false });
};
module.exports = { validateFields };