UNPKG

ruler-factory

Version:

A flexible, chainable validation rule factory for typeScript/javaScript.

445 lines (444 loc) 12 kB
// src/index.ts import { isArray, isBoolean, isEmpty, isFunction, isNumber, isPlainObject, isString, isSymbol } from "rattail"; var EMAIL_REGEX = /^(?!\.)(?!.*\.\.)([a-z0-9_'+\-\\.]*)[a-z0-9_+-]@([a-z0-9][a-z0-9\\-]*\.)+[a-z]{2,}$/i; function rulerFactory(generator, extend) { return function ruler() { var _a; const rules = []; const ctx = { // helpers rules, addRule, generator, getMessage, // type type: "string", string, number, array, boolean, object, symbol, bigint, null: _null, undefined: _undefined, true: _true, false: _false, // validation length, min, max, regex, required, startsWith, endsWith, includes, uppercase, lowercase, email, gt, gte, lt, lte, positive, negative, is, not, done, // transform transformer, transform, trim, shouldTrim: false, toLowerCase, shouldToLowerCase: false, toUpperCase, shouldToUpperCase: false }; Object.assign(ctx, (_a = extend == null ? void 0 : extend(ctx)) != null ? _a : {}); function string(message, params) { ctx.type = "string"; addRule((value) => { if (message == null) { return; } if (!isString(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function number(message, params) { ctx.type = "number"; addRule((value) => { if (message == null) { return; } if (!isNumber(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function object(message, params) { ctx.type = "object"; addRule((value) => { if (message == null) { return; } if (!isPlainObject(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function array(message, params) { ctx.type = "array"; addRule((value) => { if (message == null) { return; } if (!isArray(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function boolean(message, params) { ctx.type = "boolean"; addRule((value) => { if (message == null) { return; } if (!isBoolean(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function _true(message, params) { ctx.type = "boolean"; addRule((value) => { if (message == null) { return; } if (value !== true) { return new Error(getMessage(message)); } }, params); return ctx; } function _false(message, params) { ctx.type = "boolean"; addRule((value) => { if (message == null) { return; } if (value !== false) { return new Error(getMessage(message)); } }, params); return ctx; } function symbol(message, params) { ctx.type = "symbol"; addRule((value) => { if (message == null) { return; } if (!isSymbol(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function _null(message, params) { ctx.type = "null"; addRule((value) => { if (message == null) { return; } if (value !== null) { return new Error(getMessage(message)); } }, params); return ctx; } function _undefined(message, params) { ctx.type = "undefined"; addRule((value) => { if (message == null) { return; } if (value !== void 0) { return new Error(getMessage(message)); } }, params); return ctx; } function bigint(message, params) { ctx.type = "bigint"; addRule((value) => { if (message == null) { return; } if (typeof value !== "bigint") { return new Error(getMessage(message)); } }, params); return ctx; } function required(message, params) { addRule((value) => { if (isEmpty(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function email(message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || !EMAIL_REGEX.test(value))) { return new Error(getMessage(message)); } }, params); return ctx; } function min(v, message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || value.length < v)) { return new Error(getMessage(message)); } if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value < v) { return new Error(getMessage(message)); } } if (ctx.type === "array" && (!isArray(value) || value.length < v)) { return new Error(getMessage(message)); } }, params); return ctx; } function max(v, message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || value.length > v)) { return new Error(getMessage(message)); } if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value > v) { return new Error(getMessage(message)); } } if (ctx.type === "array" && (!isArray(value) || value.length > v)) { return new Error(getMessage(message)); } }, params); return ctx; } function length(v, message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || value.length !== v)) { return new Error(getMessage(message)); } if (ctx.type === "array" && (!isArray(value) || value.length !== v)) { return new Error(getMessage(message)); } }, params); return ctx; } function regex(v, message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || !v.test(value))) { return new Error(getMessage(message)); } }, params); return ctx; } function startsWith(v, message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || !value.startsWith(v))) { return new Error(getMessage(message)); } }, params); return ctx; } function endsWith(v, message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || !value.endsWith(v))) { return new Error(getMessage(message)); } }, params); return ctx; } function includes(v, message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || !value.includes(v))) { return new Error(getMessage(message)); } if (ctx.type === "array" && (!isArray(value) || !value.includes(v))) { return new Error(getMessage(message)); } }, params); return ctx; } function uppercase(message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || value !== value.toUpperCase())) { return new Error(getMessage(message)); } }, params); return ctx; } function lowercase(message, params) { addRule((value) => { if (ctx.type === "string" && (!isString(value) || value !== value.toLowerCase())) { return new Error(getMessage(message)); } }, params); return ctx; } function gt(v, message, params) { addRule((value) => { if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value <= v) { return new Error(getMessage(message)); } } }, params); return ctx; } function gte(v, message, params) { addRule((value) => { if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value < v) { return new Error(getMessage(message)); } } }, params); return ctx; } function lt(v, message, params) { addRule((value) => { if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value >= v) { return new Error(getMessage(message)); } } }, params); return ctx; } function lte(v, message, params) { addRule((value) => { if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value > v) { return new Error(getMessage(message)); } } }, params); return ctx; } function positive(message, params) { addRule((value) => { if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value <= 0) { return new Error(getMessage(message)); } } }, params); return ctx; } function negative(message, params) { addRule((value) => { if (ctx.type === "number" || ctx.type === "bigint") { if (!isNumber(value) && typeof value !== "bigint") { return new Error(getMessage(message)); } if (value >= 0) { return new Error(getMessage(message)); } } }, params); return ctx; } function is(v, message, params) { addRule((value) => { if (!v(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function not(v, message, params) { addRule((value) => { if (v(value)) { return new Error(getMessage(message)); } }, params); return ctx; } function trim() { ctx.shouldTrim = true; return ctx; } function toLowerCase() { ctx.shouldToLowerCase = true; return ctx; } function toUpperCase() { ctx.shouldToUpperCase = true; return ctx; } function transformer(value) { if (ctx.type === "string" && isString(value)) { ctx.shouldTrim && (value = value.trim()); ctx.shouldToLowerCase && (value = value.toLowerCase()); ctx.shouldToUpperCase && (value = value.toUpperCase()); } return value; } function transform(v) { ctx.transformer = v; } function addRule(validator, params) { rules.push( generator((value) => { value = ctx.transformer(value); return validator(value); }, params) ); return ctx; } function done() { return rules; } function getMessage(message) { return isFunction(message) ? message() : message; } return ctx; }; } export { rulerFactory };