cross-validator
Version:
A Cross Script Validator, node, browser, java
499 lines (409 loc) • 12.3 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Validator = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
(function () {
'use strict';
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
window.CrossValidator = require('./');
})();
},{"./":2}],2:[function(require,module,exports){
(function () {
'use strict';
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
module.exports = require('./validator/validator');
})();
},{"./validator/validator":6}],3:[function(require,module,exports){
(function () {
'use strict';
var util = require('./util');
var validators = require('./validators');
var Extractor = require('./extractor');
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
var exec = {
constrains: [],
loggerError: {},
data: {},
expressions: [],
itemsToValidate: {}
};
var Validate = {
validate: function () {
exec.constrains.forEach(function (constrain) {
exec.expressions = exec.expressions.concat(new Expressions(constrain));
});
exec.expressions.forEach(function (expression) {
validators.exec(expression, exec.loggerError);
});
}
};
var DataValidator = {
outErrors: function (error) {
exec.loggerError = error;
return this;
},
forData: function (data) {
exec.data = data;
return Validate;
}
};
var ConstrainsValidator = {
using: function (constrains) {
exec.constrains = constrains;
exec.loggerError = {};
exec.data = {},
exec.expressions = [];
exec.itemsToValidate = {};
return DataValidator;
}
};
var Expressions = function (constrain) {
var result = [];
var items = [];
var expression = util.expressionToArray(constrain);
var method = expression.shift();
var params = expression;
params.forEach(function (param) {
if (/^\$/.test(param)) {
var itemsExtracted = new Extractor(exec.data).extract(param.replace('$', ''));
items = items.concat(itemsExtracted);
} else {
items = items.concat(new LiteralItem(param));
}
});
if (params.length === 1) {
items.forEach(function (item) {
result.push(new Expression(item, method));
});
return result;
}
result.push(new Expression(items, method));
return result;
};
var LiteralItem = function (value) {
return new Extractor(value).extract('literalvalue');
};
var Expression = function (items, method) {
var expression = {};
expression.method = method;
expression.paramsValue = items;
return expression;
};
module.exports = ConstrainsValidator;
})();
},{"./extractor":4,"./util":5,"./validators":8}],4:[function(require,module,exports){
(function () {
'use strict';
var util = require('./util');
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
* @author Bruno M Marques <zaccabruno@gmail.com>
*/
var Extractor = function (data) {
var object = data;
this.extract = function (path) {
return extractor(object, path);
};
var extractor = function (obj, fullPath, position, path, result) {
if (fullPath === 'literalvalue') {
result = [];
result.push(new Item(fullPath, obj));
return result;
}
var pathArr = fullPath.split('.');
result = result || [];
path = path || '';
position = position || 0;
obj = obj[pathArr[position]];
path = path + '.' + pathArr[position];
path = path.replace(/^\./, '');
if (pathArr.length - 1 <= position) {
result.push(new Item(path, obj));
return result;
}
if (Array.isArray(obj)) {
path = path.concat('[:index]');
obj.forEach(function (item, index) {
var newPath = path.replace(':index', index);
extractor(item, fullPath, position + 1, newPath, result);
});
return result;
}
return extractor(obj, fullPath, position + 1, path, result);
};
};
var Item = function (key, value) {
this.key = key;
this.value = value;
};
module.exports = Extractor;
})();
},{"./util":5}],5:[function(require,module,exports){
(function () {
'use strict';
/*global toString*/
/**
* @name util
* @author Guilherme Mangabeira Gregio <guilherme@gregio.net>
*/
var util = {};
util.isArray = Array.isArray;
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Object'].forEach(function (name) {
util['is' + name] = function (obj) {
return toString.call(obj) === '[object ' + name + ']';
};
});
util.isEmpty = function (obj) {
if (obj == null) {
return true;
}
if (util.isArray(obj) || util.isString(obj) || util.isArguments(obj)) {
return obj.length === 0;
}
if (util.isNumber(obj)) {
return obj === 0;
}
for (var key in obj) {
if (util.has(obj, key)) {
return false;
}
}
return true;
};
util.has = function (obj, key) {
return obj != null && Object.prototype.hasOwnProperty.call(obj, key);
};
util.deep = function (obj, key, value) {
var keys = key.replace(/\[(["']?)([^\1]+?)\1?\]/g, '.$2').replace(/^\./, '').split('.'),
root,
i = 0,
n = keys.length;
if (arguments.length > 2) {
// Set deep value
root = obj;
n--;
while (i < n) {
key = keys[i++];
obj = obj[key] = util.isObject(obj[key]) ? obj[key] : {};
}
obj[keys[i]] = value;
value = root;
} else {
// Get deep value
var exec = true;
while (exec && i < n) {
exec = (obj = obj[keys[i++]]) != null;
}
value = i < n ? void 0 : obj;
}
return value;
};
util.expressionToArray = function (expression) {
return expression.replace(/[\(\),]/g, '|').replace(/ /g, '').replace(/\|$/, '').split('|');
};
util.clone = function clone(item) {
if (!item) {
return item;
} // null, undefined values check
var types = [Number, String, Boolean],
result;
// normalizing primitives if someone did new String('aaa'), or new Number('444');
types.forEach(function (type) {
if (item instanceof type) {
result = type(item);
}
});
if (typeof result == "undefined") {
if (Object.prototype.toString.call(item) === "[object Array]") {
result = [];
item.forEach(function (child, index, array) {
result[index] = clone(child);
});
} else if (typeof item == "object") {
// testing that this is DOM
if (item.nodeType && typeof item.cloneNode == "function") {
result = item.cloneNode(true);
} else if (!item.prototype) { // check that this is a literal
if (item instanceof Date) {
result = new Date(item);
} else {
// it is an object literal
result = {};
var keys = Object.keys(item);
for (var i = 0, itemLength = keys.length; i < itemLength; i++) {
result[keys[i]] = clone(item[keys[i]]);
}
}
} else {
// depending what you would like here,
// just keep the reference, or create new object
if (false && item.constructor) {
// would not advice to do that, reason? Read below
result = new item.constructor();
} else {
result = item;
}
}
} else {
result = item;
}
}
return result;
};
module.exports = util;
})();
},{}],6:[function(require,module,exports){
(function () {
'use strict';
var util = require('./util');
var execValidators = require('./execValidators');
var ValidatorResult = require('./validatorResult');
/**
* Class Validator
* @param data Object
* @param constrains Array
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
var Validator = function (data, constrains) {
var _data = data;
var _constrains = constrains;
verifyData(_data);
verifyConstrains(_constrains);
this.getData = function () {
return _data;
};
this.getConstrains = function () {
return _constrains;
};
this.validate = function () {
var errors = {};
execValidators.using(this.getConstrains()).outErrors(errors).forData(this.getData()).validate();
return new ValidatorResult(errors);
};
};
function verifyData(data) {
if (util.isEmpty(data) || !util.isObject(data)) {
var message = 'Data is Invalid. Expected an Object not empty, but was given: :result';
message = message.replace(":result", JSON.stringify(data, null, 4));
throw new InvalidArguments(message);
}
}
function verifyConstrains(constrains) {
if (util.isEmpty(constrains) || !util.isArray(constrains)) {
var message = 'Constrains is Invalid. Expected an Array not empty, but was given: :result';
message = message.replace(":result", JSON.stringify(constrains, null, 4));
throw new InvalidArguments(message);
}
}
var InvalidArguments = function (message) {
var error = new Error(message);
error.name = 'InvalidArguments';
throw error;
};
module.exports = Validator;
})();
},{"./execValidators":3,"./util":5,"./validatorResult":7}],7:[function(require,module,exports){
(function () {
'use strict';
var util = require('./util');
var validators = require('./validators');
/**
*
* @param errors
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
var ValidatorResult = function (errors) {
var _errors = util.clone(errors);
this.hasErrors = function () {
return !util.isEmpty(_errors);
};
this.getAllFailures = function () {
return _errors;
};
this.getErrorsOf = function (field) {
return util.deep(_errors, field);
};
this.forField = function (field) {
return new FieldApi(field);
};
var FieldApi = function (field) {
var self = this;
Object.keys(validators).forEach(function (validator) {
if (validator === 'exec' || validator === 'defaultMethod') {
return;
}
var name = validator.charAt(0).toUpperCase() + validator.substring(1);
var method = "has:ValidatorPassed".replace(":Validator", name);
self[method] = function () {
return (_errors[field] || []).indexOf(validator) === -1;
};
});
};
};
module.exports = ValidatorResult;
})();
},{"./util":5,"./validators":8}],8:[function(require,module,exports){
(function () {
'use strict';
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
var validators = {
notEmpty: require('./validators/notEmpty'),
isEmail: require('./validators/isEmail'),
isNumber: require('./validators/isNumber'),
defaultMethod: function () {
return true;
},
exec: function (expression, loggerError) {
var fn = (validators[expression.method] || validators.defaultMethod);
if (!fn.call(this, expression.paramsValue)) {
loggerError[expression.paramsValue.key] = loggerError[expression.paramsValue.key] || [];
loggerError[expression.paramsValue.key].push(expression.method);
}
}
};
module.exports = validators;
})();
},{"./validators/isEmail":9,"./validators/isNumber":10,"./validators/notEmpty":11}],9:[function(require,module,exports){
(function () {
'use strict';
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
var isEmail = function (item) {
var isMail = /^[a-z0-9_]+@[a-z0-9_]+\.[a-z]{3}(\.[a-z]{2})?$/g;
return isMail.test(item.value);
};
module.exports = isEmail;
})();
},{}],10:[function(require,module,exports){
(function () {
'use strict';
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
var isNumber = function (item) {
var isNumber = /^[0-9]+$/g;
return isNumber.test(item.value);
};
module.exports = isNumber;
})();
},{}],11:[function(require,module,exports){
(function () {
'use strict';
var util = require('../util');
/**
* @author Guilherme M Gregio <guilherme@gregio.net>
*/
var notEmpty = function (item) {
return !util.isEmpty(item.value);
};
module.exports = notEmpty;
})();
},{"../util":5}]},{},[1])(1)
});