yup-decorator

Decorators for yup

Usage no npm install needed!

<script type="module">
  import yupDecorator from 'https://cdn.skypack.dev/yup-decorator';
</script>

README

Build Status codecov

Yup Decorators

Added TypeScript decorators support for yup

Usage

  • Named schema
import { a, is, namedSchema, getNamedSchema } from 'yup-decorator';

@namedSchema('user')
class User {
    constructor({ email, age }) {
        this.email = email;
        this.age = age;
    }
    @is(a.string().email('Not a valid email'))
    email: string;

    @is(a.number().lessThan(80).moreThan(10))
    age: number;
}

// you can get the yup schema with
const userSchema = getNamedSchema('user');
  • Unnamed schema
import { schema, getSchemaByType } from 'yup-decorator';

@schema()
class User {
    ...
}

// you can get the yup schema with
const userSchema = getSchemaByType(User);
  • Nested validation

import { is, a, an, nested, schema } from 'yup-decorator';

@schema(an.object().required())
export class NestedChildModel {
    @is(a.string().uppercase())
    uppercase: string;
}

@schema()
export class NestedModel {
    @is(
        an
            .array()
            .of(a.number())
            .min(2)
            .max(3)
    )
    array: number[];

    @nested()
    child: NestedChildModel;
}
  • Validate:
import { validate } from 'yup-decorator';

const user = new User({ email: 'vdtn359', age: 23 });

validate({ object: user, options: {
    strict: true,
    abortEarly: false,
}}).then(err => {
    // err.name; // => 'ValidationError'
    // err.errors; // => ['Not a valid email']
});

// you can also pass in the schema name as a string or a constructor
validate({ object: user, schemaName: 'user' });
validate({ object: user, schemaName: User });

The sync version is validateSync

  • Check if object is valid or not
import { isValid } from 'yup-decorator';
isValid({ object: user }).then(isValid => console.log(isValid));

The sync version is isValidSync

  • Validate property at path
import { validateAt } from 'yup-decorator';
validateAt({ object: user, path: 'email' }).then(e => console.error(e));

The sync version is validateSyncAt

  • Cast object.

This will coerce the property's value according to its type

import { cast } from 'yup-decorator';
const user = new User({ email: 'vdtn359', age: '18' });
const result = cast({ object: user });
result // {email: 'vdtn359@gmail.com', age: 18 }

The sync version is isValidSync

API usage

The API documentation is available at http://luxuriant-sneeze.surge.sh/