UNPKG

@napunda/pix-key-ts

Version:

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

119 lines (118 loc) 3.64 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.format = exports.normalize = exports.validate = exports.PixKeyType = void 0; const js_brasil_1 = require("js-brasil"); const uuid_validate_1 = __importDefault(require("uuid-validate")); const mobile_1 = require("libphonenumber-js/mobile"); const email_validator_1 = require("email-validator"); var PixKeyType; (function (PixKeyType) { PixKeyType["CPF"] = "cpf"; PixKeyType["CNPJ"] = "cnpj"; PixKeyType["RANDOM"] = "random"; PixKeyType["EMAIL"] = "email"; PixKeyType["PHONE"] = "phone"; })(PixKeyType || (exports.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 (js_brasil_1.validateBr.cpf(pixKey)) { keyTypes.push(PIX_KEY_CPF); } if (js_brasil_1.validateBr.cnpj(pixKey)) { keyTypes.push(PIX_KEY_CNPJ); } if ((0, uuid_validate_1.default)(pixKey)) { keyTypes.push(PIX_KEY_RANDOM); } if ((0, mobile_1.isValidPhoneNumber)(pixKey, "BR")) { keyTypes.push(PIX_KEY_PHONE); } if ((0, email_validator_1.validate)(pixKey)) { keyTypes.push(PIX_KEY_EMAIL); } return keyTypes; }; exports.validate = validate; 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 (0, mobile_1.parsePhoneNumber)(pixKey, "BR").number; } catch { return null; } default: return null; } }; exports.normalize = normalize; 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 js_brasil_1.maskBr.cpf(normalized); case PIX_KEY_CNPJ: return js_brasil_1.maskBr.cnpj(normalized); case PIX_KEY_RANDOM: case PIX_KEY_EMAIL: return normalized; case PIX_KEY_PHONE: const phoneNumber = (0, mobile_1.parsePhoneNumber)(normalized, "BR"); return phoneNumber.country === "BR" ? phoneNumber.formatNational() : phoneNumber.formatInternational(); default: return null; } } catch { return null; } }; exports.format = format;