Skip to content

Latest commit

 

History

History
88 lines (59 loc) · 1.8 KB

README.md

File metadata and controls

88 lines (59 loc) · 1.8 KB

discriminate

A data validator with an idiomatic API

Example:

Creating Discriminators:

var discriminate = require('discriminate');
var { Required, Custom, Maybe, And, Or } = discriminate;

const Email = discriminate(discriminate.And(
    String,
    Custom(([path, name], value, callback) =>
        value.match(/^.+@[^.].*?\..*[^.]$/) ? callbacl(null, value) : callback(`${path[1]} must be an email`)
    )
));

const User = discriminate({
    firstName: String,
    surname: String,
    email: Maybe(Email),
    nickname: Maybe(String, 'Buddy'),
    age: Number
});

function greetUser(maybeNotAValidUser){
    User(maybeNotAValidUser, function(error, user){
        if(error){
            /*
                error will look like:
                {
                    message: ...
                    errors: [
                        { path: 'path.in.schema', message: ... }
                    ]
                }
            */
            return;
        }

        // user will be valid at this point.
    });
}

Available base types (BaseType):

value type constructors are valid, eg:

String, Number, Boolean

Extra types provided by discriminate:

Maybe(Type, default<optional>)

Ensure a value is either Type or null/undefined

And(Types...)

Ensures a value is every one of Types.

Or(Types...)

Ensures a value is any one of Types.

Custom(fn<value>)

Ensures fn(value) does not throw.

The value returned from fn will be the result of the type instansiation.

Required(Type)

Prints a nicer error if a value is null or undefined, eg: 'age is required.'

Any()

Allow any value

List(Type, minLength<optional>, maxLength<optional>)

Ensures a value is an array where each item matches Type.

Cast(BaseType)

Casts a value to a BaseType.