assurance
Version:
Node validation/sanitization library with a handsome API
172 lines (143 loc) • 4.04 kB
JavaScript
var errors = require('./errors')
exports.matches = function (val, regex) {
if (!regex.test(val)) {
return new errors.InvalidValue('value must match ' + regex, val)
}
}
exports.len = function (val, min, max) {
var len = val.length
if (arguments.length === 2) {
max = min
min = max
if (len > max) {
return new errors.InvalidLength(min, max, len)
}
}
else {
if ((len > max) || (len < min)) {
return new errors.InvalidLength(min, max, len)
}
}
}
exports.isInt = function (val) {
if (val % 1 !== 0) {
return new errors.InvalidValue('value must be an integer', val)
}
}
// see http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
var EMAIL_REGEX =
'^(([^<>()[\\]\\\.,;:\\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,}))$'
EMAIL_REGEX = new RegExp(EMAIL_REGEX)
exports.isEmail = function (val) {
var type = typeof val
if (type !== 'string') {
return new errors.InvalidType('string', type)
}
if (!EMAIL_REGEX.test(val)) {
return new errors.InvalidEmail(val)
}
}
exports.oneOf = function (val, index) {
if (Array.isArray(index)) {
if (index.indexOf(val) === -1) {
return new errors.NotAnOption(val, index)
}
}
else {
if (!index[val]) {
return new errors.NotAnOption(val, Object.keys(index))
}
}
}
exports.required = function (val) {
if ((typeof val === 'undefined') || (val === null)) {
return new errors.MissingParameter()
}
}
exports.is = function (val, expectedType) {
var type = typeof val
var expectedButNotPresent =
(expectedType !== 'undefined') &&
(expectedType !== null) &&
(type === 'undefined' || val === null)
if (expectedButNotPresent) {
return new errors.MissingParameter()
}
if (expectedType === 'array') {
if (Array.isArray(val)) {
return
}
else {
return new errors.InvalidType(expectedType, type)
}
}
if (type !== expectedType) {
return new errors.InvalidType(expectedType, type)
}
}
exports.gt = function (val, gtVal) {
if (!(val > gtVal)) {
return new errors.InvalidValue('expected a value greater than ' + gtVal, val)
}
}
exports.lt = function (val, ltVal) {
if (!(val < ltVal)) {
return new errors.InvalidValue('expected a value less than ' + ltVal, val)
}
}
exports.max = function (val, maxVal) {
if (!(val <= maxVal)) {
return new errors.InvalidValue('must be at most ' + maxVal, val)
}
}
exports.min = function (val, minVal) {
if (!(val >= minVal)) {
return new errors.InvalidValue('must be at least ' + minVal, val)
}
}
exports.equals = function (val, otherVal) {
if (val !== otherVal) {
return new errors.InvalidValue('value must equal ' + otherVal, val)
}
}
exports.notEquals = function (val, otherVal) {
if (val === otherVal) {
return new errors.InvalidValue('value must not equal ' + otherVal, val)
}
}
exports.consistsOf = function (val, index) {
var i
if (Array.isArray(index) || typeof index === 'string') {
for (i = 0; i < val.length; i++) {
if (index.indexOf(val[i]) === -1) {
return new errors.InvalidValue('didnt expect value to contain ' + val[i], val)
}
}
}
else {
for (i = 0; i < val.length; i++) {
if (!index[val[i]]) {
return new errors.InvalidValue('didnt expect value to contain ' + val[i], val)
}
}
}
}
// TODO: unicode support
exports.isLowerCase = function (val) {
if (/[A-Z]/.test(val)) {
return new errors.InvalidValue('must contain only lower case characters', val)
}
}
// TODO: unicode support
exports.isUpperCase = function (val) {
if (/[a-z]/.test(val)) {
return new errors.InvalidValue('must contain only upper case characters', val)
}
}
exports.contains = function (val, elem) {
if (val.indexOf(elem) === -1) {
return new errors.InvalidValue('must contain ' + elem, val)
}
}