@ntbl/validator
Version:
146 lines (123 loc) • 3.31 kB
JavaScript
import V from 'validator'
/**
*
* @param options
* @param data{object} - 需要验证的数据对象
* @param rules{object} - 验证规则
* @returns {*|Validator}
* @constructor
*
* @example
*
* const data = {
* username: 'sunny',
* password: '123456'
* }
*
* const rules = {
* username: [
* {rule: }
* ],
*
* password: [
* {}
* ]
* }
*
* if (Validator(data, rules).validate()) {
* console.log('验证通过')
* }
*/
function Validator(data, rules, options) {
if (!(this instanceof Validator)) return new Validator(data, rules, options)
this.data = data;
this.rules = rules;
this.options = options;
for (let key in rules) {
rules[key].forEach(r => {
let rule = r.rule;
if (typeof rule === 'string') rule = [rule];
if (Array.isArray(rule)) {
const funcName = rule.shift();
if (funcName in V) r.rule = d => V[funcName](d, ...rule);
else if (funcName in this._rules) r.rule = d => this._rules[funcName](d, ...rule);
else {
throw new Error(`不存在名为 ${r.rule} 的内置规则`)
}
} else if (typeof rule === 'function') r.rule = d => rule(d, this.data);
});
}
}
Validator.prototype = {
constructor: Validator,
validate,
validateOf,
_rules: {
min (data, n) {
return typeof data === 'string' || Array.isArray(data) ? data.length > n
: typeof data === 'number' ? data > n
: false
},
max (data, n) {
return typeof data === 'string' || Array.isArray(data) ? data.length < n
: typeof data === 'number' ? data < n
: false
},
is (data, pattern) {
return pattern.test(data)
},
required (data) {
return data !== ''
},
}
}
function validateOf(name) {
const data = this.data[name]
const rules = this.rules[name]
if (data === undefined || !Array.isArray(rules)) return
for (let r of rules) {
let {rule, msg} = r;
if (!rule(data)) {
return {name, msg}
}
}
}
function validate() {
const errors = Object.keys(this.data).map(name => this.validateOf(name)).filter(Boolean)
return errors.length ? errors : undefined
}
const formData = {
username: 'sunny',
password: '1234567',
mali: 'hsy.ntbl@gmail.com',
point: [4, 4, 5]
}
const rules = {
username: [
{rule: 'required', msg: '必须填写用户名'},
],
password: [
{rule: 'required', msg: '必须填写密码'},
{rule: ['min', 6], msg: '不少于 6 个字符'},
{rule: ['max', 16], msg: '不超过 16 个字符'},
],
mali: [
{rule: 'required', msg: '必须填写邮箱'},
{rule: 'isEmail', msg: '邮箱格式不正确'}
],
point: [
{rule: d => d.every(e => e > 3) , msg: '骰子的点数必须都大于 3 点'}
]
};
const validator = Validator(formData, rules);
console.log(validator.validate())
console.log(validator.validateOf('emil'))
const formData1 = {
username: 'sunny',
password: '123',
mali: 'hsy.ntbl',
point: [4, 4, 5]
};
const validator2 = Validator(formData1, rules);
console.log(validator2.validate())
console.log(validator2.validateOf('emil'))