Integração com Class Validator
Crie decorators com isCPF e isCNPJ do validation-br para o class-validator.
O class-validator é usado em NestJS, TypeORM e diversos outros frameworks baseados em decorators. Ele permite criar decorators customizados que reaproveitam uma das funções isX do validation-br, como isCPF ou isCNPJ — inclusive para validar o formato alfanumérico de CNPJ. A mesma técnica usada abaixo para CPF vale, sem alterações, para criar um decorator equivalente de CNPJ alfanumérico. Este guia usa a API de funções soltas da versão 1.x; para projetos novos, veja a integração com class-validator na versão 2.0.
Como validar CPF e CNPJ alfanumérico com class-validator no NestJS
Crie um arquivo iscpf.decorator.ts no seu diretório de validadores, por exemplo src/validators/iscpf.decorator.ts.
// src/validators/iscpf.decorator.ts
import {
registerDecorator,
ValidationOptions,
ValidatorConstraint,
ValidatorConstraintInterface,
ValidationArguments,
} from 'class-validator';
import { isCPF } from 'validation-br';
@ValidatorConstraint({ async: false })
export class IsCpfConstraint implements ValidatorConstraintInterface {
validate(cpf: any, args: ValidationArguments) {
return isCPF(cpf);
}
defaultMessage() {
return 'CPF inválido';
}
}
export function IsCpf(validationOptions?: ValidationOptions) {
return function (object: any, propertyName: string) {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [],
validator: IsCpfConstraint,
});
};
}O mesmo padrão serve para CNPJ. Crie um iscnpj.decorator.ts análogo:
// src/validators/iscnpj.decorator.ts
import {
registerDecorator,
ValidationOptions,
ValidatorConstraint,
ValidatorConstraintInterface,
ValidationArguments,
} from 'class-validator';
import { isCNPJ } from 'validation-br';
@ValidatorConstraint({ async: false })
export class IsCnpjConstraint implements ValidatorConstraintInterface {
validate(cnpj: any, args: ValidationArguments) {
// já valida CNPJ alfanumérico (novo formato, a partir de 2026)
return isCNPJ(cnpj);
}
defaultMessage() {
return 'CNPJ inválido';
}
}
export function IsCnpj(validationOptions?: ValidationOptions) {
return function (object: any, propertyName: string) {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [],
validator: IsCnpjConstraint,
});
};
}Como usar
import { IsCpf } from '../../validators/iscpf.decorator';
import { IsCnpj } from '../../validators/iscnpj.decorator';
export class CreateUserDto {
@IsString()
@IsNotEmpty()
@IsCpf()
cpf: string;
@IsString()
@IsNotEmpty()
@IsCnpj()
cnpj: string;
}
