UNPKG

@ntbl/validator

Version:

一个内置验证规则的数据验证库

146 lines (123 loc) 3.31 kB
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'))