@haorama/nestjs-fv
TypeScript icon, indicating that this package has built-in type declarations

0.4.0 • Public • Published

nestjs-fv

Fastest validator for nestjs

Features

  • Class Validation (similar to class-validator)
  • built-in validation pipe

Installation

npm install @haorama/nestjs-fv

or

yarn add @haorama/nestjs-fv

Usage

Create your class and put some validation decorators on the properties you want to validate:

import { IsString, IsNumber, IsEmail } from "@haorama/nestjs-fv"

export class CreateUserDTO {
  @IsString()
  name: string

  @IsEmail()
  email: string;

  @IsNumber()
  age: number;
}

and somewhere in your controller

import { ValidationPipe } from "@haorama/nestjs-fv";
import { CreateUserDTO } from "./create-user.dto";
import { Controller, UsePipes, Post, Body } from "@nestjs/common";

@Controller("users")
@UsePipes(ValidationPipe)
export class UserController {
  @Post()
  async create(@Body() data: CreateUserDTO) {
    return data;
  }
}

Notice that you'll received unhandled exceptions, next step is to create exception filter to sends an appropriate user-friendly response.

Also noted that validation pipe by default add $$strict = "remove" if there is no $$strict prop defined in your class schema. you can overwrite or use your own validation pipe to modify the behavior.

import { ValidationError } from "@haorama/nestjs-fv";
import { ArgumentsHost, Catch, ExceptionFilter } from "@nestjs/common";
import { Response } from "express"; // change this if you're using fastify

@Catch(ValidationError)
export class ValidationExceptionFilter
  implements ExceptionFilter<ValidationError>
{
  catch(exception: ValidationError, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const res = ctx.getResponse<Response>();

    const errors = exception.errors.map((error) => ({
      field: error.field,
      message: error.message,
    }));

    return res.status(422).json({
      message: "Unprocessable Entity",
      statusCode: 422,
      errors,
    });
  }
}

and add exception filters into our UserController:

import { ValidationPipe } from "@haorama/nestjs-fv";
import { CreateUserDTO } from "./create-user.dto";
import { ValidationExceptionFilter } from "./validation-exception.filter";
import { Controller, UsePipes, Post, Body, UseFilters } from "@nestjs/common";

@Controller("users")
@UsePipes(ValidationPipe)
@UseFilters(ValidationExceptionFilter)
export class UserController {
  @Post()
  async create(@Body() data: CreateUserDTO) {
    return data;
  }
}

@IsArray

This is an array validator.

import { IsArray } from "@haorama/nestjs-fv";

export class CreateUserDTO {
  @IsArray({ items: "string" })
  roles: string[];

  // OR
  @IsArray({ items: { type: "string", enum: ["editor", "viewer"]} })
  roles: string[];
}

@IsBoolean

This is an boolean validator, by default value will be converted to boolean (1,0, on, off, "true", "false")

import { IsBoolean } from "@haorama/nestjs-fv";

export class CreateUserDTO {
  @IsBoolean()
  subscribed: boolean;
}

@IsDate

This is an date validator, by default value will be convert to Date

import { IsDate } from "@haorama/nestjs-fv";

export class CreatePostDTO {
  @IsDate()
  created: Date;
}

@IsEmail

This is an email validator

import { IsEmail } from "@haorama/nestjs-fv";

export class CreateUserDTO {
  @IsEmail()
  email: string;
}

@IsEqual

This is an equal validator.

import { IsString, IsEqual } from "@haorama/nestjs-fv";

export class CreateUserDTO {
  @IsString()
  password: string;

  @IsEqual("password")
  confirm_password: string;

  @IsEqual({ value: true, strict: true }) // this also worked
  agreeTerms: boolean;
}

@IsNumber

This is an number validator, by default value will be converted to number.

import { IsNumber } from "@haoarama/nestjs-fv";

export class CreateUserDTO {
  @IsNumber()
  age: number;
}

@IsObject

This is an object validator

import { IsObject } from "@haorama/nestjs-fv";

export class CreateUserDTO {
  @IsObject({
    strict: "remove", //true, false, remove
    props: {
      street: "string", //string short-hand definition
      city: { type: "string" },
      zip: { type: "number" }
    }
  })
  address: Record<string, any>; //or you can replace with class or interface ( because we dont support nested schema yet)
}

@IsString

This is an string validator.

import { IsString } from "@haorama/nestjs-fv";
export class CreateUserDTO {
  @IsString({convert: false, empty: true})
  name: string;
}

@IsUrl

This is an url validator

import { IsUrl } from "@haorama/nestjs-fv";

export class CreateProfileDTO {
  @IsUrl()
  github_url: string;
}

Unsupported Rule

For now we dont add all rules from fastest-validator, but you can still use it by using IsRule decorator:

import {IsRule, IsString} from "@haorama/nestjs-fv";

export class LoginDTO {
  @IsString({ min: 8 })
  password: string;

  @IsRule({ type: "equal", field: "password" })
  password_confirmation: string;
}

Error / Validation Messages

by default we overwrite some of the fastest-validator default messages. removing 'field' inside field placeholder. you can check the overwrite messages here https://github.com/haorama/nestjs-fv/blob/main/src/validator.ts

TODO

  • Add more decorators provided by fastest-validator
  • Support Nested Schema
  • Unit and e2e testing?

Package Sidebar

Install

npm i @haorama/nestjs-fv

Weekly Downloads

0

Version

0.4.0

License

MIT

Unpacked Size

28.3 kB

Total Files

53

Last publish

Collaborators

  • mlazuardy