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ário | SDK fakeforge-br | Algoritmo local |
|---|---|---|
| Só placa simples | ✅ | ✅ |
| Validador embutido (retorna tipo) | ✅ | ✅ |
| 100% offline | ❌ | ✅ |
| Bulk 10k+ | ✅ 1 chamada | ⚠️ loop |
| Custo | Free 50/dia | R$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.