A lightweight, dependency free, declarative, OOP node.js module for validating your code entities
npm i --save logic-validator
Lets say for example that your are writing a program that manages the events of a conference hall.
Events are considered valid if:
- The start date is before the end date.
- The number of invitations is less than max number invitations ( which is 600 ).
Without using logic-validator your validation function would probably look something like this:
function validate(event) {
if (event.startDate < event.endDate) {
return true;
}
if (event.numberOfInvetations < 600) {
return true;
}
return false
}
Using logic-validator turns it to something like this:
// taken from examples/1/validators/event.validator.js
class EventValidator extends Validator{
constructor(event) {
super(
new AndCondition([
new StartDateIsBeforeEndDate(event.startDate, event.endDate),
new NumberOfInvitationsIsLessThanMaximum(event.numberOfInvetations, maxNumberOfInvitations)
])
);
}
}
The validate
function is derived from the Validator
class, so don't worry about it. Calling the validate from the outside looks like this:
// taken from examples/1/main.js
let validValidator = new EventValidator(validEvent);
console.log(`valid: ${validValidator.validate()}`);
The example above uses costume conditions (such as StartDateIsBeforeEndDate
and NumberOfInvitationsIsLessThanMaximum
).
There is also a way to write the example using generic conditions:
class EventValidator extends Validator{
constructor(event) {
super(
new AndCondition([
new LessThan(event.startDate, event.endDate),
new LessThan(event.numberOfInvetations, maxNumberOfInvitations)
])
);
}
}
Calling require('logic-validator')
returns an object with the following classes as properties:
- Validator.
- Condition.
- AndCondition.
- OrCondition.
You can also create validators with more complex conditions:
class EventValidator extends Validator{
constructor(event) {
super(
new AndCondition([
new StartDateIsBeforeEndDate(event.startDate, event.endDate),
new NumberOfInvitationsIsLessThanMaximum(event.numberOfInvetations, maxNumberOfInvitations),
new OrCondition([
new LessThan(event.startDate, event.endDate),
new LessThan(event.numberOfInvetations, maxNumberOfInvitations)
])
])
);
}
}
The StartDateIsBeforeEndDate
and the NumberOfInvitationsIsLessThanMaximum
are a costume conditions.
Costume conditions help making the validation process readable and reusable.
In order to create a costume condition all you need to do is derive from Condition
class:
//taken from examples/1/conditions/StartDateIsBeforeEndDate.js
class StartDateIsBeforeEndDate extends Condition {
constructor(startDate, endDate){
super();
this.startDate = startDate;
this.endDate = endDate;
}
validate(){
return this.startDate < this.endDate;
}
}
The validate
function is where the validation logic is placed.
For more information and for the full code of the examples used in this file, take a look at the examples/
dir.
This package is a design proposal more than an out of the box solution, so please feel free to fork it, tweak it and twist it.
If you think others can enjoy your contribution, please open a PR.
Enjoy :)