getta 0.1.22 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ #### 0.2.2 (2022-06-24)
2
+
3
+ ##### Bug Fixes
4
+
5
+ * add second attempt to parse body when invalid json ([5a27b0ef](https://github.com/badbatch/getta/commit/5a27b0eff2855bec70d0d54cf75b8b53e71d076f))
6
+
7
+ #### 0.2.1 (2022-06-06)
8
+
9
+ ##### Bug Fixes
10
+
11
+ * catch response parsing error correctly ([07871c37](https://github.com/badbatch/getta/commit/07871c37979bcd02933d4e610e18e8c68b06532f))
12
+
13
+ ### 0.2.0 (2022-06-01)
14
+
15
+ ##### New Features
16
+
17
+ * enable method overriding on shortcut properties ([053c3556](https://github.com/badbatch/getta/commit/053c35567d717d6e56c9ae4ed46c73af622b1734))
18
+
1
19
  #### 0.1.22 (2022-04-01)
2
20
 
3
21
  ##### Chores
@@ -1,2 +1,2 @@
1
- import e from"@babel/runtime/helpers/defineProperty";import t from"lodash/merge";import"core-js/modules/es.promise.js";import a from"md5";import r from"query-string";const s="arrayBuffer",i="blob",h="formData",c="json",o="text",n={ARRAY_BUFFER_FORMAT:"arrayBuffer",BLOB_FORMAT:"blob",FORM_DATA_FORMAT:"formData",JSON_FORMAT:c,TEXT_FORMAT:"text"},d=e=>e,u=5e3,l={"content-type":"application/json"},p=5,m=3,_=/({type})|({id})|({id,\+})|({brief\|standard})/g,T=/({[a-zA-Z0-9_]+\?})/g,y=100,f="Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.",g="The request exceeded the maximum number of redirects, which is",R="The request exceeded the maximum number of retries, which is",E="Getta expected to receive 'get', 'post', 'put' or 'delete', but received",v="The requested resource could not been found.",b="The request timed out. Getta did not get a response within",q="get",x="post",P="put",w="delete",k=["get","post","put","delete"],C="information",D="successful",O="redirection",j="clientError",A="serverError",$=304,H=404,M="Cookie",F="ETag",G="Location",W="If-None-Match",S="Cache-Control";function B(e,t,a){const r=Object.keys(t);return e.replace(a,e=>r.reduce((a,r)=>e.includes(r)?t[r]:a,""))}function L(e,t,{optionalPathTemplateRegExp:a,pathTemplateCallback:s,pathTemplateData:i,pathTemplateRegExp:h,queryParams:c}){const o=e.endsWith("/")||t.startsWith("/")?"":"/";let n=`${e}${o}${t}`;if(i&&(n=s(n,i,h)),n=n.replace(a,""),n.endsWith("/")&&(n=n.substring(0,n.length-1)),c&&Object.keys(c).length){n=`${n}${r.extract(n)?"&":"?"}${r.stringify(c)}`}return n}class N{constructor(t){e(this,"_basePath",void 0),e(this,"_bodyParser",void 0),e(this,"_cache",void 0),e(this,"_conditionalRequestsEnabled",void 0),e(this,"_fetchTimeout",void 0),e(this,"_headers",void 0),e(this,"_maxRedirects",void 0),e(this,"_maxRetries",void 0),e(this,"_optionalPathTemplateRegExp",void 0),e(this,"_pathTemplateCallback",void 0),e(this,"_pathTemplateRegExp",void 0),e(this,"_queryParams",void 0),e(this,"_requestRetryWait",void 0),e(this,"_requestTracker",{active:[],pending:new Map}),e(this,"_streamReader",void 0);const{basePath:a,bodyParser:r=d,cache:s,enableConditionalRequests:i=!0,fetchTimeout:h=u,headers:o,maxRedirects:n=p,maxRetries:g=m,optionalPathTemplateRegExp:R=T,pathTemplateCallback:E=B,pathTemplateRegExp:v=_,queryParams:b={},requestRetryWait:q=y,streamReader:x=c}=t;if(!a)throw new Error(f);this._basePath=a,this._bodyParser=r,this._cache=s,this._conditionalRequestsEnabled=i,this._fetchTimeout=h,this._headers={...l,...o||{}},this._maxRedirects=n,this._maxRetries=g,this._optionalPathTemplateRegExp=R,this._pathTemplateCallback=E,this._pathTemplateRegExp=v,this._queryParams=b,this._requestRetryWait=q,this._streamReader=x}get cache(){return this._cache}createShortcut(e,a,{method:r,...s}){if(!k.includes(r))throw new Error("Getta expected to receive 'get', 'post', 'put' or 'delete', but received "+r);this[e]=async(e={})=>this[r](a,t({},s,e))}async delete(e,t={}){return this._delete(e,t)}async get(e,t={}){return this._get(e,t)}async post(e,t){return this._request(e,{...t,method:"post"})}async put(e,t){return this._request(e,{...t,method:"put"})}async _cacheEntryDelete(e){if(!this._cache)return!1;try{return await this._cache.delete(e)}catch(e){return Promise.reject(e)}}async _cacheEntryGet(e){if(this._cache)try{return await this._cache.get(e)}catch(e){return Promise.reject(e)}}async _cacheEntryHas(e){if(!this._cache)return!1;try{return await this._cache.has(e)}catch(e){return!1}}async _cacheEntrySet(e,t,a){if(this._cache)try{return await this._cache.set(e,t,{cacheHeaders:a})}catch(e){return Promise.reject(e)}}async _delete(e,{headers:t={},pathTemplateData:r,queryParams:s={},...i}){const h=L(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}}),c=a(h);return await this._cacheEntryHas(c)&&this._cacheEntryDelete(c),this._fetch(h,{headers:{...this._headers,...t},method:"delete",...i})}async _fetch(e,{redirects:t,retries:a,...r}){try{return new Promise(async(s,i)=>{const h=setTimeout(()=>{i(new Error(`${b} ${this._fetchTimeout}ms.`))},this._fetchTimeout),c=await fetch(e,r);clearTimeout(h);const{headers:o,status:n}=c,d=function(e){switch(!0){case e<200:return"information";case e<300:return"successful";case e<400:return"redirection";case e<500:return"clientError";default:return"serverError"}}(n);"redirection"===d&&o.get("Location")&&s(await this._fetchRedirectHandler(o.get("Location"),{redirects:t,status:n,...r})),"serverError"===d&&s(await this._fetchRetryHandler(e,{retries:a,...r}));const u=c;u.data=c.body?this._bodyParser(await c[this._streamReader]()):void 0,s(u)})}catch(e){return{errors:[e]}}}async _fetchRedirectHandler(e,{method:t,redirects:a=1,status:r,...s}){if(a===this._maxRedirects){return{errors:[new Error(`The request exceeded the maximum number of redirects, which is ${this._maxRedirects}.`)]}}a+=1;const i=303===r?"get":t;return this._fetch(e,{method:i,redirects:a,...s})}async _fetchRetryHandler(e,{retries:t=1,...a}){return t===this._maxRetries?{errors:[new Error(`The request exceeded the maximum number of retries, which is ${this._maxRetries}.`)]}:(t+=1,await(r=this._requestRetryWait,new Promise(e=>setTimeout(e,r))),this._fetch(e,{retries:t,...a}));var r}async _get(e,{headers:t={},pathTemplateData:r,queryParams:s={}}){const i=L(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}}),h=a(i),c=await this._cacheEntryHas(h);if(c){if(function(e){var t,a,r;return!(null!==(t=null==e||null===(a=e.metadata)||void 0===a||null===(r=a.cacheControl)||void 0===r?void 0:r.noCache)&&void 0!==t&&t)&&e.checkTTL()}(c))return{data:await this._cacheEntryGet(h),headers:new Headers({"cache-control":c.printCacheControl()})};if(this._conditionalRequestsEnabled){var o,n;const e=null!==(o=null==c||null===(n=c.metadata)||void 0===n?void 0:n.etag)&&void 0!==o?o:null;e&&(t["If-None-Match"]=e)}}const d=this._trackRequest(h);return d||this._getResolve(h,await this._fetch(i,{headers:{...this._headers,...t},method:"get"}))}async _getResolve(e,t){const{data:a,headers:r,status:s}=t;if(404===s)this._cacheEntryDelete(e),t.errors||(t.errors=[]),t.errors.push(new Error("The requested resource could not been found."));else if(304===s&&r){const a=await this._cacheEntryGet(e);a&&(this._cacheEntrySet(e,a,{cacheControl:r.get("Cache-Control")||void 0,etag:r.get("ETag")||void 0}),t.data=a)}else a&&r&&this._cacheEntrySet(e,a,{cacheControl:r.get("Cache-Control")||void 0,etag:r.get("ETag")||void 0});return this._resolvePendingRequests(e,t),this._requestTracker.active=this._requestTracker.active.filter(t=>t!==e),t}async _request(e,{body:t,headers:a,method:r,pathTemplateData:s,queryParams:i,...h}){const c=L(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:s,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...i}});return this._fetch(c,{body:t,headers:{...this._headers,...a},method:r,...h})}_resolvePendingRequests(e,t){const a=this._requestTracker.pending.get(e);a&&(a.forEach(({resolve:e})=>{e(t)}),this._requestTracker.pending.delete(e))}_setPendingRequest(e,t){let a=this._requestTracker.pending.get(e);a||(a=[]),a.push(t),this._requestTracker.pending.set(e,a)}_trackRequest(e){if(this._requestTracker.active.includes(e))return new Promise(t=>{this._setPendingRequest(e,{resolve:t})});this._requestTracker.active.push(e)}}export default function(e,t){const a=new N(e);return t?(Object.keys(t).forEach(e=>{a.createShortcut(e,...t[e])}),a):a}export{s as ARRAY_BUFFER_FORMAT,i as BLOB_FORMAT,S as CACHE_CONTROL_HEADER,j as CLIENT_ERROR_REPSONSE,M as COOKIE_HEADER,d as DEFAULT_BODY_PARSER,u as DEFAULT_FETCH_TIMEOUT,l as DEFAULT_HEADERS,p as DEFAULT_MAX_REDIRECTS,m as DEFAULT_MAX_RETRIES,_ as DEFAULT_PATH_TEMPLATE_REGEX,y as DEFAULT_REQUEST_RETRY_WAIT,w as DELETE_METHOD,F as ETAG_HEADER,k as FETCH_METHODS,b as FETCH_TIMEOUT_ERROR,h as FORM_DATA_FORMAT,q as GET_METHOD,N as Getta,W as IF_NONE_MATCH_HEADER,C as INFORMATION_REPSONSE,E as INVALID_FETCH_METHOD_ERROR,c as JSON_FORMAT,G as LOCATION_HEADER,g as MAX_REDIRECTS_EXCEEDED_ERROR,R as MAX_RETRIES_EXCEEDED_ERROR,f as MISSING_BASE_PATH_ERROR,H as NOT_FOUND_STATUS_CODE,$ as NOT_MODIFIED_STATUS_CODE,T as OPTIONAL_PATH_TEMPLATE_REGEX,x as POST_METHOD,P as PUT_METHOD,O as REDIRECTION_REPSONSE,v as RESOURCE_NOT_FOUND_ERROR,A as SERVER_ERROR_REPSONSE,n as STREAM_READERS,D as SUCCESSFUL_REPSONSE,o as TEXT_FORMAT,B as defaultPathTemplateCallback};
1
+ import e from"@babel/runtime/helpers/defineProperty";import t from"lodash/merge";import r from"lodash/castArray";import"core-js/modules/es.promise.js";import a from"md5";import s from"query-string";const i="arrayBuffer",h="blob",c="formData",o="json",n="text",d={ARRAY_BUFFER_FORMAT:"arrayBuffer",BLOB_FORMAT:"blob",FORM_DATA_FORMAT:"formData",JSON_FORMAT:o,TEXT_FORMAT:"text"},u=e=>e,l=5e3,p={"content-type":"application/json"},m=5,_=3,y=/({type})|({id})|({id,\+})|({brief\|standard})/g,T=/({[a-zA-Z0-9_]+\?})/g,f=100,g="Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.",R="The request exceeded the maximum number of redirects, which is",E="The request exceeded the maximum number of retries, which is",b="Getta expected to receive 'get', 'post', 'put' or 'delete', but received",v="The requested resource could not been found.",q="The request timed out. Getta did not get a response within",x="get",P="post",w="put",k="delete",C=["get","post","put","delete"],$="information",D="successful",O="redirection",j="clientError",A="serverError",H=304,M=404,F="Cookie",G="ETag",S="Location",W="If-None-Match",B="Cache-Control";function L(e,t,r){const a=Object.keys(t);return e.replace(r,e=>a.reduce((r,a)=>e.includes(a)?t[a]:r,""))}function N(e,t,{optionalPathTemplateRegExp:r,pathTemplateCallback:a,pathTemplateData:i,pathTemplateRegExp:h,queryParams:c}){const o=e.endsWith("/")||t.startsWith("/")?"":"/";let n=`${e}${o}${t}`;if(i&&(n=a(n,i,h)),n=n.replace(r,""),n.endsWith("/")&&(n=n.substring(0,n.length-1)),c&&Object.keys(c).length){n=`${n}${s.extract(n)?"&":"?"}${s.stringify(c)}`}return n}class U{constructor(t){e(this,"_basePath",void 0),e(this,"_bodyParser",void 0),e(this,"_cache",void 0),e(this,"_conditionalRequestsEnabled",void 0),e(this,"_fetchTimeout",void 0),e(this,"_headers",void 0),e(this,"_maxRedirects",void 0),e(this,"_maxRetries",void 0),e(this,"_optionalPathTemplateRegExp",void 0),e(this,"_pathTemplateCallback",void 0),e(this,"_pathTemplateRegExp",void 0),e(this,"_queryParams",void 0),e(this,"_requestRetryWait",void 0),e(this,"_requestTracker",{active:[],pending:new Map}),e(this,"_streamReader",void 0);const{basePath:r,bodyParser:a=u,cache:s,enableConditionalRequests:i=!0,fetchTimeout:h=l,headers:c,maxRedirects:n=m,maxRetries:d=_,optionalPathTemplateRegExp:R=T,pathTemplateCallback:E=L,pathTemplateRegExp:b=y,queryParams:v={},requestRetryWait:q=f,streamReader:x=o}=t;if(!r)throw new Error(g);this._basePath=r,this._bodyParser=a,this._cache=s,this._conditionalRequestsEnabled=i,this._fetchTimeout=h,this._headers={...p,...c||{}},this._maxRedirects=n,this._maxRetries=d,this._optionalPathTemplateRegExp=R,this._pathTemplateCallback=E,this._pathTemplateRegExp=b,this._queryParams=v,this._requestRetryWait=q,this._streamReader=x}get cache(){return this._cache}createShortcut(e,r,{method:a,...s}){if(!C.includes(a))throw new Error("Getta expected to receive 'get', 'post', 'put' or 'delete', but received "+a);this[e]=async({method:e,...i}={})=>this[null!=e?e:a](r,t({},s,i))}async delete(e,t={}){return this._delete(e,t)}async get(e,t={}){return this._get(e,t)}async post(e,t){return this._request(e,{...t,method:"post"})}async put(e,t){return this._request(e,{...t,method:"put"})}async _cacheEntryDelete(e){if(!this._cache)return!1;try{return await this._cache.delete(e)}catch(e){return Promise.reject(e)}}async _cacheEntryGet(e){if(this._cache)try{return await this._cache.get(e)}catch(e){return Promise.reject(e)}}async _cacheEntryHas(e){if(!this._cache)return!1;try{return await this._cache.has(e)}catch(e){return!1}}async _cacheEntrySet(e,t,r){if(this._cache)try{return await this._cache.set(e,t,{cacheHeaders:r})}catch(e){return Promise.reject(e)}}async _delete(e,{headers:t={},pathTemplateData:r,queryParams:s={},...i}){const h=N(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}}),c=a(h);return await this._cacheEntryHas(c)&&this._cacheEntryDelete(c),this._fetch(h,{headers:{...this._headers,...t},method:"delete",...i})}async _fetch(e,{redirects:t,retries:a,...s}){try{return new Promise(async(r,i)=>{const h=setTimeout(()=>{i(new Error(`${q} ${this._fetchTimeout}ms.`))},this._fetchTimeout),c=await fetch(e,s);clearTimeout(h);const{headers:o,status:n}=c,d=function(e){switch(!0){case e<200:return"information";case e<300:return"successful";case e<400:return"redirection";case e<500:return"clientError";default:return"serverError"}}(n);"redirection"===d&&o.get("Location")&&r(await this._fetchRedirectHandler(o.get("Location"),{redirects:t,status:n,...s})),"serverError"===d&&r(await this._fetchRetryHandler(e,{retries:a,...s}));const u=c,l=c.clone();try{u.data=c.body?this._bodyParser(await c[this._streamReader]()):void 0,r(u)}catch(t){try{if("json"===this._streamReader&&c.body){const e=l;e.data=JSON.parse(await l.text()),r(e)}else i([t,new Error(`Unable to ${s.method} ${e} due to previous error`)])}catch{i([t,new Error(`Unable to ${s.method} ${e} due to previous error`)])}}})}catch(e){return{errors:r(e)}}}async _fetchRedirectHandler(e,{method:t,redirects:r=1,status:a,...s}){if(r===this._maxRedirects){return{errors:[new Error(`The request exceeded the maximum number of redirects, which is ${this._maxRedirects}.`)]}}r+=1;const i=303===a?"get":t;return this._fetch(e,{method:i,redirects:r,...s})}async _fetchRetryHandler(e,{retries:t=1,...r}){return t===this._maxRetries?{errors:[new Error(`The request exceeded the maximum number of retries, which is ${this._maxRetries}.`)]}:(t+=1,await(a=this._requestRetryWait,new Promise(e=>setTimeout(e,a))),this._fetch(e,{retries:t,...r}));var a}async _get(e,{headers:t={},pathTemplateData:r,queryParams:s={}}){const i=N(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:r,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}}),h=a(i),c=await this._cacheEntryHas(h);if(c){if(function(e){var t,r,a;return!(null!==(t=null==e||null===(r=e.metadata)||void 0===r||null===(a=r.cacheControl)||void 0===a?void 0:a.noCache)&&void 0!==t&&t)&&e.checkTTL()}(c))return{data:await this._cacheEntryGet(h),headers:new Headers({"cache-control":c.printCacheControl()})};if(this._conditionalRequestsEnabled){var o,n;const e=null!==(o=null==c||null===(n=c.metadata)||void 0===n?void 0:n.etag)&&void 0!==o?o:null;e&&(t["If-None-Match"]=e)}}const d=this._trackRequest(h);return d||this._getResolve(h,await this._fetch(i,{headers:{...this._headers,...t},method:"get"}))}async _getResolve(e,t){const{data:r,headers:a,status:s}=t;if(404===s)this._cacheEntryDelete(e),t.errors||(t.errors=[]),t.errors.push(new Error("The requested resource could not been found."));else if(304===s&&a){const r=await this._cacheEntryGet(e);r&&(this._cacheEntrySet(e,r,{cacheControl:a.get("Cache-Control")||void 0,etag:a.get("ETag")||void 0}),t.data=r)}else r&&a&&this._cacheEntrySet(e,r,{cacheControl:a.get("Cache-Control")||void 0,etag:a.get("ETag")||void 0});return this._resolvePendingRequests(e,t),this._requestTracker.active=this._requestTracker.active.filter(t=>t!==e),t}async _request(e,{body:t,headers:r,method:a,pathTemplateData:s,queryParams:i,...h}){const c=N(this._basePath,e,{optionalPathTemplateRegExp:this._optionalPathTemplateRegExp,pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:s,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...i}});return this._fetch(c,{body:t,headers:{...this._headers,...r},method:a,...h})}_resolvePendingRequests(e,t){const r=this._requestTracker.pending.get(e);r&&(r.forEach(({resolve:e})=>{e(t)}),this._requestTracker.pending.delete(e))}_setPendingRequest(e,t){let r=this._requestTracker.pending.get(e);r||(r=[]),r.push(t),this._requestTracker.pending.set(e,r)}_trackRequest(e){if(this._requestTracker.active.includes(e))return new Promise(t=>{this._setPendingRequest(e,{resolve:t})});this._requestTracker.active.push(e)}}export default function(e,t){const r=new U(e);return t?(Object.keys(t).forEach(e=>{r.createShortcut(e,...t[e])}),r):r}export{i as ARRAY_BUFFER_FORMAT,h as BLOB_FORMAT,B as CACHE_CONTROL_HEADER,j as CLIENT_ERROR_REPSONSE,F as COOKIE_HEADER,u as DEFAULT_BODY_PARSER,l as DEFAULT_FETCH_TIMEOUT,p as DEFAULT_HEADERS,m as DEFAULT_MAX_REDIRECTS,_ as DEFAULT_MAX_RETRIES,y as DEFAULT_PATH_TEMPLATE_REGEX,f as DEFAULT_REQUEST_RETRY_WAIT,k as DELETE_METHOD,G as ETAG_HEADER,C as FETCH_METHODS,q as FETCH_TIMEOUT_ERROR,c as FORM_DATA_FORMAT,x as GET_METHOD,U as Getta,W as IF_NONE_MATCH_HEADER,$ as INFORMATION_REPSONSE,b as INVALID_FETCH_METHOD_ERROR,o as JSON_FORMAT,S as LOCATION_HEADER,R as MAX_REDIRECTS_EXCEEDED_ERROR,E as MAX_RETRIES_EXCEEDED_ERROR,g as MISSING_BASE_PATH_ERROR,M as NOT_FOUND_STATUS_CODE,H as NOT_MODIFIED_STATUS_CODE,T as OPTIONAL_PATH_TEMPLATE_REGEX,P as POST_METHOD,w as PUT_METHOD,O as REDIRECTION_REPSONSE,v as RESOURCE_NOT_FOUND_ERROR,A as SERVER_ERROR_REPSONSE,d as STREAM_READERS,D as SUCCESSFUL_REPSONSE,n as TEXT_FORMAT,L as defaultPathTemplateCallback};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../getta/src/constants.ts","../getta/src/helpers/default-path-template-callback/index.ts","../getta/src/helpers/build-endpoint/index.ts","../getta/src/main.ts","../getta/src/helpers/get-response-group/index.ts","../getta/src/helpers/delay/index.ts","../getta/src/helpers/is-cacheability-valid/index.ts"],"sourcesContent":["import { PlainObject } from \"@repodog/types\";\n\nexport const ARRAY_BUFFER_FORMAT = \"arrayBuffer\" as const;\nexport const BLOB_FORMAT = \"blob\" as const;\nexport const FORM_DATA_FORMAT = \"formData\" as const;\nexport const JSON_FORMAT = \"json\" as const;\nexport const TEXT_FORMAT = \"text\" as const;\n\nexport const STREAM_READERS = {\n ARRAY_BUFFER_FORMAT,\n BLOB_FORMAT,\n FORM_DATA_FORMAT,\n JSON_FORMAT,\n TEXT_FORMAT,\n};\n\nexport const DEFAULT_BODY_PARSER = (body: PlainObject) => body;\nexport const DEFAULT_FETCH_TIMEOUT = 5000 as const;\nexport const DEFAULT_HEADERS = { \"content-type\": \"application/json\" };\nexport const DEFAULT_MAX_REDIRECTS = 5 as const;\nexport const DEFAULT_MAX_RETRIES = 3 as const;\nexport const DEFAULT_PATH_TEMPLATE_REGEX = /({type})|({id})|({id,\\+})|({brief\\|standard})/g;\nexport const OPTIONAL_PATH_TEMPLATE_REGEX = /({[a-zA-Z0-9_]+\\?})/g;\nexport const DEFAULT_REQUEST_RETRY_WAIT = 100;\n\nexport const MISSING_BASE_PATH_ERROR = `Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.`;\n\nexport const MAX_REDIRECTS_EXCEEDED_ERROR = \"The request exceeded the maximum number of redirects, which is\";\n\nexport const MAX_RETRIES_EXCEEDED_ERROR = \"The request exceeded the maximum number of retries, which is\";\n\nexport const INVALID_FETCH_METHOD_ERROR = \"Getta expected to receive 'get', 'post', 'put' or 'delete', but received\";\n\nexport const RESOURCE_NOT_FOUND_ERROR = \"The requested resource could not been found.\";\n\nexport const FETCH_TIMEOUT_ERROR = \"The request timed out. Getta did not get a response within\";\n\nexport const GET_METHOD = \"get\" as const;\nexport const POST_METHOD = \"post\" as const;\nexport const PUT_METHOD = \"put\" as const;\nexport const DELETE_METHOD = \"delete\" as const;\n\nexport const FETCH_METHODS = [GET_METHOD, POST_METHOD, PUT_METHOD, DELETE_METHOD];\n\nexport const INFORMATION_REPSONSE = \"information\" as const;\nexport const SUCCESSFUL_REPSONSE = \"successful\" as const;\nexport const REDIRECTION_REPSONSE = \"redirection\" as const;\nexport const CLIENT_ERROR_REPSONSE = \"clientError\" as const;\nexport const SERVER_ERROR_REPSONSE = \"serverError\" as const;\n\nexport const NOT_MODIFIED_STATUS_CODE = 304 as const;\nexport const NOT_FOUND_STATUS_CODE = 404 as const;\n\nexport const COOKIE_HEADER = \"Cookie\" as const;\nexport const ETAG_HEADER = \"ETag\" as const;\nexport const LOCATION_HEADER = \"Location\" as const;\nexport const IF_NONE_MATCH_HEADER = \"If-None-Match\" as const;\nexport const CACHE_CONTROL_HEADER = \"Cache-Control\" as const;\n","import { StringObject } from \"@repodog/types\";\n\nexport default function defaultPathTemplateCallback(\n pathTemplate: string,\n data: StringObject,\n pathTemplateRegExp: RegExp,\n) {\n const dataKeys = Object.keys(data);\n\n return pathTemplate.replace(pathTemplateRegExp, match => {\n return dataKeys.reduce((value, key) => {\n if (match.includes(key)) return data[key];\n return value;\n }, \"\");\n });\n}\n","import queryString from \"query-string\";\nimport { BuildEndpointOptions } from \"./types\";\n\nexport default function buildEndpoint(\n basePath: string,\n path: string,\n {\n optionalPathTemplateRegExp,\n pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp,\n queryParams,\n }: BuildEndpointOptions,\n) {\n const pathJoiner = basePath.endsWith(\"/\") || path.startsWith(\"/\") ? \"\" : \"/\";\n let endpoint = `${basePath}${pathJoiner}${path}`;\n\n if (pathTemplateData) {\n endpoint = pathTemplateCallback(endpoint, pathTemplateData, pathTemplateRegExp);\n }\n\n endpoint = endpoint.replace(optionalPathTemplateRegExp, \"\");\n\n if (endpoint.endsWith(\"/\")) {\n endpoint = endpoint.substring(0, endpoint.length - 1);\n }\n\n if (queryParams && Object.keys(queryParams).length) {\n const queryJoin = queryString.extract(endpoint) ? \"&\" : \"?\";\n endpoint = `${endpoint}${queryJoin}${queryString.stringify(queryParams)}`;\n }\n\n return endpoint;\n}\n","import Cachemap, { CacheHeaders } from \"@cachemap/core\";\nimport { Func, PlainObject, StringObject } from \"@repodog/types\";\nimport Cacheability from \"cacheability\";\nimport { merge } from \"lodash\";\nimport md5 from \"md5\";\nimport { Required } from \"utility-types\";\nimport {\n CACHE_CONTROL_HEADER,\n DEFAULT_BODY_PARSER,\n DEFAULT_FETCH_TIMEOUT,\n DEFAULT_HEADERS,\n DEFAULT_MAX_REDIRECTS,\n DEFAULT_MAX_RETRIES,\n DEFAULT_PATH_TEMPLATE_REGEX,\n DEFAULT_REQUEST_RETRY_WAIT,\n DELETE_METHOD,\n ETAG_HEADER,\n FETCH_METHODS,\n FETCH_TIMEOUT_ERROR,\n GET_METHOD,\n IF_NONE_MATCH_HEADER,\n INVALID_FETCH_METHOD_ERROR,\n JSON_FORMAT,\n LOCATION_HEADER,\n MAX_REDIRECTS_EXCEEDED_ERROR,\n MAX_RETRIES_EXCEEDED_ERROR,\n MISSING_BASE_PATH_ERROR,\n NOT_FOUND_STATUS_CODE,\n NOT_MODIFIED_STATUS_CODE,\n OPTIONAL_PATH_TEMPLATE_REGEX,\n POST_METHOD,\n PUT_METHOD,\n REDIRECTION_REPSONSE,\n RESOURCE_NOT_FOUND_ERROR,\n SERVER_ERROR_REPSONSE,\n} from \"./constants\";\nimport buildEndpoint from \"./helpers/build-endpoint\";\nimport defaultPathTemplateCallback from \"./helpers/default-path-template-callback\";\nimport delay from \"./helpers/delay\";\nimport getResponseGroup from \"./helpers/get-response-group\";\nimport isCacheabilityValid from \"./helpers/is-cacheability-valid\";\nimport {\n ConstructorOptions,\n FetchOptions,\n FetchRedirectHandlerOptions,\n FetchResponse,\n PathTemplateCallback,\n PendingRequestResolver,\n PendingRequestResolvers,\n RequestOptions,\n RequestTracker,\n ShortcutProperties,\n Shortcuts,\n StreamReader,\n} from \"./types\";\n\nexport class Getta {\n private _basePath: string;\n private _bodyParser: Func;\n private _cache?: Cachemap;\n private _conditionalRequestsEnabled: boolean;\n private _fetchTimeout: number;\n private _headers: StringObject;\n private _maxRedirects: number;\n private _maxRetries: number;\n private _optionalPathTemplateRegExp: RegExp;\n private _pathTemplateCallback: PathTemplateCallback;\n private _pathTemplateRegExp: RegExp;\n private _queryParams: PlainObject;\n private _requestRetryWait: number;\n private _requestTracker: RequestTracker = { active: [], pending: new Map() };\n private _streamReader: StreamReader;\n\n constructor(options: ConstructorOptions) {\n const {\n basePath,\n bodyParser = DEFAULT_BODY_PARSER,\n cache,\n enableConditionalRequests = true,\n fetchTimeout = DEFAULT_FETCH_TIMEOUT,\n headers,\n maxRedirects = DEFAULT_MAX_REDIRECTS,\n maxRetries = DEFAULT_MAX_RETRIES,\n optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,\n pathTemplateCallback = defaultPathTemplateCallback,\n pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,\n queryParams = {},\n requestRetryWait = DEFAULT_REQUEST_RETRY_WAIT,\n streamReader = JSON_FORMAT,\n } = options;\n\n if (!basePath) {\n throw new Error(MISSING_BASE_PATH_ERROR);\n }\n\n this._basePath = basePath;\n this._bodyParser = bodyParser;\n this._cache = cache;\n this._conditionalRequestsEnabled = enableConditionalRequests;\n this._fetchTimeout = fetchTimeout;\n this._headers = { ...DEFAULT_HEADERS, ...(headers || {}) };\n this._maxRedirects = maxRedirects;\n this._maxRetries = maxRetries;\n this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;\n this._pathTemplateCallback = pathTemplateCallback;\n this._pathTemplateRegExp = pathTemplateRegExp;\n this._queryParams = queryParams;\n this._requestRetryWait = requestRetryWait;\n this._streamReader = streamReader;\n }\n\n get cache(): Cachemap | undefined {\n return this._cache;\n }\n\n public createShortcut(name: string, path: string, { method, ...rest }: Required<RequestOptions, \"method\">) {\n if (!FETCH_METHODS.includes(method)) {\n throw new Error(`${INVALID_FETCH_METHOD_ERROR} ${method}`);\n }\n\n // @ts-ignore\n this[name] = async <Resource extends PlainObject>(options: RequestOptions = {}) =>\n // @ts-ignore\n this[method](path, merge({}, rest, options)) as Promise<FetchResponse<Resource>>;\n }\n\n public async delete(path: string, options: RequestOptions = {}) {\n return this._delete(path, options);\n }\n\n public async get(path: string, options: RequestOptions = {}) {\n return this._get(path, options);\n }\n\n public async post(path: string, options: Required<RequestOptions, \"body\">) {\n return this._request(path, { ...options, method: POST_METHOD });\n }\n\n public async put(path: string, options: Required<RequestOptions, \"body\">) {\n return this._request(path, { ...options, method: PUT_METHOD });\n }\n\n private async _cacheEntryDelete(requestHash: string): Promise<boolean> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.delete(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryGet(requestHash: string): Promise<PlainObject | undefined> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.get(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryHas(requestHash: string): Promise<Cacheability | false> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.has(requestHash);\n } catch (error) {\n return false;\n }\n }\n\n private async _cacheEntrySet(requestHash: string, data: PlainObject, cacheHeaders: CacheHeaders): Promise<void> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.set(requestHash, data, { cacheHeaders });\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n private async _delete(path: string, { headers = {}, pathTemplateData, queryParams = {}, ...rest }: RequestOptions) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n this._cacheEntryDelete(requestHash);\n }\n\n return this._fetch(endpoint, {\n headers: { ...this._headers, ...headers },\n method: DELETE_METHOD,\n ...rest,\n });\n }\n\n private async _fetch(endpoint: string, { redirects, retries, ...rest }: FetchOptions): Promise<FetchResponse> {\n try {\n return new Promise(async (resolve: (value: FetchResponse) => void, reject) => {\n const fetchTimer = setTimeout(() => {\n reject(new Error(`${FETCH_TIMEOUT_ERROR} ${this._fetchTimeout}ms.`));\n }, this._fetchTimeout);\n\n const res = await fetch(endpoint, rest);\n\n clearTimeout(fetchTimer);\n\n const { headers, status } = res;\n const responseGroup = getResponseGroup(status);\n\n if (responseGroup === REDIRECTION_REPSONSE && headers.get(LOCATION_HEADER)) {\n resolve(\n await this._fetchRedirectHandler(headers.get(LOCATION_HEADER) as string, {\n redirects,\n status,\n ...rest,\n }),\n );\n }\n\n if (responseGroup === SERVER_ERROR_REPSONSE) {\n resolve(\n (await this._fetchRetryHandler(endpoint, {\n retries,\n ...rest,\n })) as FetchResponse,\n );\n }\n\n const fetchRes = res as FetchResponse;\n fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;\n resolve(fetchRes);\n });\n } catch (error) {\n const errorRes = { errors: [error] };\n return errorRes as FetchResponse;\n }\n }\n\n private async _fetchRedirectHandler(\n endpoint: string,\n { method, redirects = 1, status, ...rest }: FetchRedirectHandlerOptions,\n ): Promise<FetchResponse> {\n if (redirects === this._maxRedirects) {\n const errorRes = {\n errors: [new Error(`${MAX_REDIRECTS_EXCEEDED_ERROR} ${this._maxRedirects}.`)],\n };\n\n return errorRes as FetchResponse;\n }\n\n redirects += 1;\n const redirectMethod = status === 303 ? GET_METHOD : method;\n return this._fetch(endpoint, { method: redirectMethod, redirects, ...rest });\n }\n\n private async _fetchRetryHandler(endpoint: string, { retries = 1, ...rest }: FetchOptions) {\n if (retries === this._maxRetries) {\n return {\n errors: [new Error(`${MAX_RETRIES_EXCEEDED_ERROR} ${this._maxRetries}.`)],\n };\n }\n\n retries += 1;\n await delay(this._requestRetryWait);\n return this._fetch(endpoint, { retries, ...rest });\n }\n\n private async _get(path: string, { headers = {}, pathTemplateData, queryParams = {} }: RequestOptions) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n if (isCacheabilityValid(cacheability)) {\n return {\n data: await this._cacheEntryGet(requestHash),\n headers: new Headers({ \"cache-control\": cacheability.printCacheControl() }),\n };\n }\n\n if (this._conditionalRequestsEnabled) {\n const etag = cacheability?.metadata?.etag ?? null;\n if (etag) headers[IF_NONE_MATCH_HEADER] = etag;\n }\n }\n\n const pendingRequest = this._trackRequest(requestHash);\n if (pendingRequest) return pendingRequest;\n\n return this._getResolve(\n requestHash,\n await this._fetch(endpoint, { headers: { ...this._headers, ...headers }, method: GET_METHOD }),\n );\n }\n\n private async _getResolve(requestHash: string, res: FetchResponse) {\n const { data, headers, status } = res;\n\n if (status === NOT_FOUND_STATUS_CODE) {\n this._cacheEntryDelete(requestHash);\n\n if (!res.errors) {\n res.errors = [];\n }\n\n res.errors.push(new Error(RESOURCE_NOT_FOUND_ERROR));\n } else if (status === NOT_MODIFIED_STATUS_CODE && headers) {\n const cachedData = await this._cacheEntryGet(requestHash);\n\n if (cachedData) {\n this._cacheEntrySet(requestHash, cachedData, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n\n res.data = cachedData;\n }\n } else if (data && headers) {\n this._cacheEntrySet(requestHash, data, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n }\n\n this._resolvePendingRequests(requestHash, res);\n this._requestTracker.active = this._requestTracker.active.filter(value => value !== requestHash);\n return res;\n }\n\n private async _request(\n path: string,\n { body, headers, method, pathTemplateData, queryParams, ...rest }: Required<RequestOptions, \"method\">,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n return this._fetch(endpoint, {\n body,\n headers: { ...this._headers, ...headers },\n method,\n ...rest,\n });\n }\n\n private _resolvePendingRequests(requestHash: string, responseData: FetchResponse) {\n const pendingRequests = this._requestTracker.pending.get(requestHash);\n if (!pendingRequests) return;\n\n pendingRequests.forEach(({ resolve }) => {\n resolve(responseData);\n });\n\n this._requestTracker.pending.delete(requestHash);\n }\n\n private _setPendingRequest(requestHash: string, resolver: PendingRequestResolvers) {\n let pending = this._requestTracker.pending.get(requestHash);\n if (!pending) pending = [];\n pending.push(resolver);\n this._requestTracker.pending.set(requestHash, pending);\n }\n\n private _trackRequest(requestHash: string): Promise<FetchResponse> | void {\n if (this._requestTracker.active.includes(requestHash)) {\n return new Promise((resolve: PendingRequestResolver) => {\n this._setPendingRequest(requestHash, { resolve });\n });\n }\n\n this._requestTracker.active.push(requestHash);\n }\n}\n\nexport default function createRestClient<N extends string>(options: ConstructorOptions, shortcuts?: Shortcuts) {\n const getta = new Getta(options) as Getta & ShortcutProperties<N>;\n if (!shortcuts) return getta;\n\n Object.keys(shortcuts).forEach(key => {\n getta.createShortcut(key, ...shortcuts[key]);\n });\n\n return getta;\n}\n","import {\n CLIENT_ERROR_REPSONSE,\n INFORMATION_REPSONSE,\n REDIRECTION_REPSONSE,\n SERVER_ERROR_REPSONSE,\n SUCCESSFUL_REPSONSE,\n} from \"../../constants\";\n\nexport default function getResponseGroup(status: number) {\n switch (true) {\n case status < 200:\n return INFORMATION_REPSONSE;\n case status < 300:\n return SUCCESSFUL_REPSONSE;\n case status < 400:\n return REDIRECTION_REPSONSE;\n case status < 500:\n return CLIENT_ERROR_REPSONSE;\n default:\n return SERVER_ERROR_REPSONSE;\n }\n}\n","export default function delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import Cacheability from \"cacheability\";\n\nexport default function isCacheabilityValid(cacheability: Cacheability) {\n const noCache = cacheability?.metadata?.cacheControl?.noCache ?? false;\n return !noCache && cacheability.checkTTL();\n}\n"],"names":["ARRAY_BUFFER_FORMAT","BLOB_FORMAT","FORM_DATA_FORMAT","JSON_FORMAT","TEXT_FORMAT","STREAM_READERS","DEFAULT_BODY_PARSER","body","DEFAULT_FETCH_TIMEOUT","DEFAULT_HEADERS","DEFAULT_MAX_REDIRECTS","DEFAULT_MAX_RETRIES","DEFAULT_PATH_TEMPLATE_REGEX","OPTIONAL_PATH_TEMPLATE_REGEX","DEFAULT_REQUEST_RETRY_WAIT","MISSING_BASE_PATH_ERROR","MAX_REDIRECTS_EXCEEDED_ERROR","MAX_RETRIES_EXCEEDED_ERROR","INVALID_FETCH_METHOD_ERROR","RESOURCE_NOT_FOUND_ERROR","FETCH_TIMEOUT_ERROR","GET_METHOD","POST_METHOD","PUT_METHOD","DELETE_METHOD","FETCH_METHODS","INFORMATION_REPSONSE","SUCCESSFUL_REPSONSE","REDIRECTION_REPSONSE","CLIENT_ERROR_REPSONSE","SERVER_ERROR_REPSONSE","NOT_MODIFIED_STATUS_CODE","NOT_FOUND_STATUS_CODE","COOKIE_HEADER","ETAG_HEADER","LOCATION_HEADER","IF_NONE_MATCH_HEADER","CACHE_CONTROL_HEADER","defaultPathTemplateCallback","pathTemplate","data","pathTemplateRegExp","dataKeys","Object","keys","replace","match","reduce","value","key","includes","buildEndpoint","basePath","path","optionalPathTemplateRegExp","pathTemplateCallback","pathTemplateData","queryParams","pathJoiner","endsWith","startsWith","endpoint","substring","length","queryString","extract","stringify","Getta","constructor","options","active","pending","Map","bodyParser","cache","enableConditionalRequests","fetchTimeout","headers","maxRedirects","maxRetries","requestRetryWait","streamReader","Error","_basePath","_bodyParser","_cache","_conditionalRequestsEnabled","_fetchTimeout","_headers","_maxRedirects","_maxRetries","_optionalPathTemplateRegExp","_pathTemplateCallback","_pathTemplateRegExp","_queryParams","_requestRetryWait","_streamReader","this","createShortcut","name","method","rest","async","_merge","_delete","_get","_request","requestHash","delete","errors","Promise","reject","get","has","error","cacheHeaders","set","md5","_cacheEntryHas","_cacheEntryDelete","_fetch","redirects","retries","resolve","fetchTimer","setTimeout","res","fetch","clearTimeout","status","responseGroup","getResponseGroup","_fetchRedirectHandler","_fetchRetryHandler","fetchRes","undefined","redirectMethod","ms","cacheability","metadata","_cacheability$metadat2","cacheControl","_cacheability$metadat3","noCache","checkTTL","isCacheabilityValid","_cacheEntryGet","Headers","printCacheControl","etag","pendingRequest","_trackRequest","_getResolve","push","cachedData","_cacheEntrySet","_resolvePendingRequests","_requestTracker","filter","responseData","pendingRequests","forEach","_setPendingRequest","resolver","shortcuts","getta"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../getta/src/constants.ts","../getta/src/helpers/default-path-template-callback/index.ts","../getta/src/helpers/build-endpoint/index.ts","../getta/src/main.ts","../getta/src/helpers/get-response-group/index.ts","../getta/src/helpers/delay/index.ts","../getta/src/helpers/is-cacheability-valid/index.ts"],"sourcesContent":["import { PlainObject } from \"@repodog/types\";\n\nexport const ARRAY_BUFFER_FORMAT = \"arrayBuffer\" as const;\nexport const BLOB_FORMAT = \"blob\" as const;\nexport const FORM_DATA_FORMAT = \"formData\" as const;\nexport const JSON_FORMAT = \"json\" as const;\nexport const TEXT_FORMAT = \"text\" as const;\n\nexport const STREAM_READERS = {\n ARRAY_BUFFER_FORMAT,\n BLOB_FORMAT,\n FORM_DATA_FORMAT,\n JSON_FORMAT,\n TEXT_FORMAT,\n};\n\nexport const DEFAULT_BODY_PARSER = (body: PlainObject) => body;\nexport const DEFAULT_FETCH_TIMEOUT = 5000 as const;\nexport const DEFAULT_HEADERS = { \"content-type\": \"application/json\" };\nexport const DEFAULT_MAX_REDIRECTS = 5 as const;\nexport const DEFAULT_MAX_RETRIES = 3 as const;\nexport const DEFAULT_PATH_TEMPLATE_REGEX = /({type})|({id})|({id,\\+})|({brief\\|standard})/g;\nexport const OPTIONAL_PATH_TEMPLATE_REGEX = /({[a-zA-Z0-9_]+\\?})/g;\nexport const DEFAULT_REQUEST_RETRY_WAIT = 100;\n\nexport const MISSING_BASE_PATH_ERROR = `Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.`;\n\nexport const MAX_REDIRECTS_EXCEEDED_ERROR = \"The request exceeded the maximum number of redirects, which is\";\n\nexport const MAX_RETRIES_EXCEEDED_ERROR = \"The request exceeded the maximum number of retries, which is\";\n\nexport const INVALID_FETCH_METHOD_ERROR = \"Getta expected to receive 'get', 'post', 'put' or 'delete', but received\";\n\nexport const RESOURCE_NOT_FOUND_ERROR = \"The requested resource could not been found.\";\n\nexport const FETCH_TIMEOUT_ERROR = \"The request timed out. Getta did not get a response within\";\n\nexport const GET_METHOD = \"get\" as const;\nexport const POST_METHOD = \"post\" as const;\nexport const PUT_METHOD = \"put\" as const;\nexport const DELETE_METHOD = \"delete\" as const;\n\nexport const FETCH_METHODS = [GET_METHOD, POST_METHOD, PUT_METHOD, DELETE_METHOD];\n\nexport const INFORMATION_REPSONSE = \"information\" as const;\nexport const SUCCESSFUL_REPSONSE = \"successful\" as const;\nexport const REDIRECTION_REPSONSE = \"redirection\" as const;\nexport const CLIENT_ERROR_REPSONSE = \"clientError\" as const;\nexport const SERVER_ERROR_REPSONSE = \"serverError\" as const;\n\nexport const NOT_MODIFIED_STATUS_CODE = 304 as const;\nexport const NOT_FOUND_STATUS_CODE = 404 as const;\n\nexport const COOKIE_HEADER = \"Cookie\" as const;\nexport const ETAG_HEADER = \"ETag\" as const;\nexport const LOCATION_HEADER = \"Location\" as const;\nexport const IF_NONE_MATCH_HEADER = \"If-None-Match\" as const;\nexport const CACHE_CONTROL_HEADER = \"Cache-Control\" as const;\n","import { StringObject } from \"@repodog/types\";\n\nexport default function defaultPathTemplateCallback(\n pathTemplate: string,\n data: StringObject,\n pathTemplateRegExp: RegExp,\n) {\n const dataKeys = Object.keys(data);\n\n return pathTemplate.replace(pathTemplateRegExp, match => {\n return dataKeys.reduce((value, key) => {\n if (match.includes(key)) return data[key];\n return value;\n }, \"\");\n });\n}\n","import queryString from \"query-string\";\nimport { BuildEndpointOptions } from \"./types\";\n\nexport default function buildEndpoint(\n basePath: string,\n path: string,\n {\n optionalPathTemplateRegExp,\n pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp,\n queryParams,\n }: BuildEndpointOptions,\n) {\n const pathJoiner = basePath.endsWith(\"/\") || path.startsWith(\"/\") ? \"\" : \"/\";\n let endpoint = `${basePath}${pathJoiner}${path}`;\n\n if (pathTemplateData) {\n endpoint = pathTemplateCallback(endpoint, pathTemplateData, pathTemplateRegExp);\n }\n\n endpoint = endpoint.replace(optionalPathTemplateRegExp, \"\");\n\n if (endpoint.endsWith(\"/\")) {\n endpoint = endpoint.substring(0, endpoint.length - 1);\n }\n\n if (queryParams && Object.keys(queryParams).length) {\n const queryJoin = queryString.extract(endpoint) ? \"&\" : \"?\";\n endpoint = `${endpoint}${queryJoin}${queryString.stringify(queryParams)}`;\n }\n\n return endpoint;\n}\n","import Cachemap, { CacheHeaders } from \"@cachemap/core\";\nimport { Func, PlainObject, StringObject } from \"@repodog/types\";\nimport Cacheability from \"cacheability\";\nimport { castArray, merge } from \"lodash\";\nimport md5 from \"md5\";\nimport { Required } from \"utility-types\";\nimport {\n CACHE_CONTROL_HEADER,\n DEFAULT_BODY_PARSER,\n DEFAULT_FETCH_TIMEOUT,\n DEFAULT_HEADERS,\n DEFAULT_MAX_REDIRECTS,\n DEFAULT_MAX_RETRIES,\n DEFAULT_PATH_TEMPLATE_REGEX,\n DEFAULT_REQUEST_RETRY_WAIT,\n DELETE_METHOD,\n ETAG_HEADER,\n FETCH_METHODS,\n FETCH_TIMEOUT_ERROR,\n GET_METHOD,\n IF_NONE_MATCH_HEADER,\n INVALID_FETCH_METHOD_ERROR,\n JSON_FORMAT,\n LOCATION_HEADER,\n MAX_REDIRECTS_EXCEEDED_ERROR,\n MAX_RETRIES_EXCEEDED_ERROR,\n MISSING_BASE_PATH_ERROR,\n NOT_FOUND_STATUS_CODE,\n NOT_MODIFIED_STATUS_CODE,\n OPTIONAL_PATH_TEMPLATE_REGEX,\n POST_METHOD,\n PUT_METHOD,\n REDIRECTION_REPSONSE,\n RESOURCE_NOT_FOUND_ERROR,\n SERVER_ERROR_REPSONSE,\n} from \"./constants\";\nimport buildEndpoint from \"./helpers/build-endpoint\";\nimport defaultPathTemplateCallback from \"./helpers/default-path-template-callback\";\nimport delay from \"./helpers/delay\";\nimport getResponseGroup from \"./helpers/get-response-group\";\nimport isCacheabilityValid from \"./helpers/is-cacheability-valid\";\nimport {\n ConstructorOptions,\n FetchOptions,\n FetchRedirectHandlerOptions,\n FetchResponse,\n PathTemplateCallback,\n PendingRequestResolver,\n PendingRequestResolvers,\n RequestOptions,\n RequestTracker,\n ShortcutProperties,\n Shortcuts,\n StreamReader,\n} from \"./types\";\n\nexport class Getta {\n private _basePath: string;\n private _bodyParser: Func;\n private _cache?: Cachemap;\n private _conditionalRequestsEnabled: boolean;\n private _fetchTimeout: number;\n private _headers: StringObject;\n private _maxRedirects: number;\n private _maxRetries: number;\n private _optionalPathTemplateRegExp: RegExp;\n private _pathTemplateCallback: PathTemplateCallback;\n private _pathTemplateRegExp: RegExp;\n private _queryParams: PlainObject;\n private _requestRetryWait: number;\n private _requestTracker: RequestTracker = { active: [], pending: new Map() };\n private _streamReader: StreamReader;\n\n constructor(options: ConstructorOptions) {\n const {\n basePath,\n bodyParser = DEFAULT_BODY_PARSER,\n cache,\n enableConditionalRequests = true,\n fetchTimeout = DEFAULT_FETCH_TIMEOUT,\n headers,\n maxRedirects = DEFAULT_MAX_REDIRECTS,\n maxRetries = DEFAULT_MAX_RETRIES,\n optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,\n pathTemplateCallback = defaultPathTemplateCallback,\n pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,\n queryParams = {},\n requestRetryWait = DEFAULT_REQUEST_RETRY_WAIT,\n streamReader = JSON_FORMAT,\n } = options;\n\n if (!basePath) {\n throw new Error(MISSING_BASE_PATH_ERROR);\n }\n\n this._basePath = basePath;\n this._bodyParser = bodyParser;\n this._cache = cache;\n this._conditionalRequestsEnabled = enableConditionalRequests;\n this._fetchTimeout = fetchTimeout;\n this._headers = { ...DEFAULT_HEADERS, ...(headers || {}) };\n this._maxRedirects = maxRedirects;\n this._maxRetries = maxRetries;\n this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;\n this._pathTemplateCallback = pathTemplateCallback;\n this._pathTemplateRegExp = pathTemplateRegExp;\n this._queryParams = queryParams;\n this._requestRetryWait = requestRetryWait;\n this._streamReader = streamReader;\n }\n\n get cache(): Cachemap | undefined {\n return this._cache;\n }\n\n public createShortcut(name: string, path: string, { method, ...rest }: Required<RequestOptions, \"method\">) {\n if (!FETCH_METHODS.includes(method)) {\n throw new Error(`${INVALID_FETCH_METHOD_ERROR} ${method}`);\n }\n\n // @ts-ignore\n this[name] = async <Resource extends PlainObject>({ method: requestMethod, ...requestRest }: RequestOptions = {}) =>\n // @ts-ignore\n this[requestMethod ?? method](path, merge({}, rest, requestRest)) as Promise<FetchResponse<Resource>>;\n }\n\n public async delete(path: string, options: Omit<RequestOptions, \"method\"> = {}) {\n return this._delete(path, options);\n }\n\n public async get(path: string, options: Omit<RequestOptions, \"method\"> = {}) {\n return this._get(path, options);\n }\n\n public async post(path: string, options: Omit<Required<RequestOptions, \"body\">, \"method\">) {\n return this._request(path, { ...options, method: POST_METHOD });\n }\n\n public async put(path: string, options: Omit<Required<RequestOptions, \"body\">, \"methood\">) {\n return this._request(path, { ...options, method: PUT_METHOD });\n }\n\n private async _cacheEntryDelete(requestHash: string): Promise<boolean> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.delete(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryGet(requestHash: string): Promise<PlainObject | undefined> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.get(requestHash);\n } catch (errors) {\n return Promise.reject(errors);\n }\n }\n\n private async _cacheEntryHas(requestHash: string): Promise<Cacheability | false> {\n if (!this._cache) return false;\n\n try {\n return await this._cache.has(requestHash);\n } catch (error) {\n return false;\n }\n }\n\n private async _cacheEntrySet(requestHash: string, data: PlainObject, cacheHeaders: CacheHeaders): Promise<void> {\n if (!this._cache) return undefined;\n\n try {\n return await this._cache.set(requestHash, data, { cacheHeaders });\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n private async _delete(\n path: string,\n { headers = {}, pathTemplateData, queryParams = {}, ...rest }: Omit<RequestOptions, \"method\">,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n this._cacheEntryDelete(requestHash);\n }\n\n return this._fetch(endpoint, {\n headers: { ...this._headers, ...headers },\n method: DELETE_METHOD,\n ...rest,\n });\n }\n\n private async _fetch(endpoint: string, { redirects, retries, ...rest }: FetchOptions): Promise<FetchResponse> {\n try {\n return new Promise(async (resolve: (value: FetchResponse) => void, reject) => {\n const fetchTimer = setTimeout(() => {\n reject(new Error(`${FETCH_TIMEOUT_ERROR} ${this._fetchTimeout}ms.`));\n }, this._fetchTimeout);\n\n const res = await fetch(endpoint, rest);\n\n clearTimeout(fetchTimer);\n\n const { headers, status } = res;\n const responseGroup = getResponseGroup(status);\n\n if (responseGroup === REDIRECTION_REPSONSE && headers.get(LOCATION_HEADER)) {\n resolve(\n await this._fetchRedirectHandler(headers.get(LOCATION_HEADER) as string, {\n redirects,\n status,\n ...rest,\n }),\n );\n }\n\n if (responseGroup === SERVER_ERROR_REPSONSE) {\n resolve(\n (await this._fetchRetryHandler(endpoint, {\n retries,\n ...rest,\n })) as FetchResponse,\n );\n }\n\n const fetchRes = res as FetchResponse;\n const resClone = res.clone();\n\n try {\n fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;\n resolve(fetchRes);\n } catch (e) {\n try {\n if (this._streamReader === \"json\" && res.body) {\n const fetchResClone = resClone as FetchResponse;\n fetchResClone.data = JSON.parse(await resClone.text());\n resolve(fetchResClone);\n } else {\n reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);\n }\n } catch {\n reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);\n }\n }\n });\n } catch (error) {\n const errorRes = { errors: castArray(error) };\n return errorRes as FetchResponse;\n }\n }\n\n private async _fetchRedirectHandler(\n endpoint: string,\n { method, redirects = 1, status, ...rest }: FetchRedirectHandlerOptions,\n ): Promise<FetchResponse> {\n if (redirects === this._maxRedirects) {\n const errorRes = {\n errors: [new Error(`${MAX_REDIRECTS_EXCEEDED_ERROR} ${this._maxRedirects}.`)],\n };\n\n return errorRes as FetchResponse;\n }\n\n redirects += 1;\n const redirectMethod = status === 303 ? GET_METHOD : method;\n return this._fetch(endpoint, { method: redirectMethod, redirects, ...rest });\n }\n\n private async _fetchRetryHandler(endpoint: string, { retries = 1, ...rest }: FetchOptions) {\n if (retries === this._maxRetries) {\n return {\n errors: [new Error(`${MAX_RETRIES_EXCEEDED_ERROR} ${this._maxRetries}.`)],\n };\n }\n\n retries += 1;\n await delay(this._requestRetryWait);\n return this._fetch(endpoint, { retries, ...rest });\n }\n\n private async _get(\n path: string,\n { headers = {}, pathTemplateData, queryParams = {} }: Omit<RequestOptions, \"method\">,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n const requestHash = md5(endpoint);\n const cacheability = await this._cacheEntryHas(requestHash);\n\n if (cacheability) {\n if (isCacheabilityValid(cacheability)) {\n return {\n data: await this._cacheEntryGet(requestHash),\n headers: new Headers({ \"cache-control\": cacheability.printCacheControl() }),\n };\n }\n\n if (this._conditionalRequestsEnabled) {\n const etag = cacheability?.metadata?.etag ?? null;\n if (etag) headers[IF_NONE_MATCH_HEADER] = etag;\n }\n }\n\n const pendingRequest = this._trackRequest(requestHash);\n if (pendingRequest) return pendingRequest;\n\n return this._getResolve(\n requestHash,\n await this._fetch(endpoint, { headers: { ...this._headers, ...headers }, method: GET_METHOD }),\n );\n }\n\n private async _getResolve(requestHash: string, res: FetchResponse) {\n const { data, headers, status } = res;\n\n if (status === NOT_FOUND_STATUS_CODE) {\n this._cacheEntryDelete(requestHash);\n\n if (!res.errors) {\n res.errors = [];\n }\n\n res.errors.push(new Error(RESOURCE_NOT_FOUND_ERROR));\n } else if (status === NOT_MODIFIED_STATUS_CODE && headers) {\n const cachedData = await this._cacheEntryGet(requestHash);\n\n if (cachedData) {\n this._cacheEntrySet(requestHash, cachedData, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n\n res.data = cachedData;\n }\n } else if (data && headers) {\n this._cacheEntrySet(requestHash, data, {\n cacheControl: headers.get(CACHE_CONTROL_HEADER) || undefined,\n etag: headers.get(ETAG_HEADER) || undefined,\n });\n }\n\n this._resolvePendingRequests(requestHash, res);\n this._requestTracker.active = this._requestTracker.active.filter(value => value !== requestHash);\n return res;\n }\n\n private async _request(\n path: string,\n { body, headers, method, pathTemplateData, queryParams, ...rest }: Required<RequestOptions, \"method\">,\n ) {\n const endpoint = buildEndpoint(this._basePath, path, {\n optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,\n pathTemplateCallback: this._pathTemplateCallback,\n pathTemplateData,\n pathTemplateRegExp: this._pathTemplateRegExp,\n queryParams: { ...this._queryParams, ...queryParams },\n });\n\n return this._fetch(endpoint, {\n body,\n headers: { ...this._headers, ...headers },\n method,\n ...rest,\n });\n }\n\n private _resolvePendingRequests(requestHash: string, responseData: FetchResponse) {\n const pendingRequests = this._requestTracker.pending.get(requestHash);\n if (!pendingRequests) return;\n\n pendingRequests.forEach(({ resolve }) => {\n resolve(responseData);\n });\n\n this._requestTracker.pending.delete(requestHash);\n }\n\n private _setPendingRequest(requestHash: string, resolver: PendingRequestResolvers) {\n let pending = this._requestTracker.pending.get(requestHash);\n if (!pending) pending = [];\n pending.push(resolver);\n this._requestTracker.pending.set(requestHash, pending);\n }\n\n private _trackRequest(requestHash: string): Promise<FetchResponse> | void {\n if (this._requestTracker.active.includes(requestHash)) {\n return new Promise((resolve: PendingRequestResolver) => {\n this._setPendingRequest(requestHash, { resolve });\n });\n }\n\n this._requestTracker.active.push(requestHash);\n }\n}\n\nexport default function createRestClient<N extends string>(options: ConstructorOptions, shortcuts?: Shortcuts) {\n const getta = new Getta(options) as Getta & ShortcutProperties<N>;\n if (!shortcuts) return getta;\n\n Object.keys(shortcuts).forEach(key => {\n getta.createShortcut(key, ...shortcuts[key]);\n });\n\n return getta;\n}\n","import {\n CLIENT_ERROR_REPSONSE,\n INFORMATION_REPSONSE,\n REDIRECTION_REPSONSE,\n SERVER_ERROR_REPSONSE,\n SUCCESSFUL_REPSONSE,\n} from \"../../constants\";\n\nexport default function getResponseGroup(status: number) {\n switch (true) {\n case status < 200:\n return INFORMATION_REPSONSE;\n case status < 300:\n return SUCCESSFUL_REPSONSE;\n case status < 400:\n return REDIRECTION_REPSONSE;\n case status < 500:\n return CLIENT_ERROR_REPSONSE;\n default:\n return SERVER_ERROR_REPSONSE;\n }\n}\n","export default function delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import Cacheability from \"cacheability\";\n\nexport default function isCacheabilityValid(cacheability: Cacheability) {\n const noCache = cacheability?.metadata?.cacheControl?.noCache ?? false;\n return !noCache && cacheability.checkTTL();\n}\n"],"names":["ARRAY_BUFFER_FORMAT","BLOB_FORMAT","FORM_DATA_FORMAT","JSON_FORMAT","TEXT_FORMAT","STREAM_READERS","DEFAULT_BODY_PARSER","body","DEFAULT_FETCH_TIMEOUT","DEFAULT_HEADERS","DEFAULT_MAX_REDIRECTS","DEFAULT_MAX_RETRIES","DEFAULT_PATH_TEMPLATE_REGEX","OPTIONAL_PATH_TEMPLATE_REGEX","DEFAULT_REQUEST_RETRY_WAIT","MISSING_BASE_PATH_ERROR","MAX_REDIRECTS_EXCEEDED_ERROR","MAX_RETRIES_EXCEEDED_ERROR","INVALID_FETCH_METHOD_ERROR","RESOURCE_NOT_FOUND_ERROR","FETCH_TIMEOUT_ERROR","GET_METHOD","POST_METHOD","PUT_METHOD","DELETE_METHOD","FETCH_METHODS","INFORMATION_REPSONSE","SUCCESSFUL_REPSONSE","REDIRECTION_REPSONSE","CLIENT_ERROR_REPSONSE","SERVER_ERROR_REPSONSE","NOT_MODIFIED_STATUS_CODE","NOT_FOUND_STATUS_CODE","COOKIE_HEADER","ETAG_HEADER","LOCATION_HEADER","IF_NONE_MATCH_HEADER","CACHE_CONTROL_HEADER","defaultPathTemplateCallback","pathTemplate","data","pathTemplateRegExp","dataKeys","Object","keys","replace","match","reduce","value","key","includes","buildEndpoint","basePath","path","optionalPathTemplateRegExp","pathTemplateCallback","pathTemplateData","queryParams","pathJoiner","endsWith","startsWith","endpoint","substring","length","queryString","extract","stringify","Getta","constructor","options","active","pending","Map","bodyParser","cache","enableConditionalRequests","fetchTimeout","headers","maxRedirects","maxRetries","requestRetryWait","streamReader","Error","_basePath","_bodyParser","_cache","_conditionalRequestsEnabled","_fetchTimeout","_headers","_maxRedirects","_maxRetries","_optionalPathTemplateRegExp","_pathTemplateCallback","_pathTemplateRegExp","_queryParams","_requestRetryWait","_streamReader","this","createShortcut","name","method","rest","async","requestMethod","requestRest","_merge","_delete","_get","_request","requestHash","delete","errors","Promise","reject","get","has","error","cacheHeaders","set","md5","_cacheEntryHas","_cacheEntryDelete","_fetch","redirects","retries","resolve","fetchTimer","setTimeout","res","fetch","clearTimeout","status","responseGroup","getResponseGroup","_fetchRedirectHandler","_fetchRetryHandler","fetchRes","resClone","clone","undefined","e","fetchResClone","JSON","parse","text","_castArray","redirectMethod","ms","cacheability","metadata","_cacheability$metadat2","cacheControl","_cacheability$metadat3","noCache","checkTTL","isCacheabilityValid","_cacheEntryGet","Headers","printCacheControl","etag","pendingRequest","_trackRequest","_getResolve","push","cachedData","_cacheEntrySet","_resolvePendingRequests","_requestTracker","filter","responseData","pendingRequests","forEach","_setPendingRequest","resolver","shortcuts","getta"],"mappings":"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"}
@@ -1,23 +1,23 @@
1
1
  -----------------------------
