0.3.4 • Published 2 years ago

validozer-monad v0.3.4

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

validozer

TypeScript runtime validator. Hugely inspired typescript implementation of https://github.com/iluwatar/java-design-patterns

Performs a validation on runtime using a monad.

It chains the validation steps to gather all potential failures into one single error, if there is at least one. You can use a variety of predicate combined with this library, create your own, as long at it responds to the following signature (t:T) => boolean on a Validator<T>.

Getting started

npm package

npm i validozer-monad

Usage

const validatedRequest = Validator.of<Request>(request)
    .validate(request => isDefined(request.name), new Error('The name is not defined'))
    .validate(request => isDefined(request.firstname),  new Error('The firstname is not defined'))
    .validate(request => isEmail(request.email),  new Error('The email is not at the right format'))
    .get();

In this example, isDefined and isEmail are coming from a third party called class validator

Motivation

You could ask yourself what is the purpose of this library when you have the library class validator The main problem about this library is that it depends on how you build your object.

class Foo {
    @IsNotEmpty()
    bar: string;
}
const foo : Foo = {
    bar: ''
}

const errors = validate(foo); // Result: []
class Foo {
    @IsNotEmpty()
    bar: string;
}
const foo : Foo = new Foo();
foo.bar = ''

const errors = validate(foo); // Result: [ ValidationError {...} ]

The way to perform it with class-validator is to use the lib class-transformer

class Foo {
    @IsNotEmpty()
    bar: string;
}
const foo : Foo = {
    bar: ''
}
let users = plainToClass(Foo, foo)
const errors = validate(foo); // Result: [ ValidationError {...} ]

That can be really frustrating because missing this step will lead to the validation of the object because it is the new Foo() which triggers the decorators binding.

While the combo class-validator / class-transformer is really good to check objects coming from a JSON.parse() and in the general way, for deserialization of data coming from the network, it is a real pain in other contexts.

This repository brings a way to use the monad and still continue to use the check functions of class-validator, and everything that fulfills the contract of a predicate to build your validation to achieve the contract programmation.