@napunda/pix-key-ts
Version:
Identify, validate, format and normalize a Pix key type from a string
119 lines (118 loc) • 3.64 kB
JavaScript
;
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;