2
2
  Rollup File Analysis
3
3
  -----------------------------
4
- bundle size: 15.074 KB
5
- original size: 19.812 KB
6
- code reduction: 23.91 %
4
+ bundle size: 15.792 KB
5
+ original size: 20.612 KB
6
+ code reduction: 23.38 %
7
7
  module count: 9
8
8
 
9
- ████████████████████████████████████░░░░░░░░░░░░░░
9
+ █████████████████████████████████████░░░░░░░░░░░░░
10
10
  file: /src/main.ts
11
- bundle space: 72.89 %
12
- rendered size: 10.988 KB
13
- original size: 12.891 KB
14
- code reduction: 14.76 %
11
+ bundle space: 74.13 %
12
+ rendered size: 11.706 KB
13
+ original size: 13.691 KB
14
+ code reduction: 14.5 %
15
15
  dependents: 1
16
16
  - /src/index.ts
17
17
 
18
18
  ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
19
19
  file: /src/constants.ts
20
- bundle space: 12.95 %
20
+ bundle space: 12.36 %
21
21
  rendered size: 1.952 KB
22
22
  original size: 2.502 KB
23
23
  code reduction: 21.98 %
@@ -28,16 +28,16 @@ dependents: 3
28
28
 
29
29
  ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
30
30
  file: /src/helpers/build-endpoint/index.ts
