aovi
v2.0.5
Published
AOVI is a tiny dependency free library to validate values in declarative way.
Downloads
70
Maintainers
Readme
aovi
AOVI is a lightweight dependency free library to validate values of the simple object's properties in declarative way. May be used in Node or in browser as well.
Usage
Node
const {aovi} = require('aovi');
const test_object = {name:'John'};
const result = aovi(test_object)
.check('name')
.required()
.match(/^[a-z]+$/i)
console.log(result.valid); // true
Browser
<script src='https://cdn.jsdelivr.net/npm/aovi'></script>
...
<Input id="password" type="password" value="12345"/>
<script>
const {aovi} = Aovi;
const test_object = {
password: document.getElementById('password').value
};
const result = aovi(test_object)
.check('password')
.required()
.minLength(5)
console.log(result.valid); // true
</script>
Example
const {aovi} = require('aovi');
const test_object = {
user: 'John',
sex: 'male',
email: 'no',
age: 16
}
const result = aovi(test_object)
.check('user') // the property name
.required() // check something
.type('string') // check more
.check('sex') // and once again with another property
.required()
.oneof(['male','female'])
.check('email')
.match(/[^@]+@[^\.]+\..+/,'E-Mail is invalid')
.minLength(6) // skipped, because match already failed
.check('age')
.min(18)
.check('name')
.type('string') // skipped, because name is undefined and not required
console.log(result.valid); // false
console.log(result.text()); // E-Mail is invalid. age must be greater than 18.
console.log(result.json()); // [{"name": "email", "error":"E-Mail is invalid"},{"name": "age", "error":"age must be greater than 18"}]
Asynchronus example
// http-request with body_parser.json middleware example
async function(req,res){
// asynchronously request db and check password
const check_password = async function(userid,password) {
const user = await db.getuser(userid);
return user.password===password;
}
const data = req.body;
const result = aovi(data)
.check('password')
.required()
.is(async (password) => {
return await check_password( data.userid, password )
},'Wrong password')
.check('userid')
.required()
.type('number')
// don't miss await keyword here
console.log(await result.valid);
console.log(await result.text());
console.log(await result.json());
}
Custom validators
You may add your own reusable validators to the aovi
object. Custom validator is the function which must return object containing properties below:
name
- name for validator methodtest
- test function must returntrue
orfalse
. Whentrue
value of the property is valid. Function gets the value of the property as its parameter.message
- default validation error message. Name of the property or its label will be added at the start of this text.notMessage
- default validation error message if used.not
operator before. Name of the property or its label will be added at the start of this text. If ommited,.not
operator will not be allowing to use with this custom validator.
Custom validator example
// a,b - params, which should be be passed to the validator by user
const my_custom_validator = (a,b) => {
return {
// name of the validator method
name: 'between',
// test function gets value, must return true or false
test: (v)=>(v>=a && v<=b),
// error message, when test returns false
message: `%Label% must be between ${a} and ${b}`
// error message, when used .not and test returns true
notMessage: `%Label% must not be between ${a} and ${b}`
}
}
const test_object={number1:5, number2:42, number3:100};
const result = aovi(test_object)
.use(my_custom_validator)
.check('number1')
.between(10,50)
.check('number2')
.not.between(0,100)
.check('number3')
.between(1,10,'The value is out of range')
console.log(result.text()); // number1 must be between 10 and 50. number2 must not be between 0 and 100. The value is out of range.
Meassages variables
There is a set ov placeholders, which you may use in validators custom messages or in the messages of custom validators. They will be replaced by their values in result.
%label%
- label (or name, if label not specified) of the tested property.%Label%
- same, but with capitalized first letter.%name%
- name of the tested property.%Name%
- same, but with capitalized first letter.%value%
- provided property value.
API
aovi(test_object)
Detrmine object for validation
.use(validator_function)
Add custom validator to the aovi
object. See Custom validators for more info.
.check(property_name,[label])
Set which property will be validate by next functions. label
is the name for the property which will be shown in default error messages
.not
Invert result of the next validator. Can be used before type
,match
,is
,oneof
and length
validators. Example .not.length(5)
.
.required([custom_message])
Check if the propertyis defined in object and its value is not equal empty string.
.type(type,[custom_message])
Check if the property's value is of specified type
, like 'string','number' etc.
.match(regular_expression,[custom_message])
Check if the property's value is match regular_expression
.
.is(function,[custom_message])
Pass if the function
returns true
. This function accept one parameter which is a value of the current property. If function
is asynchronous, you must call result functions (.text()
, .json()
, .array()
and .valid
) asynchronously too.
.oneof(array_of_variants,[custom_message])
Check if the property's value is in the array_of_variants
array.
.length(needed_length,[custom_message])
Check if the property's value length is exact needed_length
.
.minLength(min_length,[custom_message])
Check if the property's value length is greater than or equal min_length
.
.maxLength(max_length,[custom_message])
Check if the property's value length is less than or equal max_length
.
.min(minimum,[custom_message])
Check if the property's valueis greater than or equal minimum
.
.max(maximum,[custom_message])
Check if the property's value is less than or equal maximum
.
.valid
Is true
when no errors where occured during validation chain. Will be false
in other case.
.text()
Return errors as string. Will return ''
if no errors.
.json()
Return errors as JSON-string. Will return '[]'
if no errors.
.array()
Return errors as array. Will return []
if no errors.