@orbis-systems/orbis-api-clients 0.4.3 → 0.4.4

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.
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/src/BaseClient.ts","src/src/BaseApi.ts","src/src/JwtClient.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,"export * from './BaseApi';\nexport * from './BaseClient';\nexport * from './JwtClient';\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["src/src/BaseClient.ts","src/src/BaseApi.ts","src/src/JwtClient.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,"export * from './BaseApi';\r\nexport * from './BaseClient';\r\nexport * from './JwtClient';\r\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../"}
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import t from"auto-bind";import e,{isAxiosError as a}from"axios";import s from"axios-better-stacktrace";import{isNil as r,merge as o}from"lodash";import{jwtDecode as n}from"jwt-decode";function i(t,e,a,s){Object.defineProperty(t,e,{get:a,set:s,enumerable:!0,configurable:!0})}i({},"BaseApi",()=>u);class u{constructor(e){this.apiClient=e,t(this)}getApiClient(){return this.apiClient}}var c,h={};i(h,"ContentType",()=>l),i(h,"BaseClient",()=>f);var l=((c={}).Json="application/json",c.FormData="multipart/form-data",c.UrlEncoded="application/x-www-form-urlencoded",c.Text="text/plain",c);class f{constructor(a){this.config=a,t(this),this.storage=a.storage??sessionStorage,this.axiosInstance=e.create({baseURL:a.baseUrl,headers:{"Content-Type":"application/json",...a.defaultHeaders}}),s(this.axiosInstance)}stringifyFormItem(t){return"object"==typeof t&&null!==t?JSON.stringify(t):`${t}`}createFormData(t){return t instanceof FormData?t:Object.keys(t).reduce((e,a)=>{let s=t[a];for(let t of s instanceof Array?s:[s]){let s=t instanceof Blob||t instanceof File;e.append(a,s?t:this.stringifyFormItem(t))}return e},new FormData)}async request(t){let{contentType:e,data:s}=t;r(s)||("multipart/form-data"===e&&"object"==typeof s&&(t.data=this.createFormData(s)),"text/plain"===e&&"string"!=typeof s&&(t.data=JSON.stringify(s)));let n=o(t.secure??this.config.defaultSecure?this.prepareAuthRequestConfig():{},e?{headers:{"Content-Type":e}}:{},t);try{let{data:t,status:e,statusText:a}=await this.axiosInstance.request(n);return{success:!0,data:t,status:e,statusText:a}}catch(e){if(!this.config.errorHandling)throw e;let t={success:!1,status:-1,statusText:String(e),error:e};return a(e)&&(this.config.onAxiosError?.(e),t.data=e.response?.data,t.status=e.response?.status??t.status,t.statusText=e.response?.statusText??t.statusText),this.config.onError?.(e),t}}get(t,e){return this.request({...e,method:"GET",url:t})}delete(t,e){return this.request({...e,method:"DELETE",url:t})}head(t,e){return this.request({...e,method:"HEAD",url:t})}options(t,e){return this.request({...e,method:"OPTIONS",url:t})}post(t,e,a){return this.request({...a,method:"POST",url:t,data:e})}put(t,e,a){return this.request({...a,method:"PUT",url:t,data:e})}patch(t,e,a){return this.request({...a,method:"PATCH",url:t,data:e})}getAxios(){return this.axiosInstance}setAuthData(t){this.storage.setItem(this.config.authDataStorageKey||"auth",JSON.stringify(t))}getAuthData(){let t=this.storage.getItem(this.config.authDataStorageKey||"auth");return t?JSON.parse(t):null}getConfig(){return this.config}}i({},"JwtClient",()=>d);class d extends f{constructor(t){super(t),this.config=t}getConfig(){return super.getConfig()}prepareAuthRequestConfig(){let{accessToken:t}=this.getAuthData()||{};return t?{headers:{Authorization:`${this.config.authSchema??"Bearer"} ${t}`}}:(console.warn("No access token found. Please set auth data after authorization."),{})}scheduleTokenRenewal(t){let e;this.cancelTokenRenewal();let a=this.getAuthData();try{e=n(a?.accessToken||"")}catch(t){console.error(t)}if(!e||!e.exp){console.warn("Could not schedule token renewal: invalid expiration time.");return}let s=1e3*e.exp-Date.now();this.tokenRenewalTimeout=setTimeout(async()=>{let e=await t();this.setAuthData(e),this.scheduleTokenRenewal(t)},s-6e4)}cancelTokenRenewal(){clearTimeout(this.tokenRenewalTimeout)}}export{u as BaseApi,l as ContentType,f as BaseClient,d as JwtClient};
1
+ import t from"auto-bind";import e,{isAxiosError as a}from"axios";import s from"axios-better-stacktrace";import{isNil as r,merge as o}from"lodash";import{consola as n}from"consola";import{jwtDecode as i}from"jwt-decode";function u(t,e,a,s){Object.defineProperty(t,e,{get:a,set:s,enumerable:!0,configurable:!0})}u({},"BaseApi",()=>c);class c{constructor(e){this.apiClient=e,t(this)}getApiClient(){return this.apiClient}}var h,l={};u(l,"ContentType",()=>f),u(l,"BaseClient",()=>d);var f=((h={}).Json="application/json",h.FormData="multipart/form-data",h.UrlEncoded="application/x-www-form-urlencoded",h.Text="text/plain",h);class d{constructor(a){this.config=a,t(this),this.storage=a.storage??sessionStorage,this.axiosInstance=e.create({baseURL:a.baseUrl,headers:{"Content-Type":"application/json",...a.defaultHeaders}}),s(this.axiosInstance)}stringifyFormItem(t){return"object"==typeof t&&null!==t?JSON.stringify(t):`${t}`}createFormData(t){return t instanceof FormData?t:Object.keys(t).reduce((e,a)=>{let s=t[a];for(let t of s instanceof Array?s:[s]){let s=t instanceof Blob||t instanceof File;e.append(a,s?t:this.stringifyFormItem(t))}return e},new FormData)}async request(t){let{contentType:e,data:s}=t;r(s)||("multipart/form-data"===e&&"object"==typeof s&&(t.data=this.createFormData(s)),"text/plain"===e&&"string"!=typeof s&&(t.data=JSON.stringify(s)));let n=o(t.secure??this.config.defaultSecure?this.prepareAuthRequestConfig():{},e?{headers:{"Content-Type":e}}:{},t);try{let{data:t,status:e,statusText:a}=await this.axiosInstance.request(n);return{success:!0,data:t,status:e,statusText:a}}catch(e){if(!this.config.errorHandling)throw e;let t={success:!1,status:-1,statusText:String(e),error:e};return a(e)&&(this.config.onAxiosError?.(e),t.data=e.response?.data,t.status=e.response?.status??t.status,t.statusText=e.response?.statusText??t.statusText),this.config.onError?.(e),t}}get(t,e){return this.request({...e,method:"GET",url:t})}delete(t,e){return this.request({...e,method:"DELETE",url:t})}head(t,e){return this.request({...e,method:"HEAD",url:t})}options(t,e){return this.request({...e,method:"OPTIONS",url:t})}post(t,e,a){return this.request({...a,method:"POST",url:t,data:e})}put(t,e,a){return this.request({...a,method:"PUT",url:t,data:e})}patch(t,e,a){return this.request({...a,method:"PATCH",url:t,data:e})}getAxios(){return this.axiosInstance}setAuthData(t){this.storage.setItem(this.config.authDataStorageKey||"auth",JSON.stringify(t))}getAuthData(){let t=this.storage.getItem(this.config.authDataStorageKey||"auth");return t?JSON.parse(t):null}getConfig(){return this.config}}u({},"JwtClient",()=>p);class p extends d{constructor(t){super(t),this.config=t}getConfig(){return super.getConfig()}prepareAuthRequestConfig(){let{accessToken:t}=this.getAuthData()||{};return t?{headers:{Authorization:`${this.config.authSchema??"Bearer"} ${t}`}}:(n.warn("No access token found. Please set auth data after authorization."),{})}scheduleTokenRenewal(t){let e;this.cancelTokenRenewal();let a=this.getAuthData();try{e=i(a?.accessToken||"")}catch(t){n.error(t)}if(!e||!e.exp){n.warn("Could not schedule token renewal: invalid expiration time");return}let s=1e3*e.exp-Date.now(),r=async()=>{let e=await t();this.setAuthData(e),this.scheduleTokenRenewal(t)};this.tokenRenewalTimeout=setTimeout(async()=>{try{await r()}catch(t){n.error("Failed to renew token. Retry in 10s",t),setTimeout(r,1e4)}},s-6e4)}cancelTokenRenewal(){clearTimeout(this.tokenRenewalTimeout)}}export{c as BaseApi,f as ContentType,d as BaseClient,p as JwtClient};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["<anon>","src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["import $hfdUH$autobind from \"auto-bind\";\nimport $hfdUH$axios, {isAxiosError as $hfdUH$isAxiosError} from \"axios\";\nimport $hfdUH$axiosbetterstacktrace from \"axios-better-stacktrace\";\nimport {isNil as $hfdUH$isNil, merge as $hfdUH$merge} from \"lodash\";\nimport {jwtDecode as $hfdUH$jwtDecode} from \"jwt-decode\";\n\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $bc46d0f9a75295f8$exports = {};\n\n$parcel$export($bc46d0f9a75295f8$exports, \"BaseApi\", () => $bc46d0f9a75295f8$export$3ad201792064a82b);\n\nclass $bc46d0f9a75295f8$export$3ad201792064a82b {\n // request: ApiClient['request'];\n // get: ApiClient['get'];\n // delete: ApiClient['delete'];\n // head: ApiClient['head'];\n // options: ApiClient['options'];\n // post: ApiClient['post'];\n // put: ApiClient['put'];\n // patch: ApiClient['patch'];\n constructor(apiClient){\n this.apiClient = apiClient;\n (0, $hfdUH$autobind)(this);\n // this.request = this.client.request;\n // this.get = this.client.get;\n // this.delete = this.client.delete;\n // this.head = this.client.head;\n // this.options = this.client.options;\n // this.post = this.client.post;\n // this.put = this.client.put;\n // this.patch = this.client.patch;\n // this.get = this.client.get;\n }\n getApiClient() {\n return this.apiClient;\n }\n}\n\n\nvar $7f0ef0073dbac97f$exports = {};\n\n$parcel$export($7f0ef0073dbac97f$exports, \"ContentType\", () => $7f0ef0073dbac97f$export$e2e108cbe2e4f865);\n$parcel$export($7f0ef0073dbac97f$exports, \"BaseClient\", () => $7f0ef0073dbac97f$export$4f22f74eddb7716a);\n\n\n\n\nvar $7f0ef0073dbac97f$export$e2e108cbe2e4f865 = /*#__PURE__*/ function(ContentType) {\n ContentType[\"Json\"] = \"application/json\";\n ContentType[\"FormData\"] = \"multipart/form-data\";\n ContentType[\"UrlEncoded\"] = \"application/x-www-form-urlencoded\";\n ContentType[\"Text\"] = \"text/plain\";\n return ContentType;\n}({});\nclass $7f0ef0073dbac97f$export$4f22f74eddb7716a {\n constructor(config){\n this.config = config;\n (0, $hfdUH$autobind)(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = (0, $hfdUH$axios).create({\n baseURL: config.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders\n }\n });\n (0, $hfdUH$axiosbetterstacktrace)(this.axiosInstance);\n }\n stringifyFormItem(formItem) {\n if (typeof formItem === 'object' && formItem !== null) return JSON.stringify(formItem);\n else return `${formItem}`;\n }\n createFormData(input) {\n if (input instanceof FormData) return input;\n return Object.keys(input).reduce((formData, key)=>{\n const property = input[key];\n const propertyContent = property instanceof Array ? property : [\n property\n ];\n for (const formItem of propertyContent){\n const isFileType = formItem instanceof Blob || formItem instanceof File;\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\n }\n return formData;\n }, new FormData());\n }\n async request(requestConfig) {\n const { contentType: contentType, data: data } = requestConfig;\n if (!(0, $hfdUH$isNil)(data)) {\n if (contentType === \"multipart/form-data\" && typeof data === 'object') requestConfig.data = this.createFormData(data);\n if (contentType === \"text/plain\" && typeof data !== 'string') requestConfig.data = JSON.stringify(data);\n }\n const mergedConfig = (0, $hfdUH$merge)(requestConfig.secure ?? this.config.defaultSecure ? this.prepareAuthRequestConfig() : {}, contentType ? {\n headers: {\n 'Content-Type': contentType\n }\n } : {}, requestConfig);\n try {\n const { data: data, status: status, statusText: statusText } = await this.axiosInstance.request(mergedConfig);\n return {\n success: true,\n data: data,\n status: status,\n statusText: statusText\n };\n } catch (error) {\n if (!this.config.errorHandling) throw error;\n const result = {\n success: false,\n status: -1,\n statusText: String(error),\n error: error\n };\n if ((0, $hfdUH$isAxiosError)(error)) {\n this.config.onAxiosError?.(error);\n result.data = error.response?.data;\n result.status = error.response?.status ?? result.status;\n result.statusText = error.response?.statusText ?? result.statusText;\n }\n this.config.onError?.(error);\n return result;\n }\n }\n get(url, config) {\n return this.request({\n ...config,\n method: 'GET',\n url: url\n });\n }\n delete(url, config) {\n return this.request({\n ...config,\n method: 'DELETE',\n url: url\n });\n }\n head(url, config) {\n return this.request({\n ...config,\n method: 'HEAD',\n url: url\n });\n }\n options(url, config) {\n return this.request({\n ...config,\n method: 'OPTIONS',\n url: url\n });\n }\n post(url, data, config) {\n return this.request({\n ...config,\n method: 'POST',\n url: url,\n data: data\n });\n }\n put(url, data, config) {\n return this.request({\n ...config,\n method: 'PUT',\n url: url,\n data: data\n });\n }\n patch(url, data, config) {\n return this.request({\n ...config,\n method: 'PATCH',\n url: url,\n data: data\n });\n }\n getAxios() {\n return this.axiosInstance;\n }\n setAuthData(data) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n getAuthData() {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? JSON.parse(data) : null;\n }\n getConfig() {\n return this.config;\n }\n}\n\n\nvar $c53992c281676acd$exports = {};\n\n$parcel$export($c53992c281676acd$exports, \"JwtClient\", () => $c53992c281676acd$export$f280b732bbc5934b);\n\n\nclass $c53992c281676acd$export$f280b732bbc5934b extends (0, $7f0ef0073dbac97f$export$4f22f74eddb7716a) {\n constructor(config){\n super(config), this.config = config;\n }\n getConfig() {\n return super.getConfig();\n }\n prepareAuthRequestConfig() {\n const { accessToken: accessToken } = this.getAuthData() || {};\n if (!accessToken) {\n console.warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`\n }\n };\n }\n scheduleTokenRenewal(renewTokenCallback) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n try {\n payload = (0, $hfdUH$jwtDecode)(authData?.accessToken || '');\n } catch (error) {\n console.error(error);\n }\n if (!payload || !payload.exp) {\n console.warn('Could not schedule token renewal: invalid expiration time.');\n return;\n }\n const expiresIn = payload.exp * 1000 - Date.now();\n this.tokenRenewalTimeout = setTimeout(async ()=>{\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n }, expiresIn - 60000);\n }\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n\n\n\n\nexport {$bc46d0f9a75295f8$export$3ad201792064a82b as BaseApi, $7f0ef0073dbac97f$export$e2e108cbe2e4f865 as ContentType, $7f0ef0073dbac97f$export$4f22f74eddb7716a as BaseClient, $c53992c281676acd$export$f280b732bbc5934b as JwtClient};\n//# sourceMappingURL=index.esm.js.map\n","export * from './BaseApi';\nexport * from './BaseClient';\nexport * from './JwtClient';\n","import autoBind from 'auto-bind';\r\nimport { BaseClient } from './BaseClient';\r\n\r\nexport class BaseApi<\r\n HandleError extends boolean = boolean,\r\n ApiClient extends BaseClient<HandleError> = BaseClient<HandleError>,\r\n> {\r\n // request: ApiClient['request'];\r\n // get: ApiClient['get'];\r\n // delete: ApiClient['delete'];\r\n // head: ApiClient['head'];\r\n // options: ApiClient['options'];\r\n // post: ApiClient['post'];\r\n // put: ApiClient['put'];\r\n // patch: ApiClient['patch'];\r\n\r\n constructor(protected readonly apiClient: ApiClient) {\r\n autoBind(this);\r\n // this.request = this.client.request;\r\n // this.get = this.client.get;\r\n // this.delete = this.client.delete;\r\n // this.head = this.client.head;\r\n // this.options = this.client.options;\r\n // this.post = this.client.post;\r\n // this.put = this.client.put;\r\n // this.patch = this.client.patch;\r\n // this.get = this.client.get;\r\n }\r\n\r\n getApiClient(): ApiClient {\r\n return this.apiClient;\r\n }\r\n}\r\n","import autoBind from 'auto-bind';\r\nimport axios, {\r\n AxiosError,\r\n AxiosInstance,\r\n AxiosRequestConfig,\r\n AxiosResponse,\r\n HttpStatusCode,\r\n isAxiosError,\r\n} from 'axios';\r\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\r\nimport { isNil, merge } from 'lodash';\r\n\r\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\r\n baseUrl: string;\r\n errorHandling?: HandleError;\r\n storage?: Storage;\r\n defaultHeaders?: Record<string, string>;\r\n defaultSecure?: boolean;\r\n authDataStorageKey?: string;\r\n onAxiosError?: (error: AxiosError) => void;\r\n onError?: (error: unknown) => void;\r\n}\r\n\r\nexport enum ContentType {\r\n Json = 'application/json',\r\n FormData = 'multipart/form-data',\r\n UrlEncoded = 'application/x-www-form-urlencoded',\r\n Text = 'text/plain',\r\n}\r\n\r\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\r\n secure?: boolean;\r\n contentType?: ContentType;\r\n};\r\n\r\nexport type ResponseStatus = {\r\n status: HttpStatusCode | -1;\r\n statusText: string;\r\n};\r\n\r\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\r\n success: true;\r\n data: Data;\r\n};\r\n\r\nexport type ErrorClientResponse = ResponseStatus & {\r\n success: false;\r\n data?: any;\r\n error: unknown;\r\n};\r\n\r\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\r\n ? SuccessClientResponse<Data> | ErrorClientResponse\r\n : SuccessClientResponse<Data>;\r\n\r\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\r\n protected readonly axiosInstance: AxiosInstance;\r\n protected readonly storage: Storage;\r\n\r\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\r\n autoBind(this);\r\n this.storage = config.storage ?? sessionStorage;\r\n this.axiosInstance = axios.create({\r\n baseURL: config.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...config.defaultHeaders,\r\n },\r\n });\r\n axiosBetterStacktrace(this.axiosInstance);\r\n }\r\n\r\n protected stringifyFormItem(formItem: unknown) {\r\n if (typeof formItem === 'object' && formItem !== null) {\r\n return JSON.stringify(formItem);\r\n } else {\r\n return `${formItem}`;\r\n }\r\n }\r\n\r\n protected createFormData(input: Record<string, unknown>): FormData {\r\n if (input instanceof FormData) {\r\n return input;\r\n }\r\n\r\n return Object.keys(input).reduce((formData, key) => {\r\n const property = input[key];\r\n const propertyContent: any[] = property instanceof Array ? property : [property];\r\n\r\n for (const formItem of propertyContent) {\r\n const isFileType = formItem instanceof Blob || formItem instanceof File;\r\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\r\n }\r\n\r\n return formData;\r\n }, new FormData());\r\n }\r\n\r\n async request<Data = unknown, Error = unknown, Body = unknown>(\r\n requestConfig: RequestConfig<Body>,\r\n ): Promise<ClientResponse<Data, HandleError>> {\r\n const { contentType, data } = requestConfig;\r\n\r\n if (!isNil(data)) {\r\n if (contentType === ContentType.FormData && typeof data === 'object') {\r\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\r\n }\r\n\r\n if (contentType === ContentType.Text && typeof data !== 'string') {\r\n requestConfig.data = JSON.stringify(data) as any;\r\n }\r\n }\r\n\r\n const mergedConfig = merge(\r\n (requestConfig.secure ?? this.config.defaultSecure) ? this.prepareAuthRequestConfig() : {},\r\n contentType ? { headers: { 'Content-Type': contentType } } : {},\r\n requestConfig,\r\n );\r\n\r\n try {\r\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\r\n mergedConfig,\r\n );\r\n\r\n return {\r\n success: true,\r\n data,\r\n status,\r\n statusText,\r\n };\r\n } catch (error) {\r\n if (!this.config.errorHandling) {\r\n throw error;\r\n }\r\n\r\n const result: ErrorClientResponse = {\r\n success: false,\r\n status: -1,\r\n statusText: String(error),\r\n error,\r\n };\r\n\r\n if (isAxiosError<Error, Data>(error)) {\r\n this.config.onAxiosError?.(error);\r\n result.data = error.response?.data;\r\n result.status = error.response?.status ?? result.status;\r\n result.statusText = error.response?.statusText ?? result.statusText;\r\n }\r\n\r\n this.config.onError?.(error);\r\n\r\n return result as ClientResponse<Data, HandleError>;\r\n }\r\n }\r\n\r\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'GET',\r\n url,\r\n });\r\n }\r\n\r\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'DELETE',\r\n url,\r\n });\r\n }\r\n\r\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'HEAD',\r\n url,\r\n });\r\n }\r\n\r\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'OPTIONS',\r\n url,\r\n });\r\n }\r\n\r\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'POST',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PUT',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PATCH',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n getAxios(): AxiosInstance {\r\n return this.axiosInstance;\r\n }\r\n\r\n setAuthData(data: AuthData | null) {\r\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\r\n }\r\n\r\n getAuthData(): AuthData | null {\r\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\r\n return data ? (JSON.parse(data) as AuthData) : null;\r\n }\r\n\r\n getConfig(): BaseClientConfig<HandleError> {\r\n return this.config;\r\n }\r\n\r\n abstract prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>;\r\n}\r\n","import { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean> extends BaseClientConfig<HandleError> {\n authSchema?: string;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken: string;\n}\n\nexport class JwtClient<HandleError extends boolean = boolean> extends BaseClient<HandleError, JwtAuthData> {\n private tokenRenewalTimeout: number | undefined;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n override prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'> {\n const { accessToken } = this.getAuthData() || {};\n\n if (!accessToken) {\n console.warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n scheduleTokenRenewal(renewTokenCallback: () => Promise<JwtAuthData>) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n\n try {\n payload = jwtDecode(authData?.accessToken || '');\n } catch (error) {\n console.error(error);\n }\n\n if (!payload || !payload.exp) {\n console.warn('Could not schedule token renewal: invalid expiration time.');\n return;\n }\n\n const expiresIn = payload.exp * 1000 - Date.now();\n\n this.tokenRenewalTimeout = setTimeout(\n async () => {\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n },\n expiresIn - 60 * 1000,\n ) as unknown as number;\n }\n\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n"],"names":["$hfdUH$autobind","$hfdUH$axios","isAxiosError","$hfdUH$isAxiosError","$hfdUH$axiosbetterstacktrace","isNil","$hfdUH$isNil","merge","$hfdUH$merge","jwtDecode","$hfdUH$jwtDecode","$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$bc46d0f9a75295f8$export$3ad201792064a82b","constructor","apiClient","getApiClient","ContentType","$7f0ef0073dbac97f$exports","$7f0ef0073dbac97f$export$e2e108cbe2e4f865","$7f0ef0073dbac97f$export$4f22f74eddb7716a","config","storage","sessionStorage","axiosInstance","create","baseURL","baseUrl","headers","defaultHeaders","stringifyFormItem","formItem","JSON","stringify","createFormData","input","FormData","keys","reduce","formData","key","property","Array","isFileType","Blob","File","append","request","requestConfig","contentType","data","mergedConfig","secure","defaultSecure","prepareAuthRequestConfig","status","statusText","success","error","errorHandling","result","String","onAxiosError","response","onError","url","method","delete","head","options","post","put","patch","getAxios","setAuthData","setItem","authDataStorageKey","getAuthData","getItem","parse","getConfig","$c53992c281676acd$export$f280b732bbc5934b","accessToken","Authorization","authSchema","console","warn","scheduleTokenRenewal","renewTokenCallback","payload","cancelTokenRenewal","authData","exp","expiresIn","Date","now","tokenRenewalTimeout","setTimeout","clearTimeout","BaseApi","BaseClient","JwtClient"],"version":3,"file":"index.esm.js.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["<anon>","src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["import $hfdUH$autobind from \"auto-bind\";\nimport $hfdUH$axios, {isAxiosError as $hfdUH$isAxiosError} from \"axios\";\nimport $hfdUH$axiosbetterstacktrace from \"axios-better-stacktrace\";\nimport {isNil as $hfdUH$isNil, merge as $hfdUH$merge} from \"lodash\";\nimport {consola as $hfdUH$consola} from \"consola\";\nimport {jwtDecode as $hfdUH$jwtDecode} from \"jwt-decode\";\n\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $bc46d0f9a75295f8$exports = {};\n\n$parcel$export($bc46d0f9a75295f8$exports, \"BaseApi\", () => $bc46d0f9a75295f8$export$3ad201792064a82b);\n\nclass $bc46d0f9a75295f8$export$3ad201792064a82b {\n // request: ApiClient['request'];\n // get: ApiClient['get'];\n // delete: ApiClient['delete'];\n // head: ApiClient['head'];\n // options: ApiClient['options'];\n // post: ApiClient['post'];\n // put: ApiClient['put'];\n // patch: ApiClient['patch'];\n constructor(apiClient){\n this.apiClient = apiClient;\n (0, $hfdUH$autobind)(this);\n // this.request = this.client.request;\n // this.get = this.client.get;\n // this.delete = this.client.delete;\n // this.head = this.client.head;\n // this.options = this.client.options;\n // this.post = this.client.post;\n // this.put = this.client.put;\n // this.patch = this.client.patch;\n // this.get = this.client.get;\n }\n getApiClient() {\n return this.apiClient;\n }\n}\n\n\nvar $7f0ef0073dbac97f$exports = {};\n\n$parcel$export($7f0ef0073dbac97f$exports, \"ContentType\", () => $7f0ef0073dbac97f$export$e2e108cbe2e4f865);\n$parcel$export($7f0ef0073dbac97f$exports, \"BaseClient\", () => $7f0ef0073dbac97f$export$4f22f74eddb7716a);\n\n\n\n\nvar $7f0ef0073dbac97f$export$e2e108cbe2e4f865 = /*#__PURE__*/ function(ContentType) {\n ContentType[\"Json\"] = \"application/json\";\n ContentType[\"FormData\"] = \"multipart/form-data\";\n ContentType[\"UrlEncoded\"] = \"application/x-www-form-urlencoded\";\n ContentType[\"Text\"] = \"text/plain\";\n return ContentType;\n}({});\nclass $7f0ef0073dbac97f$export$4f22f74eddb7716a {\n constructor(config){\n this.config = config;\n (0, $hfdUH$autobind)(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = (0, $hfdUH$axios).create({\n baseURL: config.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders\n }\n });\n (0, $hfdUH$axiosbetterstacktrace)(this.axiosInstance);\n }\n stringifyFormItem(formItem) {\n if (typeof formItem === 'object' && formItem !== null) return JSON.stringify(formItem);\n else return `${formItem}`;\n }\n createFormData(input) {\n if (input instanceof FormData) return input;\n return Object.keys(input).reduce((formData, key)=>{\n const property = input[key];\n const propertyContent = property instanceof Array ? property : [\n property\n ];\n for (const formItem of propertyContent){\n const isFileType = formItem instanceof Blob || formItem instanceof File;\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\n }\n return formData;\n }, new FormData());\n }\n async request(requestConfig) {\n const { contentType: contentType, data: data } = requestConfig;\n if (!(0, $hfdUH$isNil)(data)) {\n if (contentType === \"multipart/form-data\" && typeof data === 'object') requestConfig.data = this.createFormData(data);\n if (contentType === \"text/plain\" && typeof data !== 'string') requestConfig.data = JSON.stringify(data);\n }\n const mergedConfig = (0, $hfdUH$merge)(requestConfig.secure ?? this.config.defaultSecure ? this.prepareAuthRequestConfig() : {}, contentType ? {\n headers: {\n 'Content-Type': contentType\n }\n } : {}, requestConfig);\n try {\n const { data: data, status: status, statusText: statusText } = await this.axiosInstance.request(mergedConfig);\n return {\n success: true,\n data: data,\n status: status,\n statusText: statusText\n };\n } catch (error) {\n if (!this.config.errorHandling) throw error;\n const result = {\n success: false,\n status: -1,\n statusText: String(error),\n error: error\n };\n if ((0, $hfdUH$isAxiosError)(error)) {\n this.config.onAxiosError?.(error);\n result.data = error.response?.data;\n result.status = error.response?.status ?? result.status;\n result.statusText = error.response?.statusText ?? result.statusText;\n }\n this.config.onError?.(error);\n return result;\n }\n }\n get(url, config) {\n return this.request({\n ...config,\n method: 'GET',\n url: url\n });\n }\n delete(url, config) {\n return this.request({\n ...config,\n method: 'DELETE',\n url: url\n });\n }\n head(url, config) {\n return this.request({\n ...config,\n method: 'HEAD',\n url: url\n });\n }\n options(url, config) {\n return this.request({\n ...config,\n method: 'OPTIONS',\n url: url\n });\n }\n post(url, data, config) {\n return this.request({\n ...config,\n method: 'POST',\n url: url,\n data: data\n });\n }\n put(url, data, config) {\n return this.request({\n ...config,\n method: 'PUT',\n url: url,\n data: data\n });\n }\n patch(url, data, config) {\n return this.request({\n ...config,\n method: 'PATCH',\n url: url,\n data: data\n });\n }\n getAxios() {\n return this.axiosInstance;\n }\n setAuthData(data) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n getAuthData() {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? JSON.parse(data) : null;\n }\n getConfig() {\n return this.config;\n }\n}\n\n\nvar $c53992c281676acd$exports = {};\n\n$parcel$export($c53992c281676acd$exports, \"JwtClient\", () => $c53992c281676acd$export$f280b732bbc5934b);\n\n\n\nclass $c53992c281676acd$export$f280b732bbc5934b extends (0, $7f0ef0073dbac97f$export$4f22f74eddb7716a) {\n constructor(config){\n super(config), this.config = config;\n }\n getConfig() {\n return super.getConfig();\n }\n prepareAuthRequestConfig() {\n const { accessToken: accessToken } = this.getAuthData() || {};\n if (!accessToken) {\n (0, $hfdUH$consola).warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`\n }\n };\n }\n scheduleTokenRenewal(renewTokenCallback) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n try {\n payload = (0, $hfdUH$jwtDecode)(authData?.accessToken || '');\n } catch (error) {\n (0, $hfdUH$consola).error(error);\n }\n if (!payload || !payload.exp) {\n (0, $hfdUH$consola).warn('Could not schedule token renewal: invalid expiration time');\n return;\n }\n const expiresIn = payload.exp * 1000 - Date.now();\n const renewToken = async ()=>{\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n };\n this.tokenRenewalTimeout = setTimeout(async ()=>{\n try {\n await renewToken();\n } catch (error) {\n (0, $hfdUH$consola).error('Failed to renew token. Retry in 10s', error);\n setTimeout(renewToken, 10000);\n }\n }, expiresIn - 60000);\n }\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n\n\n\n\nexport {$bc46d0f9a75295f8$export$3ad201792064a82b as BaseApi, $7f0ef0073dbac97f$export$e2e108cbe2e4f865 as ContentType, $7f0ef0073dbac97f$export$4f22f74eddb7716a as BaseClient, $c53992c281676acd$export$f280b732bbc5934b as JwtClient};\n//# sourceMappingURL=index.esm.js.map\n","export * from './BaseApi';\r\nexport * from './BaseClient';\r\nexport * from './JwtClient';\r\n","import autoBind from 'auto-bind';\r\nimport { BaseClient } from './BaseClient';\r\n\r\nexport class BaseApi<\r\n HandleError extends boolean = boolean,\r\n ApiClient extends BaseClient<HandleError> = BaseClient<HandleError>,\r\n> {\r\n // request: ApiClient['request'];\r\n // get: ApiClient['get'];\r\n // delete: ApiClient['delete'];\r\n // head: ApiClient['head'];\r\n // options: ApiClient['options'];\r\n // post: ApiClient['post'];\r\n // put: ApiClient['put'];\r\n // patch: ApiClient['patch'];\r\n\r\n constructor(protected readonly apiClient: ApiClient) {\r\n autoBind(this);\r\n // this.request = this.client.request;\r\n // this.get = this.client.get;\r\n // this.delete = this.client.delete;\r\n // this.head = this.client.head;\r\n // this.options = this.client.options;\r\n // this.post = this.client.post;\r\n // this.put = this.client.put;\r\n // this.patch = this.client.patch;\r\n // this.get = this.client.get;\r\n }\r\n\r\n getApiClient(): ApiClient {\r\n return this.apiClient;\r\n }\r\n}\r\n","import autoBind from 'auto-bind';\r\nimport axios, {\r\n AxiosError,\r\n AxiosInstance,\r\n AxiosRequestConfig,\r\n AxiosResponse,\r\n HttpStatusCode,\r\n isAxiosError,\r\n} from 'axios';\r\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\r\nimport { isNil, merge } from 'lodash';\r\n\r\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\r\n baseUrl: string;\r\n errorHandling?: HandleError;\r\n storage?: Storage;\r\n defaultHeaders?: Record<string, string>;\r\n defaultSecure?: boolean;\r\n authDataStorageKey?: string;\r\n onAxiosError?: (error: AxiosError) => void;\r\n onError?: (error: unknown) => void;\r\n}\r\n\r\nexport enum ContentType {\r\n Json = 'application/json',\r\n FormData = 'multipart/form-data',\r\n UrlEncoded = 'application/x-www-form-urlencoded',\r\n Text = 'text/plain',\r\n}\r\n\r\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\r\n secure?: boolean;\r\n contentType?: ContentType;\r\n};\r\n\r\nexport type ResponseStatus = {\r\n status: HttpStatusCode | -1;\r\n statusText: string;\r\n};\r\n\r\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\r\n success: true;\r\n data: Data;\r\n};\r\n\r\nexport type ErrorClientResponse = ResponseStatus & {\r\n success: false;\r\n data?: any;\r\n error: unknown;\r\n};\r\n\r\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\r\n ? SuccessClientResponse<Data> | ErrorClientResponse\r\n : SuccessClientResponse<Data>;\r\n\r\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\r\n protected readonly axiosInstance: AxiosInstance;\r\n protected readonly storage: Storage;\r\n\r\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\r\n autoBind(this);\r\n this.storage = config.storage ?? sessionStorage;\r\n this.axiosInstance = axios.create({\r\n baseURL: config.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...config.defaultHeaders,\r\n },\r\n });\r\n axiosBetterStacktrace(this.axiosInstance);\r\n }\r\n\r\n protected stringifyFormItem(formItem: unknown) {\r\n if (typeof formItem === 'object' && formItem !== null) {\r\n return JSON.stringify(formItem);\r\n } else {\r\n return `${formItem}`;\r\n }\r\n }\r\n\r\n protected createFormData(input: Record<string, unknown>): FormData {\r\n if (input instanceof FormData) {\r\n return input;\r\n }\r\n\r\n return Object.keys(input).reduce((formData, key) => {\r\n const property = input[key];\r\n const propertyContent: any[] = property instanceof Array ? property : [property];\r\n\r\n for (const formItem of propertyContent) {\r\n const isFileType = formItem instanceof Blob || formItem instanceof File;\r\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\r\n }\r\n\r\n return formData;\r\n }, new FormData());\r\n }\r\n\r\n async request<Data = unknown, Error = unknown, Body = unknown>(\r\n requestConfig: RequestConfig<Body>,\r\n ): Promise<ClientResponse<Data, HandleError>> {\r\n const { contentType, data } = requestConfig;\r\n\r\n if (!isNil(data)) {\r\n if (contentType === ContentType.FormData && typeof data === 'object') {\r\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\r\n }\r\n\r\n if (contentType === ContentType.Text && typeof data !== 'string') {\r\n requestConfig.data = JSON.stringify(data) as any;\r\n }\r\n }\r\n\r\n const mergedConfig = merge(\r\n (requestConfig.secure ?? this.config.defaultSecure) ? this.prepareAuthRequestConfig() : {},\r\n contentType ? { headers: { 'Content-Type': contentType } } : {},\r\n requestConfig,\r\n );\r\n\r\n try {\r\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\r\n mergedConfig,\r\n );\r\n\r\n return {\r\n success: true,\r\n data,\r\n status,\r\n statusText,\r\n };\r\n } catch (error) {\r\n if (!this.config.errorHandling) {\r\n throw error;\r\n }\r\n\r\n const result: ErrorClientResponse = {\r\n success: false,\r\n status: -1,\r\n statusText: String(error),\r\n error,\r\n };\r\n\r\n if (isAxiosError<Error, Data>(error)) {\r\n this.config.onAxiosError?.(error);\r\n result.data = error.response?.data;\r\n result.status = error.response?.status ?? result.status;\r\n result.statusText = error.response?.statusText ?? result.statusText;\r\n }\r\n\r\n this.config.onError?.(error);\r\n\r\n return result as ClientResponse<Data, HandleError>;\r\n }\r\n }\r\n\r\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'GET',\r\n url,\r\n });\r\n }\r\n\r\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'DELETE',\r\n url,\r\n });\r\n }\r\n\r\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'HEAD',\r\n url,\r\n });\r\n }\r\n\r\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'OPTIONS',\r\n url,\r\n });\r\n }\r\n\r\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'POST',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PUT',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PATCH',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n getAxios(): AxiosInstance {\r\n return this.axiosInstance;\r\n }\r\n\r\n setAuthData(data: AuthData | null) {\r\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\r\n }\r\n\r\n getAuthData(): AuthData | null {\r\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\r\n return data ? (JSON.parse(data) as AuthData) : null;\r\n }\r\n\r\n getConfig(): BaseClientConfig<HandleError> {\r\n return this.config;\r\n }\r\n\r\n abstract prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>;\r\n}\r\n","import { consola } from 'consola';\nimport { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean> extends BaseClientConfig<HandleError> {\n authSchema?: string;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken: string;\n}\n\nexport class JwtClient<HandleError extends boolean = boolean> extends BaseClient<HandleError, JwtAuthData> {\n private tokenRenewalTimeout: number | undefined;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n override prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'> {\n const { accessToken } = this.getAuthData() || {};\n\n if (!accessToken) {\n consola.warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n scheduleTokenRenewal(renewTokenCallback: () => Promise<JwtAuthData>) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n\n try {\n payload = jwtDecode(authData?.accessToken || '');\n } catch (error) {\n consola.error(error);\n }\n\n if (!payload || !payload.exp) {\n consola.warn('Could not schedule token renewal: invalid expiration time');\n return;\n }\n\n const expiresIn = payload.exp * 1000 - Date.now();\n\n const renewToken = async () => {\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n };\n\n this.tokenRenewalTimeout = setTimeout(\n async () => {\n try {\n await renewToken();\n } catch (error) {\n consola.error('Failed to renew token. Retry in 10s', error);\n setTimeout(renewToken, 10000);\n }\n },\n expiresIn - 60 * 1000,\n ) as unknown as number;\n }\n\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n"],"names":["$hfdUH$autobind","$hfdUH$axios","isAxiosError","$hfdUH$isAxiosError","$hfdUH$axiosbetterstacktrace","isNil","$hfdUH$isNil","merge","$hfdUH$merge","consola","$hfdUH$consola","jwtDecode","$hfdUH$jwtDecode","$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$bc46d0f9a75295f8$export$3ad201792064a82b","constructor","apiClient","getApiClient","ContentType","$7f0ef0073dbac97f$exports","$7f0ef0073dbac97f$export$e2e108cbe2e4f865","$7f0ef0073dbac97f$export$4f22f74eddb7716a","config","storage","sessionStorage","axiosInstance","create","baseURL","baseUrl","headers","defaultHeaders","stringifyFormItem","formItem","JSON","stringify","createFormData","input","FormData","keys","reduce","formData","key","property","Array","isFileType","Blob","File","append","request","requestConfig","contentType","data","mergedConfig","secure","defaultSecure","prepareAuthRequestConfig","status","statusText","success","error","errorHandling","result","String","onAxiosError","response","onError","url","method","delete","head","options","post","put","patch","getAxios","setAuthData","setItem","authDataStorageKey","getAuthData","getItem","parse","getConfig","$c53992c281676acd$export$f280b732bbc5934b","accessToken","Authorization","authSchema","warn","scheduleTokenRenewal","renewTokenCallback","payload","cancelTokenRenewal","authData","exp","expiresIn","Date","now","renewToken","tokenRenewalTimeout","setTimeout","clearTimeout","BaseApi","BaseClient","JwtClient"],"version":3,"file":"index.esm.js.map","sourceRoot":"../"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var t,e=require("auto-bind"),r=require("axios"),a=require("axios-better-stacktrace"),s=require("lodash"),n=require("jwt-decode");function o(t,e){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t}function i(t){return t&&t.__esModule?t.default:t}function u(t,e,r,a){Object.defineProperty(t,e,{get:r,set:a,enumerable:!0,configurable:!0})}var c={};u(c,"BaseApi",()=>l);class l{constructor(t){this.apiClient=t,i(e)(this)}getApiClient(){return this.apiClient}}var h={};u(h,"ContentType",()=>d),u(h,"BaseClient",()=>f);var d=((t={}).Json="application/json",t.FormData="multipart/form-data",t.UrlEncoded="application/x-www-form-urlencoded",t.Text="text/plain",t);class f{constructor(t){this.config=t,i(e)(this),this.storage=t.storage??sessionStorage,this.axiosInstance=i(r).create({baseURL:t.baseUrl,headers:{"Content-Type":"application/json",...t.defaultHeaders}}),i(a)(this.axiosInstance)}stringifyFormItem(t){return"object"==typeof t&&null!==t?JSON.stringify(t):`${t}`}createFormData(t){return t instanceof FormData?t:Object.keys(t).reduce((e,r)=>{let a=t[r];for(let t of a instanceof Array?a:[a]){let a=t instanceof Blob||t instanceof File;e.append(r,a?t:this.stringifyFormItem(t))}return e},new FormData)}async request(t){let{contentType:e,data:a}=t;(0,s.isNil)(a)||("multipart/form-data"===e&&"object"==typeof a&&(t.data=this.createFormData(a)),"text/plain"===e&&"string"!=typeof a&&(t.data=JSON.stringify(a)));let n=(0,s.merge)(t.secure??this.config.defaultSecure?this.prepareAuthRequestConfig():{},e?{headers:{"Content-Type":e}}:{},t);try{let{data:t,status:e,statusText:r}=await this.axiosInstance.request(n);return{success:!0,data:t,status:e,statusText:r}}catch(e){if(!this.config.errorHandling)throw e;let t={success:!1,status:-1,statusText:String(e),error:e};return(0,r.isAxiosError)(e)&&(this.config.onAxiosError?.(e),t.data=e.response?.data,t.status=e.response?.status??t.status,t.statusText=e.response?.statusText??t.statusText),this.config.onError?.(e),t}}get(t,e){return this.request({...e,method:"GET",url:t})}delete(t,e){return this.request({...e,method:"DELETE",url:t})}head(t,e){return this.request({...e,method:"HEAD",url:t})}options(t,e){return this.request({...e,method:"OPTIONS",url:t})}post(t,e,r){return this.request({...r,method:"POST",url:t,data:e})}put(t,e,r){return this.request({...r,method:"PUT",url:t,data:e})}patch(t,e,r){return this.request({...r,method:"PATCH",url:t,data:e})}getAxios(){return this.axiosInstance}setAuthData(t){this.storage.setItem(this.config.authDataStorageKey||"auth",JSON.stringify(t))}getAuthData(){let t=this.storage.getItem(this.config.authDataStorageKey||"auth");return t?JSON.parse(t):null}getConfig(){return this.config}}var p={};u(p,"JwtClient",()=>g);class g extends f{constructor(t){super(t),this.config=t}getConfig(){return super.getConfig()}prepareAuthRequestConfig(){let{accessToken:t}=this.getAuthData()||{};return t?{headers:{Authorization:`${this.config.authSchema??"Bearer"} ${t}`}}:(console.warn("No access token found. Please set auth data after authorization."),{})}scheduleTokenRenewal(t){let e;this.cancelTokenRenewal();let r=this.getAuthData();try{e=(0,n.jwtDecode)(r?.accessToken||"")}catch(t){console.error(t)}if(!e||!e.exp){console.warn("Could not schedule token renewal: invalid expiration time.");return}let a=1e3*e.exp-Date.now();this.tokenRenewalTimeout=setTimeout(async()=>{let e=await t();this.setAuthData(e),this.scheduleTokenRenewal(t)},a-6e4)}cancelTokenRenewal(){clearTimeout(this.tokenRenewalTimeout)}}o(module.exports,c),o(module.exports,h),o(module.exports,p);
1
+ var t,e=require("auto-bind"),r=require("axios"),a=require("axios-better-stacktrace"),s=require("lodash"),n=require("consola"),o=require("jwt-decode");function i(t,e){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t}function u(t){return t&&t.__esModule?t.default:t}function c(t,e,r,a){Object.defineProperty(t,e,{get:r,set:a,enumerable:!0,configurable:!0})}var l={};c(l,"BaseApi",()=>h);class h{constructor(t){this.apiClient=t,u(e)(this)}getApiClient(){return this.apiClient}}var d={};c(d,"ContentType",()=>f),c(d,"BaseClient",()=>p);var f=((t={}).Json="application/json",t.FormData="multipart/form-data",t.UrlEncoded="application/x-www-form-urlencoded",t.Text="text/plain",t);class p{constructor(t){this.config=t,u(e)(this),this.storage=t.storage??sessionStorage,this.axiosInstance=u(r).create({baseURL:t.baseUrl,headers:{"Content-Type":"application/json",...t.defaultHeaders}}),u(a)(this.axiosInstance)}stringifyFormItem(t){return"object"==typeof t&&null!==t?JSON.stringify(t):`${t}`}createFormData(t){return t instanceof FormData?t:Object.keys(t).reduce((e,r)=>{let a=t[r];for(let t of a instanceof Array?a:[a]){let a=t instanceof Blob||t instanceof File;e.append(r,a?t:this.stringifyFormItem(t))}return e},new FormData)}async request(t){let{contentType:e,data:a}=t;(0,s.isNil)(a)||("multipart/form-data"===e&&"object"==typeof a&&(t.data=this.createFormData(a)),"text/plain"===e&&"string"!=typeof a&&(t.data=JSON.stringify(a)));let n=(0,s.merge)(t.secure??this.config.defaultSecure?this.prepareAuthRequestConfig():{},e?{headers:{"Content-Type":e}}:{},t);try{let{data:t,status:e,statusText:r}=await this.axiosInstance.request(n);return{success:!0,data:t,status:e,statusText:r}}catch(e){if(!this.config.errorHandling)throw e;let t={success:!1,status:-1,statusText:String(e),error:e};return(0,r.isAxiosError)(e)&&(this.config.onAxiosError?.(e),t.data=e.response?.data,t.status=e.response?.status??t.status,t.statusText=e.response?.statusText??t.statusText),this.config.onError?.(e),t}}get(t,e){return this.request({...e,method:"GET",url:t})}delete(t,e){return this.request({...e,method:"DELETE",url:t})}head(t,e){return this.request({...e,method:"HEAD",url:t})}options(t,e){return this.request({...e,method:"OPTIONS",url:t})}post(t,e,r){return this.request({...r,method:"POST",url:t,data:e})}put(t,e,r){return this.request({...r,method:"PUT",url:t,data:e})}patch(t,e,r){return this.request({...r,method:"PATCH",url:t,data:e})}getAxios(){return this.axiosInstance}setAuthData(t){this.storage.setItem(this.config.authDataStorageKey||"auth",JSON.stringify(t))}getAuthData(){let t=this.storage.getItem(this.config.authDataStorageKey||"auth");return t?JSON.parse(t):null}getConfig(){return this.config}}var g={};c(g,"JwtClient",()=>m);class m extends p{constructor(t){super(t),this.config=t}getConfig(){return super.getConfig()}prepareAuthRequestConfig(){let{accessToken:t}=this.getAuthData()||{};return t?{headers:{Authorization:`${this.config.authSchema??"Bearer"} ${t}`}}:((0,n.consola).warn("No access token found. Please set auth data after authorization."),{})}scheduleTokenRenewal(t){let e;this.cancelTokenRenewal();let r=this.getAuthData();try{e=(0,o.jwtDecode)(r?.accessToken||"")}catch(t){(0,n.consola).error(t)}if(!e||!e.exp){(0,n.consola).warn("Could not schedule token renewal: invalid expiration time");return}let a=1e3*e.exp-Date.now(),s=async()=>{let e=await t();this.setAuthData(e),this.scheduleTokenRenewal(t)};this.tokenRenewalTimeout=setTimeout(async()=>{try{await s()}catch(t){(0,n.consola).error("Failed to renew token. Retry in 10s",t),setTimeout(s,1e4)}},a-6e4)}cancelTokenRenewal(){clearTimeout(this.tokenRenewalTimeout)}}i(module.exports,l),i(module.exports,d),i(module.exports,g);
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["<anon>","src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["var $5Sh66$autobind = require(\"auto-bind\");\nvar $5Sh66$axios = require(\"axios\");\nvar $5Sh66$axiosbetterstacktrace = require(\"axios-better-stacktrace\");\nvar $5Sh66$lodash = require(\"lodash\");\nvar $5Sh66$jwtdecode = require(\"jwt-decode\");\n\n\nfunction $parcel$exportWildcard(dest, source) {\n Object.keys(source).forEach(function(key) {\n if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function get() {\n return source[key];\n }\n });\n });\n\n return dest;\n}\n\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $d6fbd40018854b1b$exports = {};\n\n$parcel$export($d6fbd40018854b1b$exports, \"BaseApi\", () => $d6fbd40018854b1b$export$3ad201792064a82b);\n\nclass $d6fbd40018854b1b$export$3ad201792064a82b {\n // request: ApiClient['request'];\n // get: ApiClient['get'];\n // delete: ApiClient['delete'];\n // head: ApiClient['head'];\n // options: ApiClient['options'];\n // post: ApiClient['post'];\n // put: ApiClient['put'];\n // patch: ApiClient['patch'];\n constructor(apiClient){\n this.apiClient = apiClient;\n (0, ($parcel$interopDefault($5Sh66$autobind)))(this);\n // this.request = this.client.request;\n // this.get = this.client.get;\n // this.delete = this.client.delete;\n // this.head = this.client.head;\n // this.options = this.client.options;\n // this.post = this.client.post;\n // this.put = this.client.put;\n // this.patch = this.client.patch;\n // this.get = this.client.get;\n }\n getApiClient() {\n return this.apiClient;\n }\n}\n\n\nvar $e147b9ba9f5381c6$exports = {};\n\n$parcel$export($e147b9ba9f5381c6$exports, \"ContentType\", () => $e147b9ba9f5381c6$export$e2e108cbe2e4f865);\n$parcel$export($e147b9ba9f5381c6$exports, \"BaseClient\", () => $e147b9ba9f5381c6$export$4f22f74eddb7716a);\n\n\n\n\nvar $e147b9ba9f5381c6$export$e2e108cbe2e4f865 = /*#__PURE__*/ function(ContentType) {\n ContentType[\"Json\"] = \"application/json\";\n ContentType[\"FormData\"] = \"multipart/form-data\";\n ContentType[\"UrlEncoded\"] = \"application/x-www-form-urlencoded\";\n ContentType[\"Text\"] = \"text/plain\";\n return ContentType;\n}({});\nclass $e147b9ba9f5381c6$export$4f22f74eddb7716a {\n constructor(config){\n this.config = config;\n (0, ($parcel$interopDefault($5Sh66$autobind)))(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = (0, ($parcel$interopDefault($5Sh66$axios))).create({\n baseURL: config.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders\n }\n });\n (0, ($parcel$interopDefault($5Sh66$axiosbetterstacktrace)))(this.axiosInstance);\n }\n stringifyFormItem(formItem) {\n if (typeof formItem === 'object' && formItem !== null) return JSON.stringify(formItem);\n else return `${formItem}`;\n }\n createFormData(input) {\n if (input instanceof FormData) return input;\n return Object.keys(input).reduce((formData, key)=>{\n const property = input[key];\n const propertyContent = property instanceof Array ? property : [\n property\n ];\n for (const formItem of propertyContent){\n const isFileType = formItem instanceof Blob || formItem instanceof File;\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\n }\n return formData;\n }, new FormData());\n }\n async request(requestConfig) {\n const { contentType: contentType, data: data } = requestConfig;\n if (!(0, $5Sh66$lodash.isNil)(data)) {\n if (contentType === \"multipart/form-data\" && typeof data === 'object') requestConfig.data = this.createFormData(data);\n if (contentType === \"text/plain\" && typeof data !== 'string') requestConfig.data = JSON.stringify(data);\n }\n const mergedConfig = (0, $5Sh66$lodash.merge)(requestConfig.secure ?? this.config.defaultSecure ? this.prepareAuthRequestConfig() : {}, contentType ? {\n headers: {\n 'Content-Type': contentType\n }\n } : {}, requestConfig);\n try {\n const { data: data, status: status, statusText: statusText } = await this.axiosInstance.request(mergedConfig);\n return {\n success: true,\n data: data,\n status: status,\n statusText: statusText\n };\n } catch (error) {\n if (!this.config.errorHandling) throw error;\n const result = {\n success: false,\n status: -1,\n statusText: String(error),\n error: error\n };\n if ((0, $5Sh66$axios.isAxiosError)(error)) {\n this.config.onAxiosError?.(error);\n result.data = error.response?.data;\n result.status = error.response?.status ?? result.status;\n result.statusText = error.response?.statusText ?? result.statusText;\n }\n this.config.onError?.(error);\n return result;\n }\n }\n get(url, config) {\n return this.request({\n ...config,\n method: 'GET',\n url: url\n });\n }\n delete(url, config) {\n return this.request({\n ...config,\n method: 'DELETE',\n url: url\n });\n }\n head(url, config) {\n return this.request({\n ...config,\n method: 'HEAD',\n url: url\n });\n }\n options(url, config) {\n return this.request({\n ...config,\n method: 'OPTIONS',\n url: url\n });\n }\n post(url, data, config) {\n return this.request({\n ...config,\n method: 'POST',\n url: url,\n data: data\n });\n }\n put(url, data, config) {\n return this.request({\n ...config,\n method: 'PUT',\n url: url,\n data: data\n });\n }\n patch(url, data, config) {\n return this.request({\n ...config,\n method: 'PATCH',\n url: url,\n data: data\n });\n }\n getAxios() {\n return this.axiosInstance;\n }\n setAuthData(data) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n getAuthData() {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? JSON.parse(data) : null;\n }\n getConfig() {\n return this.config;\n }\n}\n\n\nvar $f04719e3bb600f8d$exports = {};\n\n$parcel$export($f04719e3bb600f8d$exports, \"JwtClient\", () => $f04719e3bb600f8d$export$f280b732bbc5934b);\n\n\nclass $f04719e3bb600f8d$export$f280b732bbc5934b extends (0, $e147b9ba9f5381c6$export$4f22f74eddb7716a) {\n constructor(config){\n super(config), this.config = config;\n }\n getConfig() {\n return super.getConfig();\n }\n prepareAuthRequestConfig() {\n const { accessToken: accessToken } = this.getAuthData() || {};\n if (!accessToken) {\n console.warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`\n }\n };\n }\n scheduleTokenRenewal(renewTokenCallback) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n try {\n payload = (0, $5Sh66$jwtdecode.jwtDecode)(authData?.accessToken || '');\n } catch (error) {\n console.error(error);\n }\n if (!payload || !payload.exp) {\n console.warn('Could not schedule token renewal: invalid expiration time.');\n return;\n }\n const expiresIn = payload.exp * 1000 - Date.now();\n this.tokenRenewalTimeout = setTimeout(async ()=>{\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n }, expiresIn - 60000);\n }\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n\n\n$parcel$exportWildcard(module.exports, $d6fbd40018854b1b$exports);\n$parcel$exportWildcard(module.exports, $e147b9ba9f5381c6$exports);\n$parcel$exportWildcard(module.exports, $f04719e3bb600f8d$exports);\n\n\n//# sourceMappingURL=index.js.map\n","export * from './BaseApi';\nexport * from './BaseClient';\nexport * from './JwtClient';\n","import autoBind from 'auto-bind';\r\nimport { BaseClient } from './BaseClient';\r\n\r\nexport class BaseApi<\r\n HandleError extends boolean = boolean,\r\n ApiClient extends BaseClient<HandleError> = BaseClient<HandleError>,\r\n> {\r\n // request: ApiClient['request'];\r\n // get: ApiClient['get'];\r\n // delete: ApiClient['delete'];\r\n // head: ApiClient['head'];\r\n // options: ApiClient['options'];\r\n // post: ApiClient['post'];\r\n // put: ApiClient['put'];\r\n // patch: ApiClient['patch'];\r\n\r\n constructor(protected readonly apiClient: ApiClient) {\r\n autoBind(this);\r\n // this.request = this.client.request;\r\n // this.get = this.client.get;\r\n // this.delete = this.client.delete;\r\n // this.head = this.client.head;\r\n // this.options = this.client.options;\r\n // this.post = this.client.post;\r\n // this.put = this.client.put;\r\n // this.patch = this.client.patch;\r\n // this.get = this.client.get;\r\n }\r\n\r\n getApiClient(): ApiClient {\r\n return this.apiClient;\r\n }\r\n}\r\n","import autoBind from 'auto-bind';\r\nimport axios, {\r\n AxiosError,\r\n AxiosInstance,\r\n AxiosRequestConfig,\r\n AxiosResponse,\r\n HttpStatusCode,\r\n isAxiosError,\r\n} from 'axios';\r\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\r\nimport { isNil, merge } from 'lodash';\r\n\r\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\r\n baseUrl: string;\r\n errorHandling?: HandleError;\r\n storage?: Storage;\r\n defaultHeaders?: Record<string, string>;\r\n defaultSecure?: boolean;\r\n authDataStorageKey?: string;\r\n onAxiosError?: (error: AxiosError) => void;\r\n onError?: (error: unknown) => void;\r\n}\r\n\r\nexport enum ContentType {\r\n Json = 'application/json',\r\n FormData = 'multipart/form-data',\r\n UrlEncoded = 'application/x-www-form-urlencoded',\r\n Text = 'text/plain',\r\n}\r\n\r\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\r\n secure?: boolean;\r\n contentType?: ContentType;\r\n};\r\n\r\nexport type ResponseStatus = {\r\n status: HttpStatusCode | -1;\r\n statusText: string;\r\n};\r\n\r\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\r\n success: true;\r\n data: Data;\r\n};\r\n\r\nexport type ErrorClientResponse = ResponseStatus & {\r\n success: false;\r\n data?: any;\r\n error: unknown;\r\n};\r\n\r\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\r\n ? SuccessClientResponse<Data> | ErrorClientResponse\r\n : SuccessClientResponse<Data>;\r\n\r\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\r\n protected readonly axiosInstance: AxiosInstance;\r\n protected readonly storage: Storage;\r\n\r\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\r\n autoBind(this);\r\n this.storage = config.storage ?? sessionStorage;\r\n this.axiosInstance = axios.create({\r\n baseURL: config.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...config.defaultHeaders,\r\n },\r\n });\r\n axiosBetterStacktrace(this.axiosInstance);\r\n }\r\n\r\n protected stringifyFormItem(formItem: unknown) {\r\n if (typeof formItem === 'object' && formItem !== null) {\r\n return JSON.stringify(formItem);\r\n } else {\r\n return `${formItem}`;\r\n }\r\n }\r\n\r\n protected createFormData(input: Record<string, unknown>): FormData {\r\n if (input instanceof FormData) {\r\n return input;\r\n }\r\n\r\n return Object.keys(input).reduce((formData, key) => {\r\n const property = input[key];\r\n const propertyContent: any[] = property instanceof Array ? property : [property];\r\n\r\n for (const formItem of propertyContent) {\r\n const isFileType = formItem instanceof Blob || formItem instanceof File;\r\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\r\n }\r\n\r\n return formData;\r\n }, new FormData());\r\n }\r\n\r\n async request<Data = unknown, Error = unknown, Body = unknown>(\r\n requestConfig: RequestConfig<Body>,\r\n ): Promise<ClientResponse<Data, HandleError>> {\r\n const { contentType, data } = requestConfig;\r\n\r\n if (!isNil(data)) {\r\n if (contentType === ContentType.FormData && typeof data === 'object') {\r\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\r\n }\r\n\r\n if (contentType === ContentType.Text && typeof data !== 'string') {\r\n requestConfig.data = JSON.stringify(data) as any;\r\n }\r\n }\r\n\r\n const mergedConfig = merge(\r\n (requestConfig.secure ?? this.config.defaultSecure) ? this.prepareAuthRequestConfig() : {},\r\n contentType ? { headers: { 'Content-Type': contentType } } : {},\r\n requestConfig,\r\n );\r\n\r\n try {\r\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\r\n mergedConfig,\r\n );\r\n\r\n return {\r\n success: true,\r\n data,\r\n status,\r\n statusText,\r\n };\r\n } catch (error) {\r\n if (!this.config.errorHandling) {\r\n throw error;\r\n }\r\n\r\n const result: ErrorClientResponse = {\r\n success: false,\r\n status: -1,\r\n statusText: String(error),\r\n error,\r\n };\r\n\r\n if (isAxiosError<Error, Data>(error)) {\r\n this.config.onAxiosError?.(error);\r\n result.data = error.response?.data;\r\n result.status = error.response?.status ?? result.status;\r\n result.statusText = error.response?.statusText ?? result.statusText;\r\n }\r\n\r\n this.config.onError?.(error);\r\n\r\n return result as ClientResponse<Data, HandleError>;\r\n }\r\n }\r\n\r\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'GET',\r\n url,\r\n });\r\n }\r\n\r\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'DELETE',\r\n url,\r\n });\r\n }\r\n\r\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'HEAD',\r\n url,\r\n });\r\n }\r\n\r\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'OPTIONS',\r\n url,\r\n });\r\n }\r\n\r\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'POST',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PUT',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PATCH',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n getAxios(): AxiosInstance {\r\n return this.axiosInstance;\r\n }\r\n\r\n setAuthData(data: AuthData | null) {\r\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\r\n }\r\n\r\n getAuthData(): AuthData | null {\r\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\r\n return data ? (JSON.parse(data) as AuthData) : null;\r\n }\r\n\r\n getConfig(): BaseClientConfig<HandleError> {\r\n return this.config;\r\n }\r\n\r\n abstract prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>;\r\n}\r\n","import { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean> extends BaseClientConfig<HandleError> {\n authSchema?: string;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken: string;\n}\n\nexport class JwtClient<HandleError extends boolean = boolean> extends BaseClient<HandleError, JwtAuthData> {\n private tokenRenewalTimeout: number | undefined;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n override prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'> {\n const { accessToken } = this.getAuthData() || {};\n\n if (!accessToken) {\n console.warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n scheduleTokenRenewal(renewTokenCallback: () => Promise<JwtAuthData>) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n\n try {\n payload = jwtDecode(authData?.accessToken || '');\n } catch (error) {\n console.error(error);\n }\n\n if (!payload || !payload.exp) {\n console.warn('Could not schedule token renewal: invalid expiration time.');\n return;\n }\n\n const expiresIn = payload.exp * 1000 - Date.now();\n\n this.tokenRenewalTimeout = setTimeout(\n async () => {\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n },\n expiresIn - 60 * 1000,\n ) as unknown as number;\n }\n\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n"],"names":["ContentType","$5Sh66$autobind","require","$5Sh66$axios","$5Sh66$axiosbetterstacktrace","$5Sh66$lodash","$5Sh66$jwtdecode","$parcel$exportWildcard","dest","source","Object","keys","forEach","key","prototype","hasOwnProperty","call","defineProperty","enumerable","get","$parcel$interopDefault","a","__esModule","default","$parcel$export","e","n","v","s","set","configurable","$d6fbd40018854b1b$exports","$d6fbd40018854b1b$export$3ad201792064a82b","constructor","apiClient","getApiClient","$e147b9ba9f5381c6$exports","$e147b9ba9f5381c6$export$e2e108cbe2e4f865","$e147b9ba9f5381c6$export$4f22f74eddb7716a","config","storage","sessionStorage","axiosInstance","create","baseURL","baseUrl","headers","defaultHeaders","stringifyFormItem","formItem","JSON","stringify","createFormData","input","FormData","reduce","formData","property","Array","isFileType","Blob","File","append","request","requestConfig","contentType","data","isNil","mergedConfig","merge","secure","defaultSecure","prepareAuthRequestConfig","status","statusText","success","error","errorHandling","result","String","isAxiosError","onAxiosError","response","onError","url","method","delete","head","options","post","put","patch","getAxios","setAuthData","setItem","authDataStorageKey","getAuthData","getItem","parse","getConfig","$f04719e3bb600f8d$exports","$f04719e3bb600f8d$export$f280b732bbc5934b","accessToken","Authorization","authSchema","console","warn","scheduleTokenRenewal","renewTokenCallback","payload","cancelTokenRenewal","authData","jwtDecode","exp","expiresIn","Date","now","tokenRenewalTimeout","setTimeout","clearTimeout","module","exports"],"version":3,"file":"index.js.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["<anon>","src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["var $5Sh66$autobind = require(\"auto-bind\");\nvar $5Sh66$axios = require(\"axios\");\nvar $5Sh66$axiosbetterstacktrace = require(\"axios-better-stacktrace\");\nvar $5Sh66$lodash = require(\"lodash\");\nvar $5Sh66$consola = require(\"consola\");\nvar $5Sh66$jwtdecode = require(\"jwt-decode\");\n\n\nfunction $parcel$exportWildcard(dest, source) {\n Object.keys(source).forEach(function(key) {\n if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function get() {\n return source[key];\n }\n });\n });\n\n return dest;\n}\n\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $d6fbd40018854b1b$exports = {};\n\n$parcel$export($d6fbd40018854b1b$exports, \"BaseApi\", () => $d6fbd40018854b1b$export$3ad201792064a82b);\n\nclass $d6fbd40018854b1b$export$3ad201792064a82b {\n // request: ApiClient['request'];\n // get: ApiClient['get'];\n // delete: ApiClient['delete'];\n // head: ApiClient['head'];\n // options: ApiClient['options'];\n // post: ApiClient['post'];\n // put: ApiClient['put'];\n // patch: ApiClient['patch'];\n constructor(apiClient){\n this.apiClient = apiClient;\n (0, ($parcel$interopDefault($5Sh66$autobind)))(this);\n // this.request = this.client.request;\n // this.get = this.client.get;\n // this.delete = this.client.delete;\n // this.head = this.client.head;\n // this.options = this.client.options;\n // this.post = this.client.post;\n // this.put = this.client.put;\n // this.patch = this.client.patch;\n // this.get = this.client.get;\n }\n getApiClient() {\n return this.apiClient;\n }\n}\n\n\nvar $e147b9ba9f5381c6$exports = {};\n\n$parcel$export($e147b9ba9f5381c6$exports, \"ContentType\", () => $e147b9ba9f5381c6$export$e2e108cbe2e4f865);\n$parcel$export($e147b9ba9f5381c6$exports, \"BaseClient\", () => $e147b9ba9f5381c6$export$4f22f74eddb7716a);\n\n\n\n\nvar $e147b9ba9f5381c6$export$e2e108cbe2e4f865 = /*#__PURE__*/ function(ContentType) {\n ContentType[\"Json\"] = \"application/json\";\n ContentType[\"FormData\"] = \"multipart/form-data\";\n ContentType[\"UrlEncoded\"] = \"application/x-www-form-urlencoded\";\n ContentType[\"Text\"] = \"text/plain\";\n return ContentType;\n}({});\nclass $e147b9ba9f5381c6$export$4f22f74eddb7716a {\n constructor(config){\n this.config = config;\n (0, ($parcel$interopDefault($5Sh66$autobind)))(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = (0, ($parcel$interopDefault($5Sh66$axios))).create({\n baseURL: config.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders\n }\n });\n (0, ($parcel$interopDefault($5Sh66$axiosbetterstacktrace)))(this.axiosInstance);\n }\n stringifyFormItem(formItem) {\n if (typeof formItem === 'object' && formItem !== null) return JSON.stringify(formItem);\n else return `${formItem}`;\n }\n createFormData(input) {\n if (input instanceof FormData) return input;\n return Object.keys(input).reduce((formData, key)=>{\n const property = input[key];\n const propertyContent = property instanceof Array ? property : [\n property\n ];\n for (const formItem of propertyContent){\n const isFileType = formItem instanceof Blob || formItem instanceof File;\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\n }\n return formData;\n }, new FormData());\n }\n async request(requestConfig) {\n const { contentType: contentType, data: data } = requestConfig;\n if (!(0, $5Sh66$lodash.isNil)(data)) {\n if (contentType === \"multipart/form-data\" && typeof data === 'object') requestConfig.data = this.createFormData(data);\n if (contentType === \"text/plain\" && typeof data !== 'string') requestConfig.data = JSON.stringify(data);\n }\n const mergedConfig = (0, $5Sh66$lodash.merge)(requestConfig.secure ?? this.config.defaultSecure ? this.prepareAuthRequestConfig() : {}, contentType ? {\n headers: {\n 'Content-Type': contentType\n }\n } : {}, requestConfig);\n try {\n const { data: data, status: status, statusText: statusText } = await this.axiosInstance.request(mergedConfig);\n return {\n success: true,\n data: data,\n status: status,\n statusText: statusText\n };\n } catch (error) {\n if (!this.config.errorHandling) throw error;\n const result = {\n success: false,\n status: -1,\n statusText: String(error),\n error: error\n };\n if ((0, $5Sh66$axios.isAxiosError)(error)) {\n this.config.onAxiosError?.(error);\n result.data = error.response?.data;\n result.status = error.response?.status ?? result.status;\n result.statusText = error.response?.statusText ?? result.statusText;\n }\n this.config.onError?.(error);\n return result;\n }\n }\n get(url, config) {\n return this.request({\n ...config,\n method: 'GET',\n url: url\n });\n }\n delete(url, config) {\n return this.request({\n ...config,\n method: 'DELETE',\n url: url\n });\n }\n head(url, config) {\n return this.request({\n ...config,\n method: 'HEAD',\n url: url\n });\n }\n options(url, config) {\n return this.request({\n ...config,\n method: 'OPTIONS',\n url: url\n });\n }\n post(url, data, config) {\n return this.request({\n ...config,\n method: 'POST',\n url: url,\n data: data\n });\n }\n put(url, data, config) {\n return this.request({\n ...config,\n method: 'PUT',\n url: url,\n data: data\n });\n }\n patch(url, data, config) {\n return this.request({\n ...config,\n method: 'PATCH',\n url: url,\n data: data\n });\n }\n getAxios() {\n return this.axiosInstance;\n }\n setAuthData(data) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n getAuthData() {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? JSON.parse(data) : null;\n }\n getConfig() {\n return this.config;\n }\n}\n\n\nvar $f04719e3bb600f8d$exports = {};\n\n$parcel$export($f04719e3bb600f8d$exports, \"JwtClient\", () => $f04719e3bb600f8d$export$f280b732bbc5934b);\n\n\n\nclass $f04719e3bb600f8d$export$f280b732bbc5934b extends (0, $e147b9ba9f5381c6$export$4f22f74eddb7716a) {\n constructor(config){\n super(config), this.config = config;\n }\n getConfig() {\n return super.getConfig();\n }\n prepareAuthRequestConfig() {\n const { accessToken: accessToken } = this.getAuthData() || {};\n if (!accessToken) {\n (0, $5Sh66$consola.consola).warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`\n }\n };\n }\n scheduleTokenRenewal(renewTokenCallback) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n try {\n payload = (0, $5Sh66$jwtdecode.jwtDecode)(authData?.accessToken || '');\n } catch (error) {\n (0, $5Sh66$consola.consola).error(error);\n }\n if (!payload || !payload.exp) {\n (0, $5Sh66$consola.consola).warn('Could not schedule token renewal: invalid expiration time');\n return;\n }\n const expiresIn = payload.exp * 1000 - Date.now();\n const renewToken = async ()=>{\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n };\n this.tokenRenewalTimeout = setTimeout(async ()=>{\n try {\n await renewToken();\n } catch (error) {\n (0, $5Sh66$consola.consola).error('Failed to renew token. Retry in 10s', error);\n setTimeout(renewToken, 10000);\n }\n }, expiresIn - 60000);\n }\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n\n\n$parcel$exportWildcard(module.exports, $d6fbd40018854b1b$exports);\n$parcel$exportWildcard(module.exports, $e147b9ba9f5381c6$exports);\n$parcel$exportWildcard(module.exports, $f04719e3bb600f8d$exports);\n\n\n//# sourceMappingURL=index.js.map\n","export * from './BaseApi';\r\nexport * from './BaseClient';\r\nexport * from './JwtClient';\r\n","import autoBind from 'auto-bind';\r\nimport { BaseClient } from './BaseClient';\r\n\r\nexport class BaseApi<\r\n HandleError extends boolean = boolean,\r\n ApiClient extends BaseClient<HandleError> = BaseClient<HandleError>,\r\n> {\r\n // request: ApiClient['request'];\r\n // get: ApiClient['get'];\r\n // delete: ApiClient['delete'];\r\n // head: ApiClient['head'];\r\n // options: ApiClient['options'];\r\n // post: ApiClient['post'];\r\n // put: ApiClient['put'];\r\n // patch: ApiClient['patch'];\r\n\r\n constructor(protected readonly apiClient: ApiClient) {\r\n autoBind(this);\r\n // this.request = this.client.request;\r\n // this.get = this.client.get;\r\n // this.delete = this.client.delete;\r\n // this.head = this.client.head;\r\n // this.options = this.client.options;\r\n // this.post = this.client.post;\r\n // this.put = this.client.put;\r\n // this.patch = this.client.patch;\r\n // this.get = this.client.get;\r\n }\r\n\r\n getApiClient(): ApiClient {\r\n return this.apiClient;\r\n }\r\n}\r\n","import autoBind from 'auto-bind';\r\nimport axios, {\r\n AxiosError,\r\n AxiosInstance,\r\n AxiosRequestConfig,\r\n AxiosResponse,\r\n HttpStatusCode,\r\n isAxiosError,\r\n} from 'axios';\r\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\r\nimport { isNil, merge } from 'lodash';\r\n\r\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\r\n baseUrl: string;\r\n errorHandling?: HandleError;\r\n storage?: Storage;\r\n defaultHeaders?: Record<string, string>;\r\n defaultSecure?: boolean;\r\n authDataStorageKey?: string;\r\n onAxiosError?: (error: AxiosError) => void;\r\n onError?: (error: unknown) => void;\r\n}\r\n\r\nexport enum ContentType {\r\n Json = 'application/json',\r\n FormData = 'multipart/form-data',\r\n UrlEncoded = 'application/x-www-form-urlencoded',\r\n Text = 'text/plain',\r\n}\r\n\r\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\r\n secure?: boolean;\r\n contentType?: ContentType;\r\n};\r\n\r\nexport type ResponseStatus = {\r\n status: HttpStatusCode | -1;\r\n statusText: string;\r\n};\r\n\r\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\r\n success: true;\r\n data: Data;\r\n};\r\n\r\nexport type ErrorClientResponse = ResponseStatus & {\r\n success: false;\r\n data?: any;\r\n error: unknown;\r\n};\r\n\r\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\r\n ? SuccessClientResponse<Data> | ErrorClientResponse\r\n : SuccessClientResponse<Data>;\r\n\r\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\r\n protected readonly axiosInstance: AxiosInstance;\r\n protected readonly storage: Storage;\r\n\r\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\r\n autoBind(this);\r\n this.storage = config.storage ?? sessionStorage;\r\n this.axiosInstance = axios.create({\r\n baseURL: config.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...config.defaultHeaders,\r\n },\r\n });\r\n axiosBetterStacktrace(this.axiosInstance);\r\n }\r\n\r\n protected stringifyFormItem(formItem: unknown) {\r\n if (typeof formItem === 'object' && formItem !== null) {\r\n return JSON.stringify(formItem);\r\n } else {\r\n return `${formItem}`;\r\n }\r\n }\r\n\r\n protected createFormData(input: Record<string, unknown>): FormData {\r\n if (input instanceof FormData) {\r\n return input;\r\n }\r\n\r\n return Object.keys(input).reduce((formData, key) => {\r\n const property = input[key];\r\n const propertyContent: any[] = property instanceof Array ? property : [property];\r\n\r\n for (const formItem of propertyContent) {\r\n const isFileType = formItem instanceof Blob || formItem instanceof File;\r\n formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem));\r\n }\r\n\r\n return formData;\r\n }, new FormData());\r\n }\r\n\r\n async request<Data = unknown, Error = unknown, Body = unknown>(\r\n requestConfig: RequestConfig<Body>,\r\n ): Promise<ClientResponse<Data, HandleError>> {\r\n const { contentType, data } = requestConfig;\r\n\r\n if (!isNil(data)) {\r\n if (contentType === ContentType.FormData && typeof data === 'object') {\r\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\r\n }\r\n\r\n if (contentType === ContentType.Text && typeof data !== 'string') {\r\n requestConfig.data = JSON.stringify(data) as any;\r\n }\r\n }\r\n\r\n const mergedConfig = merge(\r\n (requestConfig.secure ?? this.config.defaultSecure) ? this.prepareAuthRequestConfig() : {},\r\n contentType ? { headers: { 'Content-Type': contentType } } : {},\r\n requestConfig,\r\n );\r\n\r\n try {\r\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\r\n mergedConfig,\r\n );\r\n\r\n return {\r\n success: true,\r\n data,\r\n status,\r\n statusText,\r\n };\r\n } catch (error) {\r\n if (!this.config.errorHandling) {\r\n throw error;\r\n }\r\n\r\n const result: ErrorClientResponse = {\r\n success: false,\r\n status: -1,\r\n statusText: String(error),\r\n error,\r\n };\r\n\r\n if (isAxiosError<Error, Data>(error)) {\r\n this.config.onAxiosError?.(error);\r\n result.data = error.response?.data;\r\n result.status = error.response?.status ?? result.status;\r\n result.statusText = error.response?.statusText ?? result.statusText;\r\n }\r\n\r\n this.config.onError?.(error);\r\n\r\n return result as ClientResponse<Data, HandleError>;\r\n }\r\n }\r\n\r\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'GET',\r\n url,\r\n });\r\n }\r\n\r\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'DELETE',\r\n url,\r\n });\r\n }\r\n\r\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'HEAD',\r\n url,\r\n });\r\n }\r\n\r\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'OPTIONS',\r\n url,\r\n });\r\n }\r\n\r\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'POST',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PUT',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\r\n return this.request<Data, Error, Body>({\r\n ...config,\r\n method: 'PATCH',\r\n url,\r\n data,\r\n });\r\n }\r\n\r\n getAxios(): AxiosInstance {\r\n return this.axiosInstance;\r\n }\r\n\r\n setAuthData(data: AuthData | null) {\r\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\r\n }\r\n\r\n getAuthData(): AuthData | null {\r\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\r\n return data ? (JSON.parse(data) as AuthData) : null;\r\n }\r\n\r\n getConfig(): BaseClientConfig<HandleError> {\r\n return this.config;\r\n }\r\n\r\n abstract prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>;\r\n}\r\n","import { consola } from 'consola';\nimport { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean> extends BaseClientConfig<HandleError> {\n authSchema?: string;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken: string;\n}\n\nexport class JwtClient<HandleError extends boolean = boolean> extends BaseClient<HandleError, JwtAuthData> {\n private tokenRenewalTimeout: number | undefined;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n override prepareAuthRequestConfig(): Pick<RequestConfig<any>, 'headers' | 'data' | 'params'> {\n const { accessToken } = this.getAuthData() || {};\n\n if (!accessToken) {\n consola.warn('No access token found. Please set auth data after authorization.');\n return {};\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n scheduleTokenRenewal(renewTokenCallback: () => Promise<JwtAuthData>) {\n this.cancelTokenRenewal();\n const authData = this.getAuthData();\n let payload;\n\n try {\n payload = jwtDecode(authData?.accessToken || '');\n } catch (error) {\n consola.error(error);\n }\n\n if (!payload || !payload.exp) {\n consola.warn('Could not schedule token renewal: invalid expiration time');\n return;\n }\n\n const expiresIn = payload.exp * 1000 - Date.now();\n\n const renewToken = async () => {\n const authData = await renewTokenCallback();\n this.setAuthData(authData);\n this.scheduleTokenRenewal(renewTokenCallback);\n };\n\n this.tokenRenewalTimeout = setTimeout(\n async () => {\n try {\n await renewToken();\n } catch (error) {\n consola.error('Failed to renew token. Retry in 10s', error);\n setTimeout(renewToken, 10000);\n }\n },\n expiresIn - 60 * 1000,\n ) as unknown as number;\n }\n\n cancelTokenRenewal() {\n clearTimeout(this.tokenRenewalTimeout);\n }\n}\n"],"names":["ContentType","$5Sh66$autobind","require","$5Sh66$axios","$5Sh66$axiosbetterstacktrace","$5Sh66$lodash","$5Sh66$consola","$5Sh66$jwtdecode","$parcel$exportWildcard","dest","source","Object","keys","forEach","key","prototype","hasOwnProperty","call","defineProperty","enumerable","get","$parcel$interopDefault","a","__esModule","default","$parcel$export","e","n","v","s","set","configurable","$d6fbd40018854b1b$exports","$d6fbd40018854b1b$export$3ad201792064a82b","constructor","apiClient","getApiClient","$e147b9ba9f5381c6$exports","$e147b9ba9f5381c6$export$e2e108cbe2e4f865","$e147b9ba9f5381c6$export$4f22f74eddb7716a","config","storage","sessionStorage","axiosInstance","create","baseURL","baseUrl","headers","defaultHeaders","stringifyFormItem","formItem","JSON","stringify","createFormData","input","FormData","reduce","formData","property","Array","isFileType","Blob","File","append","request","requestConfig","contentType","data","isNil","mergedConfig","merge","secure","defaultSecure","prepareAuthRequestConfig","status","statusText","success","error","errorHandling","result","String","isAxiosError","onAxiosError","response","onError","url","method","delete","head","options","post","put","patch","getAxios","setAuthData","setItem","authDataStorageKey","getAuthData","getItem","parse","getConfig","$f04719e3bb600f8d$exports","$f04719e3bb600f8d$export$f280b732bbc5934b","accessToken","Authorization","authSchema","consola","warn","scheduleTokenRenewal","renewTokenCallback","payload","cancelTokenRenewal","authData","jwtDecode","exp","expiresIn","Date","now","renewToken","tokenRenewalTimeout","setTimeout","clearTimeout","module","exports"],"version":3,"file":"index.js.map","sourceRoot":"../"}