31
- bundle space: 5.24 %
31
+ bundle space: 5 %
32
32
  rendered size: 790 Bytes
33
33
  original size: 955 Bytes
34
34
  code reduction: 17.28 %
35
35
  dependents: 1
36
36
  - /src/main.ts
37
37
 
38
- ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
38
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
39
39
  file: /src/helpers/is-cacheability-valid/index.ts
40
- bundle space: 4.04 %
40
+ bundle space: 3.86 %
41
41
  rendered size: 609 Bytes
42
42
  original size: 238 Bytes
43
43
  code reduction: 0 %
@@ -46,16 +46,16 @@ dependents: 1
46
46
 
47
47
  █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
48
48
  file: /src/helpers/get-response-group/index.ts
49
- bundle space: 2.28 %
49
+ bundle space: 2.18 %
50
50
  rendered size: 344 Bytes
51
51
  original size: 521 Bytes
52
52
  code reduction: 33.97 %
53
53
  dependents: 1
54
54
  - /src/main.ts
55
55
 
56
- █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
56
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
57
57
  file: /src/helpers/default-path-template-callback/index.ts
58
- bundle space: 2.06 %
58
+ bundle space: 1.97 %
59
59
  rendered size: 311 Bytes
60
60
  original size: 415 Bytes
61
61
  code reduction: 25.06 %
