_comuns/dist-front/zodCustomizados.js

33 lines
1.2 KiB
JavaScript

import z from "zod";
const zPreprocessarNumero = (p) => {
if (typeof p === "number")
return p;
if (typeof p !== "string")
return p;
let p2 = p;
if (p2.includes(",")) {
// ponto de milhar → remove; vírgula decimal → troca por ponto
p2 = p2.replace(/\./g, "").replace(",", ".");
}
// remove tudo que não seja dígito ou ponto decimal
p2 = p2.replace(/[^0-9.]/g, "");
if (p2 == "")
return null;
return Number(p2);
};
/**
* Schema numérico que aceita strings legadas e normaliza para `number`.
*
* O campo **é** um número. O `preprocess` resolve compatibilidade com dados
* antigos onde o frontend enviava strings formatadas (BR ou monetária).
*
* Formatos de entrada aceitos:
* - `10` → number direto
* - `10.1` → ponto decimal
* - `10,1` → vírgula decimal (BR)
* - `1.000,1` → milhar com ponto + vírgula decimal (BR)
* - `R$ 10,01` → prefixo monetário legado
*/
export const zNumero = z.preprocess(zPreprocessarNumero, z.number());
export const zNumeroPositivo = z.preprocess(zPreprocessarNumero, z.number().positive());
export const zNumeroInteiro = z.preprocess(zPreprocessarNumero, z.number().int());