nestjs-custom-class-validators
Version:
This package contains a few custom validator I have found to be repetitive, So I made templates that handles both class-validator checks and Swagger configuration
100 lines (84 loc) • 2.48 kB
text/typescript
import {
ApiProperty,
ApiPropertyOptional,
ApiPropertyOptions,
} from "@nestjs/swagger";
import {
IsArray,
IsBoolean,
IsEnum,
IsNotEmpty,
IsNumber,
IsString,
IsUUID,
} from "class-validator";
import { ICustomSwaggerOptions } from "../dto/customValidatorOptions.dto";
const each = true;
export const notEmptyFn = (customKeys: string, isArray?: boolean) =>
IsNotEmpty({
message: `${customKeys}: Must not be empty`,
...(isArray && { each: true }),
});
export const isStringFn = (customKeys: string, isArray = false) =>
IsString({
message: `${customKeys}: Must be a string`,
...(isArray && { each }),
});
export const isEnumFn = (
customKey: string,
validEnum: object,
isArray = false
) => {
const message = `
${customKey}: Must be ${
isArray ? "a list containing" : "either"
} ${Object.values(validEnum).join(" or ")}`;
return IsEnum(validEnum, {
message,
...(isArray && { each: true }),
});
};
export const isBooleanFn = (customKeys: any) =>
IsBoolean({ message: `${customKeys}: Must be true or false` });
export const isNumberFn = (customKeys: any, isArray: any) =>
IsNumber(
{},
{
message: `${customKeys}: Must be a ${
isArray ? "number array" : "number"
}`,
...(isArray && { each }),
}
);
export const isUUIDFn = (customKey: string, isArray: boolean) =>
IsUUID("all", {
message: `${customKey}: Must be ${
isArray ? "an array of valid UUIDs" : "a valid UUID"
}`,
...(isArray && { each }),
});
export const isArrayFn = (customKey: string) =>
IsArray({ message: `${customKey}: Must be array` });
export const swaggerProp = (details: ICustomSwaggerOptions) => {
const { description, validEnum, optional, isArray, type, format } = details;
let defaultValue = details.defaultValue;
if (typeof defaultValue == "string") {
defaultValue = defaultValue.trim();
}
const types = {
boolean: Boolean,
string: String,
number: Number,
array: Array,
media: "string",
};
const options: ApiPropertyOptions = {
description,
...(format && { format }),
...(type && { type: types[type] }),
...(isArray && { isArray }),
...(validEnum && { enum: validEnum }),
...(defaultValue && { default: defaultValue }),
};
return optional ? ApiPropertyOptional(options) : ApiProperty(options);
};