@@ -65,7 +65,7 @@ dependents: 2
65
65
 
66
66
  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
67
67
  file: /src/helpers/delay/index.ts
68
- bundle space: 0.53 %
68
+ bundle space: 0.51 %
69
69
  rendered size: 80 Bytes
70
70
  original size: 104 Bytes
71
71
  code reduction: 23.08 %
package/lib/main/main.js CHANGED
@@ -14,6 +14,8 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
14
14
 
15
15
  var _merge2 = _interopRequireDefault(require("lodash/merge"));
16
16
 
17
+ var _castArray2 = _interopRequireDefault(require("lodash/castArray"));
18
+
17
19
  var _md = _interopRequireDefault(require("md5"));
18
20
 
19
21
  var _constants = require("./constants");
@@ -99,7 +101,10 @@ class Getta {
99
101
  throw new Error(`${_constants.INVALID_FETCH_METHOD_ERROR} ${method}`);
100
102
  }
101
103
 
102
- this[name] = async (options = {}) => this[method](path, (0, _merge2.default)({}, rest, options));
104
+ this[name] = async ({
105
+ method: requestMethod,
106
+ ...requestRest
107
+ } = {}) => this[requestMethod !== null && requestMethod !== void 0 ? requestMethod : method](path, (0, _merge2.default)({}, rest, requestRest));
103
108
  }
