@orbis-systems/orbis-api-clients 0.5.3 → 0.6.1
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/dist/aesmidas/index.d.ts +241 -14
- package/dist/aesmidas/index.d.ts.map +1 -1
- package/dist/aesmidas/index.esm.js +32 -0
- package/dist/aesmidas/index.esm.js.map +1 -1
- package/dist/aesmidas/index.js +32 -0
- package/dist/aesmidas/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/insight/index.d.ts +1873 -249
- package/dist/insight/index.d.ts.map +1 -1
- package/dist/insight/index.esm.js +221 -112
- package/dist/insight/index.esm.js.map +1 -1
- package/dist/insight/index.js +220 -111
- package/dist/insight/index.js.map +1 -1
- package/dist/middleware/index.d.ts +1 -0
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.esm.js +2 -0
- package/dist/middleware/index.esm.js.map +1 -1
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/index.js.map +1 -1
- package/dist/orbis/index.d.ts +1 -0
- package/dist/orbis/index.d.ts.map +1 -1
- package/dist/orbis/index.esm.js +2 -0
- package/dist/orbis/index.esm.js.map +1 -1
- package/dist/orbis/index.js +2 -0
- package/dist/orbis/index.js.map +1 -1
- package/dist/uma/index.d.ts +153 -1
- package/dist/uma/index.d.ts.map +1 -1
- package/dist/uma/index.esm.js +156 -1
- package/dist/uma/index.esm.js.map +1 -1
- package/dist/uma/index.js +155 -0
- package/dist/uma/index.js.map +1 -1
- package/package.json +137 -137
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export interface BaseClientConfig<HandleError extends boolean = boolean> {
|
|
|
7
7
|
defaultHeaders?: Record<string, string>;
|
|
8
8
|
defaultSecure?: boolean;
|
|
9
9
|
authDataStorageKey?: string;
|
|
10
|
+
withCredentials?: boolean;
|
|
10
11
|
onAxiosError?: (error: AxiosError) => void;
|
|
11
12
|
onError?: (error: unknown) => void;
|
|
12
13
|
}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";AAYA,kCAAkC,WAAW,SAAS,OAAO,GAAG,OAAO;IACnE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED;IACI,IAAI,qBAAqB;IACzB,QAAQ,wBAAwB;IAChC,UAAU,sCAAsC;IAChD,IAAI,eAAe;CACtB;AAED,0BAA0B,IAAI,GAAG,OAAO,IAAI,mBAAmB,IAAI,CAAC,GAAG;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,6BAA6B;IACzB,MAAM,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,kCAAkC,IAAI,GAAG,OAAO,IAAI,cAAc,GAAG;IACjE,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;CACd,CAAC;AAEF,kCAAkC,cAAc,GAAG;IAC/C,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,2BAA2B,IAAI,GAAG,OAAO,EAAE,WAAW,SAAS,OAAO,GAAG,OAAO,IAAI,WAAW,SAAS,IAAI,GACtG,sBAAsB,IAAI,CAAC,GAAG,mBAAmB,GACjD,sBAAsB,IAAI,CAAC,CAAC;AAElC,OAAO,QAAQ,kBAAkB,WAAW,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO;IAI1E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,WAAW,CAAC;IAHpE,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEL,MAAM,EAAE,iBAAiB,WAAW,CAAC;
|
|
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
|
@@ -65,6 +65,7 @@ class $e176194f300187e4$export$4f22f74eddb7716a {
|
|
|
65
65
|
this.storage = config.storage ?? sessionStorage;
|
|
66
66
|
this.axiosInstance = (0, $ikBRU$axios).create({
|
|
67
67
|
baseURL: config.baseUrl,
|
|
68
|
+
withCredentials: config.withCredentials,
|
|
68
69
|
headers: {
|
|
69
70
|
'Content-Type': 'application/json',
|
|
70
71
|
...config.defaultHeaders
|
|
@@ -214,6 +215,7 @@ class $584c124673bb843e$export$f280b732bbc5934b extends (0, $e176194f300187e4$ex
|
|
|
214
215
|
this.renewTokenCallback = renewTokenCallback;
|
|
215
216
|
}
|
|
216
217
|
async prepareAuthRequestConfig() {
|
|
218
|
+
if (this.config.withCredentials) return {};
|
|
217
219
|
let { accessToken: accessToken } = this.getAuthData() || {};
|
|
218
220
|
if (!accessToken) {
|
|
219
221
|
(0, $ikBRU$consola).warn('No access token found. Please set auth data after authorization.');
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;;;;;;;;ACGO,MAAM;IAIT,iCAAiC;IACjC,yBAAyB;IACzB,+BAA+B;IAC/B,2BAA2B;IAC3B,iCAAiC;IACjC,2BAA2B;IAC3B,yBAAyB;IACzB,6BAA6B;IAE7B,YAAY,AAAmB,SAAoB,CAAE;aAAtB,YAAA;QAC3B,CAAA,GAAA,eAAO,EAAE,IAAI;IACb,sCAAsC;IACtC,8BAA8B;IAC9B,oCAAoC;IACpC,gCAAgC;IAChC,sCAAsC;IACtC,gCAAgC;IAChC,8BAA8B;IAC9B,kCAAkC;IAClC,8BAA8B;IAClC;IAEA,eAA0B;QACtB,OAAO,IAAI,CAAC,SAAS;IACzB;AACJ;;;;;;;;;;;ACRO,IAAA,AAAK,mEAAA;;;;;WAAA;;AAiCL,MAAe;IAIlB,YAAY,AAAmB,MAAqC,CAAE;aAAvC,SAAA;QAC3B,CAAA,GAAA,eAAO,EAAE,IAAI;QACb,IAAI,CAAC,OAAO,GAAG,OAAO,OAAO,IAAI;QACjC,IAAI,CAAC,aAAa,GAAG,CAAA,GAAA,YAAI,EAAE,MAAM,CAAC;YAC9B,SAAS,OAAO,OAAO;YACvB,SAAS;gBACL,gBAAgB;gBAChB,GAAG,OAAO,cAAc;YAC5B;QACJ;QACA,CAAA,GAAA,4BAAoB,EAAE,IAAI,CAAC,aAAa;IAC5C;IAEU,kBAAkB,QAAiB,EAAE;QAC3C,IAAI,OAAO,aAAa,YAAY,aAAa,MAC7C,OAAO,KAAK,SAAS,CAAC;aAEtB,OAAO,GAAG,UAAU;IAE5B;IAEU,eAAe,KAA8B,EAAY;QAC/D,IAAI,iBAAiB,UACjB,OAAO;QAGX,OAAO,OAAO,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC,UAAU;YACxC,MAAM,WAAW,KAAK,CAAC,IAAI;YAC3B,MAAM,kBAAyB,oBAAoB,QAAQ,WAAW;gBAAC;aAAS;YAEhF,KAAK,MAAM,YAAY,gBAAiB;gBACpC,MAAM,aAAa,oBAAoB,QAAQ,oBAAoB;gBACnE,SAAS,MAAM,CAAC,KAAK,aAAa,WAAW,IAAI,CAAC,iBAAiB,CAAC;YACxE;YAEA,OAAO;QACX,GAAG,IAAI;IACX;IAEA,MAAM,QACF,aAAkC,EACQ;QAC1C,MAAM,eAAE,WAAW,QAAE,IAAI,EAAE,GAAG;QAE9B,IAAI,CAAC,CAAA,GAAA,YAAI,EAAE,OAAO;YACd,IAAI,yCAAwC,OAAO,SAAS,UACxD,cAAc,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;YAG7C,IAAI,gCAAoC,OAAO,SAAS,UACpD,cAAc,IAAI,GAAG,KAAK,SAAS,CAAC;QAE5C;QAEA,MAAM,eAAe,CAAA,GAAA,YAAI,EACrB,AAAC,cAAc,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,OAAQ,MAAM,IAAI,CAAC,wBAAwB,KAAK,CAAC,GACvG,cAAc;YAAE,SAAS;gBAAE,gBAAgB;YAAY;QAAE,IAAI,CAAC,GAC9D;QAGJ,IAAI;YACA,MAAM,QAAE,IAAI,UAAE,MAAM,cAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CACjE;YAGJ,OAAO;gBACH,SAAS;sBACT;wBACA;4BACA;YACJ;QACJ,EAAE,OAAO,OAAO;YACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,cAAc,WAAW,EACtD,MAAM;YAGV,MAAM,SAA8B;gBAChC,SAAS;gBACT,QAAQ;gBACR,YAAY,OAAO;uBACnB;YACJ;YAEA,IAAI,CAAA,GAAA,mBAAW,EAAe,QAAQ;gBAClC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG;gBAC3B,OAAO,IAAI,GAAG,MAAM,QAAQ,EAAE;gBAC9B,OAAO,MAAM,GAAG,MAAM,QAAQ,EAAE,UAAU,OAAO,MAAM;gBACvD,OAAO,UAAU,GAAG,MAAM,QAAQ,EAAE,cAAc,OAAO,UAAU;YACvE;YAEA,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG;YAEtB,OAAO;QACX;IACJ;IAEA,IAAqD,GAAW,EAAE,MAA4B,EAAE;QAC5F,OAAO,IAAI,CAAC,OAAO,CAAoB;YACnC,GAAG,MAAM;YACT,QAAQ;iBACR;QACJ;IACJ;IAEA,OAAwD,GAAW,EAAE,MAA4B,EAAE;QAC/F,OAAO,IAAI,CAAC,OAAO,CAAoB;YACnC,GAAG,MAAM;YACT,QAAQ;iBACR;QACJ;IACJ;IAEA,KAAsD,GAAW,EAAE,MAA4B,EAAE;QAC7F,OAAO,IAAI,CAAC,OAAO,CAAoB;YACnC,GAAG,MAAM;YACT,QAAQ;iBACR;QACJ;IACJ;IAEA,QAAyD,GAAW,EAAE,MAA4B,EAAE;QAChG,OAAO,IAAI,CAAC,OAAO,CAAoB;YACnC,GAAG,MAAM;YACT,QAAQ;iBACR;QACJ;IACJ;IAEA,KAAsD,GAAW,EAAE,IAAW,EAAE,MAA4B,EAAE;QAC1G,OAAO,IAAI,CAAC,OAAO,CAAoB;YACnC,GAAG,MAAM;YACT,QAAQ;iBACR;kBACA;QACJ;IACJ;IAEA,IAAqD,GAAW,EAAE,IAAW,EAAE,MAA4B,EAAE;QACzG,OAAO,IAAI,CAAC,OAAO,CAAoB;YACnC,GAAG,MAAM;YACT,QAAQ;iBACR;kBACA;QACJ;IACJ;IAEA,MAAuD,GAAW,EAAE,IAAW,EAAE,MAA4B,EAAE;QAC3G,OAAO,IAAI,CAAC,OAAO,CAAoB;YACnC,GAAG,MAAM;YACT,QAAQ;iBACR;kBACA;QACJ;IACJ;IAEA,WAA0B;QACtB,OAAO,IAAI,CAAC,aAAa;IAC7B;IAEA,YAAY,IAAqB,EAAE;QAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,QAAQ,KAAK,SAAS,CAAC;IAClF;IAEA,cAA+B;QAC3B,MAAM,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI;QACpE,OAAO,OAAQ,KAAK,KAAK,CAAC,QAAqB;IACnD;IAEA,YAA2C;QACvC,OAAO,IAAI,CAAC,MAAM;IACtB;AAGJ;;;;;;;;;;;ACxNO,MAAM,kDAGH,CAAA,GAAA,yCAAS;IAIf,YAAY,AAA4B,MAA8C,CAAE;QACpF,KAAK,CAAC,cAD8B,SAAA,aAHvB,OAAO,IAAI,CAAA,GAAA,YAAI;IAKhC;IAES,YAA0C;QAC/C,OAAO,KAAK,CAAC;IACjB;IAEA,sBAAsB,kBAA2C,EAAE;QAC/D,IAAI,CAAC,kBAAkB,GAAG;IAC9B;IAEA,MAAyB,2BAEvB;QACE,IAAI,eAAE,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,MAAM,CAAC;QAE7C,IAAI,CAAC,aAAa;YACd,CAAA,GAAA,cAAM,EAAE,IAAI,CAAC;YACb,OAAO,CAAC;QACZ;QAEA,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,cAC5D,IAAI;YACA,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;gBACzB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EACjB,CAAA,GAAA,cAAM,EAAE,KAAK,CAAC;gBAElB,cAAc,AAAC,CAAA,MAAM,IAAI,CAAC,UAAU,EAAC,EAAG,WAAW;gBACnD,IAAI,CAAC,IAAI,CAAC,MAAM;YACpB;QACJ,EAAE,OAAO,OAAO;YACZ,IAAI,UAAU,CAAA,GAAA,iBAAS,GACnB,cAAc,IAAI,CAAC,WAAW,IAAI;iBAElC,MAAM;QAEd;QAGJ,OAAO;YACH,SAAS;gBACL,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,EAAE,aAAa;YACzE;QACJ;IACJ;IAEQ,eAAe,KAAa,EAAW;QAC3C,MAAM,UAAU,CAAA,GAAA,gBAAQ,EAAE;QAE1B,IAAI,CAAC,QAAQ,GAAG,EACZ,OAAO;QAGX,OAAO,CAAA,GAAA,eAAO,EAAE,CAAA,GAAA,iBAAS,EAAE,QAAQ,GAAG,GAAG,MAAM,IAAI,KAAK,GAAG;IAC/D;IAEA,MAAc,aAAa;QACvB,MAAM,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,kBAAkB;QAEpE,IAAI,CAAC,UACD,MAAM,IAAI,MAAM;QAGpB,MAAM,WAAW,MAAM;QACvB,IAAI,CAAC,WAAW,CAAC;QACjB,OAAO;IACX;AACJ;","sources":["src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["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';\nimport axios, {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n HttpStatusCode,\n isAxiosError,\n} from 'axios';\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\nimport { isNil, merge } from 'lodash';\n\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\n debug?: boolean;\n baseUrl: string;\n handleError?: HandleError;\n storage?: Storage;\n defaultHeaders?: Record<string, string>;\n defaultSecure?: boolean;\n authDataStorageKey?: string;\n onAxiosError?: (error: AxiosError) => void;\n onError?: (error: unknown) => void;\n}\n\nexport enum ContentType {\n Json = 'application/json',\n FormData = 'multipart/form-data',\n UrlEncoded = 'application/x-www-form-urlencoded',\n Text = 'text/plain',\n}\n\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\n secure?: boolean;\n contentType?: ContentType;\n handleError?: boolean;\n};\n\nexport type ResponseStatus = {\n status: HttpStatusCode | -1;\n statusText: string;\n};\n\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\n success: true;\n data: Data;\n};\n\nexport type ErrorClientResponse = ResponseStatus & {\n success: false;\n data?: any;\n error: unknown;\n};\n\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\n ? SuccessClientResponse<Data> | ErrorClientResponse\n : SuccessClientResponse<Data>;\n\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\n protected readonly axiosInstance: AxiosInstance;\n protected readonly storage: Storage;\n\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\n autoBind(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = axios.create({\n baseURL: config.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders,\n },\n });\n axiosBetterStacktrace(this.axiosInstance);\n }\n\n protected stringifyFormItem(formItem: unknown) {\n if (typeof formItem === 'object' && formItem !== null) {\n return JSON.stringify(formItem);\n } else {\n return `${formItem}`;\n }\n }\n\n protected createFormData(input: Record<string, unknown>): FormData {\n if (input instanceof FormData) {\n return input;\n }\n\n return Object.keys(input).reduce((formData, key) => {\n const property = input[key];\n const propertyContent: any[] = property instanceof Array ? property : [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\n return formData;\n }, new FormData());\n }\n\n async request<Data = unknown, Error = unknown, Body = unknown>(\n requestConfig: RequestConfig<Body>,\n ): Promise<ClientResponse<Data, HandleError>> {\n const { contentType, data } = requestConfig;\n\n if (!isNil(data)) {\n if (contentType === ContentType.FormData && typeof data === 'object') {\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\n }\n\n if (contentType === ContentType.Text && typeof data !== 'string') {\n requestConfig.data = JSON.stringify(data) as any;\n }\n }\n\n const mergedConfig = merge(\n (requestConfig.secure ?? this.config.defaultSecure ?? true) ? await this.prepareAuthRequestConfig() : {},\n contentType ? { headers: { 'Content-Type': contentType } } : {},\n requestConfig,\n );\n\n try {\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\n mergedConfig,\n );\n\n return {\n success: true,\n data,\n status,\n statusText,\n };\n } catch (error) {\n if (!this.config.handleError && !requestConfig.handleError) {\n throw error;\n }\n\n const result: ErrorClientResponse = {\n success: false,\n status: -1,\n statusText: String(error),\n error,\n };\n\n if (isAxiosError<Error, Data>(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\n this.config.onError?.(error);\n\n return result as ClientResponse<Data, HandleError>;\n }\n }\n\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'GET',\n url,\n });\n }\n\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'DELETE',\n url,\n });\n }\n\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'HEAD',\n url,\n });\n }\n\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'OPTIONS',\n url,\n });\n }\n\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'POST',\n url,\n data,\n });\n }\n\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PUT',\n url,\n data,\n });\n }\n\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PATCH',\n url,\n data,\n });\n }\n\n getAxios(): AxiosInstance {\n return this.axiosInstance;\n }\n\n setAuthData(data: AuthData | null) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n\n getAuthData(): AuthData | null {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? (JSON.parse(data) as AuthData) : null;\n }\n\n getConfig(): BaseClientConfig<HandleError> {\n return this.config;\n }\n\n protected abstract prepareAuthRequestConfig(): Promise<Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>>;\n}\n","import { E_CANCELED, Mutex } from 'async-mutex';\nimport { consola } from 'consola';\nimport { isBefore, subMinutes } from 'date-fns';\nimport { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean, AuthData extends JwtAuthData = JwtAuthData>\n extends BaseClientConfig<HandleError> {\n authSchema?: string;\n autoRenewToken?: boolean;\n onRenewToken?: () => Promise<AuthData>;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport class JwtClient<\n HandleError extends boolean = boolean,\n AuthData extends JwtAuthData = JwtAuthData,\n> extends BaseClient<HandleError, AuthData> {\n private readonly lock = new Mutex();\n private renewTokenCallback?: () => Promise<AuthData>;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError, AuthData>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n setRenewTokenCallback(renewTokenCallback: () => Promise<AuthData>) {\n this.renewTokenCallback = renewTokenCallback;\n }\n\n protected override async prepareAuthRequestConfig(): Promise<\n Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>\n > {\n let { 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 if (this.config.autoRenewToken !== false && this.isTokenExpired(accessToken)) {\n try {\n await this.lock.runExclusive(async () => {\n if (this.config.debug) {\n consola.debug('Token expired. Renewing…');\n }\n accessToken = (await this.renewToken()).accessToken;\n this.lock.cancel();\n });\n } catch (error) {\n if (error === E_CANCELED) {\n accessToken = this.getAuthData()?.accessToken;\n } else {\n throw error;\n }\n }\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n private isTokenExpired(token: string): boolean {\n const payload = jwtDecode(token);\n\n if (!payload.exp) {\n return true;\n }\n\n return isBefore(subMinutes(payload.exp * 1000, 1), Date.now());\n }\n\n private async renewToken() {\n const callback = this.config.onRenewToken ?? this.renewTokenCallback;\n\n if (!callback) {\n throw new Error('No renew token callback provided');\n }\n\n const authData = await callback();\n this.setAuthData(authData);\n return authData;\n }\n}\n"],"names":[],"version":3,"file":"index.esm.js.map","sourceRoot":"../"}
|
|
1
|
+
{"mappings":"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","sources":["src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["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';\nimport axios, {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n HttpStatusCode,\n isAxiosError,\n} from 'axios';\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\nimport { isNil, merge } from 'lodash';\n\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\n debug?: boolean;\n baseUrl: string;\n handleError?: HandleError;\n storage?: Storage;\n defaultHeaders?: Record<string, string>;\n defaultSecure?: boolean;\n authDataStorageKey?: string;\n withCredentials?: boolean;\n onAxiosError?: (error: AxiosError) => void;\n onError?: (error: unknown) => void;\n}\n\nexport enum ContentType {\n Json = 'application/json',\n FormData = 'multipart/form-data',\n UrlEncoded = 'application/x-www-form-urlencoded',\n Text = 'text/plain',\n}\n\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\n secure?: boolean;\n contentType?: ContentType;\n handleError?: boolean;\n};\n\nexport type ResponseStatus = {\n status: HttpStatusCode | -1;\n statusText: string;\n};\n\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\n success: true;\n data: Data;\n};\n\nexport type ErrorClientResponse = ResponseStatus & {\n success: false;\n data?: any;\n error: unknown;\n};\n\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\n ? SuccessClientResponse<Data> | ErrorClientResponse\n : SuccessClientResponse<Data>;\n\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\n protected readonly axiosInstance: AxiosInstance;\n protected readonly storage: Storage;\n\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\n autoBind(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = axios.create({\n baseURL: config.baseUrl,\n withCredentials: config.withCredentials,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders,\n },\n });\n axiosBetterStacktrace(this.axiosInstance);\n }\n\n protected stringifyFormItem(formItem: unknown) {\n if (typeof formItem === 'object' && formItem !== null) {\n return JSON.stringify(formItem);\n } else {\n return `${formItem}`;\n }\n }\n\n protected createFormData(input: Record<string, unknown>): FormData {\n if (input instanceof FormData) {\n return input;\n }\n\n return Object.keys(input).reduce((formData, key) => {\n const property = input[key];\n const propertyContent: any[] = property instanceof Array ? property : [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\n return formData;\n }, new FormData());\n }\n\n async request<Data = unknown, Error = unknown, Body = unknown>(\n requestConfig: RequestConfig<Body>,\n ): Promise<ClientResponse<Data, HandleError>> {\n const { contentType, data } = requestConfig;\n\n if (!isNil(data)) {\n if (contentType === ContentType.FormData && typeof data === 'object') {\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\n }\n\n if (contentType === ContentType.Text && typeof data !== 'string') {\n requestConfig.data = JSON.stringify(data) as any;\n }\n }\n\n const mergedConfig = merge(\n (requestConfig.secure ?? this.config.defaultSecure ?? true) ? await this.prepareAuthRequestConfig() : {},\n contentType ? { headers: { 'Content-Type': contentType } } : {},\n requestConfig,\n );\n\n try {\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\n mergedConfig,\n );\n\n return {\n success: true,\n data,\n status,\n statusText,\n };\n } catch (error) {\n if (!this.config.handleError && !requestConfig.handleError) {\n throw error;\n }\n\n const result: ErrorClientResponse = {\n success: false,\n status: -1,\n statusText: String(error),\n error,\n };\n\n if (isAxiosError<Error, Data>(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\n this.config.onError?.(error);\n\n return result as ClientResponse<Data, HandleError>;\n }\n }\n\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'GET',\n url,\n });\n }\n\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'DELETE',\n url,\n });\n }\n\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'HEAD',\n url,\n });\n }\n\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'OPTIONS',\n url,\n });\n }\n\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'POST',\n url,\n data,\n });\n }\n\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PUT',\n url,\n data,\n });\n }\n\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PATCH',\n url,\n data,\n });\n }\n\n getAxios(): AxiosInstance {\n return this.axiosInstance;\n }\n\n setAuthData(data: AuthData | null) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n\n getAuthData(): AuthData | null {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? (JSON.parse(data) as AuthData) : null;\n }\n\n getConfig(): BaseClientConfig<HandleError> {\n return this.config;\n }\n\n protected abstract prepareAuthRequestConfig(): Promise<Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>>;\n}\n","import { E_CANCELED, Mutex } from 'async-mutex';\nimport { consola } from 'consola';\nimport { isBefore, subMinutes } from 'date-fns';\nimport { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean, AuthData extends JwtAuthData = JwtAuthData>\n extends BaseClientConfig<HandleError> {\n authSchema?: string;\n autoRenewToken?: boolean;\n onRenewToken?: () => Promise<AuthData>;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport class JwtClient<\n HandleError extends boolean = boolean,\n AuthData extends JwtAuthData = JwtAuthData,\n> extends BaseClient<HandleError, AuthData> {\n private readonly lock = new Mutex();\n private renewTokenCallback?: () => Promise<AuthData>;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError, AuthData>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n setRenewTokenCallback(renewTokenCallback: () => Promise<AuthData>) {\n this.renewTokenCallback = renewTokenCallback;\n }\n\n protected override async prepareAuthRequestConfig(): Promise<\n Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>\n > {\n if (this.config.withCredentials) {\n return {};\n }\n\n let { 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 if (this.config.autoRenewToken !== false && this.isTokenExpired(accessToken)) {\n try {\n await this.lock.runExclusive(async () => {\n if (this.config.debug) {\n consola.debug('Token expired. Renewing…');\n }\n accessToken = (await this.renewToken()).accessToken;\n this.lock.cancel();\n });\n } catch (error) {\n if (error === E_CANCELED) {\n accessToken = this.getAuthData()?.accessToken;\n } else {\n throw error;\n }\n }\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n private isTokenExpired(token: string): boolean {\n const payload = jwtDecode(token);\n\n if (!payload.exp) {\n return true;\n }\n\n return isBefore(subMinutes(payload.exp * 1000, 1), Date.now());\n }\n\n private async renewToken() {\n const callback = this.config.onRenewToken ?? this.renewTokenCallback;\n\n if (!callback) {\n throw new Error('No renew token callback provided');\n }\n\n const authData = await callback();\n this.setAuthData(authData);\n return authData;\n }\n}\n"],"names":[],"version":3,"file":"index.esm.js.map","sourceRoot":"../"}
|
package/dist/index.js
CHANGED
|
@@ -86,6 +86,7 @@ class $3621850f1f570615$export$4f22f74eddb7716a {
|
|
|
86
86
|
this.storage = config.storage ?? sessionStorage;
|
|
87
87
|
this.axiosInstance = (0, ($parcel$interopDefault($7TMtJ$axios))).create({
|
|
88
88
|
baseURL: config.baseUrl,
|
|
89
|
+
withCredentials: config.withCredentials,
|
|
89
90
|
headers: {
|
|
90
91
|
'Content-Type': 'application/json',
|
|
91
92
|
...config.defaultHeaders
|
|
@@ -235,6 +236,7 @@ class $538ed1203bac2e79$export$f280b732bbc5934b extends (0, $3621850f1f570615$ex
|
|
|
235
236
|
this.renewTokenCallback = renewTokenCallback;
|
|
236
237
|
}
|
|
237
238
|
async prepareAuthRequestConfig() {
|
|
239
|
+
if (this.config.withCredentials) return {};
|
|
238
240
|
let { accessToken: accessToken } = this.getAuthData() || {};
|
|
239
241
|
if (!accessToken) {
|
|
240
242
|
(0, $7TMtJ$consola.consola).warn('No access token found. Please set auth data after authorization.');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["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';\nimport axios, {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n HttpStatusCode,\n isAxiosError,\n} from 'axios';\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\nimport { isNil, merge } from 'lodash';\n\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\n debug?: boolean;\n baseUrl: string;\n handleError?: HandleError;\n storage?: Storage;\n defaultHeaders?: Record<string, string>;\n defaultSecure?: boolean;\n authDataStorageKey?: string;\n onAxiosError?: (error: AxiosError) => void;\n onError?: (error: unknown) => void;\n}\n\nexport enum ContentType {\n Json = 'application/json',\n FormData = 'multipart/form-data',\n UrlEncoded = 'application/x-www-form-urlencoded',\n Text = 'text/plain',\n}\n\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\n secure?: boolean;\n contentType?: ContentType;\n handleError?: boolean;\n};\n\nexport type ResponseStatus = {\n status: HttpStatusCode | -1;\n statusText: string;\n};\n\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\n success: true;\n data: Data;\n};\n\nexport type ErrorClientResponse = ResponseStatus & {\n success: false;\n data?: any;\n error: unknown;\n};\n\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\n ? SuccessClientResponse<Data> | ErrorClientResponse\n : SuccessClientResponse<Data>;\n\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\n protected readonly axiosInstance: AxiosInstance;\n protected readonly storage: Storage;\n\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\n autoBind(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = axios.create({\n baseURL: config.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders,\n },\n });\n axiosBetterStacktrace(this.axiosInstance);\n }\n\n protected stringifyFormItem(formItem: unknown) {\n if (typeof formItem === 'object' && formItem !== null) {\n return JSON.stringify(formItem);\n } else {\n return `${formItem}`;\n }\n }\n\n protected createFormData(input: Record<string, unknown>): FormData {\n if (input instanceof FormData) {\n return input;\n }\n\n return Object.keys(input).reduce((formData, key) => {\n const property = input[key];\n const propertyContent: any[] = property instanceof Array ? property : [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\n return formData;\n }, new FormData());\n }\n\n async request<Data = unknown, Error = unknown, Body = unknown>(\n requestConfig: RequestConfig<Body>,\n ): Promise<ClientResponse<Data, HandleError>> {\n const { contentType, data } = requestConfig;\n\n if (!isNil(data)) {\n if (contentType === ContentType.FormData && typeof data === 'object') {\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\n }\n\n if (contentType === ContentType.Text && typeof data !== 'string') {\n requestConfig.data = JSON.stringify(data) as any;\n }\n }\n\n const mergedConfig = merge(\n (requestConfig.secure ?? this.config.defaultSecure ?? true) ? await this.prepareAuthRequestConfig() : {},\n contentType ? { headers: { 'Content-Type': contentType } } : {},\n requestConfig,\n );\n\n try {\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\n mergedConfig,\n );\n\n return {\n success: true,\n data,\n status,\n statusText,\n };\n } catch (error) {\n if (!this.config.handleError && !requestConfig.handleError) {\n throw error;\n }\n\n const result: ErrorClientResponse = {\n success: false,\n status: -1,\n statusText: String(error),\n error,\n };\n\n if (isAxiosError<Error, Data>(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\n this.config.onError?.(error);\n\n return result as ClientResponse<Data, HandleError>;\n }\n }\n\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'GET',\n url,\n });\n }\n\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'DELETE',\n url,\n });\n }\n\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'HEAD',\n url,\n });\n }\n\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'OPTIONS',\n url,\n });\n }\n\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'POST',\n url,\n data,\n });\n }\n\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PUT',\n url,\n data,\n });\n }\n\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PATCH',\n url,\n data,\n });\n }\n\n getAxios(): AxiosInstance {\n return this.axiosInstance;\n }\n\n setAuthData(data: AuthData | null) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n\n getAuthData(): AuthData | null {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? (JSON.parse(data) as AuthData) : null;\n }\n\n getConfig(): BaseClientConfig<HandleError> {\n return this.config;\n }\n\n protected abstract prepareAuthRequestConfig(): Promise<Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>>;\n}\n","import { E_CANCELED, Mutex } from 'async-mutex';\nimport { consola } from 'consola';\nimport { isBefore, subMinutes } from 'date-fns';\nimport { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean, AuthData extends JwtAuthData = JwtAuthData>\n extends BaseClientConfig<HandleError> {\n authSchema?: string;\n autoRenewToken?: boolean;\n onRenewToken?: () => Promise<AuthData>;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport class JwtClient<\n HandleError extends boolean = boolean,\n AuthData extends JwtAuthData = JwtAuthData,\n> extends BaseClient<HandleError, AuthData> {\n private readonly lock = new Mutex();\n private renewTokenCallback?: () => Promise<AuthData>;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError, AuthData>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n setRenewTokenCallback(renewTokenCallback: () => Promise<AuthData>) {\n this.renewTokenCallback = renewTokenCallback;\n }\n\n protected override async prepareAuthRequestConfig(): Promise<\n Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>\n > {\n let { 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 if (this.config.autoRenewToken !== false && this.isTokenExpired(accessToken)) {\n try {\n await this.lock.runExclusive(async () => {\n if (this.config.debug) {\n consola.debug('Token expired. Renewing…');\n }\n accessToken = (await this.renewToken()).accessToken;\n this.lock.cancel();\n });\n } catch (error) {\n if (error === E_CANCELED) {\n accessToken = this.getAuthData()?.accessToken;\n } else {\n throw error;\n }\n }\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n private isTokenExpired(token: string): boolean {\n const payload = jwtDecode(token);\n\n if (!payload.exp) {\n return true;\n }\n\n return isBefore(subMinutes(payload.exp * 1000, 1), Date.now());\n }\n\n private async renewToken() {\n const callback = this.config.onRenewToken ?? this.renewTokenCallback;\n\n if (!callback) {\n throw new Error('No renew token callback provided');\n }\n\n const authData = await callback();\n this.setAuthData(authData);\n return authData;\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
|
|
1
|
+
{"mappings":"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","sources":["src/index.ts","src/BaseApi.ts","src/BaseClient.ts","src/JwtClient.ts"],"sourcesContent":["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';\nimport axios, {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n HttpStatusCode,\n isAxiosError,\n} from 'axios';\nimport axiosBetterStacktrace from 'axios-better-stacktrace';\nimport { isNil, merge } from 'lodash';\n\nexport interface BaseClientConfig<HandleError extends boolean = boolean> {\n debug?: boolean;\n baseUrl: string;\n handleError?: HandleError;\n storage?: Storage;\n defaultHeaders?: Record<string, string>;\n defaultSecure?: boolean;\n authDataStorageKey?: string;\n withCredentials?: boolean;\n onAxiosError?: (error: AxiosError) => void;\n onError?: (error: unknown) => void;\n}\n\nexport enum ContentType {\n Json = 'application/json',\n FormData = 'multipart/form-data',\n UrlEncoded = 'application/x-www-form-urlencoded',\n Text = 'text/plain',\n}\n\nexport type RequestConfig<Body = unknown> = AxiosRequestConfig<Body> & {\n secure?: boolean;\n contentType?: ContentType;\n handleError?: boolean;\n};\n\nexport type ResponseStatus = {\n status: HttpStatusCode | -1;\n statusText: string;\n};\n\nexport type SuccessClientResponse<Data = unknown> = ResponseStatus & {\n success: true;\n data: Data;\n};\n\nexport type ErrorClientResponse = ResponseStatus & {\n success: false;\n data?: any;\n error: unknown;\n};\n\nexport type ClientResponse<Data = unknown, HandleError extends boolean = boolean> = HandleError extends true\n ? SuccessClientResponse<Data> | ErrorClientResponse\n : SuccessClientResponse<Data>;\n\nexport abstract class BaseClient<HandleError extends boolean = boolean, AuthData = unknown> {\n protected readonly axiosInstance: AxiosInstance;\n protected readonly storage: Storage;\n\n constructor(protected readonly config: BaseClientConfig<HandleError>) {\n autoBind(this);\n this.storage = config.storage ?? sessionStorage;\n this.axiosInstance = axios.create({\n baseURL: config.baseUrl,\n withCredentials: config.withCredentials,\n headers: {\n 'Content-Type': 'application/json',\n ...config.defaultHeaders,\n },\n });\n axiosBetterStacktrace(this.axiosInstance);\n }\n\n protected stringifyFormItem(formItem: unknown) {\n if (typeof formItem === 'object' && formItem !== null) {\n return JSON.stringify(formItem);\n } else {\n return `${formItem}`;\n }\n }\n\n protected createFormData(input: Record<string, unknown>): FormData {\n if (input instanceof FormData) {\n return input;\n }\n\n return Object.keys(input).reduce((formData, key) => {\n const property = input[key];\n const propertyContent: any[] = property instanceof Array ? property : [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\n return formData;\n }, new FormData());\n }\n\n async request<Data = unknown, Error = unknown, Body = unknown>(\n requestConfig: RequestConfig<Body>,\n ): Promise<ClientResponse<Data, HandleError>> {\n const { contentType, data } = requestConfig;\n\n if (!isNil(data)) {\n if (contentType === ContentType.FormData && typeof data === 'object') {\n requestConfig.data = this.createFormData(data as Record<string, unknown>) as any;\n }\n\n if (contentType === ContentType.Text && typeof data !== 'string') {\n requestConfig.data = JSON.stringify(data) as any;\n }\n }\n\n const mergedConfig = merge(\n (requestConfig.secure ?? this.config.defaultSecure ?? true) ? await this.prepareAuthRequestConfig() : {},\n contentType ? { headers: { 'Content-Type': contentType } } : {},\n requestConfig,\n );\n\n try {\n const { data, status, statusText } = await this.axiosInstance.request<Data, AxiosResponse<Data>, Body>(\n mergedConfig,\n );\n\n return {\n success: true,\n data,\n status,\n statusText,\n };\n } catch (error) {\n if (!this.config.handleError && !requestConfig.handleError) {\n throw error;\n }\n\n const result: ErrorClientResponse = {\n success: false,\n status: -1,\n statusText: String(error),\n error,\n };\n\n if (isAxiosError<Error, Data>(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\n this.config.onError?.(error);\n\n return result as ClientResponse<Data, HandleError>;\n }\n }\n\n get<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'GET',\n url,\n });\n }\n\n delete<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'DELETE',\n url,\n });\n }\n\n head<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'HEAD',\n url,\n });\n }\n\n options<Data = unknown, Error = unknown, Body = unknown>(url: string, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'OPTIONS',\n url,\n });\n }\n\n post<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'POST',\n url,\n data,\n });\n }\n\n put<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PUT',\n url,\n data,\n });\n }\n\n patch<Data = unknown, Error = unknown, Body = unknown>(url: string, data?: Body, config?: RequestConfig<Body>) {\n return this.request<Data, Error, Body>({\n ...config,\n method: 'PATCH',\n url,\n data,\n });\n }\n\n getAxios(): AxiosInstance {\n return this.axiosInstance;\n }\n\n setAuthData(data: AuthData | null) {\n this.storage.setItem(this.config.authDataStorageKey || 'auth', JSON.stringify(data));\n }\n\n getAuthData(): AuthData | null {\n const data = this.storage.getItem(this.config.authDataStorageKey || 'auth');\n return data ? (JSON.parse(data) as AuthData) : null;\n }\n\n getConfig(): BaseClientConfig<HandleError> {\n return this.config;\n }\n\n protected abstract prepareAuthRequestConfig(): Promise<Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>>;\n}\n","import { E_CANCELED, Mutex } from 'async-mutex';\nimport { consola } from 'consola';\nimport { isBefore, subMinutes } from 'date-fns';\nimport { jwtDecode } from 'jwt-decode';\nimport { BaseClient, BaseClientConfig, RequestConfig } from './BaseClient';\n\nexport interface JwtClientConfig<HandleError extends boolean = boolean, AuthData extends JwtAuthData = JwtAuthData>\n extends BaseClientConfig<HandleError> {\n authSchema?: string;\n autoRenewToken?: boolean;\n onRenewToken?: () => Promise<AuthData>;\n}\n\nexport interface JwtAuthData {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport class JwtClient<\n HandleError extends boolean = boolean,\n AuthData extends JwtAuthData = JwtAuthData,\n> extends BaseClient<HandleError, AuthData> {\n private readonly lock = new Mutex();\n private renewTokenCallback?: () => Promise<AuthData>;\n\n constructor(protected override readonly config: JwtClientConfig<HandleError, AuthData>) {\n super(config);\n }\n\n override getConfig(): JwtClientConfig<HandleError> {\n return super.getConfig() as JwtClientConfig<HandleError>;\n }\n\n setRenewTokenCallback(renewTokenCallback: () => Promise<AuthData>) {\n this.renewTokenCallback = renewTokenCallback;\n }\n\n protected override async prepareAuthRequestConfig(): Promise<\n Pick<RequestConfig<any>, 'headers' | 'data' | 'params'>\n > {\n if (this.config.withCredentials) {\n return {};\n }\n\n let { 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 if (this.config.autoRenewToken !== false && this.isTokenExpired(accessToken)) {\n try {\n await this.lock.runExclusive(async () => {\n if (this.config.debug) {\n consola.debug('Token expired. Renewing…');\n }\n accessToken = (await this.renewToken()).accessToken;\n this.lock.cancel();\n });\n } catch (error) {\n if (error === E_CANCELED) {\n accessToken = this.getAuthData()?.accessToken;\n } else {\n throw error;\n }\n }\n }\n\n return {\n headers: {\n Authorization: `${this.config.authSchema ?? 'Bearer'} ${accessToken}`,\n },\n };\n }\n\n private isTokenExpired(token: string): boolean {\n const payload = jwtDecode(token);\n\n if (!payload.exp) {\n return true;\n }\n\n return isBefore(subMinutes(payload.exp * 1000, 1), Date.now());\n }\n\n private async renewToken() {\n const callback = this.config.onRenewToken ?? this.renewTokenCallback;\n\n if (!callback) {\n throw new Error('No renew token callback provided');\n }\n\n const authData = await callback();\n this.setAuthData(authData);\n return authData;\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
|