1.2.2 • Published 6 months ago

@ts-lab/object-validator v1.2.2

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

Object validator for typescript

npm package Downloads Issues Code Coverage

A very lightweight library to create reusable configurations to validate objects in typescript.

Installation

npm install @ts-lab/object-validator

Usage

Given this interface:

export interface UserFormOutput {
  name: string;
  age: number;
  hobbies?: string[];
}

With this data:

const formOutputMock: UserFormOutput = {
  name: 'John',
  age: 20,
}
const formOutputMock2: UserFormOutput = {
  name: 'John',
  age: 70,
  hobbies: ['football', 'basketball'],
}

We firstly create 'ObjectValidator' instance specifing the type.

const formOutputValidator = new ObjectValidator<UserFormOutput>()

Creating synchronous validations

Then we can add validations for each property of the object.

import { ObjectValidator } from '@ts-lab/object-validator';

const formOutputValidator = new ObjectValidator<UserFormOutput>()
.addValidationRule('name', value => value.includes('John'))
.addValidationRule('age', value => value > 18)
.addValidationRule('age', value => value < 65)

// NOTE -----------------
// if the property does not exist on the object, an error will be thrown when compiling
.addValidationRule('fakeName', value => value.includes('John')) // Error: Property fakeName does not exist on object
// if the expected type (string) does not match the type of the property (number), an error will be thrown when compiling
.addValidationRule('age', value => value.includes('John')) // Error: Property age is not of type string
}

Then the data can be validated with that configuration.

  const formOutputValidator = new ObjectValidator<UserFormOutput>()
.addValidationRule('name', value => value.includes('John'))
.addValidationRule('age', value => value > 18)
.addValidationRule('age', value => value < 65)

formInputValidator.validate(formOutputMock); // true
formInputValidator.validate(formOutputMock2); // false

Creating asynchronous validations

The library also supports asynchronous validations with promises.

const asyncCall = of(mockData)
.pipe(
  map(data => data.age > 18),
  delay(1000)
)

const formOutputValidator = new ObjectValidator<UserFormOutput>()
.addValidationRule('name', value => value.includes('John'))
.addValidationRule('age', value => value > 18)
.addValidationRule('age', value => value < 65)
.addAsyncValidationRule('hobbies', value => lastValueFrom(asyncCall))

In order to validate asyncronous validations, the validateAsync method must be used which return a promise.

  isValid = await formInputValidator.validateAsync(formOutputMock); // true

Validations removal

A validation for a property can also be removed.

  const formOutputValidator = new ObjectValidator<UserFormOutput>()
.addValidationRule('name', value => value.includes('John'))
.addValidationRule('age', value => value > 18)

formInputValidator.removeValidationRule('name');

Configuration cloning

In order to create more than 1 validation configurations with small adjustments there is a method to clone the actual configuration.

  const validatorForLessAge = new ObjectValidator<UserFormOutput>()
.addValidationRule('name', value => value.includes('John'))
.addValidationRule('age', value => value > 18)

const validatorForMoreAge = validatorForLessAge.clone()
.addValidationRule('age', value => value < 65)

The "validatorForMoreAge" configuration will have the same rules as "validatorForLessAge" plus the new rule for the "age" property.