UNPKG

lara-validator

Version:

Validating data based on Laravel validation style

600 lines (573 loc) 23.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _laravelMimeMapper = require('../laravelMimeMapper'); var _laravelMimeMapper2 = _interopRequireDefault(_laravelMimeMapper); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Rules = function () { function Rules() { _classCallCheck(this, Rules); } _createClass(Rules, [{ key: 'accepted', value: function accepted(val) { return typeof val === 'string' && (val.toLowerCase() === 'yes' || val.toLowerCase() === 'on' || val.toLowerCase() === 'true' || val === '1') || val === 1 || val === true; } }, { key: 'dateCompared', /** * @param {Date|Number} val * @param {string} type should be one of '>', '>=', '=', '<=' or '<' * @param {Date|Number} compareVal */ value: function dateCompared(val, type, compareVal) { var testDate = undefined; var compareDate = undefined; try { testDate = val instanceof Date ? new Date(val).getTime() : val; compareDate = compareVal instanceof Date ? new Date(compareVal).getTime() : compareVal; } catch (error) { return false; } switch (type) { case '>': return testDate > compareDate; case '>=': return testDate >= compareDate; case '=': return testDate === compareDate; case '<=': return testDate <= compareDate; case '<': return testDate < compareDate; default: return false; } } }, { key: 'afterDate', value: function afterDate(val, compareVal) { return this.dateCompared(val, '>', compareVal); } }, { key: 'afterOrEqualDate', value: function afterOrEqualDate(val, compareVal) { return this.dateCompared(val, '>=', compareVal); } }, { key: 'alpha', value: function alpha(val) { var alphaRegex = /^[a-zA-Z]*$/gi; return this.regex(val, alphaRegex); } }, { key: 'alphaDash', value: function alphaDash(val) { var alphaDashRegex = /^[a-zA-Z0-9\-_]*$/gi; return this.regex(val, alphaDashRegex); } }, { key: 'alphaNum', value: function alphaNum(val) { var alphaNumRegex = /^[a-zA-Z0-9]*$/gi; return this.regex(val, alphaNumRegex); } }, { key: 'isArray', value: function isArray(val) { return Array.isArray(val); } }, { key: 'beforeDate', value: function beforeDate(val, compareVal) { return this.dateCompared(val, '<', compareVal); } }, { key: 'beforeOrEqualDate', value: function beforeOrEqualDate(val, compareVal) { return this.dateCompared(val, '<=', compareVal); } }, { key: 'between', value: function between(min, val, max) { return this.sizeCompare(val, '>=', min) && this.sizeCompare(val, '<=', max); } }, { key: 'isBoolean', value: function isBoolean(val) { return typeof val === 'boolean' || val === '1' || val === '0' || val === 1 || val === 0; } }, { key: 'confirmed', // todo: should be wrapper value: function confirmed(val, fieldName) { var objectData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var confirmedFieldVal = objectData[fieldName + '_confirmation']; return val === confirmedFieldVal; } }, { key: 'isDate', value: function isDate(val) { var isValidDateInstance = val instanceof Date && val.toString() !== 'Invalid Date'; if (isValidDateInstance) { return true; } else if (val) { try { var dateInstance = new Date(val); var invalidDate = dateInstance.toString() === 'Invalid Date'; return !invalidDate; } catch (error) { return false; } } return false; } }, { key: 'equalDate', value: function equalDate(val, compareVal) { return this.dateCompared(val, '=', compareVal); } }, { key: 'different', value: function different(val, compareVal) { return !this.same(val, compareVal); } }, { key: 'digits', value: function digits(val, length) { var lengthOfNumeric = this.numericLength(val); return lengthOfNumeric !== 0 && lengthOfNumeric === length; } }, { key: 'digitsBetween', value: function digitsBetween(val, min, max) { var length = this.numericLength(val); return length !== 0 && min <= length && length <= max; } }, { key: 'isDistinct', value: function isDistinct(array) { var exitColumns = []; if (Array.isArray(array)) { var result = true; array.every(function (ele) { ele = JSON.stringify(ele); if (exitColumns.includes(ele)) { result = false; return false; } else { exitColumns.push(ele); return true; } }); return result; } return false; } }, { key: 'isEmail', value: function isEmail(val) { var emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/gi; return this.regex(val, emailRegex); } }, { key: 'isFile', value: function isFile(val) { return val instanceof File; } }, { key: 'filled', value: function filled(val) { if (val) { if (Array.isArray(val)) { return val.length > 0; } else if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object') { return Object.keys(val).length > 0; } return true; } return false; } }, { key: 'greaterThan', value: function greaterThan(val, compareVal) { return this.sizeCompare(val, '>', compareVal); } }, { key: 'greaterThanOrEqual', value: function greaterThanOrEqual(val, compareVal) { return this.sizeCompare(val, '>=', compareVal); } }, { key: 'isImage', value: function isImage(val) { if (this.isFile(val)) { var imageMIMEs = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp', // 'image/webp', // 'image/x-icon', // 'image/vnd.microsoft.icon', 'image/svg+xml']; return imageMIMEs.includes(val.type); } return false; } }, { key: 'includeIn', value: function includeIn(val) { var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; try { return opts.includes(val); } catch (error) { return false; } } }, { key: 'inArray', value: function inArray(val, arrayVal) { var _this = this; try { /* * toString() JSON.stringify() .constructor.toString() * {} '[object Object]' '{}' 'function Object() { [native code] }' * {data: 123} '[object Object]' '{data: 123}' 'function Object() { [native code] }' * /^Mc/i '/^Mc/i' '{}' 'function RegExp() { [native code] }' * WithPropClass('A') '[object Object]' '{prop: "A"}' 'class WithPropClass { ... }' * NoPropClass() '[object Object]' '{}' 'class NoPropClass { ... }' * [1, 2, 3] '1, 2, 3' '[1, 2, 3]' 'function Array() { [native code] }' * * **/ var valObjectType = this.getObjectType(val); if (valObjectType) { // compare for object var valStr = this.getObjectStringByType(val, valObjectType); var validResult = false; arrayVal.every(function (ele) { var eleObjectType = _this.getObjectType(ele); if (eleObjectType) { var eleStr = _this.getObjectStringByType(ele, eleObjectType); if (valStr === eleStr) { validResult = true; return false; } else { return true; } } return true; }); return validResult; } else { return this.includeIn(val, arrayVal); } } catch (error) { return false; } } }, { key: 'isInteger', value: function isInteger(val) { return Number.isInteger(val); } }, { key: 'isIP', value: function isIP(val) { var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'ip'; switch (type.toLowerCase()) { case 'ipv4': return this.isIPv4(val); case 'ipv6': return this.isIPv6(val); default: return this.isIPv4(val) || this.isIPv6(val); } } }, { key: 'isIPv4', value: function isIPv4(val) { var ipv4Regex = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/gi; return this.regex(val, ipv4Regex); } }, { key: 'isIPv6', value: function isIPv6(val) { var ipv6Regex = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/gi; return this.regex(val, ipv6Regex); } }, { key: 'lessThan', value: function lessThan(val, compareVal) { return this.sizeCompare(val, '<', compareVal); } }, { key: 'lessThanOrEqual', value: function lessThanOrEqual(val, compareVal) { return this.sizeCompare(val, '<=', compareVal); } }, { key: 'isMimeTypes', value: function isMimeTypes(val) { var mimeTypeArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; if (this.isFile(val)) { return mimeTypeArray.includes(val.type); } return false; } }, { key: 'isMime', value: function isMime(val) { var mimeArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; if (this.isFile(val)) { var guessMime = _laravelMimeMapper2.default[val.type]; return mimeArray.includes(guessMime); } return false; } }, { key: 'notIncludeIn', value: function notIncludeIn(val) { var checkValArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; return !this.includeIn(val, checkValArray); } }, { key: 'notRegex', value: function notRegex(val, regEx) { return !this.regex(val, regEx); } }, { key: 'nullable', value: function nullable(val) { return !!val || val === null; } }, { key: 'numericLength', value: function numericLength(val) { // reference: // https://stackoverflow.com/questions/14879691/get-number-of-digits-with-javascript/28203456#28203456 if (this.isNumeric(val)) { return (Math.log10((val ^ val >> 31) - (val >> 31)) | 0) + 1; } return 0; } }, { key: 'isNumeric', value: function isNumeric(val) { return typeof val === 'number' && !Number.isNaN(val); } }, { key: 'present', value: function present(fieldName) { var objectVal = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; try { return objectVal.hasOwnProperty(fieldName); } catch (error) { return false; } } }, { key: 'regex', value: function regex(val, regEx) { try { return !!val.match(new RegExp(regEx)); } catch (error) { return false; } } }, { key: 'required', value: function required(val) { var isUndefined = val === undefined; var isNull = val === null; var isEmptyString = typeof val === 'string' && val === ''; var isEmptyArray = Array.isArray(val) && val.length === 0; var curlyObjectConstructor = 'function Object() { [native code] }'; var isEmptyCurlyObject = val && (typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' && val.constructor.toString() === curlyObjectConstructor && Object.keys(val).length === 0; return !(isUndefined || isNull || isEmptyString || isEmptyArray || isEmptyCurlyObject); } }, { key: 'requiredIf', value: function requiredIf(val, conditionData, conditionVal) { if (this.same(conditionData, conditionVal)) { return this.required(val); } return true; } }, { key: 'requiredUnless', value: function requiredUnless(val, conditionData, conditionVal) { if (!this.same(conditionData, conditionVal)) { return this.required(val); } return true; } }, { key: 'same', value: function same(val, compareVal) { var valObjectType = undefined; var compareValObjectType = undefined; var getObjectTypeError = false; try { valObjectType = this.getObjectType(val); compareValObjectType = this.getObjectType(compareVal); } catch (error) { getObjectTypeError = true; } var sameObjectType = valObjectType === compareValObjectType; if (!getObjectTypeError && valObjectType && compareValObjectType && sameObjectType) { var valStr = this.getObjectStringByType(val, valObjectType); var compareValStr = this.getObjectStringByType(compareVal, compareValObjectType); return valStr === compareValStr; } else { return val === compareVal; } } }, { key: 'getSize', value: function getSize(arg) { try { if (typeof arg === 'string') { return arg.length; } else if (typeof arg === 'number') { return arg; } else if (Array.isArray(arg)) { return arg.length; } else if (this.isFile(arg)) { return arg.size; } else { return null; } } catch (error) { return null; } } }, { key: 'sizeCompare', value: function sizeCompare(val, type, compareSize) { var checkValue = this.getSize(val); if (val !== null) { switch (type) { case '<': return checkValue < compareSize; case '<=': return checkValue <= compareSize; case '=': return checkValue === compareSize; case '>': return checkValue > compareSize; case '>=': return checkValue >= compareSize; } } return false; } }, { key: 'equalSize', value: function equalSize(val, compareSize) { return this.sizeCompare(val, '=', compareSize); } }, { key: 'startWith', value: function startWith(val) { var _this2 = this; var startRegexes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var isStartWithRegex = false; startRegexes.every(function (ele) { if (_this2.regex(val, new RegExp('^' + ele))) { isStartWithRegex = true; return false; } return true; }); return isStartWithRegex; } }, { key: 'isString', value: function isString(val) { return typeof val === 'string'; } }, { key: 'isURL', value: function isURL(val) { var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; // https://mathiasbynens.be/demo/url-regex var urlRegex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/gi; if (type) { switch (type.toLowerCase()) { case 'http': urlRegex = /http:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi; break; case 'https': urlRegex = /https:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi; break; } } return this.regex(val, urlRegex); } }, { key: 'isUUID', value: function isUUID(val) { var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; switch (version) { case 1: uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; break; case 2: uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-2[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; break; case 3: uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; break; case 4: uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; break; case 5: uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; break; } try { return this.regex(val, uuidRegex); } catch (error) { return false; } } }, { key: 'getObjectType', value: function getObjectType(val) { if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object') { if (Array.isArray(val)) { return 'array'; } if (val.constructor.toString() === 'function Object() { [native code] }') { return 'curlyObject'; } if (val.constructor.toString().includes('class')) { return JSON.stringify(val) === '{}' ? 'withoutPropClass' : 'withPropClass'; } else { return 'prototypeObject'; } } return false; } }, { key: 'getObjectStringByType', value: function getObjectStringByType(val, type) { switch (type) { case 'array': case 'curlyObject': case 'withPropClass': case 'withoutPropClass': return JSON.stringify(val); case 'prototypeObject': return val.toString(); default: return undefined; } } }]); return Rules; }(); var rules = new Rules(); exports.default = rules;