@krainovsd/js-helpers 0.15.2 → 0.15.3

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.
@@ -11,6 +11,7 @@ import 'lodash/get';
11
11
  import 'lodash/set';
12
12
  import { RESPONSE_DATA_SYMBOL } from './constants.js';
13
13
  import { generateMiddlewares, generatePostMiddlewares } from './middlewares/index.js';
14
+ import { refetchAfterOauth } from './middlewares/oauth-middleware.js';
14
15
 
15
16
  class ResponseError extends Error {
16
17
  status;
@@ -28,8 +29,8 @@ class ResponseError extends Error {
28
29
  function createRequestClientInstance(options) {
29
30
  let executeMiddlewares;
30
31
  let executePostMiddlewares;
31
- function setMiddlewares({ activeMiddlewares = [], middlewareOptions = {}, customMiddlewares = [], activePostMiddlewares = [], postMiddlewaresOptions = {}, customPostMiddlewares = [], } = {}) {
32
- executeMiddlewares = generateMiddlewares(activeMiddlewares, middlewareOptions, customMiddlewares);
32
+ function setMiddlewares({ activeMiddlewares = [], middlewareOptions = {}, customMiddlewares = [], activePostMiddlewares = [], postMiddlewaresOptions = {}, customPostMiddlewares = [], oauthOptions = undefined, } = {}) {
33
+ executeMiddlewares = generateMiddlewares(activeMiddlewares, middlewareOptions, oauthOptions, customMiddlewares);
33
34
  executePostMiddlewares = generatePostMiddlewares(activePostMiddlewares, postMiddlewaresOptions, customPostMiddlewares);
34
35
  }
35
36
  setMiddlewares(options);
@@ -47,7 +48,7 @@ function createRequestClientInstance(options) {
47
48
  : transformedResult;
48
49
  }
49
50
  await executeMiddlewares(request);
50
- const { method, body, path, params, headers = {} } = request;
51
+ const { method, body, path, params, headers = {}, refetchNoAuth = true } = request;
51
52
  const url = createURLWithParams({ baseURL: path, params });
52
53
  const [, requestContentType] = Object.entries(headers).find(([header]) => header.toLowerCase() === "content-type") ?? [];
53
54
  let preparedBody = body;
@@ -72,7 +73,7 @@ function createRequestClientInstance(options) {
72
73
  headers: headers,
73
74
  signal: request.signal,
74
75
  });
75
- await executePostMiddlewares(response);
76
+ await executePostMiddlewares(request, response);
76
77
  if (!response) {
77
78
  throw new Error("hasn't response");
78
79
  }
@@ -86,6 +87,9 @@ function createRequestClientInstance(options) {
86
87
  }
87
88
  : undefined;
88
89
  }
90
+ if (response.status === 401 && refetchNoAuth && options.oauthOptions) {
91
+ return refetchAfterOauth(options.oauthOptions, () => handleRequest({ ...request, refetchNoAuth: false }, responseWithStatus));
92
+ }
89
93
  if (request.defaultResponse) {
90
94
  const defaultResponse = typeof request.defaultResponse === "function"
91
95
  ? request.defaultResponse()
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sources":["../../../../src/lib/api/core.ts"],"sourcesContent":["import type {\n HeadersInit,\n BodyInit as NodeBodyInit,\n RequestInfo as NodeRequestInfo,\n RequestInit as NodeRequestInit,\n Response as NodeResponse,\n} from \"node-fetch\";\nimport { IS_BROWSER } from \"../../constants\";\nimport type {\n ActiveMiddleware,\n ActivePostMiddleware,\n Middleware,\n MiddlewaresOptions,\n PostMiddleware,\n PostMiddlewareOptions,\n RequestInterface,\n} from \"../../types\";\nimport { downloadFile } from \"../browser\";\nimport { isString } from \"../typings\";\nimport { createURLWithParams, wait } from \"../utils\";\nimport { RESPONSE_DATA_SYMBOL } from \"./constants\";\nimport { generateMiddlewares, generatePostMiddlewares } from \"./middlewares\";\n\ntype ResponseErrorOptions = {\n message: string;\n status: number;\n code?: number;\n description?: unknown;\n headers?: Record<string, string>;\n};\n\nexport class ResponseError extends Error {\n status: number;\n\n code?: number;\n\n description?: unknown;\n\n headers?: Record<string, string>;\n\n constructor({ message, status, description, code, headers }: ResponseErrorOptions) {\n super(message);\n this.status = status;\n this.description = description;\n this.code = code;\n this.headers = headers;\n }\n}\n\ntype CreateRequestClientInstance = {\n client:\n | ((url: URL | NodeRequestInfo, init?: NodeRequestInit) => Promise<NodeResponse>)\n | typeof fetch;\n activeMiddlewares?: ActiveMiddleware;\n middlewareOptions?: MiddlewaresOptions;\n customMiddlewares?: Middleware[];\n activePostMiddlewares?: ActivePostMiddleware;\n postMiddlewaresOptions?: PostMiddlewareOptions;\n customPostMiddlewares?: PostMiddleware[];\n};\n\nexport type RequestInstance = {\n <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<Incoming>;\n setOptions: (options: CreateRequestClientInstance) => void;\n};\n\nexport function createRequestClientInstance(options: CreateRequestClientInstance) {\n let executeMiddlewares: <\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ) => Promise<unknown>;\n\n let executePostMiddlewares: (response: Response | NodeResponse | undefined) => Promise<unknown>;\n\n function setMiddlewares({\n activeMiddlewares = [],\n middlewareOptions = {},\n customMiddlewares = [],\n activePostMiddlewares = [],\n postMiddlewaresOptions = {},\n customPostMiddlewares = [],\n }: Omit<CreateRequestClientInstance, \"client\"> = {}) {\n executeMiddlewares = generateMiddlewares(\n activeMiddlewares,\n middlewareOptions,\n customMiddlewares,\n );\n\n executePostMiddlewares = generatePostMiddlewares(\n activePostMiddlewares,\n postMiddlewaresOptions,\n customPostMiddlewares,\n );\n }\n\n setMiddlewares(options);\n\n async function handleRequest<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n responseWithStatus?: boolean,\n ): Promise<{ data: Incoming; status: number; headers: Record<string, string> } | Incoming> {\n if (request.delay) {\n await wait(request.delay);\n }\n if (request.mock) {\n const mock: unknown =\n typeof request.mock === \"function\" ? (request.mock as () => Incoming)() : request.mock;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(mock as IncomingApi)\n : (mock as Incoming);\n\n return responseWithStatus\n ? { data: transformedResult, status: 200, headers: {} }\n : transformedResult;\n }\n\n await executeMiddlewares(request);\n\n const { method, body, path, params, headers = {} } = request;\n\n const url = createURLWithParams({ baseURL: path, params });\n const [, requestContentType] =\n Object.entries(headers).find(([header]) => header.toLowerCase() === \"content-type\") ?? [];\n\n let preparedBody: OutcomingApi = body as OutcomingApi;\n if (request.transformOutcomingData) {\n preparedBody = request.transformOutcomingData(body as Outcoming);\n }\n\n if (\n requestContentType == undefined &&\n !(preparedBody instanceof FormData) &&\n preparedBody != undefined &&\n !isString(preparedBody)\n ) {\n headers[\"content-type\"] = \"application/json; charset=UTF-8\";\n }\n\n if (\n (requestContentType == undefined || requestContentType.toLowerCase().includes(\"json\")) &&\n preparedBody != undefined &&\n !(preparedBody instanceof FormData) &&\n !isString(preparedBody)\n ) {\n preparedBody = JSON.stringify(preparedBody) as OutcomingApi;\n }\n\n const response: Response | NodeResponse | undefined = await options.client(url, {\n method,\n body: preparedBody as ((BodyInit | null) & NodeBodyInit) | undefined,\n headers: headers as globalThis.HeadersInit & HeadersInit,\n signal: request.signal as (AbortSignal & NodeRequestInit[\"signal\"]) | null | undefined,\n });\n\n await executePostMiddlewares(response);\n\n if (!response) {\n throw new Error(\"hasn't response\");\n }\n\n if (!response.ok) {\n if (response.status === 304) {\n return responseWithStatus\n ? {\n data: undefined as Incoming,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : (undefined as Incoming);\n }\n\n if (request.defaultResponse) {\n const defaultResponse: unknown =\n typeof request.defaultResponse === \"function\"\n ? (request.defaultResponse as () => Incoming)()\n : request.defaultResponse;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(defaultResponse as IncomingApi)\n : (defaultResponse as Incoming);\n\n return responseWithStatus\n ? {\n data: transformedResult,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : transformedResult;\n }\n\n let result;\n try {\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes?.(\"text\")) {\n result = await response.text();\n } else if (contentType?.includes?.(\"json\")) {\n result = await response.json();\n } else {\n result = await response.blob();\n }\n } catch {\n if (RESPONSE_DATA_SYMBOL in response) result = response[RESPONSE_DATA_SYMBOL];\n }\n\n throw new ResponseError({\n status: response.status,\n message: `HTTP error! Status: ${response.status}`,\n description: result,\n headers: Object.fromEntries(response.headers.entries()),\n });\n }\n\n if (request.downloadFile) {\n const data = await response.blob();\n const mimeType = response.headers.get(\"content-type\");\n const fileName = response.headers.get(\"content-disposition\");\n\n if (!mimeType || !fileName) throw new Error(\"Download Error! Empty info!\");\n\n if (IS_BROWSER)\n downloadFile({\n data: data as Blob,\n fileName,\n mimeType,\n });\n\n return responseWithStatus\n ? {\n data: data as Incoming,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : (data as Incoming);\n }\n\n const contentType = response.headers.get(\"content-type\");\n let result: Incoming | IncomingApi = undefined as Incoming | IncomingApi;\n\n try {\n if (contentType?.includes?.(\"text\")) {\n result = (await response.text()) as Incoming | IncomingApi;\n } else if (contentType?.includes?.(\"json\")) {\n result = (await response.json()) as Incoming | IncomingApi;\n } else {\n result = (await response.blob()) as Incoming | IncomingApi;\n }\n } catch {}\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(result as IncomingApi)\n : (result as Incoming);\n\n return responseWithStatus\n ? {\n data: transformedResult,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : transformedResult;\n }\n\n async function requestApi<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>): Promise<Incoming> {\n return handleRequest(request, false) as Promise<Incoming>;\n }\n\n async function requestApiWithMeta<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<{ data: Incoming; status: number; headers: Record<string, string> }> {\n return handleRequest(request, true) as Promise<{\n data: Incoming;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n\n return {\n requestApi,\n requestApiWithMeta,\n setMiddlewares,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sources":["../../../../src/lib/api/core.ts"],"sourcesContent":["import type {\n HeadersInit,\n BodyInit as NodeBodyInit,\n RequestInfo as NodeRequestInfo,\n RequestInit as NodeRequestInit,\n Response as NodeResponse,\n} from \"node-fetch\";\nimport { IS_BROWSER } from \"../../constants\";\nimport type {\n ActiveMiddleware,\n ActivePostMiddleware,\n Middleware,\n MiddlewaresOptions,\n OauthOptions,\n PostMiddleware,\n PostMiddlewareOptions,\n RequestInterface,\n} from \"../../types\";\nimport { downloadFile } from \"../browser\";\nimport { isString } from \"../typings\";\nimport { createURLWithParams, wait } from \"../utils\";\nimport { RESPONSE_DATA_SYMBOL } from \"./constants\";\nimport { generateMiddlewares, generatePostMiddlewares } from \"./middlewares\";\nimport { refetchAfterOauth } from \"./middlewares/oauth-middleware\";\n\ntype ResponseErrorOptions = {\n message: string;\n status: number;\n code?: number;\n description?: unknown;\n headers?: Record<string, string>;\n};\n\nexport class ResponseError extends Error {\n status: number;\n\n code?: number;\n\n description?: unknown;\n\n headers?: Record<string, string>;\n\n constructor({ message, status, description, code, headers }: ResponseErrorOptions) {\n super(message);\n this.status = status;\n this.description = description;\n this.code = code;\n this.headers = headers;\n }\n}\n\ntype CreateRequestClientInstance = {\n client:\n | ((url: URL | NodeRequestInfo, init?: NodeRequestInit) => Promise<NodeResponse>)\n | typeof fetch;\n oauthOptions?: OauthOptions;\n activeMiddlewares?: ActiveMiddleware;\n middlewareOptions?: MiddlewaresOptions;\n customMiddlewares?: Middleware[];\n activePostMiddlewares?: ActivePostMiddleware;\n postMiddlewaresOptions?: PostMiddlewareOptions;\n customPostMiddlewares?: PostMiddleware[];\n};\n\nexport type RequestInstance = {\n <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<Incoming>;\n setOptions: (options: CreateRequestClientInstance) => void;\n};\n\nexport function createRequestClientInstance(options: CreateRequestClientInstance) {\n let executeMiddlewares: <\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ) => Promise<unknown>;\n\n let executePostMiddlewares: <\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n response: Response | NodeResponse | undefined,\n ) => Promise<unknown>;\n\n function setMiddlewares({\n activeMiddlewares = [],\n middlewareOptions = {},\n customMiddlewares = [],\n activePostMiddlewares = [],\n postMiddlewaresOptions = {},\n customPostMiddlewares = [],\n oauthOptions = undefined,\n }: Omit<CreateRequestClientInstance, \"client\"> = {}) {\n executeMiddlewares = generateMiddlewares(\n activeMiddlewares,\n middlewareOptions,\n oauthOptions,\n customMiddlewares,\n );\n\n executePostMiddlewares = generatePostMiddlewares(\n activePostMiddlewares,\n postMiddlewaresOptions,\n customPostMiddlewares,\n );\n }\n\n setMiddlewares(options);\n\n async function handleRequest<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n responseWithStatus?: boolean,\n ): Promise<{ data: Incoming; status: number; headers: Record<string, string> } | Incoming> {\n if (request.delay) {\n await wait(request.delay);\n }\n if (request.mock) {\n const mock: unknown =\n typeof request.mock === \"function\" ? (request.mock as () => Incoming)() : request.mock;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(mock as IncomingApi)\n : (mock as Incoming);\n\n return responseWithStatus\n ? { data: transformedResult, status: 200, headers: {} }\n : transformedResult;\n }\n\n await executeMiddlewares(request);\n\n const { method, body, path, params, headers = {}, refetchNoAuth = true } = request;\n\n const url = createURLWithParams({ baseURL: path, params });\n const [, requestContentType] =\n Object.entries(headers).find(([header]) => header.toLowerCase() === \"content-type\") ?? [];\n\n let preparedBody: OutcomingApi = body as OutcomingApi;\n if (request.transformOutcomingData) {\n preparedBody = request.transformOutcomingData(body as Outcoming);\n }\n\n if (\n requestContentType == undefined &&\n !(preparedBody instanceof FormData) &&\n preparedBody != undefined &&\n !isString(preparedBody)\n ) {\n headers[\"content-type\"] = \"application/json; charset=UTF-8\";\n }\n\n if (\n (requestContentType == undefined || requestContentType.toLowerCase().includes(\"json\")) &&\n preparedBody != undefined &&\n !(preparedBody instanceof FormData) &&\n !isString(preparedBody)\n ) {\n preparedBody = JSON.stringify(preparedBody) as OutcomingApi;\n }\n\n const response: Response | NodeResponse | undefined = await options.client(url, {\n method,\n body: preparedBody as ((BodyInit | null) & NodeBodyInit) | undefined,\n headers: headers as globalThis.HeadersInit & HeadersInit,\n signal: request.signal as (AbortSignal & NodeRequestInit[\"signal\"]) | null | undefined,\n });\n\n await executePostMiddlewares(request, response);\n\n if (!response) {\n throw new Error(\"hasn't response\");\n }\n\n if (!response.ok) {\n if (response.status === 304) {\n return responseWithStatus\n ? {\n data: undefined as Incoming,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : (undefined as Incoming);\n }\n if (response.status === 401 && refetchNoAuth && options.oauthOptions) {\n return refetchAfterOauth(options.oauthOptions, () =>\n handleRequest({ ...request, refetchNoAuth: false }, responseWithStatus),\n );\n }\n\n if (request.defaultResponse) {\n const defaultResponse: unknown =\n typeof request.defaultResponse === \"function\"\n ? (request.defaultResponse as () => Incoming)()\n : request.defaultResponse;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(defaultResponse as IncomingApi)\n : (defaultResponse as Incoming);\n\n return responseWithStatus\n ? {\n data: transformedResult,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : transformedResult;\n }\n\n let result;\n try {\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes?.(\"text\")) {\n result = await response.text();\n } else if (contentType?.includes?.(\"json\")) {\n result = await response.json();\n } else {\n result = await response.blob();\n }\n } catch {\n if (RESPONSE_DATA_SYMBOL in response) result = response[RESPONSE_DATA_SYMBOL];\n }\n\n throw new ResponseError({\n status: response.status,\n message: `HTTP error! Status: ${response.status}`,\n description: result,\n headers: Object.fromEntries(response.headers.entries()),\n });\n }\n\n if (request.downloadFile) {\n const data = await response.blob();\n const mimeType = response.headers.get(\"content-type\");\n const fileName = response.headers.get(\"content-disposition\");\n\n if (!mimeType || !fileName) throw new Error(\"Download Error! Empty info!\");\n\n if (IS_BROWSER)\n downloadFile({\n data: data as Blob,\n fileName,\n mimeType,\n });\n\n return responseWithStatus\n ? {\n data: data as Incoming,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : (data as Incoming);\n }\n\n const contentType = response.headers.get(\"content-type\");\n let result: Incoming | IncomingApi = undefined as Incoming | IncomingApi;\n\n try {\n if (contentType?.includes?.(\"text\")) {\n result = (await response.text()) as Incoming | IncomingApi;\n } else if (contentType?.includes?.(\"json\")) {\n result = (await response.json()) as Incoming | IncomingApi;\n } else {\n result = (await response.blob()) as Incoming | IncomingApi;\n }\n } catch {}\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(result as IncomingApi)\n : (result as Incoming);\n\n return responseWithStatus\n ? {\n data: transformedResult,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n }\n : transformedResult;\n }\n\n async function requestApi<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>): Promise<Incoming> {\n return handleRequest(request, false) as Promise<Incoming>;\n }\n\n async function requestApiWithMeta<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<{ data: Incoming; status: number; headers: Record<string, string> }> {\n return handleRequest(request, true) as Promise<{\n data: Incoming;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n\n return {\n requestApi,\n requestApiWithMeta,\n setMiddlewares,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { RESPONSE_DATA_SYMBOL } from '../constants.js';
2
2
 
3
3
  function generateConsolePostMiddleware(options = {}) {
4
- return (response) => {
4
+ return (request, response) => {
5
5
  return new Promise((resolve) => {
6
6
  void (async function logger() {
7
7
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"console-post-middleware.js","sources":["../../../../../src/lib/api/middlewares/console-post-middleware.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport type { LoggerPostMiddlewareOptions, PostMiddleware } from \"../../../types\";\nimport { RESPONSE_DATA_SYMBOL } from \"../constants\";\n\nexport function generateConsolePostMiddleware(\n options: LoggerPostMiddlewareOptions = {},\n): PostMiddleware {\n return (response) => {\n return new Promise((resolve) => {\n void (async function logger() {\n try {\n if (\n !response ||\n (options.filter && !options.filter(response)) ||\n (options.filterStatus && !options.filterStatus(response.status)) ||\n (options.filterUrl && !options.filterUrl(response.url)) ||\n (options.filterHeaders && !options.filterHeaders(response.headers))\n ) {\n resolve(true);\n\n return;\n }\n\n const contentType = response.headers.get(\"content-type\");\n let result;\n if (contentType?.includes?.(\"text\")) {\n result = await response.text();\n } else if (contentType?.includes?.(\"json\")) {\n result = await response.json();\n } else {\n result = await response.blob();\n }\n\n Object.defineProperty(response, RESPONSE_DATA_SYMBOL, {\n value: result,\n writable: false,\n enumerable: false,\n configurable: true,\n });\n\n console.log({\n url: response.url,\n status: response.status,\n headers: response.headers,\n body: result,\n });\n\n resolve(true);\n } catch {\n if (response) {\n console.log({ url: response.url, status: response.status, headers: response.headers });\n }\n\n resolve(true);\n }\n })().finally(() => {\n resolve(true);\n });\n });\n };\n}\n"],"names":[],"mappings":";;AAIgB,SAAA,6BAA6B,CAC3C,OAAA,GAAuC,EAAE,EAAA;IAEzC,OAAO,CAAC,QAAQ,KAAI;AAClB,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,eAAe,MAAM,GAAA;AACzB,gBAAA,IAAI;AACF,oBAAA,IACE,CAAC,QAAQ;yBACR,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC7C,yBAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChE,yBAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvD,yBAAC,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EACnE;wBACA,OAAO,CAAC,IAAI,CAAC;wBAEb;;oBAGF,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACxD,oBAAA,IAAI,MAAM;oBACV,IAAI,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC,EAAE;AACnC,wBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;yBACzB,IAAI,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC,EAAE;AAC1C,wBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;yBACzB;AACL,wBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;AAGhC,oBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE;AACpD,wBAAA,KAAK,EAAE,MAAM;AACb,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,UAAU,EAAE,KAAK;AACjB,wBAAA,YAAY,EAAE,IAAI;AACnB,qBAAA,CAAC;oBAEF,OAAO,CAAC,GAAG,CAAC;wBACV,GAAG,EAAE,QAAQ,CAAC,GAAG;wBACjB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,wBAAA,IAAI,EAAE,MAAM;AACb,qBAAA,CAAC;oBAEF,OAAO,CAAC,IAAI,CAAC;;AACb,gBAAA,MAAM;oBACN,IAAI,QAAQ,EAAE;wBACZ,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;;oBAGxF,OAAO,CAAC,IAAI,CAAC;;AAEjB,aAAC,GAAG,CAAC,OAAO,CAAC,MAAK;gBAChB,OAAO,CAAC,IAAI,CAAC;AACf,aAAC,CAAC;AACJ,SAAC,CAAC;AACJ,KAAC;AACH;;;;"}
1
+ {"version":3,"file":"console-post-middleware.js","sources":["../../../../../src/lib/api/middlewares/console-post-middleware.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport type { LoggerPostMiddlewareOptions, PostMiddleware } from \"../../../types\";\nimport { RESPONSE_DATA_SYMBOL } from \"../constants\";\n\nexport function generateConsolePostMiddleware(\n options: LoggerPostMiddlewareOptions = {},\n): PostMiddleware {\n return (request, response) => {\n return new Promise((resolve) => {\n void (async function logger() {\n try {\n if (\n !response ||\n (options.filter && !options.filter(response)) ||\n (options.filterStatus && !options.filterStatus(response.status)) ||\n (options.filterUrl && !options.filterUrl(response.url)) ||\n (options.filterHeaders && !options.filterHeaders(response.headers))\n ) {\n resolve(true);\n\n return;\n }\n\n const contentType = response.headers.get(\"content-type\");\n let result;\n if (contentType?.includes?.(\"text\")) {\n result = await response.text();\n } else if (contentType?.includes?.(\"json\")) {\n result = await response.json();\n } else {\n result = await response.blob();\n }\n\n Object.defineProperty(response, RESPONSE_DATA_SYMBOL, {\n value: result,\n writable: false,\n enumerable: false,\n configurable: true,\n });\n\n console.log({\n url: response.url,\n status: response.status,\n headers: response.headers,\n body: result,\n });\n\n resolve(true);\n } catch {\n if (response) {\n console.log({ url: response.url, status: response.status, headers: response.headers });\n }\n\n resolve(true);\n }\n })().finally(() => {\n resolve(true);\n });\n });\n };\n}\n"],"names":[],"mappings":";;AAIgB,SAAA,6BAA6B,CAC3C,OAAA,GAAuC,EAAE,EAAA;AAEzC,IAAA,OAAO,CAAC,OAAO,EAAE,QAAQ,KAAI;AAC3B,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,eAAe,MAAM,GAAA;AACzB,gBAAA,IAAI;AACF,oBAAA,IACE,CAAC,QAAQ;yBACR,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC7C,yBAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChE,yBAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvD,yBAAC,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EACnE;wBACA,OAAO,CAAC,IAAI,CAAC;wBAEb;;oBAGF,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACxD,oBAAA,IAAI,MAAM;oBACV,IAAI,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC,EAAE;AACnC,wBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;yBACzB,IAAI,WAAW,EAAE,QAAQ,GAAG,MAAM,CAAC,EAAE;AAC1C,wBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;yBACzB;AACL,wBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;AAGhC,oBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE;AACpD,wBAAA,KAAK,EAAE,MAAM;AACb,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,UAAU,EAAE,KAAK;AACjB,wBAAA,YAAY,EAAE,IAAI;AACnB,qBAAA,CAAC;oBAEF,OAAO,CAAC,GAAG,CAAC;wBACV,GAAG,EAAE,QAAQ,CAAC,GAAG;wBACjB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,wBAAA,IAAI,EAAE,MAAM;AACb,qBAAA,CAAC;oBAEF,OAAO,CAAC,IAAI,CAAC;;AACb,gBAAA,MAAM;oBACN,IAAI,QAAQ,EAAE;wBACZ,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;;oBAGxF,OAAO,CAAC,IAAI,CAAC;;AAEjB,aAAC,GAAG,CAAC,OAAO,CAAC,MAAK;gBAChB,OAAO,CAAC,IAAI,CAAC;AACf,aAAC,CAAC;AACJ,SAAC,CAAC;AACJ,KAAC;AACH;;;;"}
@@ -4,13 +4,14 @@ import { generateConsoleMiddleware } from './console-middleware.js';
4
4
  import { generateConsolePostMiddleware } from './console-post-middleware.js';
5
5
  import { generateOauthMiddleware } from './oauth-middleware.js';
6
6
 
7
- function generateMiddlewares(activeMiddlewares, middlewareOptions, customMiddlewares) {
7
+ // eslint-disable-next-line max-params
8
+ function generateMiddlewares(activeMiddlewares, middlewareOptions, oauthOptions, customMiddlewares) {
8
9
  const selectedMiddlewares = customMiddlewares;
9
10
  for (const key of activeMiddlewares) {
10
11
  switch (key) {
11
12
  case API_MIDDLEWARES.Oauth: {
12
- if (middlewareOptions.oauth && (IS_BROWSER || IS_JEST))
13
- selectedMiddlewares.push(generateOauthMiddleware(middlewareOptions.oauth));
13
+ if (oauthOptions && (IS_BROWSER || IS_JEST))
14
+ selectedMiddlewares.push(generateOauthMiddleware(oauthOptions));
14
15
  continue;
15
16
  }
16
17
  case API_MIDDLEWARES.Logger: {
@@ -47,12 +48,12 @@ function generatePostMiddlewares(activePostMiddlewares, postMiddlewaresOptions,
47
48
  }
48
49
  }
49
50
  }
50
- return function executeMiddlewares(response) {
51
+ return function executeMiddlewares(request, response) {
51
52
  return new Promise((resolve) => {
52
53
  void (async () => {
53
54
  for (const middleware of selectedMiddlewares) {
54
55
  // eslint-disable-next-line no-await-in-loop
55
- await middleware(response);
56
+ await middleware(request, response);
56
57
  }
57
58
  resolve(1);
58
59
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/middlewares/index.ts"],"sourcesContent":["import type { Response as NodeResponse } from \"node-fetch\";\nimport { API_MIDDLEWARES, IS_BROWSER, IS_JEST, POST_API_MIDDLEWARES } from \"../../../constants\";\nimport type {\n ActiveMiddleware,\n ActivePostMiddleware,\n Middleware,\n MiddlewaresOptions,\n PostMiddleware,\n PostMiddlewareOptions,\n RequestInterface,\n} from \"../../../types\";\nimport { generateConsoleMiddleware } from \"./console-middleware\";\nimport { generateConsolePostMiddleware } from \"./console-post-middleware\";\nimport { generateOauthMiddleware } from \"./oauth-middleware\";\n\nexport function generateMiddlewares(\n activeMiddlewares: ActiveMiddleware,\n middlewareOptions: MiddlewaresOptions,\n customMiddlewares: Middleware[],\n) {\n const selectedMiddlewares: Middleware[] = customMiddlewares;\n\n for (const key of activeMiddlewares) {\n switch (key) {\n case API_MIDDLEWARES.Oauth: {\n if (middlewareOptions.oauth && (IS_BROWSER || IS_JEST))\n selectedMiddlewares.push(generateOauthMiddleware(middlewareOptions.oauth));\n continue;\n }\n case API_MIDDLEWARES.Logger: {\n selectedMiddlewares.push(generateConsoleMiddleware(middlewareOptions.logger));\n continue;\n }\n default: {\n continue;\n }\n }\n }\n\n return function executeMiddlewares<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) {\n return new Promise((resolve) => {\n void (async () => {\n for (const middleware of selectedMiddlewares) {\n // eslint-disable-next-line no-await-in-loop\n await middleware(request);\n }\n\n resolve(1);\n })();\n });\n };\n}\n\nexport function generatePostMiddlewares(\n activePostMiddlewares: ActivePostMiddleware,\n postMiddlewaresOptions: PostMiddlewareOptions,\n customPostMiddlewares: PostMiddleware[],\n) {\n const selectedMiddlewares: PostMiddleware[] = customPostMiddlewares;\n\n for (const key of activePostMiddlewares) {\n switch (key) {\n case POST_API_MIDDLEWARES.Logger: {\n selectedMiddlewares.push(generateConsolePostMiddleware(postMiddlewaresOptions.logger));\n continue;\n }\n\n default: {\n continue;\n }\n }\n }\n\n return function executeMiddlewares(response: Response | NodeResponse | undefined) {\n return new Promise((resolve) => {\n void (async () => {\n for (const middleware of selectedMiddlewares) {\n // eslint-disable-next-line no-await-in-loop\n await middleware(response);\n }\n\n resolve(1);\n })();\n });\n };\n}\n"],"names":[],"mappings":";;;;;;SAegB,mBAAmB,CACjC,iBAAmC,EACnC,iBAAqC,EACrC,iBAA+B,EAAA;IAE/B,MAAM,mBAAmB,GAAiB,iBAAiB;AAE3D,IAAA,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE;QACnC,QAAQ,GAAG;AACT,YAAA,KAAK,eAAe,CAAC,KAAK,EAAE;gBAC1B,IAAI,iBAAiB,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,CAAC;oBACpD,mBAAmB,CAAC,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC5E;;AAEF,YAAA,KAAK,eAAe,CAAC,MAAM,EAAE;gBAC3B,mBAAmB,CAAC,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAC7E;;YAEF,SAAS;gBACP;;;;IAKN,OAAO,SAAS,kBAAkB,CAKhC,OAAyE,EAAA;AACzE,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,YAAW;AACf,gBAAA,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;;AAE5C,oBAAA,MAAM,UAAU,CAAC,OAAO,CAAC;;gBAG3B,OAAO,CAAC,CAAC,CAAC;aACX,GAAG;AACN,SAAC,CAAC;AACJ,KAAC;AACH;SAEgB,uBAAuB,CACrC,qBAA2C,EAC3C,sBAA6C,EAC7C,qBAAuC,EAAA;IAEvC,MAAM,mBAAmB,GAAqB,qBAAqB;AAEnE,IAAA,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE;QACvC,QAAQ,GAAG;AACT,YAAA,KAAK,oBAAoB,CAAC,MAAM,EAAE;gBAChC,mBAAmB,CAAC,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBACtF;;YAGF,SAAS;gBACP;;;;IAKN,OAAO,SAAS,kBAAkB,CAAC,QAA6C,EAAA;AAC9E,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,YAAW;AACf,gBAAA,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;;AAE5C,oBAAA,MAAM,UAAU,CAAC,QAAQ,CAAC;;gBAG5B,OAAO,CAAC,CAAC,CAAC;aACX,GAAG;AACN,SAAC,CAAC;AACJ,KAAC;AACH;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/middlewares/index.ts"],"sourcesContent":["import type { Response as NodeResponse } from \"node-fetch\";\nimport { API_MIDDLEWARES, IS_BROWSER, IS_JEST, POST_API_MIDDLEWARES } from \"../../../constants\";\nimport type {\n ActiveMiddleware,\n ActivePostMiddleware,\n Middleware,\n MiddlewaresOptions,\n OauthOptions,\n PostMiddleware,\n PostMiddlewareOptions,\n RequestInterface,\n} from \"../../../types\";\nimport { generateConsoleMiddleware } from \"./console-middleware\";\nimport { generateConsolePostMiddleware } from \"./console-post-middleware\";\nimport { generateOauthMiddleware } from \"./oauth-middleware\";\n\n// eslint-disable-next-line max-params\nexport function generateMiddlewares(\n activeMiddlewares: ActiveMiddleware,\n middlewareOptions: MiddlewaresOptions,\n oauthOptions: OauthOptions | undefined,\n customMiddlewares: Middleware[],\n) {\n const selectedMiddlewares: Middleware[] = customMiddlewares;\n\n for (const key of activeMiddlewares) {\n switch (key) {\n case API_MIDDLEWARES.Oauth: {\n if (oauthOptions && (IS_BROWSER || IS_JEST))\n selectedMiddlewares.push(generateOauthMiddleware(oauthOptions));\n continue;\n }\n case API_MIDDLEWARES.Logger: {\n selectedMiddlewares.push(generateConsoleMiddleware(middlewareOptions.logger));\n continue;\n }\n default: {\n continue;\n }\n }\n }\n\n return function executeMiddlewares<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) {\n return new Promise((resolve) => {\n void (async () => {\n for (const middleware of selectedMiddlewares) {\n // eslint-disable-next-line no-await-in-loop\n await middleware(request);\n }\n\n resolve(1);\n })();\n });\n };\n}\n\nexport function generatePostMiddlewares(\n activePostMiddlewares: ActivePostMiddleware,\n postMiddlewaresOptions: PostMiddlewareOptions,\n customPostMiddlewares: PostMiddleware[],\n) {\n const selectedMiddlewares: PostMiddleware[] = customPostMiddlewares;\n\n for (const key of activePostMiddlewares) {\n switch (key) {\n case POST_API_MIDDLEWARES.Logger: {\n selectedMiddlewares.push(generateConsolePostMiddleware(postMiddlewaresOptions.logger));\n continue;\n }\n\n default: {\n continue;\n }\n }\n }\n\n return function executeMiddlewares<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n response: Response | NodeResponse | undefined,\n ) {\n return new Promise((resolve) => {\n void (async () => {\n for (const middleware of selectedMiddlewares) {\n // eslint-disable-next-line no-await-in-loop\n await middleware(request, response);\n }\n\n resolve(1);\n })();\n });\n };\n}\n"],"names":[],"mappings":";;;;;;AAgBA;AACM,SAAU,mBAAmB,CACjC,iBAAmC,EACnC,iBAAqC,EACrC,YAAsC,EACtC,iBAA+B,EAAA;IAE/B,MAAM,mBAAmB,GAAiB,iBAAiB;AAE3D,IAAA,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE;QACnC,QAAQ,GAAG;AACT,YAAA,KAAK,eAAe,CAAC,KAAK,EAAE;AAC1B,gBAAA,IAAI,YAAY,KAAK,UAAU,IAAI,OAAO,CAAC;oBACzC,mBAAmB,CAAC,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;gBACjE;;AAEF,YAAA,KAAK,eAAe,CAAC,MAAM,EAAE;gBAC3B,mBAAmB,CAAC,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAC7E;;YAEF,SAAS;gBACP;;;;IAKN,OAAO,SAAS,kBAAkB,CAKhC,OAAyE,EAAA;AACzE,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,YAAW;AACf,gBAAA,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;;AAE5C,oBAAA,MAAM,UAAU,CAAC,OAAO,CAAC;;gBAG3B,OAAO,CAAC,CAAC,CAAC;aACX,GAAG;AACN,SAAC,CAAC;AACJ,KAAC;AACH;SAEgB,uBAAuB,CACrC,qBAA2C,EAC3C,sBAA6C,EAC7C,qBAAuC,EAAA;IAEvC,MAAM,mBAAmB,GAAqB,qBAAqB;AAEnE,IAAA,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE;QACvC,QAAQ,GAAG;AACT,YAAA,KAAK,oBAAoB,CAAC,MAAM,EAAE;gBAChC,mBAAmB,CAAC,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBACtF;;YAGF,SAAS;gBACP;;;;AAKN,IAAA,OAAO,SAAS,kBAAkB,CAMhC,OAAyE,EACzE,QAA6C,EAAA;AAE7C,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,YAAW;AACf,gBAAA,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;;AAE5C,oBAAA,MAAM,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC;;gBAGrC,OAAO,CAAC,CAAC,CAAC;aACX,GAAG;AACN,SAAC,CAAC;AACJ,KAAC;AACH;;;;"}
@@ -51,6 +51,25 @@ const generateOauthMiddleware = (options) => async (request) => {
51
51
  Authorization: `Bearer ${token}`,
52
52
  };
53
53
  };
54
+ async function refetchAfterOauth(options, refetch) {
55
+ isFetchingAccessToken = true;
56
+ await getOauthTokenFromOtherWindow({
57
+ onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,
58
+ onWindowOpenError: options.onWindowOpenError,
59
+ refreshTokenWindowUrl: options.refreshTokenWindowUrl,
60
+ wait: options.wait,
61
+ expiresTokenStorageName: options.expiresTokenStorageName,
62
+ closeObserveInterval: options.closeObserveInterval,
63
+ });
64
+ if (options.tokenRequest) {
65
+ const token = await options.tokenRequest();
66
+ if (token != undefined && options.tokenStorageName) {
67
+ localStorage.setItem(options.tokenStorageName, token);
68
+ }
69
+ }
70
+ isFetchingAccessToken = false;
71
+ return await refetch();
72
+ }
54
73
 
55
- export { generateOauthMiddleware };
74
+ export { generateOauthMiddleware, refetchAfterOauth };
56
75
  //# sourceMappingURL=oauth-middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-middleware.js","sources":["../../../../../src/lib/api/middlewares/oauth-middleware.ts"],"sourcesContent":["import type { Middleware, OauthMiddleWareOptions } from \"../../../types\";\nimport { startWith, waitUntil } from \"../../utils\";\nimport { getOauthTokenFromOtherWindow } from \"../oauth\";\n\nlet isFetchingAccessToken = false;\n\nexport const generateOauthMiddleware =\n (options: OauthMiddleWareOptions): Middleware =>\n async (request) => {\n if (!options.expiresTokenStorageName) {\n throw new Error(\"Auth middleware hasn't required options\");\n }\n\n const isSameOrigin = !startWith(request.path, \"http\");\n\n if (request.token) {\n if (!isSameOrigin)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${request.token}`,\n };\n\n return;\n }\n\n if (isFetchingAccessToken) await waitUntil(() => isFetchingAccessToken);\n\n const expires = localStorage.getItem(options.expiresTokenStorageName);\n let token: string | undefined | null;\n if (!expires || Number.isNaN(+expires) || Date.now() > +expires) {\n isFetchingAccessToken = true;\n await getOauthTokenFromOtherWindow({\n onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,\n onWindowOpenError: options.onWindowOpenError,\n refreshTokenWindowUrl: options.refreshTokenWindowUrl,\n wait: options.wait,\n expiresTokenStorageName: options.expiresTokenStorageName,\n closeObserveInterval: options.closeObserveInterval,\n });\n if (options.tokenRequest) {\n token = await options.tokenRequest();\n if (token != undefined && options.tokenStorageName) {\n localStorage.setItem(options.tokenStorageName, token);\n }\n }\n isFetchingAccessToken = false;\n }\n\n if (!isSameOrigin && token)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${token}`,\n };\n };\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,IAAI,qBAAqB,GAAG,KAAK;AAE1B,MAAM,uBAAuB,GAClC,CAAC,OAA+B,KAChC,OAAO,OAAO,KAAI;AAChB,IAAA,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE;AACpC,QAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;;IAG5D,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AAErD,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,IAAI,CAAC,YAAY;YACf,OAAO,CAAC,OAAO,GAAG;gBAChB,GAAG,OAAO,CAAC,OAAO;AAClB,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,OAAO,CAAC,KAAK,CAAE,CAAA;aACzC;QAEH;;AAGF,IAAA,IAAI,qBAAqB;AAAE,QAAA,MAAM,SAAS,CAAC,MAAM,qBAAqB,CAAC;IAEvE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;AACrE,IAAA,IAAI,KAAgC;AACpC,IAAA,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE;QAC/D,qBAAqB,GAAG,IAAI;AAC5B,QAAA,MAAM,4BAA4B,CAAC;YACjC,+BAA+B,EAAE,OAAO,CAAC,+BAA+B;YACxE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;YACpD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;YACxD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;AACnD,SAAA,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,YAAY,EAAE;AACxB,YAAA,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;YACpC,IAAI,KAAK,IAAI,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE;gBAClD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC;;;QAGzD,qBAAqB,GAAG,KAAK;;IAG/B,IAAI,CAAC,YAAY,IAAI,KAAK;QACxB,OAAO,CAAC,OAAO,GAAG;YAChB,GAAG,OAAO,CAAC,OAAO;YAClB,aAAa,EAAE,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA;SACjC;AACL;;;;"}
1
+ {"version":3,"file":"oauth-middleware.js","sources":["../../../../../src/lib/api/middlewares/oauth-middleware.ts"],"sourcesContent":["import type { Middleware, OauthOptions } from \"../../../types\";\nimport { startWith, waitUntil } from \"../../utils\";\nimport { getOauthTokenFromOtherWindow } from \"../oauth\";\n\nlet isFetchingAccessToken = false;\n\nexport const generateOauthMiddleware =\n (options: OauthOptions): Middleware =>\n async (request) => {\n if (!options.expiresTokenStorageName) {\n throw new Error(\"Auth middleware hasn't required options\");\n }\n\n const isSameOrigin = !startWith(request.path, \"http\");\n\n if (request.token) {\n if (!isSameOrigin)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${request.token}`,\n };\n\n return;\n }\n\n if (isFetchingAccessToken) await waitUntil(() => isFetchingAccessToken);\n\n const expires = localStorage.getItem(options.expiresTokenStorageName);\n let token: string | undefined | null;\n if (!expires || Number.isNaN(+expires) || Date.now() > +expires) {\n isFetchingAccessToken = true;\n await getOauthTokenFromOtherWindow({\n onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,\n onWindowOpenError: options.onWindowOpenError,\n refreshTokenWindowUrl: options.refreshTokenWindowUrl,\n wait: options.wait,\n expiresTokenStorageName: options.expiresTokenStorageName,\n closeObserveInterval: options.closeObserveInterval,\n });\n if (options.tokenRequest) {\n token = await options.tokenRequest();\n if (token != undefined && options.tokenStorageName) {\n localStorage.setItem(options.tokenStorageName, token);\n }\n }\n isFetchingAccessToken = false;\n }\n\n if (!isSameOrigin && token)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${token}`,\n };\n };\n\nexport async function refetchAfterOauth<T>(options: OauthOptions, refetch: () => Promise<T>) {\n isFetchingAccessToken = true;\n await getOauthTokenFromOtherWindow({\n onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,\n onWindowOpenError: options.onWindowOpenError,\n refreshTokenWindowUrl: options.refreshTokenWindowUrl,\n wait: options.wait,\n expiresTokenStorageName: options.expiresTokenStorageName,\n closeObserveInterval: options.closeObserveInterval,\n });\n if (options.tokenRequest) {\n const token = await options.tokenRequest();\n if (token != undefined && options.tokenStorageName) {\n localStorage.setItem(options.tokenStorageName, token);\n }\n }\n isFetchingAccessToken = false;\n\n return await refetch();\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,IAAI,qBAAqB,GAAG,KAAK;AAE1B,MAAM,uBAAuB,GAClC,CAAC,OAAqB,KACtB,OAAO,OAAO,KAAI;AAChB,IAAA,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE;AACpC,QAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;;IAG5D,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AAErD,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,IAAI,CAAC,YAAY;YACf,OAAO,CAAC,OAAO,GAAG;gBAChB,GAAG,OAAO,CAAC,OAAO;AAClB,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,OAAO,CAAC,KAAK,CAAE,CAAA;aACzC;QAEH;;AAGF,IAAA,IAAI,qBAAqB;AAAE,QAAA,MAAM,SAAS,CAAC,MAAM,qBAAqB,CAAC;IAEvE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;AACrE,IAAA,IAAI,KAAgC;AACpC,IAAA,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE;QAC/D,qBAAqB,GAAG,IAAI;AAC5B,QAAA,MAAM,4BAA4B,CAAC;YACjC,+BAA+B,EAAE,OAAO,CAAC,+BAA+B;YACxE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;YACpD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;YACxD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;AACnD,SAAA,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,YAAY,EAAE;AACxB,YAAA,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;YACpC,IAAI,KAAK,IAAI,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE;gBAClD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC;;;QAGzD,qBAAqB,GAAG,KAAK;;IAG/B,IAAI,CAAC,YAAY,IAAI,KAAK;QACxB,OAAO,CAAC,OAAO,GAAG;YAChB,GAAG,OAAO,CAAC,OAAO;YAClB,aAAa,EAAE,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA;SACjC;AACL;AAEK,eAAe,iBAAiB,CAAI,OAAqB,EAAE,OAAyB,EAAA;IACzF,qBAAqB,GAAG,IAAI;AAC5B,IAAA,MAAM,4BAA4B,CAAC;QACjC,+BAA+B,EAAE,OAAO,CAAC,+BAA+B;QACxE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;QACpD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;QACxD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;AACnD,KAAA,CAAC;AACF,IAAA,IAAI,OAAO,CAAC,YAAY,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;QAC1C,IAAI,KAAK,IAAI,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE;YAClD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC;;;IAGzD,qBAAqB,GAAG,KAAK;IAE7B,OAAO,MAAM,OAAO,EAAE;AACxB;;;;"}
@@ -10,13 +10,8 @@ import 'lodash/get';
10
10
  import 'lodash/set';
11
11
  import { getQueryValues } from '../../browser/get-query-values.js';
12
12
 
13
- let waiting = false;
14
13
  async function getOauthTokenFromOtherWindow(options) {
15
- await waitUntil(() => waiting);
16
- const expires = localStorage.getItem(options.expiresTokenStorageName);
17
- if (expires != undefined && !Number.isNaN(+expires) && Date.now() < +expires)
18
- return;
19
- waiting = true;
14
+ let waiting = true;
20
15
  const url = new URL(typeof options.refreshTokenWindowUrl === "function"
21
16
  ? options.refreshTokenWindowUrl()
22
17
  : (options.refreshTokenWindowUrl ?? window.origin));
@@ -61,9 +56,6 @@ async function getOauthTokenFromOtherWindow(options) {
61
56
  await waitUntil(() => waiting);
62
57
  }
63
58
  function getOauthToken(options) {
64
- let expires = localStorage.getItem(options.expiresTokenStorageName);
65
- if (!expires || Number.isNaN(+expires) || Date.now() > +expires)
66
- expires = null;
67
59
  const queries = getQueryValues([
68
60
  options.expiresTokenQueryName,
69
61
  options.onlyRefreshTokenWindowQueryName,
@@ -77,17 +69,11 @@ function getOauthToken(options) {
77
69
  ? refreshQuery[refreshQuery.length - 1] === "true"
78
70
  : false;
79
71
  /** Expires token */
80
- const expiresFromQuery = isString(expiresQuery)
72
+ const expires = isString(expiresQuery)
81
73
  ? expiresQuery
82
74
  : isArray(expiresQuery)
83
75
  ? expiresQuery[expiresQuery.length - 1]
84
76
  : false;
85
- /** Extract expires from query */
86
- if (!expires && expiresFromQuery) {
87
- expires = expiresFromQuery;
88
- if (!expires || Number.isNaN(+expires) || Date.now() > +expires)
89
- expires = null;
90
- }
91
77
  /** OAuth flow if not expires */
92
78
  if (!expires) {
93
79
  window.location.replace(typeof options.oauthUrl === "function" ? options.oauthUrl() : options.oauthUrl);
@@ -102,7 +88,7 @@ function getOauthToken(options) {
102
88
  window.close();
103
89
  }
104
90
  /** Delete expires query */
105
- if (expiresFromQuery) {
91
+ if (expires) {
106
92
  const url = new URL(window.location.href);
107
93
  url.searchParams.delete(options.expiresTokenQueryName);
108
94
  window.location.replace(url.toString());
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","sources":["../../../../../src/lib/api/oauth/token.ts"],"sourcesContent":["import type { GetOauthTokenFromOtherWindowOptions, GetOauthTokenOptions } from \"../../../types\";\nimport { getQueryValues } from \"../../browser\";\nimport { isArray, isString } from \"../../typings\";\nimport { waitUntil } from \"../../utils\";\n\nlet waiting = false;\n\nexport async function getOauthTokenFromOtherWindow(options: GetOauthTokenFromOtherWindowOptions) {\n await waitUntil(() => waiting);\n const expires: string | null | undefined = localStorage.getItem(options.expiresTokenStorageName);\n if (expires != undefined && !Number.isNaN(+expires) && Date.now() < +expires) return;\n\n waiting = true;\n const url = new URL(\n typeof options.refreshTokenWindowUrl === \"function\"\n ? options.refreshTokenWindowUrl()\n : (options.refreshTokenWindowUrl ?? window.origin),\n );\n url.searchParams.append(options.onlyRefreshTokenWindowQueryName, \"true\");\n\n let windowInstance = window.open(\n url.toString(),\n \"_blank\",\n \"width=800,height=600,left=100,top=100\",\n );\n windowInstance ??= window.open(url.toString(), \"_blank\");\n\n if (windowInstance) {\n const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);\n const windowCloseObserver = setInterval(() => {\n if (windowInstance.closed) {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n }\n }, options.closeObserveInterval ?? 500);\n channel.onmessage = () => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n };\n setTimeout(() => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n if (windowInstance && !windowInstance.closed) {\n windowInstance.close();\n }\n }, options.wait ?? 15000);\n } else {\n if (options.onWindowOpenError) options.onWindowOpenError();\n waiting = false;\n\n return;\n }\n\n await waitUntil(() => waiting);\n}\n\nexport function getOauthToken(options: GetOauthTokenOptions) {\n let expires: string | null | undefined = localStorage.getItem(options.expiresTokenStorageName);\n if (!expires || Number.isNaN(+expires) || Date.now() > +expires) expires = null;\n\n const queries = getQueryValues([\n options.expiresTokenQueryName,\n options.onlyRefreshTokenWindowQueryName,\n ]);\n const refreshQuery = queries?.[options.onlyRefreshTokenWindowQueryName];\n const expiresQuery = queries?.[options.expiresTokenQueryName];\n\n /** Is OnlyRefresh window */\n const isRefresh = isString(refreshQuery)\n ? refreshQuery === \"true\"\n : isArray(refreshQuery)\n ? refreshQuery[refreshQuery.length - 1] === \"true\"\n : false;\n /** Expires token */\n const expiresFromQuery = isString(expiresQuery)\n ? expiresQuery\n : isArray(expiresQuery)\n ? expiresQuery[expiresQuery.length - 1]\n : false;\n\n /** Extract expires from query */\n if (!expires && expiresFromQuery) {\n expires = expiresFromQuery;\n if (!expires || Number.isNaN(+expires) || Date.now() > +expires) expires = null;\n }\n\n /** OAuth flow if not expires */\n if (!expires) {\n window.location.replace(\n typeof options.oauthUrl === \"function\" ? options.oauthUrl() : options.oauthUrl,\n );\n\n return null;\n }\n\n localStorage.setItem(options.expiresTokenStorageName, expires);\n\n /** Close if OnlyRefresh window */\n if (isRefresh) {\n const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);\n channel.postMessage(true);\n channel.close();\n window.close();\n }\n\n /** Delete expires query */\n if (expiresFromQuery) {\n const url = new URL(window.location.href);\n url.searchParams.delete(options.expiresTokenQueryName);\n window.location.replace(url.toString());\n\n return null;\n }\n\n return expires;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token.js","sources":["../../../../../src/lib/api/oauth/token.ts"],"sourcesContent":["import type { GetOauthTokenFromOtherWindowOptions, GetOauthTokenOptions } from \"../../../types\";\nimport { getQueryValues } from \"../../browser\";\nimport { isArray, isString } from \"../../typings\";\nimport { waitUntil } from \"../../utils\";\n\nexport async function getOauthTokenFromOtherWindow(options: GetOauthTokenFromOtherWindowOptions) {\n let waiting = true;\n const url = new URL(\n typeof options.refreshTokenWindowUrl === \"function\"\n ? options.refreshTokenWindowUrl()\n : (options.refreshTokenWindowUrl ?? window.origin),\n );\n url.searchParams.append(options.onlyRefreshTokenWindowQueryName, \"true\");\n\n let windowInstance = window.open(\n url.toString(),\n \"_blank\",\n \"width=800,height=600,left=100,top=100\",\n );\n windowInstance ??= window.open(url.toString(), \"_blank\");\n\n if (windowInstance) {\n const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);\n const windowCloseObserver = setInterval(() => {\n if (windowInstance.closed) {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n }\n }, options.closeObserveInterval ?? 500);\n channel.onmessage = () => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n };\n setTimeout(() => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n if (windowInstance && !windowInstance.closed) {\n windowInstance.close();\n }\n }, options.wait ?? 15000);\n } else {\n if (options.onWindowOpenError) options.onWindowOpenError();\n waiting = false;\n\n return;\n }\n\n await waitUntil(() => waiting);\n}\n\nexport function getOauthToken(options: GetOauthTokenOptions) {\n const queries = getQueryValues([\n options.expiresTokenQueryName,\n options.onlyRefreshTokenWindowQueryName,\n ]);\n const refreshQuery = queries?.[options.onlyRefreshTokenWindowQueryName];\n const expiresQuery = queries?.[options.expiresTokenQueryName];\n\n /** Is OnlyRefresh window */\n const isRefresh = isString(refreshQuery)\n ? refreshQuery === \"true\"\n : isArray(refreshQuery)\n ? refreshQuery[refreshQuery.length - 1] === \"true\"\n : false;\n /** Expires token */\n const expires = isString(expiresQuery)\n ? expiresQuery\n : isArray(expiresQuery)\n ? expiresQuery[expiresQuery.length - 1]\n : false;\n\n /** OAuth flow if not expires */\n if (!expires) {\n window.location.replace(\n typeof options.oauthUrl === \"function\" ? options.oauthUrl() : options.oauthUrl,\n );\n\n return null;\n }\n\n localStorage.setItem(options.expiresTokenStorageName, expires);\n\n /** Close if OnlyRefresh window */\n if (isRefresh) {\n const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);\n channel.postMessage(true);\n channel.close();\n window.close();\n }\n\n /** Delete expires query */\n if (expires) {\n const url = new URL(window.location.href);\n url.searchParams.delete(options.expiresTokenQueryName);\n window.location.replace(url.toString());\n\n return null;\n }\n\n return expires;\n}\n"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -60,6 +60,7 @@ type RequestInterface<IncomingApi, Incoming = IncomingApi, Outcoming = unknown,
60
60
  downloadFile?: boolean;
61
61
  signal?: AbortSignal;
62
62
  token?: string;
63
+ refetchNoAuth?: boolean;
63
64
  } & RequestTransformIncoming<IncomingApi, Incoming> & RequestTransformOutcoming<Outcoming, OutcomingApi>;
64
65
  type RequestTransformOutcoming<Outcoming, OutcomingApi> = IsEqual<OutcomingApi, Outcoming> extends true ? {
65
66
  transformOutcomingData?: never;
@@ -72,7 +73,7 @@ type RequestTransformIncoming<IncomingApi, Incoming> = IsEqual<Incoming, Incomin
72
73
  transformIncomingData: (data: IncomingApi) => Incoming;
73
74
  };
74
75
  type Middleware = <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) => Promise<unknown>;
75
- type PostMiddleware = (response: Response | Response$1 | undefined) => Promise<unknown>;
76
+ type PostMiddleware = <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>, response: Response | Response$1 | undefined) => Promise<unknown>;
76
77
  type PostMiddlewareType = ValueOf<typeof POST_API_MIDDLEWARES>;
77
78
  type ActivePostMiddleware = PostMiddlewareType[];
78
79
  type LoggerPostMiddlewareOptions = {
@@ -94,7 +95,6 @@ type LoggerMiddlewareOptions = {
94
95
  filterHeaders?: (headers?: Record<string, string | undefined>) => boolean;
95
96
  };
96
97
  type MiddlewaresOptions = {
97
- oauth?: OauthMiddleWareOptions;
98
98
  logger?: LoggerMiddlewareOptions;
99
99
  };
100
100
  type AuthUserUpdateRequestOptions<User extends Record<string, unknown>> = AuthUserRequestOptions & {
@@ -105,7 +105,7 @@ type AuthUserUpdateRequestOptions<User extends Record<string, unknown>> = AuthUs
105
105
  type AuthUserRequestOptions = {
106
106
  authUserUrl: string;
107
107
  };
108
- type OauthMiddleWareOptions = {
108
+ type OauthOptions = {
109
109
  expiresTokenStorageName: string;
110
110
  onlyRefreshTokenWindowQueryName: string;
111
111
  refreshTokenWindowUrl?: (() => string) | string;
@@ -157,6 +157,7 @@ declare class ResponseError extends Error {
157
157
  }
158
158
  type CreateRequestClientInstance = {
159
159
  client: ((url: URL | RequestInfo, init?: RequestInit) => Promise<Response$1>) | typeof fetch;
160
+ oauthOptions?: OauthOptions;
160
161
  activeMiddlewares?: ActiveMiddleware;
161
162
  middlewareOptions?: MiddlewaresOptions;
162
163
  customMiddlewares?: Middleware[];
@@ -175,7 +176,7 @@ declare function createRequestClientInstance(options: CreateRequestClientInstanc
175
176
  status: number;
176
177
  headers: Record<string, string>;
177
178
  }>;
178
- setMiddlewares: ({ activeMiddlewares, middlewareOptions, customMiddlewares, activePostMiddlewares, postMiddlewaresOptions, customPostMiddlewares, }?: Omit<CreateRequestClientInstance, "client">) => void;
179
+ setMiddlewares: ({ activeMiddlewares, middlewareOptions, customMiddlewares, activePostMiddlewares, postMiddlewaresOptions, customPostMiddlewares, oauthOptions, }?: Omit<CreateRequestClientInstance, "client">) => void;
179
180
  };
180
181
 
181
182
  declare function getOauthTokenFromOtherWindow(options: GetOauthTokenFromOtherWindowOptions): Promise<void>;
@@ -399,4 +400,4 @@ declare function throttle<TArgs extends any[]>({ interval }: {
399
400
  declare function type(value: unknown): string;
400
401
 
401
402
  export { API_MIDDLEWARES, COLOR_FORMATS, DATE_TYPES, FIELD_TYPES, IS_BROWSER, IS_BUN, IS_DENO, IS_JEST, IS_NODE, IS_WEB_WORKER, POST_API_MIDDLEWARES, ResponseError, arrayToMapByKey, buildQueryString, checkType, cloneDeep, copyToClipboard, createGlobalId, createLocalIdGenerator, createRequestClientInstance, createURLWithParams, dateDifference, dateFormat, debounce, declination, difference, differenceBy, differenceWith, downloadFile, downloadJson, execAnimation, extractQueries, fieldViewFormat, getAuthUser, getByPath, getCallerFunctionName, getColorFormat, getDateByRules, getFileNameFromHeader, getOauthToken, getOauthTokenFromOtherWindow, getQueryValues, getRandomColor, getToday, getTomorrow, getVisiblePosition, getYesterday, isArray, isBoolean, isDate, isEqual, isId, isNull, isNullable, isNumber, isObject, isPrimitive, isString, isToday, isTomorrow, isUndefined, isYesterday, joinPaths, jsonParse, limitStreamOfRequests, randomNumber, randomString, readFile, setByPath, speedTest, startWith, syncObjectValues, takeOpacityColors, throttle, transformHEXtoRGB, transformRGBAtoRGB, transformRGBtoRGBA, transformToColor, transformToDayjs, transformToNumber, translit, trimUrl, type, updateAuthUser, wait, waitUntil };
402
- export type { ActiveMiddleware, ActivePostMiddleware, AuthUserRequestOptions, AuthUserUpdateRequestOptions, ColorFormat, DateGetterRule, DateType, DayJS, FieldType, GetOauthTokenFromOtherWindowOptions, GetOauthTokenOptions, IsEqual, LoggerMiddlewareOptions, LoggerPostMiddlewareOptions, Maybe, Middleware, MiddlewareType, MiddlewaresOptions, OauthMiddleWareOptions, ParamValueType, ParamsType, PositionPlacements, PostMiddleware, PostMiddlewareOptions, PostMiddlewareType, RequestInstance, RequestInterface, RequestMethod, RequestTransformIncoming, RequestTransformOutcoming, ValueOf, VisiblePosition };
403
+ export type { ActiveMiddleware, ActivePostMiddleware, AuthUserRequestOptions, AuthUserUpdateRequestOptions, ColorFormat, DateGetterRule, DateType, DayJS, FieldType, GetOauthTokenFromOtherWindowOptions, GetOauthTokenOptions, IsEqual, LoggerMiddlewareOptions, LoggerPostMiddlewareOptions, Maybe, Middleware, MiddlewareType, MiddlewaresOptions, OauthOptions, ParamValueType, ParamsType, PositionPlacements, PostMiddleware, PostMiddlewareOptions, PostMiddlewareType, RequestInstance, RequestInterface, RequestMethod, RequestTransformIncoming, RequestTransformOutcoming, ValueOf, VisiblePosition };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krainovsd/js-helpers",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "description": "Krainov helpers",
5
5
  "type": "module",
6
6
  "author": "KrainovSD <denislosev48@gmail.com>",