lara-validator
Version:
Validating data based on Laravel validation style
600 lines (573 loc) • 23.7 kB
JavaScript
'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;