104
109
 
105
110
  async delete(path, options = {}) {
@@ -229,12 +234,28 @@ class Getta {
229
234
  }
230
235
 
231
236
  const fetchRes = res;
232
- fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
233
- resolve(fetchRes);
237
+ const resClone = res.clone();
238
+
239
+ try {
240
+ fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
241
+ resolve(fetchRes);
242
+ } catch (e) {
243
+ try {
244
+ if (this._streamReader === "json" && res.body) {
245
+ const fetchResClone = resClone;
246
+ fetchResClone.data = JSON.parse(await resClone.text());
247
+ resolve(fetchResClone);
248
+ } else {
249
+ reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);
250
+ }
251
+ } catch {
252
+ reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);
253
+ }
254
+ }
234
255
  });
235
256
  } catch (error) {
236
257
  const errorRes = {
237
- errors: [error]
258
+ errors: (0, _castArray2.default)(error)
238
259
  };
239
260
  return errorRes;
240
261
  }
@@ -1,5 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import _merge from "lodash/merge";
3
+ import _castArray from "lodash/castArray";
3
4
  import "core-js/modules/es.promise.js";
4
5
  import md5 from "md5";
5
6
  import { CACHE_CONTROL_HEADER, DEFAULT_BODY_PARSER, DEFAULT_FETCH_TIMEOUT, DEFAULT_HEADERS, DEFAULT_MAX_REDIRECTS, DEFAULT_MAX_RETRIES, DEFAULT_PATH_TEMPLATE_REGEX, DEFAULT_REQUEST_RETRY_WAIT, DELETE_METHOD, ETAG_HEADER, FETCH_METHODS, FETCH_TIMEOUT_ERROR, GET_METHOD, IF_NONE_MATCH_HEADER, INVALID_FETCH_METHOD_ERROR, JSON_FORMAT, LOCATION_HEADER, MAX_REDIRECTS_EXCEEDED_ERROR, MAX_RETRIES_EXCEEDED_ERROR, MISSING_BASE_PATH_ERROR, NOT_FOUND_STATUS_CODE, NOT_MODIFIED_STATUS_CODE, OPTIONAL_PATH_TEMPLATE_REGEX, POST_METHOD, PUT_METHOD, REDIRECTION_REPSONSE, RESOURCE_NOT_FOUND_ERROR, SERVER_ERROR_REPSONSE } from "./constants";
