koa-validator
Advanced tools
Comparing version 0.5.2 to 0.5.5
@@ -5,3 +5,2 @@ var validator = require('validator') | ||
, extend = require('./extend') | ||
, sanitizers = [ | ||
@@ -24,161 +23,26 @@ 'trim' | ||
// extend validator | ||
extendCheck(extend.check); | ||
extendSanitize(extend.sanitize); | ||
// expose | ||
module.exports = koaValidator; | ||
module.exports.validator = validator; | ||
module.exports.extendSanitize = extendSanitize; | ||
module.exports.extendCheck = extendCheck; | ||
// main function | ||
function koaValidator(options){ | ||
var errorFormatter = makeError; | ||
options = options || {}; | ||
options.errorFormatter = options.errorFormatter || function(param, msg, value){ | ||
return { | ||
param: param | ||
, msg: msg | ||
, value: value | ||
}; | ||
}; | ||
function getParams(ctx, name){ | ||
return ctx.params && ctx.params[name]; | ||
} | ||
function getQuery(ctx, name){ | ||
return ctx.query && ctx.query[name]; | ||
} | ||
function getBody(ctx, name){ | ||
return ctx.request.body && ctx.request.body[name]; | ||
} | ||
function getHeader(ctx, name){ | ||
var toCheck; | ||
if (name === 'referrer' || name === 'referer') { | ||
toCheck = ctx.headers.referer; | ||
} else { | ||
toCheck = ctx.headers[name]; | ||
if(options.errorFormatter){ | ||
if(!is.isFunction(options.errorFormatter)){ | ||
throw new Error('errorFormatter must be a function'); | ||
}else{ | ||
errorFormatter = options.errorFormatter; | ||
} | ||
return toCheck || ''; | ||
} | ||
function updateParams(ctx, name, value){ | ||
return ctx.params[name] = value; | ||
// route params like /user/:id | ||
if (ctx.params && ctx.params.hasOwnProperty(name) && | ||
undefined !== ctx.params[name]) { | ||
return ctx.params[name] = value; | ||
} | ||
return false; | ||
} | ||
function updateQuery(ctx, name, value){ | ||
return ctx.query[name] = value; | ||
// query string params | ||
if (undefined !== ctx.query[name]) { | ||
return ctx.query[name] = value; | ||
} | ||
return false; | ||
} | ||
function updateBody(ctx, name, value){ | ||
return ctx.request.body[name] = value; | ||
// request body params via connect.bodyParser | ||
if (ctx.request.body && undefined !== ctx.request.body[name]) { | ||
return ctx.request.body[name] = value; | ||
} | ||
return false; | ||
} | ||
function makeSanitize(field){ | ||
var getter = field === 'params' ? getParams : | ||
field === 'query' ? getQuery : | ||
getBody | ||
, updater = field === 'params' ? updateParams : | ||
field === 'query' ? updateQuery : | ||
updateBody | ||
; | ||
return function(name){ | ||
var ctx = this | ||
, value = getter(ctx, name) | ||
, methods = {} | ||
; | ||
Object.keys(validator).forEach(function(methodName){ | ||
if(methodName.match(/^to/) || sanitizers.indexOf(methodName) !== -1){ | ||
methods[methodName] = function(){ | ||
var args = [value].concat(Array.prototype.slice.call(arguments)); | ||
var result = validator[methodName].apply(validator, args); | ||
updater(ctx, name, result) | ||
return result; | ||
}; | ||
} | ||
}); | ||
return methods; | ||
} | ||
} | ||
function makeCheck(field){ | ||
var getter = field === 'params' ? getParams : | ||
field === 'query' ? getQuery : | ||
field === 'body' ? getBody : | ||
getHeader | ||
; | ||
return function(param, failMsg){ | ||
var ctx = this | ||
, value | ||
; | ||
if(!Array.isArray(param)){ | ||
param = typeof param === 'number' ? | ||
[param] : | ||
param.split('.').filter(function(e){ | ||
return e !== ''; | ||
}); | ||
} | ||
param.map(function(item){ | ||
if(value === undefined){ | ||
value = getter(ctx, item); | ||
}else{ | ||
value = value[item]; | ||
} | ||
}); | ||
param = param.join('.'); | ||
var errorHandler = function(msg){ | ||
var error = options.errorFormatter(param, msg, value); | ||
if (ctx._validationErrors === undefined) { | ||
ctx._validationErrors = []; | ||
} | ||
ctx._validationErrors.push(error); | ||
if (ctx.onErrorCallback) { | ||
ctx.onErrorCallback(msg); | ||
} | ||
return this; | ||
}; | ||
var methods = {}; | ||
Object.keys(validator).forEach(function(methodName) { | ||
if (methodName.match(/^is/) || checkers.indexOf(methodName) !== -1) { | ||
methods[methodName] = function() { | ||
var args = [value].concat(Array.prototype.slice.call(arguments)); | ||
var isCorrect = validator[methodName].apply(validator, args); | ||
if (!isCorrect) { | ||
errorHandler(failMsg || 'Invalid value'); | ||
} | ||
return methods; | ||
} | ||
} | ||
}); | ||
return methods; | ||
}; | ||
} | ||
return function *validator(next){ | ||
@@ -191,6 +55,6 @@ var ctx = this; | ||
ctx.checkParams = makeCheck('params'); | ||
ctx.checkQuery = makeCheck('query'); | ||
ctx.checkBody = makeCheck('body'); | ||
ctx.checkHeader = makeCheck('header'); | ||
ctx.checkParams = makeCheck('params', errorFormatter); | ||
ctx.checkQuery = makeCheck('query', errorFormatter); | ||
ctx.checkBody = makeCheck('body', errorFormatter); | ||
ctx.checkHeader = makeCheck('header', errorFormatter); | ||
@@ -224,2 +88,139 @@ ctx.assertParams = ctx.checkParams; | ||
function getParams(ctx, name){ | ||
return ctx.params && ctx.params[name]; | ||
} | ||
function getQuery(ctx, name){ | ||
return ctx.query && ctx.query[name]; | ||
} | ||
function getBody(ctx, name){ | ||
return ctx.request.body && ctx.request.body[name]; | ||
} | ||
function getHeader(ctx, name){ | ||
var toCheck; | ||
if (name === 'referrer' || name === 'referer') { | ||
toCheck = ctx.headers.referer; | ||
} else { | ||
toCheck = ctx.headers[name]; | ||
} | ||
return toCheck || ''; | ||
} | ||
function updateParams(ctx, name, value){ | ||
return ctx.params[name] = value; | ||
} | ||
function updateQuery(ctx, name, value){ | ||
return ctx.query[name] = value; | ||
} | ||
function updateBody(ctx, name, value){ | ||
return ctx.request.body[name] = value; | ||
} | ||
function makeSanitize(field){ | ||
var getter = field === 'params' ? getParams : | ||
field === 'query' ? getQuery : | ||
getBody | ||
, updater = field === 'params' ? updateParams : | ||
field === 'query' ? updateQuery : | ||
updateBody | ||
; | ||
return function(name){ | ||
var ctx = this | ||
, value = getter(ctx, name) | ||
, methods = {} | ||
; | ||
Object.keys(validator).forEach(function(methodName){ | ||
if(methodName.match(/^to/) || sanitizers.indexOf(methodName) !== -1){ | ||
methods[methodName] = function(){ | ||
var args = [value].concat(Array.prototype.slice.call(arguments)); | ||
var result = validator[methodName].apply(validator, args); | ||
updater(ctx, name, result) | ||
return result; | ||
}; | ||
} | ||
}); | ||
return methods; | ||
} | ||
} | ||
function makeCheck(field, errorFormatter){ | ||
var getter = field === 'params' ? getParams : | ||
field === 'query' ? getQuery : | ||
field === 'body' ? getBody : | ||
getHeader | ||
; | ||
return function(param, failMsg){ | ||
var ctx = this | ||
, value | ||
; | ||
if(!Array.isArray(param)){ | ||
param = typeof param === 'number' ? | ||
[param] : | ||
param.split('.').filter(function(e){ | ||
return e !== ''; | ||
}); | ||
} | ||
param.map(function(item){ | ||
if(value === undefined){ | ||
value = getter(ctx, item); | ||
}else{ | ||
value = value[item]; | ||
} | ||
}); | ||
param = param.join('.'); | ||
var errorHandler = function(msg){ | ||
var error = errorFormatter(param, msg, value); | ||
if (ctx._validationErrors === undefined) { | ||
ctx._validationErrors = []; | ||
} | ||
ctx._validationErrors.push(error); | ||
if (ctx.onErrorCallback) { | ||
ctx.onErrorCallback(msg); | ||
} | ||
return this; | ||
}; | ||
var methods = {}; | ||
Object.keys(validator).forEach(function(methodName) { | ||
if (methodName.match(/^is/) || checkers.indexOf(methodName) !== -1) { | ||
methods[methodName] = function() { | ||
var args = [value].concat(Array.prototype.slice.call(arguments)); | ||
var isCorrect = validator[methodName].apply(validator, args); | ||
if (!isCorrect) { | ||
errorHandler(failMsg || 'Invalid value'); | ||
} | ||
return methods; | ||
} | ||
} | ||
}); | ||
return methods; | ||
}; | ||
} | ||
function makeError(param, msg, value){ | ||
return { | ||
param: param | ||
, msg: msg | ||
, value: value | ||
}; | ||
} | ||
function extendCheck(name, fn){ | ||
@@ -277,6 +278,1 @@ var objs = {}; | ||
} | ||
module.exports = koaValidator; | ||
module.exports.validator = validator; | ||
module.exports.extendSanitize = extendSanitize; | ||
module.exports.extendCheck = extendCheck; |
{ | ||
"name": "koa-validator", | ||
"version": "0.5.2", | ||
"version": "0.5.5", | ||
"description": "a koa port of express-validator", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
25407
715