validatorshield
Version:
Universal validation (frontend + backend) with TypeScript. Includes common rules and Sequelize-backed async rules (unique, exists).
72 lines (71 loc) • 2.52 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validate = validate;
const required_1 = require("./rules/required");
const email_1 = require("./rules/email");
const min_1 = require("./rules/min");
const max_1 = require("./rules/max");
const exists_1 = require("./rules/exists");
const unique_1 = require("./rules/unique");
const string_1 = require("./rules/string");
const number_1 = require("./rules/number");
const integer_1 = require("./rules/integer");
const boolean_1 = require("./rules/boolean");
const array_1 = require("./rules/array");
const url_1 = require("./rules/url");
const regex_1 = require("./rules/regex");
const in_1 = require("./rules/in");
const not_in_1 = require("./rules/not_in");
const confirmed_1 = require("./rules/confirmed");
const same_1 = require("./rules/same");
const different_1 = require("./rules/different");
const between_1 = require("./rules/between");
const size_1 = require("./rules/size");
const ruleFns = {
required: required_1.required,
email: email_1.email,
min: min_1.min,
max: max_1.max,
exists: exists_1.exists,
unique: unique_1.unique,
string: string_1.stringRule,
number: number_1.numberRule,
integer: integer_1.integer,
boolean: boolean_1.booleanRule,
array: array_1.arrayRule,
url: url_1.url,
regex: regex_1.regex,
in: in_1.inRule,
not_in: not_in_1.notIn,
confirmed: confirmed_1.confirmed,
same: same_1.same,
different: different_1.different,
between: between_1.between,
size: size_1.size,
};
async function validate(data, rules) {
const errors = {};
let passed = true;
for (const field in rules) {
const fieldRules = rules[field];
const value = data[field];
const ctx = { field, data };
const hasRequired = fieldRules.some(r => r.split(/:|,/g)[0] === 'required');
if ((value === undefined || value === null || value === '') && !hasRequired) {
continue;
}
for (const rule of fieldRules) {
const [ruleName, ...args] = rule.split(/:|,/g);
const ruleFn = ruleFns[ruleName];
if (ruleFn) {
const valid = await ruleFn(value, ctx, ...args);
if (!valid) {
passed = false;
errors[field] = errors[field] || [];
errors[field].push(`${field} failed validation: ${rule}`);
}
}
}
}
return { passed, errors };
}