@@ -94,7 +95,10 @@ export class Getta {
94
95
  throw new Error(`${INVALID_FETCH_METHOD_ERROR} ${method}`);
95
96
  }
96
97
 
97
- this[name] = async (options = {}) => this[method](path, _merge({}, rest, options));
98
+ this[name] = async ({
99
+ method: requestMethod,
100
+ ...requestRest
101
+ } = {}) => this[requestMethod !== null && requestMethod !== void 0 ? requestMethod : method](path, _merge({}, rest, requestRest));
98
102
  }
99
103
 
100
104
  async delete(path, options = {}) {
@@ -224,12 +228,28 @@ export class Getta {
224
228
  }
225
229
 
226
230
  const fetchRes = res;
227
- fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
228
- resolve(fetchRes);
231
+ const resClone = res.clone();
232
+
233
+ try {
234
+ fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
235
+ resolve(fetchRes);
236
+ } catch (e) {
237
+ try {
238
+ if (this._streamReader === "json" && res.body) {
239
+ const fetchResClone = resClone;
240
+ fetchResClone.data = JSON.parse(await resClone.text());
241
+ resolve(fetchResClone);
242
+ } else {
243
+ reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);
244
+ }
245
+ } catch {
246
+ reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);
247
+ }
248
+ }
229
249
  });
