-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #28 from victorfernandesraton/feat/mprove-test-wit…
…h-dist-only fix: skip apicep
- Loading branch information
Showing
13 changed files
with
5,260 additions
and
2,849 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
}; |
Oops, something went wrong.