Node.js · TypeScript · SDK

Gerador de Placa Mercosul em Node.js

SDK fakeforge-br gera placa Mercosul (LLLNLNN) e formato antigo (LLL-NNNN) válidos pela Resolução CONTRAN 729/2018. TypeScript nativo, com validação de schema pronta pra Zod.

TL;DR

npm install fakeforge-br

import { FakeForge } from "fakeforge-br"
const placas = await new FakeForge().placa(100)

Rota 1: SDK oficial fakeforge-br

import { FakeForge } from "fakeforge-br"

const ff = new FakeForge()

// 100 placas Mercosul (LLLNLNN)
const placas = await ff.placa(100)
console.log(placas[0]) // "ABC1D23"

// 50 placas no formato antigo (LLL-NNNN)
const placasAntigas = await ff.placaAntiga(50)
console.log(placasAntigas[0]) // "ABC-1234"

Rota 2: algoritmo local com regex (offline)

// placa.ts - algoritmo local, offline
const LETRAS_VALIDAS = "ABCDEFGHJKLMNPRSTUVWXYZ".split("") // sem I, O, Q

const REGEX_MERCOSUL = /^[A-HJ-NP-Z]{3}[0-9][A-HJ-NP-Z][0-9]{2}$/
const REGEX_ANTIGA = /^[A-HJ-NP-Z]{3}[0-9]{4}$/

function letraAleatoria(): string {
  return LETRAS_VALIDAS[Math.floor(Math.random() * LETRAS_VALIDAS.length)]
}

export function gerarPlacaMercosul(): string {
  const letras = letraAleatoria() + letraAleatoria() + letraAleatoria()
  const d1 = Math.floor(Math.random() * 10)
  const letraMeio = letraAleatoria()
  const d2 = Math.floor(Math.random() * 10)
  const d3 = Math.floor(Math.random() * 10)
  return `${letras}${d1}${letraMeio}${d2}${d3}`
}

export function gerarPlacaAntiga(): string {
  const letras = letraAleatoria() + letraAleatoria() + letraAleatoria()
  const numeros = Array.from({ length: 4 }, () => Math.floor(Math.random() * 10)).join("")
  return `${letras}-${numeros}`
}

export function validarPlaca(placa: string): "mercosul" | "antiga" | null {
  const limpa = placa.replace("-", "")
  if (REGEX_MERCOSUL.test(limpa)) return "mercosul"
  if (REGEX_ANTIGA.test(limpa)) return "antiga"
  return null
}

Uso com Zod (validação de schema)

Comum em formulários de seguradoras e locadoras: validar a placa antes de aceitar o cadastro, cobrindo os dois formatos.

// placa.schema.ts
import { z } from "zod"

const REGEX_PLACA = /^[A-HJ-NP-Z]{3}([0-9]{4}|[0-9][A-HJ-NP-Z][0-9]{2})$/

export const placaSchema = z
  .string()
  .transform(p => p.replace("-", "").toUpperCase())
  .refine(p => REGEX_PLACA.test(p), { message: "Placa inválida" })

// teste rápido com placas do FakeForge
import { FakeForge } from "fakeforge-br"

const ff = new FakeForge()
const placas = await ff.placa(20)

placas.forEach(p => {
  const resultado = placaSchema.safeParse(p)
  console.log(p, resultado.success)
})

Comparação: qual escolher

CenárioSDK fakeforge-brAlgoritmo local
Só placa simples✅✅
Validador embutido (retorna tipo)✅✅
100% offline❌✅
Bulk 10k+✅ 1 chamada⚠️ loop
CustoFree 50/diaR$0

Perguntas frequentes

Como gerar placa Mercosul válida em Node.js?+

Use new FakeForge().placa(n) do SDK fakeforge-br, ou monte o regex local em TypeScript combinando 3 letras (sem I, O, Q) + dígito + letra + 2 dígitos.

Como validar placa com Zod em Node.js?+

Crie um schema z.string().refine() usando a regex que aceita os dois formatos: /^[A-HJ-NP-Z]{3}([0-9]{4}|[0-9][A-HJ-NP-Z][0-9]{2})$/.

O SDK gera placa antiga também?+

Sim. Use ff.placaAntiga(n) pra formato legado (LLL-NNNN), separado do ff.placa(n) que gera Mercosul.

Por que a regex usa [A-HJ-NP-Z] em vez de [A-Z]?+

Porque exclui I, O e Q nativamente no range, evitando checagem extra. É a mesma regra visual do DENATRAN pra placas.

Próximos passos