Skip to content

Deteccion

Jose Luiz Rodrigues edited this page Sep 10, 2026 · 1 revision

Detección

detect() recibe un valor suelto y trata de decir de qué país y de qué tipo de documento es. Sirve para campos únicos donde el usuario pega lo que tiene sin elegir el tipo antes.

import { detect } from '@zeluizr/palta'

detect('111.444.777-35')
// { country: 'BR', type: 'cpf', valid: true, formatted: '111.444.777-35' }

detect('12.345.678-5')
// { country: 'CL', type: 'rut', valid: true, formatted: '12.345.678-5' }

detect('20-12345678-6')
// { country: 'AR', type: 'cuit', valid: true, formatted: '20-12345678-6' }

detect('holaaa')  // null
detect('')        // null
detect(null)      // null

Qué devuelve

interface DetectResult {
  country: string   // 'BR', 'CL', 'AR', ...
  type: string      // 'cpf', 'rut', 'cuit', ...
  valid: boolean
  formatted: string
}

null significa que no reconoció nada. Un objeto con valid: false significa otra cosa: la forma coincide con un documento conocido, pero el dígito verificador no cierra. Ese caso es útil para dar un mensaje de error específico en vez de un "dato inválido" genérico.

const r = detect(input)

if (!r) {
  // no se parece a ningún documento cubierto
} else if (!r.valid) {
  // parece un r.type de r.country, pero el verificador está mal
} else {
  // r.formatted listo para mostrar
}

Documentos cubiertos

país tipos
Brasil cpf, cnpj
Chile rut
Argentina cuit, dni
Colombia nit, cc
Perú ruc, dni
Uruguay ci
México rfc, curp
Venezuela rif
Ecuador ruc

No es exhaustiva entre los 23 países. Si el documento que te interesa no está en esta tabla, llamá directo al módulo del país.

Cómo resuelve

El orden importa, porque varios documentos comparten largo.

  1. Formatos alfanuméricos primero, que son los menos ambiguos: CURP de 18 caracteres, RFC de 12 o 13, RIF venezolano de 10 con letra inicial, y RUT chileno cuando trae K.
  2. Descarte por letras: si el valor tiene bastantes más letras que dígitos y no matcheó nada de lo anterior, devuelve null.
  3. Documentos numéricos por largo:
dígitos orden de prueba
8 CI uruguaya, DNI peruano, DNI argentino, RUT chileno
9 RUT chileno
10 NIT colombiano, CC colombiana
11 CPF, CUIT, RUC peruano
13 RUC ecuatoriano
14 CNPJ

Dentro de cada largo gana el primero que valida. Si ninguno valida, devuelve el candidato más probable con valid: false — salvo en 13 dígitos, donde devuelve null.

Cuándo no usarla

detect() adivina, y adivinar tiene costo. Si ya sabés el país, llamá al módulo directo: es más rápido, más preciso y no tiene ambigüedad.

// sabés que es Brasil
br.cpf.validate(input)

// no sabés nada del origen
detect(input)

Un caso concreto de ambigüedad: un número de 8 dígitos puede ser CI uruguaya, DNI peruano, DNI argentino o RUT chileno. detect() elige uno; el usuario puede haber querido otro.

Ampliarla

Sumar un documento a detect() es tocar src/detect.ts: importar validate y format del módulo, y agregar el chequeo en la rama del largo correspondiente, cuidando el orden. El resto del flujo está en Contribuir.

Clone this wiki locally