3.1.0 • Published 9 years ago

vstack-validator v3.1.0

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

vstack-validator

Declarative validator for complex deep structures

Intro

Validator is a simple function that receives a value and returns boolean result of validation. Validator could be asynchronous.

type Validator = (value: any) => boolean | Promise<boolean>

Constraint is a function that receives a value and returns validation metadata. Constraint should be asynchronous.

type Constraint = (value: any, context: any) => Promise<ConstraintResult>

type ConstraintResult = {
  valid: boolean,
  message: string | void,
  children: ConstraintResultMap | ConstraintResultArray | void
}

type ConstraintResultMap = {
  [key: string]: ConstraintResult
}

type ConstraintResultArray = Array<ConstraintResult>

Schema is a declaration of constraints tree.

class Schema {
  type: string;
  check: Constraint;
  children: SchemaChildren;
}

type SchemaChildren = ?({[key: string]: Schema} | Array<Schema> | Schema);

Usage

import {schema} from 'vstack-validator';

var userSchema = schema.type('user', {
  email: {
    notEmpty: schema.constraint(schema.validators.isNotEmpty, 'Email is empty'),
    email: schema.constraint(schema.validators.isEmail, 'Email is not valid'),
  },
  password: schema.optional({
    notEmpty: schema.constraint(schema.validators.isNotEmpty, 'Password is empty'),
    minLength: schema.minLength(3, 'Password is less than 3'),
  }),
});

var itemSchema = schema.type('item', {
  name: {
    notEmpty: schema.constraint(schema.validators.isNotEmpty, 'Name is empty'),
  },
});

var cartSchema = schema.type('cart', {
  user: userSchema,
  items: schema.list(itemSchema),
});

cartSchema
  .check({
    user: {
      email: '',
      password: '',
    },
    items: [
      { name: '' },
    ],
  })
  .then((constraintResult) => console.log(constraintResult));
{ valid: false,
  message: 'Object is not valid',
  children:
   { user:
      { valid: false,
        message: 'Object is not valid',
        children:
         { email:
            { valid: false,
              message: 'Value is not valid',
              children:
               { notEmpty: { valid: false, message: 'Email is empty', children: null },
                 email: { valid: false, message: 'Email is not valid', children: null } } },
           password:
            { valid: false,
              message: 'Value is not valid',
              children:
               { notEmpty: { valid: false, message: 'Password is empty', children: null },
                 minLength:
                  { valid: false,
                    message: 'Password is less than 3',
                    children: null } } } } },
     items:
      { valid: false,
        message: 'Array is not valid',
        children:
         [ { valid: false,
             message: 'Object is not valid',
             children:
              { name:
                 { valid: false,
                   message: 'Value is not valid',
                   children: { notEmpty: { valid: false, message: 'Name is empty', children: null } } } } } ] } } }
3.1.0

9 years ago

3.0.0

9 years ago

2.0.0

9 years ago

1.0.1

10 years ago

1.0.0

10 years ago

0.2.1

11 years ago

0.2.0

11 years ago

0.1.3

11 years ago

0.1.2

11 years ago

0.1.1

11 years ago

0.1.0

11 years ago