UNPKG

@napunda/pix-key-ts

Version:

Identify, validate, format and normalize a Pix key type from a string

111 lines (110 loc) 3.17 kB
import { validateBr, maskBr } from "js-brasil"; import uuidValidator from "uuid-validate"; import { parsePhoneNumber, isValidPhoneNumber } from "libphonenumber-js/mobile"; import { validate as emailValidator } from "email-validator"; export var PixKeyType; (function (PixKeyType) { PixKeyType["CPF"] = "cpf"; PixKeyType["CNPJ"] = "cnpj"; PixKeyType["RANDOM"] = "random"; PixKeyType["EMAIL"] = "email"; PixKeyType["PHONE"] = "phone"; })(PixKeyType || (PixKeyType = {})); const PIX_KEY_CPF = PixKeyType.CPF; const PIX_KEY_CNPJ = PixKeyType.CNPJ; const PIX_KEY_RANDOM = PixKeyType.RANDOM; const PIX_KEY_EMAIL = PixKeyType.EMAIL; const PIX_KEY_PHONE = PixKeyType.PHONE; const validate = (pixKey) => { if (!pixKey || typeof pixKey !== "string") { return []; } const keyTypes = []; pixKey = pixKey.trim(); if (validateBr.cpf(pixKey)) { keyTypes.push(PIX_KEY_CPF); } if (validateBr.cnpj(pixKey)) { keyTypes.push(PIX_KEY_CNPJ); } if (uuidValidator(pixKey)) { keyTypes.push(PIX_KEY_RANDOM); } if (isValidPhoneNumber(pixKey, "BR")) { keyTypes.push(PIX_KEY_PHONE); } if (emailValidator(pixKey)) { keyTypes.push(PIX_KEY_EMAIL); } return keyTypes; }; const normalize = (pixKey, as) => { if (!pixKey || typeof pixKey !== "string") { return null; } pixKey = pixKey.trim(); const validTypes = validate(pixKey); if (validTypes.length === 0) { return null; } let useType; if (as && validTypes.includes(as)) { useType = as; } else if (validTypes.length === 1) { useType = validTypes[0]; } else { return null; } switch (useType) { case PIX_KEY_CPF: case PIX_KEY_CNPJ: return pixKey.replace(/[^0-9]/g, ""); case PIX_KEY_RANDOM: case PIX_KEY_EMAIL: return pixKey; case PIX_KEY_PHONE: try { return parsePhoneNumber(pixKey, "BR").number; } catch { return null; } default: return null; } }; const format = (pixKey, as) => { const normalized = normalize(pixKey, as); if (!normalized) { return null; } const validTypes = validate(normalized); if (validTypes.length === 0) { return null; } const useType = as && validTypes.includes(as) ? as : validTypes[0]; try { switch (useType) { case PIX_KEY_CPF: return maskBr.cpf(normalized); case PIX_KEY_CNPJ: return maskBr.cnpj(normalized); case PIX_KEY_RANDOM: case PIX_KEY_EMAIL: return normalized; case PIX_KEY_PHONE: const phoneNumber = parsePhoneNumber(normalized, "BR"); return phoneNumber.country === "BR" ? phoneNumber.formatNational() : phoneNumber.formatInternational(); default: return null; } } catch { return null; } }; export { validate, normalize, format };