O Gerador De CPF O Gerador De CPF

Gerar CPF em Node.js e Express: Módulo e API REST

Este módulo Node.js implementa no servidor a mesma lógica de gerar CPF válido online do navegador, aplicando o algoritmo de módulo 11 para produzir números sob demanda. Exporta funções reutilizáveis para geração e validação, com API Express e CLI prontas para uso.

Módulo

// cpf.js
function generateCPF() {
  const digits = [];
  for (let i = 0; i < 9; i++) {
    digits.push(Math.floor(Math.random() * 10));
  }

  let sum1 = 0;
  for (let i = 0; i < 9; i++) {
    sum1 += digits[i] * (10 - i);
  }
  const r1 = sum1 % 11;
  const d1 = r1 < 2 ? 0 : 11 - r1;
  digits.push(d1);

  let sum2 = 0;
  for (let i = 0; i < 10; i++) {
    sum2 += digits[i] * (11 - i);
  }
  const r2 = sum2 % 11;
  const d2 = r2 < 2 ? 0 : 11 - r2;
  digits.push(d2);

  return digits.join("");
}

function validateCPF(value) {
  const cpf = String(value).replace(/\D/g, "");
  if (cpf.length !== 11) return false;
  if (/^(\d)\1{10}$/.test(cpf)) return false;

  for (let t = 9; t < 11; t++) {
    let sum = 0;
    for (let c = 0; c < t; c++) {
      sum += Number(cpf[c]) * (t + 1 - c);
    }
    const digit = ((10 * sum) % 11) % 10;
    if (Number(cpf[t]) !== digit) return false;
  }

  return true;
}

module.exports = { generateCPF, validateCPF };

Para projetos ESM, substitua a última linha por:

export { generateCPF, validateCPF };

API Express

// server.js
const express = require("express");
const { generateCPF, validateCPF } = require("./cpf");

const app = express();
const PORT = process.env.PORT || 3000;

app.get("/api/cpf/generate", (req, res) => {
  const count = Math.min(Math.max(parseInt(req.query.count, 10) || 1, 1), 100);

  const cpfs = [];
  for (let i = 0; i < count; i++) {
    cpfs.push(generateCPF());
  }

  if (count === 1) {
    return res.json({ cpf: cpfs[0] });
  }

  res.json({ cpfs, count });
});

app.listen(PORT, () => {
  console.log(`Servidor rodando na porta ${PORT}`);
});

Exemplos de requisição:

  • GET /api/cpf/generate — retorna { "cpf": "52998224725" }
  • GET /api/cpf/generate?count=10 — retorna { "cpfs": [...], "count": 10 }

O parâmetro count aceita valores de 1 a 100.

CLI

#!/usr/bin/env node
// generate-cpf.js
const { generateCPF } = require("./cpf");

const count = Math.max(parseInt(process.argv[2], 10) || 1, 1);

for (let i = 0; i < count; i++) {
  console.log(generateCPF());
}

Uso no terminal:

node generate-cpf.js       # gera 1 CPF
node generate-cpf.js 10    # gera 10 CPFs, um por linha

Analise do codigo

O módulo cpf.js exporta duas funções puras sem dependências externas. generateCPF cria 9 dígitos aleatórios com Math.random(), calcula o primeiro verificador multiplicando cada dígito pelo peso decrescente (10 a 2) e aplicando % 11, depois repete com 10 dígitos e pesos de 11 a 2 para o segundo verificador. validateCPF está incluída no mesmo módulo para que consumidores possam confirmar a validade dos CPFs gerados.

A API Express expõe um único endpoint GET /api/cpf/generate que aceita o query parameter count para geração em lote. O valor é limitado entre 1 e 100 para evitar abuso. Quando count é 1 (ou omitido), retorna um objeto simples com o campo cpf; para múltiplos, retorna um array cpfs junto com a contagem.

O script CLI lê a quantidade desejada de process.argv[2], com padrão de 1. Imprime cada CPF em uma linha separada, facilitando o redirecionamento para arquivo (node generate-cpf.js 100 > cpfs.txt) ou uso em pipelines de shell.

Testes

import { describe, it, expect } from "vitest";
import request from "supertest";

describe("generateCPF", () => {
  it("retorna string com 11 dígitos numéricos", () => {
    const cpf = generateCPF();
    expect(cpf).toMatch(/^\d{11}$/);
  });

  it("gera CPF que passa na validação", () => {
    const cpf = generateCPF();
    expect(validateCPF(cpf)).toBe(true);
  });

  it("gera CPFs diferentes entre si", () => {
    const cpfs = new Set();
    for (let i = 0; i < 50; i++) {
      cpfs.add(generateCPF());
    }
    expect(cpfs.size).toBeGreaterThan(1);
  });
});

describe("GET /api/cpf/generate", () => {
  it("retorna JSON com CPF válido", async () => {
    const res = await request(app).get("/api/cpf/generate");
    expect(res.status).toBe(200);
    expect(res.body.cpf).toMatch(/^\d{11}$/);
    expect(validateCPF(res.body.cpf)).toBe(true);
  });

  it("retorna múltiplos CPFs com count", async () => {
    const res = await request(app).get("/api/cpf/generate?count=5");
    expect(res.status).toBe(200);
    expect(res.body.cpfs).toHaveLength(5);
    expect(res.body.count).toBe(5);
    res.body.cpfs.forEach((cpf) => {
      expect(validateCPF(cpf)).toBe(true);
    });
  });
});

Veja também: validar CPF em Node.js e o gerador de CPF online.