Skip to content

Commit

Permalink
Merge pull request #28 from victorfernandesraton/feat/mprove-test-wit…
Browse files Browse the repository at this point in the history
…h-dist-only

fix: skip apicep
  • Loading branch information
victorfernandesraton authored Jul 23, 2023
2 parents 5f46d21 + 81e093a commit 92b576e
Show file tree
Hide file tree
Showing 13 changed files with 5,260 additions and 2,849 deletions.
275 changes: 273 additions & 2 deletions dist/esm.mjs
Original file line number Diff line number Diff line change
@@ -1,2 +1,273 @@
var l=class extends Error{constructor(e){super(e)}};var u=class extends l{constructor(e){super(`invalid params ${e}`)}};var s=class o{constructor(e,t,r=""){this.api=e,this.requester=t,this.baseUrl=r}overrideRequest(e){this.requester=e}static generalParse(e){return e.split("-").join("").split(".").join("")}static validateCep(e){return/[0-9]{8}/.test(e)}async execute(e){let t="";typeof e=="number"?t=e.toString():t=e;let r=o.generalParse(t);if(!o.validateCep(r))throw new u(r);return this.handler(r)}handler(e){throw new Error("Not implemented")}};var i=class{#e;constructor(e){this.#e=e}async execute(e){return await Promise.any(this.#e.map(r=>r.execute(e)))}};var p=class{async execute({url:e,body:t,headers:r,method:n,params:x}){let a=new URLSearchParams(x),y={method:n,body:t,headers:r},g=`${e}?${a.toString()}`;return fetch(g,y)}};var m=class extends s{constructor(e){super("apicep",e,"https://ws.apicep.com/cep.json")}async handler(e){let t=await this.requester.execute({url:this.baseUrl,params:{code:e}}),r=await t.json();if(!t.ok)throw new Error(...r);return{cep:r.code.replace("-",""),city:r.city,state:r.state,neighborhood:r.district??"",street:r.address}}};var h=class extends s{constructor(e){super("brasilAPI",e,"https://brasilapi.com.br/api/cep/v1")}async handler(e){let t=await this.requester.execute({url:`${this.baseUrl}/${e}`}),r=await t.json();if(!t.ok)throw new Error(r);return{...r}}};var c=class extends Error{api="";constructor(e,t){t?super(t):super(),this.api=e}};function v(o){return`<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cli="http://cliente.bean.master.sigep.bsb.correios.com.br/"> <soapenv:Header /> <soapenv:Body> <cli:consultaCEP> <cep>${o}</cep> </cli:consultaCEP> </soapenv:Body></soapenv:Envelope>`}function b(o){try{let e=o.replace(/\r?\n|\r/g,"").match(/<return>(.*)<\/return>/)?.[0]??"";if(e=="")throw new c(`invalid regex got ${o}`,"correios");let r=e.replace("<return>","").replace("</return>","").split(/</).reduce((n,x)=>{let a=x.split(">");return a.length>1&&a[1].trim().length&&(n[a?.[0]]=a[1]),n},{});if(r?.cep===""||!r?.cep)throw new c("not returnd a cep to parse","correios");return{cep:r.cep??"",state:r.uf??"",city:r.cidade??"",street:r.bairro??"",neighborhood:r.end??""}}catch{throw new c("not implement xml","correios")}}var d=class extends s{constructor(e){super("correios",e,"https://apps.correios.com.br")}async handler(e){let t=await this.requester.execute({url:`${this.baseUrl}/SigepMasterJPA/AtendeClienteService/AtendeCliente`,body:v(e),method:"POST",headers:{"Content-Type":"application/xml"}}),r=await t.text();if(!t.ok)throw new Error(r);return b(r)}};var f=class extends s{static baseUrl;constructor(e){super("viacep",e,"https://viacep.com.br")}async handler(e){let t=await this.requester.execute({url:`${this.baseUrl}/ws/${e}/json`,method:"GET"}),r=await t.json();if(!t.ok)throw new Error(r);return{cep:r?.cep?.replace("-","")??"",state:r?.uf??"",city:r?.localidade??"",street:r?.logradouro??"",neighborhood:r?.bairro??""}}};function w({useDefaultProviders:o=!0,custonProviders:e=[],requester:t=new p}){let r=[];return o&&(r=[new f(t),new h(t),new m(t),new d(t)]),e?.length&&(r=[...r,...e]),t&&(r=[...r.map(n=>(n.overrideRequest(t),n))]),new i(r)}var S=o=>w({useDefaultProviders:!0}).execute(o);var Z=s;export{s as CepService,i as Provider,p as RequestWIthFetch,S as cep,w as factory,Z as service};
// src/errors/basicError.mjs
var BasicError = class extends Error {
constructor(message) {
super(message);
}
};

// src/errors/paramError.mjs
var ParamError = class extends BasicError {
constructor(args) {
super(`invalid params ${args}`);
}
};

// src/service/index.mjs
var CepService = class _CepService {
/**
* @param {any} api
* @param {any} requester
*/
constructor(api, requester, baseUrl = "") {
this.api = api;
this.requester = requester;
this.baseUrl = baseUrl;
}
/**
* @param {any} requester
*/
overrideRequest(requester) {
this.requester = requester;
}
/**
* @param {string} zipcode
*/
static generalParse(zipcode) {
return zipcode.split("-").join("").split(".").join("");
}
/**
* @param {string} zipcode
* @returns {boolean}
*/
static validateCep(zipcode) {
return /[0-9]{8}/.test(zipcode);
}
/**
* @param {string | number} zipcode
* @returns {Promise<Cep>}
*/
async execute(zipcode) {
let data = "";
if (typeof zipcode === "number") {
data = zipcode.toString();
} else {
data = zipcode;
}
const value = _CepService.generalParse(data);
if (!_CepService.validateCep(value)) {
throw new ParamError(value);
}
return this.handler(value);
}
/**
* @param {string | number} _zipcode
* @returns {Promise<Cep>}
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
handler(_zipcode) {
throw new Error("Not implemented");
}
};

// src/provider.mjs
var Provider = class {
#services;
constructor(services) {
this.#services = services;
}
/**
* @returns {Promise<Cep>}
*/
async execute(zipcode) {
const result = await Promise.any(
this.#services.map((item) => item.execute(zipcode))
);
return result;
}
};

// src/requester/index.mjs
var RequestWIthFetch = class {
async execute({ url, body, headers, method, params }) {
const searchParams = new URLSearchParams(params);
const options = {
method,
body,
headers
};
const URL = `${url}?${searchParams.toString()}`;
return fetch(URL, options);
}
};

// src/service/brasilAPI/index.mjs
var BrasilAPIService = class extends CepService {
constructor(request) {
super("brasilAPI", request, "https://brasilapi.com.br/api/cep/v1");
}
/**
* @typedef {import('../../types.js').Cep} Cep
* @param {string} cep
* @returns {Promise<Cep>}
*/
async handler(cep2) {
const request = await this.requester.execute({ url: `${this.baseUrl}/${cep2}` });
const data = await request.json();
if (!request.ok) {
throw new Error(data);
}
return {
...data
};
}
};

// src/errors/parserError.mjs
var ParserError = class extends Error {
api = "";
constructor(api, message) {
if (message) {
super(message);
} else {
super();
}
this.api = api;
}
};

// src/service/correios/adapters.mjs
function parseParamsToXML(data) {
return `<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cli="http://cliente.bean.master.sigep.bsb.correios.com.br/"> <soapenv:Header /> <soapenv:Body> <cli:consultaCEP> <cep>${data}</cep> </cli:consultaCEP> </soapenv:Body></soapenv:Envelope>`;
}
function responseToCep(data) {
try {
const returnStatement = data.replace(/\r?\n|\r/g, "").match(/<return>(.*)<\/return>/)?.[0] ?? "";
if (returnStatement == "") {
throw new ParserError(`invalid regex got ${data}`, "correios");
}
const cleanReturnStatement = returnStatement.replace("<return>", "").replace("</return>", "");
const parsedReturnStatement = cleanReturnStatement.split(/</).reduce((result, exp) => {
const splittenExp = exp.split(">");
if (splittenExp.length > 1 && splittenExp[1].trim().length) {
result[splittenExp?.[0]] = splittenExp[1];
}
return result;
}, {});
if (parsedReturnStatement?.cep === "" || !parsedReturnStatement?.cep) {
throw new ParserError("not returnd a cep to parse", "correios");
}
return {
cep: parsedReturnStatement.cep ?? "",
state: parsedReturnStatement.uf ?? "",
city: parsedReturnStatement.cidade ?? "",
street: parsedReturnStatement.bairro ?? "",
neighborhood: parsedReturnStatement.end ?? ""
};
} catch (e) {
throw new ParserError("not implement xml", "correios");
}
}

// src/service/correios/index.mjs
var CorreiosService = class extends CepService {
constructor(requester) {
super("correios", requester, "https://apps.correios.com.br");
}
/**
* @typedef {import("../../types.js").Cep} Cep
* @param {string} cep
* @returns {Promise<Cep>}
*/
async handler(cep2) {
const request = await this.requester.execute({
url: `${this.baseUrl}/SigepMasterJPA/AtendeClienteService/AtendeCliente`,
body: parseParamsToXML(cep2),
method: "POST",
headers: {
"Content-Type": "application/xml"
}
});
const data = await request.text();
if (!request.ok) {
throw new Error(data);
}
return responseToCep(data);
}
};

// src/service/viacep/index.mjs
var ViaCepService = class extends CepService {
constructor(requester) {
super("viacep", requester, "https://viacep.com.br");
}
/**
* @typedef {import("../../types.js").Cep} Cep
* @param {string} cep
* @returns {Promise<Cep>}
*/
async handler(cep2) {
const request = await this.requester.execute({
url: `${this.baseUrl}/ws/${cep2}/json`,
method: "GET"
});
const data = await request.json();
if (!request.ok) {
throw new Error(data);
}
return {
cep: data?.cep?.replace("-", "") ?? "",
state: data?.uf ?? "",
city: data?.localidade ?? "",
street: data?.logradouro ?? "",
neighborhood: data?.bairro ?? ""
};
}
};

// src/factory.mjs
function factory_default({
useDefaultProviders = true,
custonProviders = [],
requester = new RequestWIthFetch()
}) {
let services = [];
if (useDefaultProviders) {
services = [
new ViaCepService(requester),
new BrasilAPIService(requester),
new CorreiosService(requester)
];
}
if (custonProviders?.length) {
services = [...services, ...custonProviders];
}
if (requester) {
services = [
...services.map((service2) => {
service2.overrideRequest(requester);
return service2;
})
];
}
return new Provider(services);
}

// src/cep.mjs
var cep = (zipcode) => {
const handler = factory_default({
useDefaultProviders: true
});
return handler.execute(zipcode);
};

// src/index.mjs
var service = CepService;
export {
CepService,
Provider,
RequestWIthFetch,
cep,
factory_default as factory,
service
};
Loading

0 comments on commit 92b576e

Please sign in to comment.