UNPKG

violations

Version:

get violated arguments for validation and assertion

106 lines (89 loc) 2.81 kB
function toS(v) { return Object.prototype.toString.call(v); } export let util = { isString: (v) => typeof v === 'string', isFunction: (v) => typeof v === 'function', isBoolean: (v) => typeof v === 'boolean', isNumber: (v) => (typeof v === 'number' || v instanceof Number) && !isNaN(v), isInteger: (v) => typeof v === 'number' && Number.isInteger(v), isUndefined: (v) => typeof v === 'undefined', isArray: (v) => Array.isArray(v), isNull: (v) => v === null, isEmpty: (v) => util.isUndefined(v) || util.isNull(v) || v === '', isObject: (v) => typeof v === 'object' && !util.isArray(v) && !util.isNull(v) && !util.isDate(v) && !util.isRegExp(v) && !util.isNumber(v), isDate: (v) => toS(v) === '[object Date]', isRegExp: (v) => toS(v) === '[object RegExp]', isError: (v) => v instanceof Error, // https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address isEmail: (v) => /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(v) }; export class AssertionError extends Error { constructor(message) { super(message); this.name = 'AssertionError'; this.message = message; if (Error.captureStackTrace) { Error.captureStackTrace(this); } else { let err = new Error(); let stack = err.stack; if (!stack) { // IE10 try { throw err; } catch (e) { stack = e.stack; } } this.stack = stack; } } } export class Violate { constructor(rules = {}) { this.rules = rules; } validate(values) { // validate arguments if (values === null || values === undefined) { return; } let violations = Object.keys(this.rules).map((key) => { // execute rules with undefined if values not exists. let value = values[key]; let rule = this.rules[key]; // apply rule if function if (util.isFunction(rule)) { return rule(value, key, util); } // create validator if rule is object let v = new Violate(rule); return v.validate(value); }).reduce((pre, curr) => { // filter undefined if (curr === undefined) { return pre; } // filter empty array if (Array.isArray(curr) && curr.length === 0) { return pre; } // merge into array return pre.concat(curr); }, []); // return violations if exists if (violations.length > 0) { return violations; } // return undefined if no violations } assert(values) { // delegate to this.validate let violations = this.validate(values); if (violations === undefined) { return; } throw new AssertionError(JSON.stringify(violations)); } }