230
250
  } catch (error) {
231
251
  const errorRes = {
232
- errors: [error]
252
+ errors: _castArray(error)
233
253
  };
234
254
  return errorRes;
235
255
  }
@@ -21,13 +21,13 @@ export declare class Getta {
21
21
  constructor(options: ConstructorOptions);
22
22
  get cache(): Cachemap | undefined;
23
23
  createShortcut(name: string, path: string, { method, ...rest }: Required<RequestOptions, "method">): void;
24
- delete(path: string, options?: RequestOptions): Promise<FetchResponse<PlainObject>>;
25
- get(path: string, options?: RequestOptions): Promise<FetchResponse<PlainObject> | {
24
+ delete(path: string, options?: Omit<RequestOptions, "method">): Promise<FetchResponse<PlainObject>>;
25
+ get(path: string, options?: Omit<RequestOptions, "method">): Promise<FetchResponse<PlainObject> | {
26
26
  data: PlainObject | undefined;
27
27
  headers: Headers;
28
28
  }>;
29
- post(path: string, options: Required<RequestOptions, "body">): Promise<FetchResponse<PlainObject>>;
30
- put(path: string, options: Required<RequestOptions, "body">): Promise<FetchResponse<PlainObject>>;
29
+ post(path: string, options: Omit<Required<RequestOptions, "body">, "method">): Promise<FetchResponse<PlainObject>>;
30
+ put(path: string, options: Omit<Required<RequestOptions, "body">, "methood">): Promise<FetchResponse<PlainObject>>;
31
31
  private _cacheEntryDelete;
32
32
  private _cacheEntryGet;
33
33
  private _cacheEntryHas;
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,QAA0B,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAQ,WAAW,EAAgB,MAAM,gBAAgB,CAAC;AAIjE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAoCzC,OAAO,EACL,kBAAkB,EAGlB,aAAa,EAIb,cAAc,EAEd,kBAAkB,EAClB,SAAS,EAEV,MAAM,SAAS,CAAC;AAEjB,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,2BAA2B,CAAU;IAC7C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAsD;IAC7E,OAAO,CAAC,aAAa,CAAe;gBAExB,OAAO,EAAE,kBAAkB;IAsCvC,IAAI,KAAK,IAAI,QAAQ,GAAG,SAAS,CAEhC;IAEM,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAW5F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB;IAIjD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB;;;;IAI9C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAI5D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;YAI1D,iBAAiB;YAUjB,cAAc;YAUd,cAAc;YAUd,cAAc;YAUd,OAAO;YAuBP,MAAM;YA2CN,qBAAqB;YAiBrB,kBAAkB;YAYlB,IAAI;YAmCJ,WAAW;YAkCX,QAAQ;IAoBtB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;CAStB;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAE,SAAS,iCAS5G"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,QAA0B,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAQ,WAAW,EAAgB,MAAM,gBAAgB,CAAC;AAIjE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAoCzC,OAAO,EACL,kBAAkB,EAGlB,aAAa,EAIb,cAAc,EAEd,kBAAkB,EAClB,SAAS,EAEV,MAAM,SAAS,CAAC;AAEjB,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,2BAA2B,CAAU;IAC7C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAsD;IAC7E,OAAO,CAAC,aAAa,CAAe;gBAExB,OAAO,EAAE,kBAAkB;IAsCvC,IAAI,KAAK,IAAI,QAAQ,GAAG,SAAS,CAEhC;IAEM,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAW5F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAM;IAIjE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAM;;;;IAI9D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;IAI5E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC;YAI3E,iBAAiB;YAUjB,cAAc;YAUd,cAAc;YAUd,cAAc;YAUd,OAAO;YA0BP,MAAM;YA2DN,qBAAqB;YAiBrB,kBAAkB;YAYlB,IAAI;YAsCJ,WAAW;YAkCX,QAAQ;IAoBtB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;CAStB;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAE,SAAS,iCAS5G"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "getta",
3
- "version": "0.1.22",
3
+ "version": "0.2.2",
4
4
  "description": "An isomorphic rest client based on the Fetch API.",
5
5
  "keywords": [
6
6
  "api-client",
package/src/main.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import Cachemap, { CacheHeaders } from "@cachemap/core";
2
2
  import { Func, PlainObject, StringObject } from "@repodog/types";
3
3
  import Cacheability from "cacheability";
4
- import { merge } from "lodash";
4
+ import { castArray, merge } from "lodash";
5
5
  import md5 from "md5";
6
6
  import { Required } from "utility-types";
7
7
  import {
@@ -119,24 +119,24 @@ export class Getta {
119
119
  }
120
120
 
121
121
  // @ts-ignore
122
- this[name] = async <Resource extends PlainObject>(options: RequestOptions = {}) =>
122
+ this[name] = async <Resource extends PlainObject>({ method: requestMethod, ...requestRest }: RequestOptions = {}) =>
123
123
  // @ts-ignore
124
- this[method](path, merge({}, rest, options)) as Promise<FetchResponse<Resource>>;
124
+ this[requestMethod ?? method](path, merge({}, rest, requestRest)) as Promise<FetchResponse<Resource>>;
125
125
  }
126
126
 
127
- public async delete(path: string, options: RequestOptions = {}) {
127
+ public async delete(path: string, options: Omit<RequestOptions, "method"> = {}) {
128
128
  return this._delete(path, options);
129
129
  }
130
130
 
131
- public async get(path: string, options: RequestOptions = {}) {
131
+ public async get(path: string, options: Omit<RequestOptions, "method"> = {}) {
132
132
  return this._get(path, options);
133
133
  }
134
134
 
135
- public async post(path: string, options: Required<RequestOptions, "body">) {
135
+ public async post(path: string, options: Omit<Required<RequestOptions, "body">, "method">) {
136
136
  return this._request(path, { ...options, method: POST_METHOD });
137
137
  }
138
138
 
139
- public async put(path: string, options: Required<RequestOptions, "body">) {
139
+ public async put(path: string, options: Omit<Required<RequestOptions, "body">, "methood">) {
140
140
  return this._request(path, { ...options, method: PUT_METHOD });
141
141
  }
142
142
 
@@ -180,7 +180,10 @@ export class Getta {
180
180
  }
181
181
  }
182
182
 
183
- private async _delete(path: string, { headers = {}, pathTemplateData, queryParams = {}, ...rest }: RequestOptions) {
183
+ private async _delete(
184
+ path: string,
185
+ { headers = {}, pathTemplateData, queryParams = {}, ...rest }: Omit<RequestOptions, "method">,
186
+ ) {
184
187
  const endpoint = buildEndpoint(this._basePath, path, {
185
188
  optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
186
189
  pathTemplateCallback: this._pathTemplateCallback,
@@ -237,11 +240,27 @@ export class Getta {
237
240
  }
238
241
 
239
242
  const fetchRes = res as FetchResponse;
240
- fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
241
- resolve(fetchRes);
243
+ const resClone = res.clone();
244
+
245
+ try {
246
+ fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
247
+ resolve(fetchRes);
248
+ } catch (e) {
249
+ try {
250
+ if (this._streamReader === "json" && res.body) {
251
+ const fetchResClone = resClone as FetchResponse;
252
+ fetchResClone.data = JSON.parse(await resClone.text());
253
+ resolve(fetchResClone);
254
+ } else {
255
+ reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);
256
+ }
257
+ } catch {
258
+ reject([e, new Error(`Unable to ${rest.method} ${endpoint} due to previous error`)]);
259
+ }
260
+ }
242
261
  });
243
262
  } catch (error) {
244
- const errorRes = { errors: [error] };
263
+ const errorRes = { errors: castArray(error) };
245
264
  return errorRes as FetchResponse;
246
265
  }
247
266
  }
@@ -275,7 +294,10 @@ export class Getta {
275
294
  return this._fetch(endpoint, { retries, ...rest });
276
295
  }
277
296
 
278
- private async _get(path: string, { headers = {}, pathTemplateData, queryParams = {} }: RequestOptions) {
297
+ private async _get(
298
+ path: string,
299
+ { headers = {}, pathTemplateData, queryParams = {} }: Omit<RequestOptions, "method">,
300
+ ) {
279
301
  const endpoint = buildEndpoint(this._basePath, path, {
280
302
  optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
281
303
  pathTemplateCallback: this._pathTemplateCallback,