zaperson
Version:
A lib for parsing, formatting, and validating Brazilian phone numbers.
492 lines (490 loc) • 11.5 kB
JavaScript
// src/data/ddd.ts
var dddInfo = [
{
ddd: "11" /* DDD_11 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Regi\xE3o Metropolitana de S\xE3o Paulo/Regi\xE3o Metropolitana de Jundia\xED/Regi\xE3o Geogr\xE1fica Imediata de Bragan\xE7a Paulista"
},
{
ddd: "12" /* DDD_12 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Regi\xE3o Metropolitana do Vale do Para\xEDba e Litoral Norte"
},
{
ddd: "13" /* DDD_13 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Regi\xE3o Metropolitana da Baixada Santista/Vale do Ribeira"
},
{
ddd: "14" /* DDD_14 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Avar\xE9/Bauru/Botucatu/Ja\xFA/Lins/Mar\xEDlia/Ourinhos"
},
{
ddd: "15" /* DDD_15 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Itapetininga/Itapeva/Sorocaba/Tatu\xED"
},
{
ddd: "16" /* DDD_16 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Araraquara/Franca/Jaboticabal/Ribeir\xE3o Preto/S\xE3o Carlos/Sert\xE3ozinho"
},
{
ddd: "17" /* DDD_17 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Barretos/Catanduva/Fernand\xF3polis/Jales/S\xE3o Jos\xE9 do Rio Preto/Votuporanga"
},
{
ddd: "18" /* DDD_18 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Andradina/Ara\xE7atuba/Assis/Birigui/Dracena/Presidente Prudente"
},
{
ddd: "19" /* DDD_19 */,
state: "S\xE3o Paulo",
uf: "SP",
region: "Americana/Campinas/Limeira/Piracicaba/Rio Claro/S\xE3o Jo\xE3o da Boa Vista"
},
{
ddd: "21" /* DDD_21 */,
state: "Rio de Janeiro",
uf: "RJ",
region: "Rio de Janeiro e Regi\xE3o Metropolitana/Teres\xF3polis"
},
{
ddd: "22" /* DDD_22 */,
state: "Rio de Janeiro",
uf: "RJ",
region: "Cabo Frio/Campos dos Goytacazes/Itaperuna/Maca\xE9/Nova Friburgo"
},
{
ddd: "24" /* DDD_24 */,
state: "Rio de Janeiro",
uf: "RJ",
region: "Angra dos Reis/Petr\xF3polis/Volta Redonda/Pira\xED"
},
{
ddd: "27" /* DDD_27 */,
state: "Esp\xEDrito Santo",
uf: "ES",
region: "Vit\xF3ria e Regi\xE3o Metropolitana/Colatina/Linhares/Santa Maria de Jetib\xE1"
},
{
ddd: "28" /* DDD_28 */,
state: "Esp\xEDrito Santo",
uf: "ES",
region: "Cachoeiro de Itapemirim/Castelo/Itapemirim/Marata\xEDzes"
},
{
ddd: "31" /* DDD_31 */,
state: "Minas Gerais",
uf: "MG",
region: "Belo Horizonte e Regi\xE3o Metropolitana/Conselheiro Lafaiete/Ipatinga/Vi\xE7osa"
},
{
ddd: "32" /* DDD_32 */,
state: "Minas Gerais",
uf: "MG",
region: "Barbacena/Juiz de Fora/Muria\xE9/S\xE3o Jo\xE3o del-Rei/Ub\xE1"
},
{
ddd: "33" /* DDD_33 */,
state: "Minas Gerais",
uf: "MG",
region: "Almenara/Caratinga/Governador Valadares/Manhua\xE7u/Te\xF3filo Otoni"
},
{
ddd: "34" /* DDD_34 */,
state: "Minas Gerais",
uf: "MG",
region: "Araguari/Arax\xE1/Patos de Minas/Uberl\xE2ndia/Uberaba"
},
{
ddd: "35" /* DDD_35 */,
state: "Minas Gerais",
uf: "MG",
region: "Alfenas/Guaxup\xE9/Lavras/Po\xE7os de Caldas/Pouso Alegre/Varginha"
},
{
ddd: "37" /* DDD_37 */,
state: "Minas Gerais",
uf: "MG",
region: "Bom Despacho/Divin\xF3polis/Formiga/Ita\xFAna/Par\xE1 de Minas"
},
{
ddd: "38" /* DDD_38 */,
state: "Minas Gerais",
uf: "MG",
region: "Curvelo/Diamantina/Montes Claros/Pirapora/Una\xED"
},
{
ddd: "41" /* DDD_41 */,
state: "Paran\xE1",
uf: "PR",
region: "Curitiba e Regi\xE3o Metropolitana"
},
{
ddd: "42" /* DDD_42 */,
state: "Paran\xE1",
uf: "PR",
region: "Ponta Grossa/Guarapuava"
},
{
ddd: "43" /* DDD_43 */,
state: "Paran\xE1",
uf: "PR",
region: "Apucarana/Londrina"
},
{
ddd: "44" /* DDD_44 */,
state: "Paran\xE1",
uf: "PR",
region: "Maring\xE1/Campo Mour\xE3o/Umuarama"
},
{
ddd: "45" /* DDD_45 */,
state: "Paran\xE1",
uf: "PR",
region: "Cascavel/Foz do Igua\xE7u"
},
{
ddd: "46" /* DDD_46 */,
state: "Paran\xE1",
uf: "PR",
region: "Francisco Beltr\xE3o/Pato Branco"
},
{
ddd: "47" /* DDD_47 */,
state: "Santa Catarina",
uf: "SC",
region: "Balne\xE1rio Cambori\xFA/Blumenau/Itaja\xED/Joinville"
},
{
ddd: "48" /* DDD_48 */,
state: "Santa Catarina",
uf: "SC",
region: "Florian\xF3polis e Regi\xE3o Metropolitana/Crici\xFAma"
},
{
ddd: "49" /* DDD_49 */,
state: "Santa Catarina",
uf: "SC",
region: "Ca\xE7ador/Chapec\xF3/Conc\xF3rdia/Lages"
},
{
ddd: "51" /* DDD_51 */,
state: "Rio Grande do Sul",
uf: "RS",
region: "Porto Alegre e Regi\xE3o Metropolitana/Santa Cruz do Sul/Litoral Norte"
},
{
ddd: "53" /* DDD_53 */,
state: "Rio Grande do Sul",
uf: "RS",
region: "Pelotas/Rio Grande"
},
{
ddd: "54" /* DDD_54 */,
state: "Rio Grande do Sul",
uf: "RS",
region: "Caxias do Sul/Passo Fundo"
},
{
ddd: "55" /* DDD_55 */,
state: "Rio Grande do Sul",
uf: "RS",
region: "Santa Maria/Santana do Livramento/Santo \xC2ngelo/Uruguaiana"
},
{
ddd: "61" /* DDD_61 */,
state: "Distrito Federal/Goi\xE1s",
uf: "DF",
region: "Abrang\xEAncia em todo o Distrito Federal e alguns munic\xEDpios da Regi\xE3o Integrada de Desenvolvimento do Distrito Federal e Entorno"
},
{
ddd: "62" /* DDD_62 */,
state: "Goi\xE1s",
uf: "GO",
region: "Goi\xE2nia e Regi\xE3o Metropolitana/An\xE1polis/Niquel\xE2ndia/Porangatu"
},
{
ddd: "63" /* DDD_63 */,
state: "Tocantins",
uf: "TO",
region: "Todo estado"
},
{
ddd: "64" /* DDD_64 */,
state: "Goi\xE1s",
uf: "GO",
region: "Caldas Novas/Catal\xE3o/Itumbiara/Rio Verde"
},
{
ddd: "65" /* DDD_65 */,
state: "Mato Grosso",
uf: "MT",
region: "Cuiab\xE1 e Regi\xE3o Metropolitana"
},
{
ddd: "66" /* DDD_66 */,
state: "Mato Grosso",
uf: "MT",
region: "Rondon\xF3polis/Sinop"
},
{
ddd: "67" /* DDD_67 */,
state: "Mato Grosso do Sul",
uf: "MS",
region: "Todo estado"
},
{
ddd: "68" /* DDD_68 */,
state: "Acre",
uf: "AC",
region: "Todo estado"
},
{
ddd: "69" /* DDD_69 */,
state: "Rond\xF4nia",
uf: "RO",
region: "Todo estado"
},
{
ddd: "71" /* DDD_71 */,
state: "Bahia",
uf: "BA",
region: "Salvador e Regi\xE3o Metropolitana"
},
{
ddd: "73" /* DDD_73 */,
state: "Bahia",
uf: "BA",
region: "Eun\xE1polis/Ilh\xE9us/Porto Seguro/Teixeira de Freitas"
},
{
ddd: "74" /* DDD_74 */,
state: "Bahia",
uf: "BA",
region: "Irec\xEA/Jacobina/Juazeiro/Xique-Xique"
},
{
ddd: "75" /* DDD_75 */,
state: "Bahia",
uf: "BA",
region: "Alagoinhas/Feira de Santana/Paulo Afonso/Valen\xE7a"
},
{
ddd: "77" /* DDD_77 */,
state: "Bahia",
uf: "BA",
region: "Barreiras/Bom Jesus da Lapa/Guanambi/Vit\xF3ria da Conquista"
},
{
ddd: "79" /* DDD_79 */,
state: "Sergipe",
uf: "SE",
region: "Todo estado"
},
{
ddd: "81" /* DDD_81 */,
state: "Pernambuco",
uf: "PE",
region: "Recife e Regi\xE3o Metropolitana/Caruaru"
},
{
ddd: "82" /* DDD_82 */,
state: "Alagoas",
uf: "AL",
region: "Todo estado"
},
{
ddd: "83" /* DDD_83 */,
state: "Para\xEDba",
uf: "PB",
region: "Todo estado"
},
{
ddd: "84" /* DDD_84 */,
state: "Rio Grande do Norte",
uf: "RN",
region: "Todo estado"
},
{
ddd: "85" /* DDD_85 */,
state: "Cear\xE1",
uf: "CE",
region: "Fortaleza e Regi\xE3o Metropolitana"
},
{
ddd: "86" /* DDD_86 */,
state: "Piau\xED",
uf: "PI",
region: "Teresina e alguns munic\xEDpios da Regi\xE3o Integrada de Desenvolvimento da Grande Teresina/Parna\xEDba"
},
{
ddd: "87" /* DDD_87 */,
state: "Pernambuco",
uf: "PE",
region: "Garanhuns/Petrolina/Salgueiro/Serra Talhada"
},
{
ddd: "88" /* DDD_88 */,
state: "Cear\xE1",
uf: "CE",
region: "Juazeiro do Norte/Sobral"
},
{
ddd: "89" /* DDD_89 */,
state: "Piau\xED",
uf: "PI",
region: "Picos/Floriano"
},
{
ddd: "91" /* DDD_91 */,
state: "Par\xE1",
uf: "PA",
region: "Bel\xE9m e Regi\xE3o Metropolitana"
},
{
ddd: "92" /* DDD_92 */,
state: "Amazonas",
uf: "AM",
region: "Manaus e Regi\xE3o Metropolitana/Parintins"
},
{
ddd: "93" /* DDD_93 */,
state: "Par\xE1",
uf: "PA",
region: "Santar\xE9m/Altamira"
},
{
ddd: "94" /* DDD_94 */,
state: "Par\xE1",
uf: "PA",
region: "Marab\xE1"
},
{
ddd: "95" /* DDD_95 */,
state: "Roraima",
uf: "RR",
region: "Todo estado"
},
{
ddd: "96" /* DDD_96 */,
state: "Amap\xE1",
uf: "AP",
region: "Todo estado"
},
{
ddd: "97" /* DDD_97 */,
state: "Amazonas",
uf: "AM",
region: "Abrang\xEAncia no interior do estado"
},
{
ddd: "98" /* DDD_98 */,
state: "Maranh\xE3o",
uf: "MA",
region: "S\xE3o Lu\xEDs e Regi\xE3o Metropolitana"
},
{
ddd: "99" /* DDD_99 */,
state: "Maranh\xE3o",
uf: "MA",
region: "Caxias/Cod\xF3/Imperatriz"
}
];
// src/index.ts
var Zaperson = class {
constructor(config) {
this.config = config;
this.dddDatabase = dddInfo;
}
parse(number) {
var _a;
const strigNumber = number.toString();
let parsedNumber = strigNumber.replace(/\D/g, "");
let hasDDI = false;
const numberLen = parsedNumber.length;
if (!numberLen) {
throw new Error("Number string is empty");
}
if (numberLen < 10) {
throw new Error(
"Number string length is invalid. DDD may be not include"
);
}
if (numberLen > 13) {
throw new Error("Number string length is too long");
}
if ((numberLen === 12 || numberLen === 13) && !parsedNumber.startsWith("55")) {
throw new Error("Number string is not a Brazilian number");
}
if ((numberLen === 12 || numberLen === 13) && parsedNumber.startsWith("55")) {
hasDDI = true;
}
if (!hasDDI) {
parsedNumber = `55${parsedNumber}`;
}
if ((_a = this.config) == null ? void 0 : _a.validateDDD) {
const ddd = this.getDDD(parsedNumber);
if (!this.isValidDDD(ddd)) {
throw new Error("Invalid DDD code");
}
}
return parsedNumber;
}
humanize(number) {
const parsedNumber = this.parse(number);
const ddi = this.getDDI(parsedNumber);
const ddd = this.getDDD(parsedNumber);
const prefix = parsedNumber.slice(4, 9);
const lineNumber = parsedNumber.slice(9);
return `+${ddi} ${ddd} ${prefix}-${lineNumber}`;
}
info(number) {
const parsedNumber = this.parse(number);
const ddd = this.getDDD(parsedNumber);
const dddData = this.dddDatabase.find((dddInfo2) => dddInfo2.ddd === ddd);
if (!dddData) {
throw new Error("DDD not found in database");
}
return {
number: parsedNumber,
formattedNumber: this.humanize(parsedNumber),
ddi: this.getDDI(parsedNumber),
ddd: dddData.ddd,
location: dddData
};
}
validate(number) {
try {
this.parse(number);
return true;
} catch (error) {
return false;
}
}
isValidDDD(ddd) {
const dddData = this.dddDatabase.find((dddInfo2) => dddInfo2.ddd === ddd);
return !!dddData;
}
getDDD(number) {
return number.slice(2, 4);
}
getDDI(number) {
return number.slice(0, 2);
}
};
export {
Zaperson
};