Saltar al contenido principal

Schemas (Standard Schema)

Cada identificador tiene un Standard Schema listo para usar. Standard Schema es la interfaz común que implementan Zod, Valibot, ArkType y otros, y que las librerías de formularios y APIs aceptan directamente. dr-utils la implementa con cero dependencias.

Usa los schemas cuando una librería te pida "un schema". En los demás casos usa los validadores de siempre: no cambian y siguen siendo la opción más simple.

SchemaAceptaSalida (si es válido)
cedulaSchema(options?)cédula, con guiones y espaciosCedula — 11 dígitos
rncSchema(options?)RNC o cédula, con guiones y espaciosRNC — 9 u 11 dígitos
ncfSchema(options?)NCF / e-CF, con espacios alrededorNCF
phoneNumberSchema(options?)cualquier formato común, +1 opcionalPhoneNumber — 10 dígitos
plateSchema(options?)placa, mayúsculas o minúsculasPlate — en mayúsculas
provinciaSchema(options?)nombre de provincia, sin importar tildesProvincia — nombre oficial
municipioSchema(options?)nombre de municipio, sin importar tildesMunicipio — nombre oficial

Opciones

OpciónTipoDescripción
messagestringMensaje de error para entradas inválidas. Por defecto en inglés ('Invalid cedula').

Los schemas validan de forma síncrona y también rechazan valores que no sean string.

Con TanStack Form​

TanStack Form acepta Standard Schemas como validadores de campo:

import { useForm } from '@tanstack/react-form'
import { cedulaSchema, phoneNumberSchema } from 'dr-utils/schemas'

const form = useForm({ defaultValues: { cedula: '', telefono: '' } })

<form.Field
name="cedula"
validators={{ onChange: cedulaSchema({ message: 'Cédula inválida' }) }}
children={(field) => (
<>
<input value={field.state.value} onChange={(e) => field.handleChange(e.target.value)} />
<p>{field.state.meta.errors[0]?.message}</p>
</>
)}
/>

Con cualquier consumidor de Standard Schema​

Cualquier librería que acepte un Standard Schema para un solo valor funciona igual, por ejemplo el input de un procedimiento de tRPC: .input(rncSchema()). También puedes llamar el schema directamente:

import { rncSchema } from 'dr-utils/schemas'

const result = rncSchema()['~standard'].validate('130-72075-4')

if (result.issues) {
console.log(result.issues[0].message) // 'Invalid RNC'
} else {
console.log(result.value) // '130720754'
}

Dentro de objetos de Zod o Valibot​

Zod y Valibot no pueden anidar el schema de otra librería dentro de sus objetos. Usa los validadores con sus funciones de refinamiento; es la misma validación:

import { z } from 'zod'
import { validateCedula, validatePhoneNumber } from 'dr-utils/validators'
import { normalizePhoneNumber } from 'dr-utils/parsers'

const Cliente = z.object({
cedula: z.string().refine(validateCedula, 'Cédula inválida'),
telefono: z
.string()
.refine(validatePhoneNumber, 'Teléfono inválido')
.transform(normalizePhoneNumber), // '(809) 555-1234' → '8095551234'
})
import * as v from 'valibot'
import { validateRNC } from 'dr-utils/validators'

const Empresa = v.object({
rnc: v.pipe(v.string(), v.check(validateRNC, 'RNC inválido')),
})

Tipos​

import { cedulaSchema, type StandardSchemaV1 } from 'dr-utils'

type Output = StandardSchemaV1.InferOutput<ReturnType<typeof cedulaSchema>> // Cedula