getta 0.1.8 → 0.1.12

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.1.11 (2021-10-19)
2
+
3
+ ##### Bug Fixes
4
+
5
+ * update shorthand method signature ([7880912c](https://github.com/badbatch/getta/commit/7880912cbfc9083aa4f41d357a9bba6db7c4ccdf))
6
+
7
+ #### 0.1.10 (2021-10-19)
8
+
9
+ ##### New Features
10
+
11
+ * pass resource type into shorthand method ([1922e959](https://github.com/badbatch/getta/commit/1922e9599389ab75c5d47ccbd761d8b4cdd9ec49))
12
+
13
+ #### 0.1.9 (2021-10-19)
14
+
15
+ ##### Bug Fixes
16
+
17
+ * shortand return type is wrong ([7da27bf0](https://github.com/badbatch/getta/commit/7da27bf0e4207fdfe04f99bae9614bb9103c0c02))
18
+
1
19
  #### 0.1.8 (2021-10-19)
2
20
 
3
21
  ##### Bug Fixes
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  An isomorphic rest client based on the Fetch API.
4
4
 
5
- [![Build Status](https://travis-ci.com/badbatch/getta.svg?branch=master)](https://travis-ci.com/badbatch/getta)
5
+ [![build-and-deploy](https://github.com/badbatch/getta/actions/workflows/build-and-deploy.yml/badge.svg)](https://github.com/badbatch/getta/actions/workflows/build-and-deploy.yml)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
  [![npm version](https://badge.fury.io/js/getta.svg)](https://badge.fury.io/js/getta)
8
8
 
@@ -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 r from"md5";import a from"query-string";const s="arrayBuffer",i="blob",h="formData",c="json",n="text",o={ARRAY_BUFFER_FORMAT:"arrayBuffer",BLOB_FORMAT:"blob",FORM_DATA_FORMAT:"formData",JSON_FORMAT:c,TEXT_FORMAT:"text"},u=e=>e,d=5e3,l={"content-type":"application/json"},m=5,_=3,p=/({type})|({id})|({id,\+})|({brief\|standard})/g,y=100,f="Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.",T="The request exceeded the maximum number of redirects, which is",R="The request exceeded the maximum number of retries, which is",g="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",E="post",x="put",P="delete",w=["get","post","put","delete"],k="information",C="successful",D="redirection",O="clientError",j="serverError",$=304,A=404,M="Cookie",F="ETag",H="Location",G="If-None-Match",S="Cache-Control";function W(e,t,r){const a=Object.keys(t);return e.replace(r,e=>a.reduce((r,a)=>e.includes(a)?t[a]:r,""))}function B(e,t,{pathTemplateCallback:r,pathTemplateData:s,pathTemplateRegExp:i,queryParams:h}){const c=e.endsWith("/")||t.startsWith("/")?"":"/";let n=`${e}${c}${t}`;if(s&&(n=r(n,s,i)),h&&Object.keys(h).length){n=`${n}${a.extract(n)?"&":"?"}${a.stringify(h)}`}return n}class L{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,"_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=d,headers:n,maxRedirects:o=m,maxRetries:T=_,pathTemplateCallback:R=W,pathTemplateRegExp:g=p,queryParams:v={},requestRetryWait:b=y,streamReader:q=c}=t;if(!r)throw new Error(f);this._basePath=r,this._bodyParser=a,this._cache=s,this._conditionalRequestsEnabled=i,this._fetchTimeout=h,this._headers={...l,...n||{}},this._maxRedirects=o,this._maxRetries=T,this._pathTemplateCallback=R,this._pathTemplateRegExp=g,this._queryParams=v,this._requestRetryWait=b,this._streamReader=q}get cache(){return this._cache}createShortcut(e,r,{method:a,...s}){if(!w.includes(a))throw new Error("Getta expected to receive 'get', 'post', 'put' or 'delete', but received "+a);this[e]=async(e={})=>this[a](r,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,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:a,queryParams:s={},...i}){const h=B(this._basePath,e,{pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:a,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}}),c=r(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:r,...a}){try{return new Promise(async(s,i)=>{const h=setTimeout(()=>{i(new Error(`${b} ${this._fetchTimeout}ms.`))},this._fetchTimeout),c=await fetch(e,a);clearTimeout(h);const{headers:n,status:o}=c,u=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"}}(o);"redirection"===u&&n.get("Location")&&s(await this._fetchRedirectHandler(n.get("Location"),{redirects:t,status:o,...a})),"serverError"===u&&s(await this._fetchRetryHandler(e,{retries:r,...a})),s({...c,data:c.body?this._bodyParser(await c[this._streamReader]()):void 0})})}catch(e){return{errors:[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:a,queryParams:s={}}){const i=B(this._basePath,e,{pathTemplateCallback:this._pathTemplateCallback,pathTemplateData:a,pathTemplateRegExp:this._pathTemplateRegExp,queryParams:{...this._queryParams,...s}}),h=r(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)};if(this._conditionalRequestsEnabled){var n,o;const e=null!==(n=null==c||null===(o=c.metadata)||void 0===o?void 0:o.etag)&&void 0!==n?n:null;e&&(t["If-None-Match"]=e)}}const u=this._trackRequest(h);return u||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=B(this._basePath,e,{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 L(e);return t?(Object.keys(t).forEach(e=>{r.createShortcut(e,...t[e])}),r):r}export{s as ARRAY_BUFFER_FORMAT,i as BLOB_FORMAT,S as CACHE_CONTROL_HEADER,O as CLIENT_ERROR_REPSONSE,M as COOKIE_HEADER,u as DEFAULT_BODY_PARSER,d as DEFAULT_FETCH_TIMEOUT,l as DEFAULT_HEADERS,m as DEFAULT_MAX_REDIRECTS,_ as DEFAULT_MAX_RETRIES,p as DEFAULT_PATH_TEMPLATE_REGEX,y as DEFAULT_REQUEST_RETRY_WAIT,P as DELETE_METHOD,F as ETAG_HEADER,w as FETCH_METHODS,b as FETCH_TIMEOUT_ERROR,h as FORM_DATA_FORMAT,q as GET_METHOD,L as Getta,G as IF_NONE_MATCH_HEADER,k as INFORMATION_REPSONSE,g as INVALID_FETCH_METHOD_ERROR,c as JSON_FORMAT,H as LOCATION_HEADER,T as MAX_REDIRECTS_EXCEEDED_ERROR,R as MAX_RETRIES_EXCEEDED_ERROR,f as MISSING_BASE_PATH_ERROR,A as NOT_FOUND_STATUS_CODE,$ as NOT_MODIFIED_STATUS_CODE,E as POST_METHOD,x as PUT_METHOD,D as REDIRECTION_REPSONSE,v as RESOURCE_NOT_FOUND_ERROR,j as SERVER_ERROR_REPSONSE,o as STREAM_READERS,C as SUCCESSFUL_REPSONSE,n as TEXT_FORMAT,W as defaultPathTemplateCallback};
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,M=404,F="Cookie",H="ETag",G="Location",S="If-None-Match",W="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,""),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)};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,W as CACHE_CONTROL_HEADER,j as CLIENT_ERROR_REPSONSE,F 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,H as ETAG_HEADER,k as FETCH_METHODS,b as FETCH_TIMEOUT_ERROR,h as FORM_DATA_FORMAT,q as GET_METHOD,N as Getta,S 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,M 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};
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 { JsonValue } from \"type-fest\";\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: JsonValue) => 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 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 { pathTemplateCallback, pathTemplateData, pathTemplateRegExp, queryParams }: 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 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 { JsonValue } from \"type-fest\";\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 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 _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 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._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 (options: RequestOptions = {}) =>\n // @ts-ignore\n this[method](path, merge({}, rest, options)) as Promise<FetchResponse>;\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<JsonValue | 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: JsonValue, 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 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 resolve({\n ...res,\n data: res.body ? this._bodyParser(await res[this._streamReader]()) : undefined,\n });\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 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 { data: await this._cacheEntryGet(requestHash) };\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 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","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","pathTemplateCallback","pathTemplateData","queryParams","pathJoiner","endsWith","startsWith","endpoint","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","_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","undefined","redirectMethod","ms","cacheability","metadata","_cacheability$metadat2","cacheControl","_cacheability$metadat3","noCache","checkTTL","isCacheabilityValid","_cacheEntryGet","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 (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 { OPTIONAL_PATH_TEMPLATE_REGEX } from \".\";\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 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 { data: await this._cacheEntryGet(requestHash) };\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","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","etag","pendingRequest","_trackRequest","_getResolve","push","cachedData","_cacheEntrySet","_resolvePendingRequests","_requestTracker","filter","responseData","pendingRequests","forEach","_setPendingRequest","resolver","shortcuts","getta"],"mappings":"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"}
@@ -1,52 +1,52 @@
1
1
  -----------------------------
2
2
  Rollup File Analysis
3
3
  -----------------------------
4
- bundle size: 14.283 KB
5
- original size: 18.922 KB
6
- code reduction: 24.52 %
4
+ bundle size: 14.869 KB
5
+ original size: 19.628 KB
6
+ code reduction: 24.25 %
7
7
  module count: 9
8
8
 
9
9
  ████████████████████████████████████░░░░░░░░░░░░░░
10
10
  file: /src/main.ts
11
- bundle space: 73.15 %
12
- rendered size: 10.448 KB
13
- original size: 12.331 KB
14
- code reduction: 15.27 %
11
+ bundle space: 73.17 %
12
+ rendered size: 10.879 KB
13
+ original size: 12.803 KB
14
+ code reduction: 15.03 %
15
15
  dependents: 1
16
16
  - /src/index.ts
17
17
 
18
18
  ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
19
19
  file: /src/constants.ts
20
- bundle space: 13.24 %
21
- rendered size: 1.891 KB
22
- original size: 2.425 KB
23
- code reduction: 22.02 %
20
+ bundle space: 13.13 %
21
+ rendered size: 1.952 KB
22
+ original size: 2.502 KB
23
+ code reduction: 21.98 %
24
24
  dependents: 3
25
25
  - /src/helpers/get-response-group/index.ts
26
26
  - /src/main.ts
27
27
  - /src/index.ts
28
28
 
29
29
  ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
30
- file: /src/helpers/is-cacheability-valid/index.ts
31
- bundle space: 4.26 %
32
- rendered size: 609 Bytes
33
- original size: 238 Bytes
34
- code reduction: 0 %
30
+ file: /src/helpers/build-endpoint/index.ts
31
+ bundle space: 4.67 %
32
+ rendered size: 694 Bytes
33
+ original size: 859 Bytes
34
+ code reduction: 19.21 %
35
35
  dependents: 1
36
36
  - /src/main.ts
37
37
 
38
38
  ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
39
- file: /src/helpers/build-endpoint/index.ts
40
- bundle space: 4.2 %
41
- rendered size: 600 Bytes
42
- original size: 744 Bytes
43
- code reduction: 19.35 %
39
+ file: /src/helpers/is-cacheability-valid/index.ts
40
+ bundle space: 4.1 %
41
+ rendered size: 609 Bytes
42
+ original size: 238 Bytes
43
+ code reduction: 0 %
44
44
  dependents: 1
45
45
  - /src/main.ts
46
46
 
47
47
  █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
48
48
  file: /src/helpers/get-response-group/index.ts
49
- bundle space: 2.41 %
49
+ bundle space: 2.31 %
50
50
  rendered size: 344 Bytes
51
51
  original size: 521 Bytes
52
52
  code reduction: 33.97 %
@@ -55,7 +55,7 @@ dependents: 1
55
55
 
56
56
  █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
57
57
  file: /src/helpers/default-path-template-callback/index.ts
58
- bundle space: 2.18 %
58
+ bundle space: 2.09 %
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.56 %
68
+ bundle space: 0.54 %
69
69
  rendered size: 80 Bytes
70
70
  original size: 104 Bytes
71
71
  code reduction: 23.08 %
@@ -76,7 +76,7 @@ dependents: 1
76
76
  file: /src/types.ts
77
77
  bundle space: 0 %
78
78
  rendered size: 0 Byte
79
- original size: 1.95 KB
79
+ original size: 1.992 KB
80
80
  code reduction: 100 %
81
81
  dependents: 1
82
82
  - /src/index.ts
@@ -87,5 +87,6 @@ bundle space: 0 %
87
87
  rendered size: 0 Byte
88
88
  original size: 194 Bytes
89
89
  code reduction: 100 %
90
- dependents: 0
90
+ dependents: 1
91
+ - /src/main.ts
91
92
 
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.CACHE_CONTROL_HEADER = exports.IF_NONE_MATCH_HEADER = exports.LOCATION_HEADER = exports.ETAG_HEADER = exports.COOKIE_HEADER = exports.NOT_FOUND_STATUS_CODE = exports.NOT_MODIFIED_STATUS_CODE = exports.SERVER_ERROR_REPSONSE = exports.CLIENT_ERROR_REPSONSE = exports.REDIRECTION_REPSONSE = exports.SUCCESSFUL_REPSONSE = exports.INFORMATION_REPSONSE = exports.FETCH_METHODS = exports.DELETE_METHOD = exports.PUT_METHOD = exports.POST_METHOD = exports.GET_METHOD = exports.FETCH_TIMEOUT_ERROR = exports.RESOURCE_NOT_FOUND_ERROR = exports.INVALID_FETCH_METHOD_ERROR = exports.MAX_RETRIES_EXCEEDED_ERROR = exports.MAX_REDIRECTS_EXCEEDED_ERROR = exports.MISSING_BASE_PATH_ERROR = exports.DEFAULT_REQUEST_RETRY_WAIT = exports.DEFAULT_PATH_TEMPLATE_REGEX = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_MAX_REDIRECTS = exports.DEFAULT_HEADERS = exports.DEFAULT_FETCH_TIMEOUT = exports.DEFAULT_BODY_PARSER = exports.STREAM_READERS = exports.TEXT_FORMAT = exports.JSON_FORMAT = exports.FORM_DATA_FORMAT = exports.BLOB_FORMAT = exports.ARRAY_BUFFER_FORMAT = void 0;
6
+ exports.TEXT_FORMAT = exports.SUCCESSFUL_REPSONSE = exports.STREAM_READERS = exports.SERVER_ERROR_REPSONSE = exports.RESOURCE_NOT_FOUND_ERROR = exports.REDIRECTION_REPSONSE = exports.PUT_METHOD = exports.POST_METHOD = exports.OPTIONAL_PATH_TEMPLATE_REGEX = exports.NOT_MODIFIED_STATUS_CODE = exports.NOT_FOUND_STATUS_CODE = exports.MISSING_BASE_PATH_ERROR = exports.MAX_RETRIES_EXCEEDED_ERROR = exports.MAX_REDIRECTS_EXCEEDED_ERROR = exports.LOCATION_HEADER = exports.JSON_FORMAT = exports.INVALID_FETCH_METHOD_ERROR = exports.INFORMATION_REPSONSE = exports.IF_NONE_MATCH_HEADER = exports.GET_METHOD = exports.FORM_DATA_FORMAT = exports.FETCH_TIMEOUT_ERROR = exports.FETCH_METHODS = exports.ETAG_HEADER = exports.DELETE_METHOD = exports.DEFAULT_REQUEST_RETRY_WAIT = exports.DEFAULT_PATH_TEMPLATE_REGEX = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_MAX_REDIRECTS = exports.DEFAULT_HEADERS = exports.DEFAULT_FETCH_TIMEOUT = exports.DEFAULT_BODY_PARSER = exports.COOKIE_HEADER = exports.CLIENT_ERROR_REPSONSE = exports.CACHE_CONTROL_HEADER = exports.BLOB_FORMAT = exports.ARRAY_BUFFER_FORMAT = void 0;
7
7
  const ARRAY_BUFFER_FORMAT = "arrayBuffer";
8
8
  exports.ARRAY_BUFFER_FORMAT = ARRAY_BUFFER_FORMAT;
9
9
  const BLOB_FORMAT = "blob";
@@ -38,6 +38,8 @@ const DEFAULT_MAX_RETRIES = 3;
38
38
  exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES;
39
39
  const DEFAULT_PATH_TEMPLATE_REGEX = /({type})|({id})|({id,\+})|({brief\|standard})/g;
40
40
  exports.DEFAULT_PATH_TEMPLATE_REGEX = DEFAULT_PATH_TEMPLATE_REGEX;
41
+ const OPTIONAL_PATH_TEMPLATE_REGEX = /({[a-zA-Z0-9_]+\?})/g;
42
+ exports.OPTIONAL_PATH_TEMPLATE_REGEX = OPTIONAL_PATH_TEMPLATE_REGEX;
41
43
  const DEFAULT_REQUEST_RETRY_WAIT = 100;
42
44
  exports.DEFAULT_REQUEST_RETRY_WAIT = DEFAULT_REQUEST_RETRY_WAIT;
43
45
  const MISSING_BASE_PATH_ERROR = `Getta expected to receive 'basePath' in the constructor options,
@@ -10,6 +10,7 @@ exports.default = buildEndpoint;
10
10
  var _queryString = _interopRequireDefault(require("query-string"));
11
11
 
12
12
  function buildEndpoint(basePath, path, {
13
+ optionalPathTemplateRegExp,
13
14
  pathTemplateCallback,
14
15
  pathTemplateData,
15
16
  pathTemplateRegExp,
@@ -22,6 +23,8 @@ function buildEndpoint(basePath, path, {
22
23
  endpoint = pathTemplateCallback(endpoint, pathTemplateData, pathTemplateRegExp);
23
24
  }
24
25
 
26
+ endpoint = endpoint.replace(optionalPathTemplateRegExp, "");
27
+
25
28
  if (queryParams && Object.keys(queryParams).length) {
26
29
  const queryJoin = _queryString.default.extract(endpoint) ? "&" : "?";
27
30
  endpoint = `${endpoint}${queryJoin}${_queryString.default.stringify(queryParams)}`;
package/lib/main/index.js CHANGED
@@ -9,10 +9,10 @@ var _exportNames = {
9
9
  defaultPathTemplateCallback: true,
10
10
  Getta: true
11
11
  };
12
- Object.defineProperty(exports, "defaultPathTemplateCallback", {
12
+ Object.defineProperty(exports, "Getta", {
13
13
  enumerable: true,
14
14
  get: function () {
15
- return _defaultPathTemplateCallback.default;
15
+ return _main.Getta;
16
16
  }
17
17
  });
18
18
  Object.defineProperty(exports, "default", {
@@ -21,10 +21,10 @@ Object.defineProperty(exports, "default", {
21
21
  return _main.default;
22
22
  }
23
23
  });
24
- Object.defineProperty(exports, "Getta", {
24
+ Object.defineProperty(exports, "defaultPathTemplateCallback", {
25
25
  enumerable: true,
26
26
  get: function () {
27
- return _main.Getta;
27
+ return _defaultPathTemplateCallback.default;
28
28
  }
29
29
  });
30
30
 
package/lib/main/main.js CHANGED
@@ -5,8 +5,8 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = createRestClient;
9
8
  exports.Getta = void 0;
9
+ exports.default = createRestClient;
10
10
 
11
11
  require("core-js/modules/es.promise.js");
12
12
 
@@ -16,6 +16,8 @@ var _merge2 = _interopRequireDefault(require("lodash/merge"));
16
16
 
17
17
  var _md = _interopRequireDefault(require("md5"));
18
18
 
19
+ var _ = require(".");
20
+
19
21
  var _constants = require("./constants");
20
22
 
21
23
  var _buildEndpoint = _interopRequireDefault(require("./helpers/build-endpoint"));
@@ -38,6 +40,7 @@ class Getta {
38
40
  (0, _defineProperty2.default)(this, "_headers", void 0);
39
41
  (0, _defineProperty2.default)(this, "_maxRedirects", void 0);
40
42
  (0, _defineProperty2.default)(this, "_maxRetries", void 0);
43
+ (0, _defineProperty2.default)(this, "_optionalPathTemplateRegExp", void 0);
41
44
  (0, _defineProperty2.default)(this, "_pathTemplateCallback", void 0);
42
45
  (0, _defineProperty2.default)(this, "_pathTemplateRegExp", void 0);
43
46
  (0, _defineProperty2.default)(this, "_queryParams", void 0);
@@ -56,6 +59,7 @@ class Getta {
56
59
  headers,
57
60
  maxRedirects = _constants.DEFAULT_MAX_REDIRECTS,
58
61
  maxRetries = _constants.DEFAULT_MAX_RETRIES,
62
+ optionalPathTemplateRegExp = _.OPTIONAL_PATH_TEMPLATE_REGEX,
59
63
  pathTemplateCallback = _defaultPathTemplateCallback.default,
60
64
  pathTemplateRegExp = _constants.DEFAULT_PATH_TEMPLATE_REGEX,
61
65
  queryParams = {},
@@ -77,6 +81,7 @@ class Getta {
77
81
  };
78
82
  this._maxRedirects = maxRedirects;
79
83
  this._maxRetries = maxRetries;
84
+ this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;
80
85
  this._pathTemplateCallback = pathTemplateCallback;
81
86
  this._pathTemplateRegExp = pathTemplateRegExp;
82
87
  this._queryParams = queryParams;
@@ -168,6 +173,7 @@ class Getta {
168
173
  ...rest
169
174
  }) {
170
175
  const endpoint = (0, _buildEndpoint.default)(this._basePath, path, {
176
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
171
177
  pathTemplateCallback: this._pathTemplateCallback,
172
178
  pathTemplateData,
173
179
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -224,9 +230,9 @@ class Getta {
224
230
  }));
225
231
  }
226
232
 
227
- resolve({ ...res,
228
- data: res.body ? this._bodyParser(await res[this._streamReader]()) : undefined
229
- });
233
+ const fetchRes = res;
234
+ fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
235
+ resolve(fetchRes);
230
236
  });
231
237
  } catch (error) {
232
238
  const errorRes = {
@@ -282,6 +288,7 @@ class Getta {
282
288
  queryParams = {}
283
289
  }) {
284
290
  const endpoint = (0, _buildEndpoint.default)(this._basePath, path, {
291
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
285
292
  pathTemplateCallback: this._pathTemplateCallback,
286
293
  pathTemplateData,
287
294
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -366,6 +373,7 @@ class Getta {
366
373
  ...rest
367
374
  }) {
368
375
  const endpoint = (0, _buildEndpoint.default)(this._basePath, path, {
376
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
369
377
  pathTemplateCallback: this._pathTemplateCallback,
370
378
  pathTemplateData,
371
379
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -18,6 +18,7 @@ export const DEFAULT_HEADERS = {
18
18
  export const DEFAULT_MAX_REDIRECTS = 5;
19
19
  export const DEFAULT_MAX_RETRIES = 3;
20
20
  export const DEFAULT_PATH_TEMPLATE_REGEX = /({type})|({id})|({id,\+})|({brief\|standard})/g;
21
+ export const OPTIONAL_PATH_TEMPLATE_REGEX = /({[a-zA-Z0-9_]+\?})/g;
21
22
  export const DEFAULT_REQUEST_RETRY_WAIT = 100;
22
23
  export const MISSING_BASE_PATH_ERROR = `Getta expected to receive 'basePath' in the constructor options,
23
24
  but recevied undefined.`;
@@ -1,5 +1,6 @@
1
1
  import queryString from "query-string";
2
2
  export default function buildEndpoint(basePath, path, {
3
+ optionalPathTemplateRegExp,
3
4
  pathTemplateCallback,
4
5
  pathTemplateData,
5
6
  pathTemplateRegExp,
@@ -12,6 +13,8 @@ export default function buildEndpoint(basePath, path, {
12
13
  endpoint = pathTemplateCallback(endpoint, pathTemplateData, pathTemplateRegExp);
13
14
  }
14
15
 
16
+ endpoint = endpoint.replace(optionalPathTemplateRegExp, "");
17
+
15
18
  if (queryParams && Object.keys(queryParams).length) {
16
19
  const queryJoin = queryString.extract(endpoint) ? "&" : "?";
17
20
  endpoint = `${endpoint}${queryJoin}${queryString.stringify(queryParams)}`;
@@ -0,0 +1 @@
1
+ export {};
@@ -2,6 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import _merge from "lodash/merge";
3
3
  import "core-js/modules/es.promise.js";
4
4
  import md5 from "md5";
5
+ import { OPTIONAL_PATH_TEMPLATE_REGEX } from ".";
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, POST_METHOD, PUT_METHOD, REDIRECTION_REPSONSE, RESOURCE_NOT_FOUND_ERROR, SERVER_ERROR_REPSONSE } from "./constants";
6
7
  import buildEndpoint from "./helpers/build-endpoint";
7
8
  import defaultPathTemplateCallback from "./helpers/default-path-template-callback";
@@ -26,6 +27,8 @@ export class Getta {
26
27
 
27
28
  _defineProperty(this, "_maxRetries", void 0);
28
29
 
30
+ _defineProperty(this, "_optionalPathTemplateRegExp", void 0);
31
+
29
32
  _defineProperty(this, "_pathTemplateCallback", void 0);
30
33
 
31
34
  _defineProperty(this, "_pathTemplateRegExp", void 0);
@@ -50,6 +53,7 @@ export class Getta {
50
53
  headers,
51
54
  maxRedirects = DEFAULT_MAX_REDIRECTS,
52
55
  maxRetries = DEFAULT_MAX_RETRIES,
56
+ optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,
53
57
  pathTemplateCallback = defaultPathTemplateCallback,
54
58
  pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,
55
59
  queryParams = {},
@@ -71,6 +75,7 @@ export class Getta {
71
75
  };
72
76
  this._maxRedirects = maxRedirects;
73
77
  this._maxRetries = maxRetries;
78
+ this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;
74
79
  this._pathTemplateCallback = pathTemplateCallback;
75
80
  this._pathTemplateRegExp = pathTemplateRegExp;
76
81
  this._queryParams = queryParams;
@@ -162,6 +167,7 @@ export class Getta {
162
167
  ...rest
163
168
  }) {
164
169
  const endpoint = buildEndpoint(this._basePath, path, {
170
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
165
171
  pathTemplateCallback: this._pathTemplateCallback,
166
172
  pathTemplateData,
167
173
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -218,9 +224,9 @@ export class Getta {
218
224
  }));
219
225
  }
220
226
 
221
- resolve({ ...res,
222
- data: res.body ? this._bodyParser(await res[this._streamReader]()) : undefined
223
- });
227
+ const fetchRes = res;
228
+ fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
229
+ resolve(fetchRes);
224
230
  });
225
231
  } catch (error) {
226
232
  const errorRes = {
@@ -276,6 +282,7 @@ export class Getta {
276
282
  queryParams = {}
277
283
  }) {
278
284
  const endpoint = buildEndpoint(this._basePath, path, {
285
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
279
286
  pathTemplateCallback: this._pathTemplateCallback,
280
287
  pathTemplateData,
281
288
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -360,6 +367,7 @@ export class Getta {
360
367
  ...rest
361
368
  }) {
362
369
  const endpoint = buildEndpoint(this._basePath, path, {
370
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
363
371
  pathTemplateCallback: this._pathTemplateCallback,
364
372
  pathTemplateData,
365
373
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,5 @@
1
1
  import Cachemap from "@cachemap/core";
2
- import { JsonValue } from "type-fest";
2
+ import { PlainObject } from "@repodog/types";
3
3
  import { RequestOptions } from "../../types";
4
4
  import { MockRequestCallbackParams, TearDownTestParams } from "../types";
5
5
  export declare const basePath = "https://tesco.com";
@@ -24,6 +24,6 @@ export declare const defaultHeaders: {
24
24
  etag: string;
25
25
  };
26
26
  export declare function getCache(): Cachemap;
27
- export declare function mockRequest(path: string, body: JsonValue, { headers, pathTemplateData, queryParams }: RequestOptions | undefined, callback: (options: MockRequestCallbackParams) => void): void;
27
+ export declare function mockRequest(path: string, body: PlainObject, { headers, pathTemplateData, queryParams }: RequestOptions | undefined, callback: (options: MockRequestCallbackParams) => void): void;
28
28
  export declare function tearDownTest({ fetchMock, restClient }: TearDownTestParams): Promise<void>;
29
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEzE,eAAO,MAAM,QAAQ,sBAAsB,CAAC;AAE5C,eAAO,MAAM,WAAW,uEAAuE,CAAC;AAEhG,eAAO,MAAM,uBAAuB;;;;CAAwE,CAAC;AAE7G,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAElD,eAAO,MAAM,kBAAkB;;CAAyB,CAAC;AAEzD,eAAO,MAAM,yBAAyB;;;CAAoD,CAAC;AAE3F,eAAO,MAAM,WAAW,6CAA6C,CAAC;AAEtE,eAAO,MAAM,cAAc;;;;CAI1B,CAAC;AAEF,wBAAgB,QAAQ,aAKvB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,EACf,EAAE,OAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,4BAAqB,EACpE,QAAQ,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,QAYvD;AAED,wBAAsB,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,kBAAkB,iBAG/E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEzE,eAAO,MAAM,QAAQ,sBAAsB,CAAC;AAE5C,eAAO,MAAM,WAAW,uEAAuE,CAAC;AAEhG,eAAO,MAAM,uBAAuB;;;;CAAwE,CAAC;AAE7G,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAElD,eAAO,MAAM,kBAAkB;;CAAyB,CAAC;AAEzD,eAAO,MAAM,yBAAyB;;;CAAoD,CAAC;AAE3F,eAAO,MAAM,WAAW,6CAA6C,CAAC;AAEtE,eAAO,MAAM,cAAc;;;;CAI1B,CAAC;AAEF,wBAAgB,QAAQ,aAKvB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,EAAE,OAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,4BAAqB,EACpE,QAAQ,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,QAavD;AAED,wBAAsB,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,kBAAkB,iBAG/E"}
@@ -1,4 +1,4 @@
1
- import { JsonValue } from "type-fest";
1
+ import { PlainObject } from "@repodog/types";
2
2
  export declare const ARRAY_BUFFER_FORMAT: "arrayBuffer";
3
3
  export declare const BLOB_FORMAT: "blob";
4
4
  export declare const FORM_DATA_FORMAT: "formData";
@@ -11,7 +11,7 @@ export declare const STREAM_READERS: {
11
11
  JSON_FORMAT: "json";
12
12
  TEXT_FORMAT: "text";
13
13
  };
14
- export declare const DEFAULT_BODY_PARSER: (body: JsonValue) => JsonValue;
14
+ export declare const DEFAULT_BODY_PARSER: (body: PlainObject) => PlainObject;
15
15
  export declare const DEFAULT_FETCH_TIMEOUT: 5000;
16
16
  export declare const DEFAULT_HEADERS: {
17
17
  "content-type": string;
@@ -19,6 +19,7 @@ export declare const DEFAULT_HEADERS: {
19
19
  export declare const DEFAULT_MAX_REDIRECTS: 5;
20
20
  export declare const DEFAULT_MAX_RETRIES: 3;
21
21
  export declare const DEFAULT_PATH_TEMPLATE_REGEX: RegExp;
22
+ export declare const OPTIONAL_PATH_TEMPLATE_REGEX: RegExp;
22
23
  export declare const DEFAULT_REQUEST_RETRY_WAIT = 100;
23
24
  export declare const MISSING_BASE_PATH_ERROR = "Getta expected to receive 'basePath' in the constructor options,\n but recevied undefined.";
24
25
  export declare const MAX_REDIRECTS_EXCEEDED_ERROR = "The request exceeded the maximum number of redirects, which is";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,eAAO,MAAM,mBAAmB,eAAyB,CAAC;AAC1D,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,gBAAgB,YAAsB,CAAC;AACpD,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAE3C,eAAO,MAAM,cAAc;;;;;;CAM1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,SAAU,SAAS,cAAS,CAAC;AAC7D,eAAO,MAAM,qBAAqB,MAAgB,CAAC;AACnD,eAAO,MAAM,eAAe;;CAAyC,CAAC;AACtE,eAAO,MAAM,qBAAqB,GAAa,CAAC;AAChD,eAAO,MAAM,mBAAmB,GAAa,CAAC;AAC9C,eAAO,MAAM,2BAA2B,QAAmD,CAAC;AAC5F,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,eAAO,MAAM,uBAAuB,gGACV,CAAC;AAE3B,eAAO,MAAM,4BAA4B,mEAAmE,CAAC;AAE7G,eAAO,MAAM,0BAA0B,iEAAiE,CAAC;AAEzG,eAAO,MAAM,0BAA0B,6EAA6E,CAAC;AAErH,eAAO,MAAM,wBAAwB,iDAAiD,CAAC;AAEvF,eAAO,MAAM,mBAAmB,+DAA+D,CAAC;AAEhG,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,aAAa,UAAoB,CAAC;AAE/C,eAAO,MAAM,aAAa,uCAAuD,CAAC;AAElF,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,mBAAmB,cAAwB,CAAC;AACzD,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAC5D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,KAAe,CAAC;AACrD,eAAO,MAAM,qBAAqB,KAAe,CAAC;AAElD,eAAO,MAAM,aAAa,UAAoB,CAAC;AAC/C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,eAAe,YAAsB,CAAC;AACnD,eAAO,MAAM,oBAAoB,iBAA2B,CAAC;AAC7D,eAAO,MAAM,oBAAoB,iBAA2B,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,eAAO,MAAM,mBAAmB,eAAyB,CAAC;AAC1D,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,gBAAgB,YAAsB,CAAC;AACpD,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAE3C,eAAO,MAAM,cAAc;;;;;;CAM1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,SAAU,WAAW,gBAAS,CAAC;AAC/D,eAAO,MAAM,qBAAqB,MAAgB,CAAC;AACnD,eAAO,MAAM,eAAe;;CAAyC,CAAC;AACtE,eAAO,MAAM,qBAAqB,GAAa,CAAC;AAChD,eAAO,MAAM,mBAAmB,GAAa,CAAC;AAC9C,eAAO,MAAM,2BAA2B,QAAmD,CAAC;AAC5F,eAAO,MAAM,4BAA4B,QAAyB,CAAC;AACnE,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,eAAO,MAAM,uBAAuB,gGACV,CAAC;AAE3B,eAAO,MAAM,4BAA4B,mEAAmE,CAAC;AAE7G,eAAO,MAAM,0BAA0B,iEAAiE,CAAC;AAEzG,eAAO,MAAM,0BAA0B,6EAA6E,CAAC;AAErH,eAAO,MAAM,wBAAwB,iDAAiD,CAAC;AAEvF,eAAO,MAAM,mBAAmB,+DAA+D,CAAC;AAEhG,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,UAAU,OAAiB,CAAC;AACzC,eAAO,MAAM,aAAa,UAAoB,CAAC;AAE/C,eAAO,MAAM,aAAa,uCAAuD,CAAC;AAElF,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,mBAAmB,cAAwB,CAAC;AACzD,eAAO,MAAM,oBAAoB,eAAyB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAC5D,eAAO,MAAM,qBAAqB,eAAyB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,KAAe,CAAC;AACrD,eAAO,MAAM,qBAAqB,KAAe,CAAC;AAElD,eAAO,MAAM,aAAa,UAAoB,CAAC;AAC/C,eAAO,MAAM,WAAW,QAAkB,CAAC;AAC3C,eAAO,MAAM,eAAe,YAAsB,CAAC;AACnD,eAAO,MAAM,oBAAoB,iBAA2B,CAAC;AAC7D,eAAO,MAAM,oBAAoB,iBAA2B,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { BuildEndpointOptions } from "./types";
2
- export default function buildEndpoint(basePath: string, path: string, { pathTemplateCallback, pathTemplateData, pathTemplateRegExp, queryParams }: BuildEndpointOptions): string;
2
+ export default function buildEndpoint(basePath: string, path: string, { optionalPathTemplateRegExp, pathTemplateCallback, pathTemplateData, pathTemplateRegExp, queryParams, }: BuildEndpointOptions): string;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/helpers/build-endpoint/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,CAAC,OAAO,UAAU,aAAa,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,oBAAoB,UAelG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/helpers/build-endpoint/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,CAAC,OAAO,UAAU,aAAa,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,EACE,0BAA0B,EAC1B,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,GACZ,EAAE,oBAAoB,UAiBxB"}
@@ -1,5 +1,6 @@
1
1
  import { PathTemplateCallback, RequestOptions } from "../../types";
2
2
  export interface BuildEndpointOptions extends Omit<RequestOptions, "headers"> {
3
+ optionalPathTemplateRegExp: RegExp;
3
4
  pathTemplateCallback: PathTemplateCallback;
4
5
  pathTemplateRegExp: RegExp;
5
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/helpers/build-endpoint/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IAC3E,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/helpers/build-endpoint/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IAC3E,0BAA0B,EAAE,MAAM,CAAC;IACnC,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
@@ -1,4 +1,5 @@
1
1
  import Cachemap from "@cachemap/core";
2
+ import { PlainObject } from "@repodog/types";
2
3
  import { Required } from "utility-types";
3
4
  import { ConstructorOptions, FetchResponse, RequestOptions, ShortcutProperties, Shortcuts } from "./types";
4
5
  export declare class Getta {
@@ -10,6 +11,7 @@ export declare class Getta {
10
11
  private _headers;
11
12
  private _maxRedirects;
12
13
  private _maxRetries;
14
+ private _optionalPathTemplateRegExp;
13
15
  private _pathTemplateCallback;
14
16
  private _pathTemplateRegExp;
15
17
  private _queryParams;
@@ -19,12 +21,12 @@ export declare class Getta {
19
21
  constructor(options: ConstructorOptions);
20
22
  get cache(): Cachemap | undefined;
21
23
  createShortcut(name: string, path: string, { method, ...rest }: Required<RequestOptions, "method">): void;
22
- delete(path: string, options?: RequestOptions): Promise<FetchResponse>;
23
- get(path: string, options?: RequestOptions): Promise<FetchResponse | {
24
- data: string | number | boolean | import("type-fest").JsonObject | import("type-fest").JsonArray | null | undefined;
24
+ delete(path: string, options?: RequestOptions): Promise<FetchResponse<PlainObject>>;
25
+ get(path: string, options?: RequestOptions): Promise<FetchResponse<PlainObject> | {
26
+ data: PlainObject | undefined;
25
27
  }>;
26
- post(path: string, options: Required<RequestOptions, "body">): Promise<FetchResponse>;
27
- put(path: string, options: Required<RequestOptions, "body">): Promise<FetchResponse>;
28
+ post(path: string, options: Required<RequestOptions, "body">): Promise<FetchResponse<PlainObject>>;
29
+ put(path: string, options: Required<RequestOptions, "body">): Promise<FetchResponse<PlainObject>>;
28
30
  private _cacheEntryDelete;
29
31
  private _cacheEntryGet;
30
32
  private _cacheEntryHas;
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,QAA0B,MAAM,gBAAgB,CAAC;AAMxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAmCzC,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,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;IAoCvC,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;YAsBP,MAAM;YA4CN,qBAAqB;YAiBrB,kBAAkB;YAYlB,IAAI;YA+BJ,WAAW;YAkCX,QAAQ;IAmBtB,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,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;YAgCJ,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,11 +1,10 @@
1
1
  import Cachemap from "@cachemap/core";
2
- import { Func, StringObject } from "@repodog/types";
3
- import { JsonObject, JsonValue } from "type-fest";
2
+ import { Func, PlainObject, StringObject } from "@repodog/types";
4
3
  import { Required } from "utility-types";
5
4
  export declare type FetchMethod = "get" | "post" | "put" | "delete";
6
5
  export declare type StreamReader = "arrayBuffer" | "blob" | "formData" | "json" | "text";
7
6
  export declare type ShortcutProperties<T extends string | number> = {
8
- [K in T]: (...args: any[]) => Promise<ResponseDataWithErrors>;
7
+ [K in T]: <Resource = PlainObject>(...args: any[]) => Promise<FetchResponse<Resource>>;
9
8
  };
10
9
  export interface ConstructorOptions {
11
10
  basePath: string;
@@ -16,9 +15,10 @@ export interface ConstructorOptions {
16
15
  headers?: StringObject;
17
16
  maxRedirects?: number;
18
17
  maxRetries?: number;
18
+ optionalPathTemplateRegExp?: RegExp;
19
19
  pathTemplateCallback?: PathTemplateCallback;
20
20
  pathTemplateRegExp?: RegExp;
21
- queryParams?: JsonObject;
21
+ queryParams?: PlainObject;
22
22
  requestRetryWait?: number;
23
23
  streamReader?: StreamReader;
24
24
  }
@@ -29,7 +29,7 @@ export interface FetchOptions {
29
29
  redirects?: number;
30
30
  retries?: number;
31
31
  }
32
- export interface FetchResponse extends ResponseDataWithErrors, Response {
32
+ export interface FetchResponse<Resource = PlainObject> extends ResponseDataWithErrors<Resource>, Response {
33
33
  }
34
34
  export interface FetchRedirectHandlerOptions extends FetchOptions {
35
35
  status: number;
@@ -39,16 +39,14 @@ export interface RequestOptions {
39
39
  headers?: StringObject;
40
40
  method?: FetchMethod;
41
41
  pathTemplateData?: StringObject;
42
- queryParams?: JsonObject;
42
+ queryParams?: PlainObject;
43
43
  }
44
- export interface ResponseData {
45
- data?: JsonValue;
46
- }
47
- export interface ResponseDataWithErrors extends ResponseData {
44
+ export interface ResponseDataWithErrors<Resource = PlainObject> {
45
+ data?: Resource;
48
46
  errors?: Error[];
49
47
  }
50
48
  export declare type PathTemplateCallback = (path: string, data: StringObject, pathTemplateRegExp: RegExp) => string;
51
- export declare type PendingRequestResolver = (value: FetchResponse) => void;
49
+ export declare type PendingRequestResolver = (value: FetchResponse<PlainObject>) => void;
52
50
  export interface PendingRequestResolvers {
53
51
  resolve: PendingRequestResolver;
54
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,oBAAY,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE5D,oBAAY,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjF,oBAAY,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;KACzD,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,sBAAsB,CAAC;CAC9D,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAc,SAAQ,sBAAsB,EAAE,QAAQ;CAAG;AAE1E,MAAM,WAAW,2BAA4B,SAAQ,YAAY;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB;AAED,oBAAY,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,KAAK,MAAM,CAAC;AAE5G,oBAAY,sBAAsB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAEpE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;CAC7D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,oBAAY,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE5D,oBAAY,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjF,oBAAY,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;KACzD,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;CACvF,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa,CAAC,QAAQ,GAAG,WAAW,CAAE,SAAQ,sBAAsB,CAAC,QAAQ,CAAC,EAAE,QAAQ;CAAG;AAE5G,MAAM,WAAW,2BAA4B,SAAQ,YAAY;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB,CAAC,QAAQ,GAAG,WAAW;IAC5D,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB;AAED,oBAAY,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,KAAK,MAAM,CAAC;AAE5G,oBAAY,sBAAsB,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAEjF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;CAC7D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "getta",
3
- "version": "0.1.8",
3
+ "version": "0.1.12",
4
4
  "description": "An isomorphic rest client based on the Fetch API.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -1,6 +1,7 @@
1
1
  import Cachemap from "@cachemap/core";
2
2
  import map from "@cachemap/map";
3
- import { JsonValue } from "type-fest";
3
+ import { PlainObject } from "@repodog/types";
4
+ import { OPTIONAL_PATH_TEMPLATE_REGEX } from "../..";
4
5
  import { DEFAULT_PATH_TEMPLATE_REGEX } from "../../constants";
5
6
  import buildEndpoint from "../../helpers/build-endpoint";
6
7
  import defaultPathTemplateCallback from "../../helpers/default-path-template-callback";
@@ -36,13 +37,14 @@ export function getCache() {
36
37
 
37
38
  export function mockRequest(
38
39
  path: string,
39
- body: JsonValue,
40
+ body: PlainObject,
40
41
  { headers = {}, pathTemplateData, queryParams }: RequestOptions = {},
41
42
  callback: (options: MockRequestCallbackParams) => void,
42
43
  ) {
43
44
  callback({
44
45
  body: JSON.stringify(body),
45
46
  endpoint: buildEndpoint(basePath, path, {
47
+ optionalPathTemplateRegExp: OPTIONAL_PATH_TEMPLATE_REGEX,
46
48
  pathTemplateCallback: defaultPathTemplateCallback,
47
49
  pathTemplateData,
48
50
  pathTemplateRegExp: DEFAULT_PATH_TEMPLATE_REGEX,
package/src/constants.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { JsonValue } from "type-fest";
1
+ import { PlainObject } from "@repodog/types";
2
2
 
3
3
  export const ARRAY_BUFFER_FORMAT = "arrayBuffer" as const;
4
4
  export const BLOB_FORMAT = "blob" as const;
@@ -14,12 +14,13 @@ export const STREAM_READERS = {
14
14
  TEXT_FORMAT,
15
15
  };
16
16
 
17
- export const DEFAULT_BODY_PARSER = (body: JsonValue) => body;
17
+ export const DEFAULT_BODY_PARSER = (body: PlainObject) => body;
18
18
  export const DEFAULT_FETCH_TIMEOUT = 5000 as const;
19
19
  export const DEFAULT_HEADERS = { "content-type": "application/json" };
20
20
  export const DEFAULT_MAX_REDIRECTS = 5 as const;
21
21
  export const DEFAULT_MAX_RETRIES = 3 as const;
22
22
  export const DEFAULT_PATH_TEMPLATE_REGEX = /({type})|({id})|({id,\+})|({brief\|standard})/g;
23
+ export const OPTIONAL_PATH_TEMPLATE_REGEX = /({[a-zA-Z0-9_]+\?})/g;
23
24
  export const DEFAULT_REQUEST_RETRY_WAIT = 100;
24
25
 
25
26
  export const MISSING_BASE_PATH_ERROR = `Getta expected to receive 'basePath' in the constructor options,
@@ -4,7 +4,13 @@ import { BuildEndpointOptions } from "./types";
4
4
  export default function buildEndpoint(
5
5
  basePath: string,
6
6
  path: string,
7
- { pathTemplateCallback, pathTemplateData, pathTemplateRegExp, queryParams }: BuildEndpointOptions,
7
+ {
8
+ optionalPathTemplateRegExp,
9
+ pathTemplateCallback,
10
+ pathTemplateData,
11
+ pathTemplateRegExp,
12
+ queryParams,
13
+ }: BuildEndpointOptions,
8
14
  ) {
9
15
  const pathJoiner = basePath.endsWith("/") || path.startsWith("/") ? "" : "/";
10
16
  let endpoint = `${basePath}${pathJoiner}${path}`;
@@ -13,6 +19,8 @@ export default function buildEndpoint(
13
19
  endpoint = pathTemplateCallback(endpoint, pathTemplateData, pathTemplateRegExp);
14
20
  }
15
21
 
22
+ endpoint = endpoint.replace(optionalPathTemplateRegExp, "");
23
+
16
24
  if (queryParams && Object.keys(queryParams).length) {
17
25
  const queryJoin = queryString.extract(endpoint) ? "&" : "?";
18
26
  endpoint = `${endpoint}${queryJoin}${queryString.stringify(queryParams)}`;
@@ -1,6 +1,7 @@
1
1
  import { PathTemplateCallback, RequestOptions } from "../../types";
2
2
 
3
3
  export interface BuildEndpointOptions extends Omit<RequestOptions, "headers"> {
4
+ optionalPathTemplateRegExp: RegExp;
4
5
  pathTemplateCallback: PathTemplateCallback;
5
6
  pathTemplateRegExp: RegExp;
6
7
  }
package/src/main.ts CHANGED
@@ -3,8 +3,8 @@ import { Func, PlainObject, StringObject } from "@repodog/types";
3
3
  import Cacheability from "cacheability";
4
4
  import { merge } from "lodash";
5
5
  import md5 from "md5";
6
- import { JsonValue } from "type-fest";
7
6
  import { Required } from "utility-types";
7
+ import { OPTIONAL_PATH_TEMPLATE_REGEX } from ".";
8
8
  import {
9
9
  CACHE_CONTROL_HEADER,
10
10
  DEFAULT_BODY_PARSER,
@@ -63,6 +63,7 @@ export class Getta {
63
63
  private _headers: StringObject;
64
64
  private _maxRedirects: number;
65
65
  private _maxRetries: number;
66
+ private _optionalPathTemplateRegExp: RegExp;
66
67
  private _pathTemplateCallback: PathTemplateCallback;
67
68
  private _pathTemplateRegExp: RegExp;
68
69
  private _queryParams: PlainObject;
@@ -80,6 +81,7 @@ export class Getta {
80
81
  headers,
81
82
  maxRedirects = DEFAULT_MAX_REDIRECTS,
82
83
  maxRetries = DEFAULT_MAX_RETRIES,
84
+ optionalPathTemplateRegExp = OPTIONAL_PATH_TEMPLATE_REGEX,
83
85
  pathTemplateCallback = defaultPathTemplateCallback,
84
86
  pathTemplateRegExp = DEFAULT_PATH_TEMPLATE_REGEX,
85
87
  queryParams = {},
@@ -99,6 +101,7 @@ export class Getta {
99
101
  this._headers = { ...DEFAULT_HEADERS, ...(headers || {}) };
100
102
  this._maxRedirects = maxRedirects;
101
103
  this._maxRetries = maxRetries;
104
+ this._optionalPathTemplateRegExp = optionalPathTemplateRegExp;
102
105
  this._pathTemplateCallback = pathTemplateCallback;
103
106
  this._pathTemplateRegExp = pathTemplateRegExp;
104
107
  this._queryParams = queryParams;
@@ -116,9 +119,9 @@ export class Getta {
116
119
  }
117
120
 
118
121
  // @ts-ignore
119
- this[name] = async (options: RequestOptions = {}) =>
122
+ this[name] = async <Resource extends PlainObject>(options: RequestOptions = {}) =>
120
123
  // @ts-ignore
121
- this[method](path, merge({}, rest, options)) as Promise<FetchResponse>;
124
+ this[method](path, merge({}, rest, options)) as Promise<FetchResponse<Resource>>;
122
125
  }
123
126
 
124
127
  public async delete(path: string, options: RequestOptions = {}) {
@@ -147,7 +150,7 @@ export class Getta {
147
150
  }
148
151
  }
149
152
 
150
- private async _cacheEntryGet(requestHash: string): Promise<JsonValue | undefined> {
153
+ private async _cacheEntryGet(requestHash: string): Promise<PlainObject | undefined> {
151
154
  if (!this._cache) return undefined;
152
155
 
153
156
  try {
@@ -167,7 +170,7 @@ export class Getta {
167
170
  }
168
171
  }
169
172
 
170
- private async _cacheEntrySet(requestHash: string, data: JsonValue, cacheHeaders: CacheHeaders): Promise<void> {
173
+ private async _cacheEntrySet(requestHash: string, data: PlainObject, cacheHeaders: CacheHeaders): Promise<void> {
171
174
  if (!this._cache) return undefined;
172
175
 
173
176
  try {
@@ -179,6 +182,7 @@ export class Getta {
179
182
 
180
183
  private async _delete(path: string, { headers = {}, pathTemplateData, queryParams = {}, ...rest }: RequestOptions) {
181
184
  const endpoint = buildEndpoint(this._basePath, path, {
185
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
182
186
  pathTemplateCallback: this._pathTemplateCallback,
183
187
  pathTemplateData,
184
188
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -232,10 +236,9 @@ export class Getta {
232
236
  );
233
237
  }
234
238
 
235
- resolve({
236
- ...res,
237
- data: res.body ? this._bodyParser(await res[this._streamReader]()) : undefined,
238
- });
239
+ const fetchRes = res as FetchResponse;
240
+ fetchRes.data = res.body ? this._bodyParser(await res[this._streamReader]()) : undefined;
241
+ resolve(fetchRes);
239
242
  });
240
243
  } catch (error) {
241
244
  const errorRes = { errors: [error] };
@@ -274,6 +277,7 @@ export class Getta {
274
277
 
275
278
  private async _get(path: string, { headers = {}, pathTemplateData, queryParams = {} }: RequestOptions) {
276
279
  const endpoint = buildEndpoint(this._basePath, path, {
280
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
277
281
  pathTemplateCallback: this._pathTemplateCallback,
278
282
  pathTemplateData,
279
283
  pathTemplateRegExp: this._pathTemplateRegExp,
@@ -342,6 +346,7 @@ export class Getta {
342
346
  { body, headers, method, pathTemplateData, queryParams, ...rest }: Required<RequestOptions, "method">,
343
347
  ) {
344
348
  const endpoint = buildEndpoint(this._basePath, path, {
349
+ optionalPathTemplateRegExp: this._optionalPathTemplateRegExp,
345
350
  pathTemplateCallback: this._pathTemplateCallback,
346
351
  pathTemplateData,
347
352
  pathTemplateRegExp: this._pathTemplateRegExp,
package/src/types.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import Cachemap from "@cachemap/core";
2
- import { Func, StringObject } from "@repodog/types";
3
- import { JsonObject, JsonValue } from "type-fest";
2
+ import { Func, PlainObject, StringObject } from "@repodog/types";
4
3
  import { Required } from "utility-types";
5
4
 
6
5
  export type FetchMethod = "get" | "post" | "put" | "delete";
@@ -8,7 +7,7 @@ export type FetchMethod = "get" | "post" | "put" | "delete";
8
7
  export type StreamReader = "arrayBuffer" | "blob" | "formData" | "json" | "text";
9
8
 
10
9
  export type ShortcutProperties<T extends string | number> = {
11
- [K in T]: (...args: any[]) => Promise<ResponseDataWithErrors>;
10
+ [K in T]: <Resource = PlainObject>(...args: any[]) => Promise<FetchResponse<Resource>>;
12
11
  };
13
12
 
14
13
  export interface ConstructorOptions {
@@ -20,9 +19,10 @@ export interface ConstructorOptions {
20
19
  headers?: StringObject;
21
20
  maxRedirects?: number;
22
21
  maxRetries?: number;
22
+ optionalPathTemplateRegExp?: RegExp;
23
23
  pathTemplateCallback?: PathTemplateCallback;
24
24
  pathTemplateRegExp?: RegExp;
25
- queryParams?: JsonObject;
25
+ queryParams?: PlainObject;
26
26
  requestRetryWait?: number;
27
27
  streamReader?: StreamReader;
28
28
  }
@@ -35,7 +35,7 @@ export interface FetchOptions {
35
35
  retries?: number;
36
36
  }
37
37
 
38
- export interface FetchResponse extends ResponseDataWithErrors, Response {}
38
+ export interface FetchResponse<Resource = PlainObject> extends ResponseDataWithErrors<Resource>, Response {}
39
39
 
40
40
  export interface FetchRedirectHandlerOptions extends FetchOptions {
41
41
  status: number;
@@ -46,20 +46,17 @@ export interface RequestOptions {
46
46
  headers?: StringObject;
47
47
  method?: FetchMethod;
48
48
  pathTemplateData?: StringObject;
49
- queryParams?: JsonObject;
49
+ queryParams?: PlainObject;
50
50
  }
51
51
 
52
- export interface ResponseData {
53
- data?: JsonValue;
54
- }
55
-
56
- export interface ResponseDataWithErrors extends ResponseData {
52
+ export interface ResponseDataWithErrors<Resource = PlainObject> {
53
+ data?: Resource;
57
54
  errors?: Error[];
58
55
  }
59
56
 
60
57
  export type PathTemplateCallback = (path: string, data: StringObject, pathTemplateRegExp: RegExp) => string;
61
58
 
62
- export type PendingRequestResolver = (value: FetchResponse) => void;
59
+ export type PendingRequestResolver = (value: FetchResponse<PlainObject>) => void;
63
60
 
64
61
  export interface PendingRequestResolvers {
65
62
  resolve: PendingRequestResolver;