More than just an object validator.
OVP includes smart helpers that makes your write less and do more when running validations.
| key | Description |
|---|---|
* |
(wildcard) validates all object keys against every validator defined in its value. |
** |
(wildcard for validators) validates all defined keys against every validator defined in its value. |
// assuming we have an object:
wildcardData = {
name: 'wildcard',
address: 'Drive 6, Astro world!',
mobile: '+1336d373'
};
// With rules set:
wildcardTestRules = {
'*': {typeOf: 'string'},
'**': {must: true},
address: {minLength: 10},
};
// the above will be transformed to this using wildcards
wildcardTestRules = {
address: { typeOf: 'string', must: true, minLength: 10 },
name: { typeOf: 'string' },
mobile: { typeOf: 'string' }
};
// name and mobile was automatically added because * wildcard exists.
// If * is removed and ** still exists, it will result to:
wildcardTestRules = {
address: { must: true, minLength: 10 }
}
// {must: true} was automatically added to address.
value of * is added to all object keys, while value of ** is added to all defined rules.
Notice that wildcardTestRules.address rules comes first when transformed before the other keys of the object.
This is because defined rules runs before * wildcard added rules.
| Name | Description |
|---|---|
:skip |
accepts a boolean or a function(value?) that returns a boolean, if true that particular validation will be skipped! |
skipMobile= true;
rules = {
mobile: {
':skip': skipMobile,
'someMobileValidator': true,
},
username: {minLength: 10},
};
// mobile will not be validated because :skip is true
// :skip can also accept a function that returns a boolean
// The current value its validating will be passed to that function also
skipMobile = (mobile) => {
// skip if mobile is empty else run all the validation listed after me.
return !mobile.length;
};
// mobile will be validated because :skip function returned false
Every validation has 3 events that can possibly occur.
| Event | Description |
|---|---|
yes |
Occurs once! when all validation is successfully. |
beforeValidation |
Occurs before validation, if false is returned in event handler the validation wont run. |
onEachError |
Occurs on each error. |
The onEachError event has a default out of the box function that logs the error affected key and a parsed error message to the console. as seen in basic examples.
These events can be handled both globally and on each validate call.
Lets override the default onEachError. This can be done using .setEventHandler(name, function)
name: Name of default function to override.
function: Function to be replaced with.
ovp.setEventHandler('onEachError', (param, msg) => {
console.log('===> ', '{' + param + '}', msg)
});
let data = {
username: ['NodeJs'],
password: '123456'
};
let rules = {
"*": {
typeOf: 'string',
must: true
},
password: {minLength: 10}
};
let check = ovp.validate(data, rules);
// returns: false
// log: ===> {username} Username is not typeOf string
All validations will use default event handlers unless a custom error handler is not passed to validate
// set custom handler per validation
check = ovp.validate(data, rules, {
onEachError(param, msg) {
console.log('Custom onEach Error ===> ', '{' + param + '}', msg)
}
});
// returns: false
// Custom onEach Error ===> {username} Username is not typeOf string
// Without custom onEachError, it reverts back to default onEachError set above.
// set username to string
data.username = 'NodeJs';
check = ovp.validate(data, rules);
// returns: false
// log: {password} Password is too short. (Min. 10 characters)
validate 3rd parameter can accept an object of event handlers functions just like this.
let eventHandlers = {
yes() {},
beforeValidation() {
return true;
},
onEachError(param, msg) {}
};
check = ovp.validate(data, rules, eventHandlers);
yes: will run when all validation is successful. check will still return boolean.