@krainovsd/js-helpers 0.15.3 → 0.16.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.
Files changed (65) hide show
  1. package/lib/cjs/index.cjs +662 -583
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/{lib/api/middlewares/console-post-middleware.js → api/after/logger-after-handler.js} +4 -4
  4. package/lib/esm/api/after/logger-after-handler.js.map +1 -0
  5. package/lib/esm/api/api.constants.js +23 -0
  6. package/lib/esm/api/api.constants.js.map +1 -0
  7. package/lib/esm/api/api.js +343 -0
  8. package/lib/esm/api/api.js.map +1 -0
  9. package/lib/esm/{lib/api/middlewares/console-middleware.js → api/before/logger-before-handler.js} +4 -4
  10. package/lib/esm/api/before/logger-before-handler.js.map +1 -0
  11. package/lib/esm/api/before/oauth-before-handler.js +56 -0
  12. package/lib/esm/api/before/oauth-before-handler.js.map +1 -0
  13. package/lib/esm/{lib/api/oauth/token.js → api/oauth.js} +30 -10
  14. package/lib/esm/api/oauth.js.map +1 -0
  15. package/lib/esm/constants/errors.js +16 -0
  16. package/lib/esm/constants/errors.js.map +1 -0
  17. package/lib/esm/constants/index.js +27 -0
  18. package/lib/esm/constants/index.js.map +1 -0
  19. package/lib/esm/index.js +9 -8
  20. package/lib/esm/index.js.map +1 -1
  21. package/lib/esm/lib/colors/get-color-format.js +1 -2
  22. package/lib/esm/lib/colors/get-color-format.js.map +1 -1
  23. package/lib/esm/lib/colors/take-opacity-colors.js +1 -2
  24. package/lib/esm/lib/colors/take-opacity-colors.js.map +1 -1
  25. package/lib/esm/lib/colors/transform-to-color.js +1 -2
  26. package/lib/esm/lib/colors/transform-to-color.js.map +1 -1
  27. package/lib/esm/lib/date/get-date-by-rules.js +1 -2
  28. package/lib/esm/lib/date/get-date-by-rules.js.map +1 -1
  29. package/lib/esm/lib/date/is-yesterday.js +0 -1
  30. package/lib/esm/lib/date/is-yesterday.js.map +1 -1
  31. package/lib/esm/lib/lodash/clone-deep.js +2 -11
  32. package/lib/esm/lib/lodash/clone-deep.js.map +1 -1
  33. package/lib/esm/lib/lodash/debounce.js +1 -2
  34. package/lib/esm/lib/lodash/debounce.js.map +1 -1
  35. package/lib/esm/lib/lodash/throttle.js +1 -1
  36. package/lib/esm/lib/lodash/throttle.js.map +1 -1
  37. package/lib/esm/lib/utils/build-query-string.js.map +1 -1
  38. package/lib/esm/lib/utils/{create-url-with-params.js → create-url-with-queries.js} +3 -3
  39. package/lib/esm/lib/utils/create-url-with-queries.js.map +1 -0
  40. package/lib/esm/lib/utils/field-view-format.js +1 -2
  41. package/lib/esm/lib/utils/field-view-format.js.map +1 -1
  42. package/lib/index.d.ts +229 -175
  43. package/package.json +4 -2
  44. package/lib/esm/constants/api.js +0 -10
  45. package/lib/esm/constants/api.js.map +0 -1
  46. package/lib/esm/constants/colors.js +0 -9
  47. package/lib/esm/constants/colors.js.map +0 -1
  48. package/lib/esm/constants/date.js +0 -11
  49. package/lib/esm/constants/date.js.map +0 -1
  50. package/lib/esm/constants/fields.js +0 -11
  51. package/lib/esm/constants/fields.js.map +0 -1
  52. package/lib/esm/lib/api/constants.js +0 -4
  53. package/lib/esm/lib/api/constants.js.map +0 -1
  54. package/lib/esm/lib/api/core.js +0 -191
  55. package/lib/esm/lib/api/core.js.map +0 -1
  56. package/lib/esm/lib/api/middlewares/console-middleware.js.map +0 -1
  57. package/lib/esm/lib/api/middlewares/console-post-middleware.js.map +0 -1
  58. package/lib/esm/lib/api/middlewares/index.js +0 -65
  59. package/lib/esm/lib/api/middlewares/index.js.map +0 -1
  60. package/lib/esm/lib/api/middlewares/oauth-middleware.js +0 -75
  61. package/lib/esm/lib/api/middlewares/oauth-middleware.js.map +0 -1
  62. package/lib/esm/lib/api/oauth/token.js.map +0 -1
  63. package/lib/esm/lib/api/oauth/user.js +0 -35
  64. package/lib/esm/lib/api/oauth/user.js.map +0 -1
  65. package/lib/esm/lib/utils/create-url-with-params.js.map +0 -1
package/lib/cjs/index.cjs CHANGED
@@ -9,22 +9,19 @@ const yesterdayPlugin = require('dayjs/plugin/isYesterday');
9
9
  const get = require('lodash/get');
10
10
  const set = require('lodash/set');
11
11
 
12
- const DATE_TYPES = {
13
- Days: "days",
14
- Months: "months",
15
- Years: "years",
16
- Seconds: "seconds",
17
- Minutes: "minutes",
18
- Hours: "hours",
19
- };
20
-
21
- const API_MIDDLEWARES = {
22
- Oauth: "oauth",
23
- Logger: "logger",
24
- };
25
- const POST_API_MIDDLEWARES = {
26
- Logger: "logger",
27
- };
12
+ class ResponseError extends Error {
13
+ status;
14
+ code;
15
+ description;
16
+ headers;
17
+ constructor({ message, status, description, code, headers }) {
18
+ super(message);
19
+ this.status = status;
20
+ this.description = description;
21
+ this.code = code;
22
+ this.headers = headers;
23
+ }
24
+ }
28
25
 
29
26
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
30
27
  /* eslint-disable @typescript-eslint/ban-ts-comment */
@@ -49,7 +46,14 @@ const COLOR_FORMATS = {
49
46
  Rgba: "RGBA",
50
47
  Hsl: "HSL",
51
48
  };
52
-
49
+ const DATE_TYPES = {
50
+ Days: "days",
51
+ Months: "months",
52
+ Years: "years",
53
+ Seconds: "seconds",
54
+ Minutes: "minutes",
55
+ Hours: "hours",
56
+ };
53
57
  const FIELD_TYPES = {
54
58
  Date: "date",
55
59
  Time: "time",
@@ -320,7 +324,7 @@ function buildQueryString(params) {
320
324
  return queryString.join("&");
321
325
  }
322
326
 
323
- function createURLWithParams(options) {
327
+ function createURLWithQueries(options) {
324
328
  const url = options.baseURL;
325
329
  if (!options.params) {
326
330
  return url;
@@ -1308,563 +1312,81 @@ function extractQueries() {
1308
1312
  return queryMap;
1309
1313
  }
1310
1314
 
1311
- const RESPONSE_DATA_SYMBOL = Symbol("response data");
1312
-
1313
- function generateConsoleMiddleware(options = {}) {
1314
- return (request) => {
1315
- return new Promise((resolve) => {
1316
- if ((options.filter &&
1317
- !options.filter(request)) ||
1318
- (options.filterHeaders && !options.filterHeaders(request.headers)) ||
1319
- (options.filterMethod && !options.filterMethod(request.method)) ||
1320
- (options.filterParams && !options.filterParams(request.params)) ||
1321
- (options.filterPath && !options.filterPath(request.path))) {
1322
- resolve(true);
1323
- return;
1324
- }
1325
- // eslint-disable-next-line no-console
1326
- console.log(request);
1327
- resolve(true);
1328
- });
1329
- };
1315
+ function getColorFormat(color) {
1316
+ if (color.startsWith("#")) {
1317
+ return COLOR_FORMATS.Hex;
1318
+ }
1319
+ if (color.startsWith("rgba")) {
1320
+ return COLOR_FORMATS.Rgba;
1321
+ }
1322
+ if (color.startsWith("rgb")) {
1323
+ return COLOR_FORMATS.Rgb;
1324
+ }
1325
+ if (color.startsWith("hsl")) {
1326
+ return COLOR_FORMATS.Hsl;
1327
+ }
1330
1328
  }
1331
1329
 
1332
- function generateConsolePostMiddleware(options = {}) {
1333
- return (request, response) => {
1334
- return new Promise((resolve) => {
1335
- void (async function logger() {
1336
- try {
1337
- if (!response ||
1338
- (options.filter && !options.filter(response)) ||
1339
- (options.filterStatus && !options.filterStatus(response.status)) ||
1340
- (options.filterUrl && !options.filterUrl(response.url)) ||
1341
- (options.filterHeaders && !options.filterHeaders(response.headers))) {
1342
- resolve(true);
1343
- return;
1344
- }
1345
- const contentType = response.headers.get("content-type");
1346
- let result;
1347
- if (contentType?.includes?.("text")) {
1348
- result = await response.text();
1349
- }
1350
- else if (contentType?.includes?.("json")) {
1351
- result = await response.json();
1352
- }
1353
- else {
1354
- result = await response.blob();
1355
- }
1356
- Object.defineProperty(response, RESPONSE_DATA_SYMBOL, {
1357
- value: result,
1358
- writable: false,
1359
- enumerable: false,
1360
- configurable: true,
1361
- });
1362
- console.log({
1363
- url: response.url,
1364
- status: response.status,
1365
- headers: response.headers,
1366
- body: result,
1367
- });
1368
- resolve(true);
1369
- }
1370
- catch {
1371
- if (response) {
1372
- console.log({ url: response.url, status: response.status, headers: response.headers });
1373
- }
1374
- resolve(true);
1375
- }
1376
- })().finally(() => {
1377
- resolve(true);
1378
- });
1379
- });
1380
- };
1330
+ function transformHEXtoRGB(hex) {
1331
+ return `rgb(${hex.match(/\w\w/g)?.map((x) => +`0x${x}`)})`;
1381
1332
  }
1382
1333
 
1383
- async function getOauthTokenFromOtherWindow(options) {
1384
- let waiting = true;
1385
- const url = new URL(typeof options.refreshTokenWindowUrl === "function"
1386
- ? options.refreshTokenWindowUrl()
1387
- : (options.refreshTokenWindowUrl ?? window.origin));
1388
- url.searchParams.append(options.onlyRefreshTokenWindowQueryName, "true");
1389
- let windowInstance = window.open(url.toString(), "_blank", "width=800,height=600,left=100,top=100");
1390
- windowInstance ??= window.open(url.toString(), "_blank");
1391
- if (windowInstance) {
1392
- const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);
1393
- const windowCloseObserver = setInterval(() => {
1394
- if (windowInstance.closed) {
1395
- if (waiting) {
1396
- waiting = false;
1397
- channel.close();
1398
- clearInterval(windowCloseObserver);
1399
- }
1400
- }
1401
- }, options.closeObserveInterval ?? 500);
1402
- channel.onmessage = () => {
1403
- if (waiting) {
1404
- waiting = false;
1405
- channel.close();
1406
- clearInterval(windowCloseObserver);
1407
- }
1408
- };
1409
- setTimeout(() => {
1410
- if (waiting) {
1411
- waiting = false;
1412
- channel.close();
1413
- clearInterval(windowCloseObserver);
1414
- }
1415
- if (windowInstance && !windowInstance.closed) {
1416
- windowInstance.close();
1417
- }
1418
- }, options.wait ?? 15000);
1419
- }
1420
- else {
1421
- if (options.onWindowOpenError)
1422
- options.onWindowOpenError();
1423
- waiting = false;
1424
- return;
1425
- }
1426
- await waitUntil(() => waiting);
1334
+ function transformRGBtoRGBA(rgb, opacity) {
1335
+ const code = rgb.match(/\d+/g);
1336
+ code?.push(String(opacity / 100));
1337
+ return `rgba(${code?.join(",")})`;
1427
1338
  }
1428
- function getOauthToken(options) {
1429
- const queries = getQueryValues([
1430
- options.expiresTokenQueryName,
1431
- options.onlyRefreshTokenWindowQueryName,
1432
- ]);
1433
- const refreshQuery = queries?.[options.onlyRefreshTokenWindowQueryName];
1434
- const expiresQuery = queries?.[options.expiresTokenQueryName];
1435
- /** Is OnlyRefresh window */
1436
- const isRefresh = isString(refreshQuery)
1437
- ? refreshQuery === "true"
1438
- : isArray(refreshQuery)
1439
- ? refreshQuery[refreshQuery.length - 1] === "true"
1440
- : false;
1441
- /** Expires token */
1442
- const expires = isString(expiresQuery)
1443
- ? expiresQuery
1444
- : isArray(expiresQuery)
1445
- ? expiresQuery[expiresQuery.length - 1]
1446
- : false;
1447
- /** OAuth flow if not expires */
1448
- if (!expires) {
1449
- window.location.replace(typeof options.oauthUrl === "function" ? options.oauthUrl() : options.oauthUrl);
1450
- return null;
1451
- }
1452
- localStorage.setItem(options.expiresTokenStorageName, expires);
1453
- /** Close if OnlyRefresh window */
1454
- if (isRefresh) {
1455
- const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);
1456
- channel.postMessage(true);
1457
- channel.close();
1458
- window.close();
1459
- }
1460
- /** Delete expires query */
1461
- if (expires) {
1462
- const url = new URL(window.location.href);
1463
- url.searchParams.delete(options.expiresTokenQueryName);
1464
- window.location.replace(url.toString());
1465
- return null;
1466
- }
1467
- return expires;
1339
+
1340
+ function transformRGBAtoRGB(rgba) {
1341
+ const code = rgba.match(/\d+/g);
1342
+ code?.splice(3);
1343
+ return `rgb(${code?.join(",")})`;
1468
1344
  }
1469
1345
 
1470
- async function updateAuthUser(options) {
1471
- const userInfo = await (options.userRequest ? options.userRequest() : getAuthUser(options));
1472
- if (isNull(userInfo)) {
1473
- return void window.location.replace(options.oauthUrl());
1346
+ function takeOpacityColors(color, opacities) {
1347
+ let rgbColor = color;
1348
+ if (!rgbColor)
1349
+ return [];
1350
+ if (getColorFormat(rgbColor) === COLOR_FORMATS.Hex) {
1351
+ rgbColor = transformHEXtoRGB(rgbColor);
1474
1352
  }
1475
- if (isUndefined(userInfo)) {
1476
- return void window.location.replace(options.errorUrl);
1353
+ else if (getColorFormat(rgbColor) === COLOR_FORMATS.Rgba) {
1354
+ rgbColor = transformRGBAtoRGB(rgbColor);
1477
1355
  }
1478
- return userInfo;
1356
+ if (getColorFormat(rgbColor) !== COLOR_FORMATS.Rgb)
1357
+ return [];
1358
+ return [...opacities.map((opacity) => transformRGBtoRGBA(rgbColor, opacity))];
1479
1359
  }
1480
- async function getAuthUser(options) {
1481
- let status = 0;
1482
- try {
1483
- const response = await fetch(options.authUserUrl, {
1484
- method: "GET",
1485
- });
1486
- status = response.status;
1487
- if (!response.ok) {
1488
- throw new Error(`HTTP error! Status: ${response.status}`);
1360
+
1361
+ function transformToColor(currentColor, defaultColor = "black", defaultFormat = COLOR_FORMATS.Hex) {
1362
+ if (!isString(currentColor))
1363
+ return defaultColor;
1364
+ let correctColor = currentColor;
1365
+ if (!getColorFormat(correctColor)) {
1366
+ switch (defaultFormat) {
1367
+ case COLOR_FORMATS.Hex: {
1368
+ correctColor = `#${correctColor}`;
1369
+ break;
1370
+ }
1371
+ case COLOR_FORMATS.Rgb: {
1372
+ correctColor = `rgb(${correctColor})`;
1373
+ break;
1374
+ }
1375
+ case COLOR_FORMATS.Rgba: {
1376
+ correctColor = `rgba(${correctColor})`;
1377
+ break;
1378
+ }
1379
+ case COLOR_FORMATS.Hsl: {
1380
+ correctColor = `hsl(${correctColor})`;
1381
+ break;
1382
+ }
1383
+ default: {
1384
+ correctColor = `#${correctColor}`;
1385
+ break;
1386
+ }
1489
1387
  }
1490
- const result = (await response.json());
1491
- return result;
1492
- }
1493
- catch {
1494
- if (status >= 500)
1495
- return undefined;
1496
- return null;
1497
1388
  }
1498
- }
1499
-
1500
- let isFetchingAccessToken = false;
1501
- const generateOauthMiddleware = (options) => async (request) => {
1502
- if (!options.expiresTokenStorageName) {
1503
- throw new Error("Auth middleware hasn't required options");
1504
- }
1505
- const isSameOrigin = !startWith(request.path, "http");
1506
- if (request.token) {
1507
- if (!isSameOrigin)
1508
- request.headers = {
1509
- ...request.headers,
1510
- Authorization: `Bearer ${request.token}`,
1511
- };
1512
- return;
1513
- }
1514
- if (isFetchingAccessToken)
1515
- await waitUntil(() => isFetchingAccessToken);
1516
- const expires = localStorage.getItem(options.expiresTokenStorageName);
1517
- let token;
1518
- if (!expires || Number.isNaN(+expires) || Date.now() > +expires) {
1519
- isFetchingAccessToken = true;
1520
- await getOauthTokenFromOtherWindow({
1521
- onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,
1522
- onWindowOpenError: options.onWindowOpenError,
1523
- refreshTokenWindowUrl: options.refreshTokenWindowUrl,
1524
- wait: options.wait,
1525
- expiresTokenStorageName: options.expiresTokenStorageName,
1526
- closeObserveInterval: options.closeObserveInterval,
1527
- });
1528
- if (options.tokenRequest) {
1529
- token = await options.tokenRequest();
1530
- if (token != undefined && options.tokenStorageName) {
1531
- localStorage.setItem(options.tokenStorageName, token);
1532
- }
1533
- }
1534
- isFetchingAccessToken = false;
1535
- }
1536
- if (!isSameOrigin && token)
1537
- request.headers = {
1538
- ...request.headers,
1539
- Authorization: `Bearer ${token}`,
1540
- };
1541
- };
1542
- async function refetchAfterOauth(options, refetch) {
1543
- isFetchingAccessToken = true;
1544
- await getOauthTokenFromOtherWindow({
1545
- onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,
1546
- onWindowOpenError: options.onWindowOpenError,
1547
- refreshTokenWindowUrl: options.refreshTokenWindowUrl,
1548
- wait: options.wait,
1549
- expiresTokenStorageName: options.expiresTokenStorageName,
1550
- closeObserveInterval: options.closeObserveInterval,
1551
- });
1552
- if (options.tokenRequest) {
1553
- const token = await options.tokenRequest();
1554
- if (token != undefined && options.tokenStorageName) {
1555
- localStorage.setItem(options.tokenStorageName, token);
1556
- }
1557
- }
1558
- isFetchingAccessToken = false;
1559
- return await refetch();
1560
- }
1561
-
1562
- // eslint-disable-next-line max-params
1563
- function generateMiddlewares(activeMiddlewares, middlewareOptions, oauthOptions, customMiddlewares) {
1564
- const selectedMiddlewares = customMiddlewares;
1565
- for (const key of activeMiddlewares) {
1566
- switch (key) {
1567
- case API_MIDDLEWARES.Oauth: {
1568
- if (oauthOptions && (IS_BROWSER || IS_JEST))
1569
- selectedMiddlewares.push(generateOauthMiddleware(oauthOptions));
1570
- continue;
1571
- }
1572
- case API_MIDDLEWARES.Logger: {
1573
- selectedMiddlewares.push(generateConsoleMiddleware(middlewareOptions.logger));
1574
- continue;
1575
- }
1576
- default: {
1577
- continue;
1578
- }
1579
- }
1580
- }
1581
- return function executeMiddlewares(request) {
1582
- return new Promise((resolve) => {
1583
- void (async () => {
1584
- for (const middleware of selectedMiddlewares) {
1585
- // eslint-disable-next-line no-await-in-loop
1586
- await middleware(request);
1587
- }
1588
- resolve(1);
1589
- })();
1590
- });
1591
- };
1592
- }
1593
- function generatePostMiddlewares(activePostMiddlewares, postMiddlewaresOptions, customPostMiddlewares) {
1594
- const selectedMiddlewares = customPostMiddlewares;
1595
- for (const key of activePostMiddlewares) {
1596
- switch (key) {
1597
- case POST_API_MIDDLEWARES.Logger: {
1598
- selectedMiddlewares.push(generateConsolePostMiddleware(postMiddlewaresOptions.logger));
1599
- continue;
1600
- }
1601
- default: {
1602
- continue;
1603
- }
1604
- }
1605
- }
1606
- return function executeMiddlewares(request, response) {
1607
- return new Promise((resolve) => {
1608
- void (async () => {
1609
- for (const middleware of selectedMiddlewares) {
1610
- // eslint-disable-next-line no-await-in-loop
1611
- await middleware(request, response);
1612
- }
1613
- resolve(1);
1614
- })();
1615
- });
1616
- };
1617
- }
1618
-
1619
- class ResponseError extends Error {
1620
- status;
1621
- code;
1622
- description;
1623
- headers;
1624
- constructor({ message, status, description, code, headers }) {
1625
- super(message);
1626
- this.status = status;
1627
- this.description = description;
1628
- this.code = code;
1629
- this.headers = headers;
1630
- }
1631
- }
1632
- function createRequestClientInstance(options) {
1633
- let executeMiddlewares;
1634
- let executePostMiddlewares;
1635
- function setMiddlewares({ activeMiddlewares = [], middlewareOptions = {}, customMiddlewares = [], activePostMiddlewares = [], postMiddlewaresOptions = {}, customPostMiddlewares = [], oauthOptions = undefined, } = {}) {
1636
- executeMiddlewares = generateMiddlewares(activeMiddlewares, middlewareOptions, oauthOptions, customMiddlewares);
1637
- executePostMiddlewares = generatePostMiddlewares(activePostMiddlewares, postMiddlewaresOptions, customPostMiddlewares);
1638
- }
1639
- setMiddlewares(options);
1640
- async function handleRequest(request, responseWithStatus) {
1641
- if (request.delay) {
1642
- await wait(request.delay);
1643
- }
1644
- if (request.mock) {
1645
- const mock = typeof request.mock === "function" ? request.mock() : request.mock;
1646
- const transformedResult = request.transformIncomingData
1647
- ? request.transformIncomingData(mock)
1648
- : mock;
1649
- return responseWithStatus
1650
- ? { data: transformedResult, status: 200, headers: {} }
1651
- : transformedResult;
1652
- }
1653
- await executeMiddlewares(request);
1654
- const { method, body, path, params, headers = {}, refetchNoAuth = true } = request;
1655
- const url = createURLWithParams({ baseURL: path, params });
1656
- const [, requestContentType] = Object.entries(headers).find(([header]) => header.toLowerCase() === "content-type") ?? [];
1657
- let preparedBody = body;
1658
- if (request.transformOutcomingData) {
1659
- preparedBody = request.transformOutcomingData(body);
1660
- }
1661
- if (requestContentType == undefined &&
1662
- !(preparedBody instanceof FormData) &&
1663
- preparedBody != undefined &&
1664
- !isString(preparedBody)) {
1665
- headers["content-type"] = "application/json; charset=UTF-8";
1666
- }
1667
- if ((requestContentType == undefined || requestContentType.toLowerCase().includes("json")) &&
1668
- preparedBody != undefined &&
1669
- !(preparedBody instanceof FormData) &&
1670
- !isString(preparedBody)) {
1671
- preparedBody = JSON.stringify(preparedBody);
1672
- }
1673
- const response = await options.client(url, {
1674
- method,
1675
- body: preparedBody,
1676
- headers: headers,
1677
- signal: request.signal,
1678
- });
1679
- await executePostMiddlewares(request, response);
1680
- if (!response) {
1681
- throw new Error("hasn't response");
1682
- }
1683
- if (!response.ok) {
1684
- if (response.status === 304) {
1685
- return responseWithStatus
1686
- ? {
1687
- data: undefined,
1688
- status: response.status,
1689
- headers: Object.fromEntries(response.headers.entries()),
1690
- }
1691
- : undefined;
1692
- }
1693
- if (response.status === 401 && refetchNoAuth && options.oauthOptions) {
1694
- return refetchAfterOauth(options.oauthOptions, () => handleRequest({ ...request, refetchNoAuth: false }, responseWithStatus));
1695
- }
1696
- if (request.defaultResponse) {
1697
- const defaultResponse = typeof request.defaultResponse === "function"
1698
- ? request.defaultResponse()
1699
- : request.defaultResponse;
1700
- const transformedResult = request.transformIncomingData
1701
- ? request.transformIncomingData(defaultResponse)
1702
- : defaultResponse;
1703
- return responseWithStatus
1704
- ? {
1705
- data: transformedResult,
1706
- status: response.status,
1707
- headers: Object.fromEntries(response.headers.entries()),
1708
- }
1709
- : transformedResult;
1710
- }
1711
- let result;
1712
- try {
1713
- const contentType = response.headers.get("content-type");
1714
- if (contentType?.includes?.("text")) {
1715
- result = await response.text();
1716
- }
1717
- else if (contentType?.includes?.("json")) {
1718
- result = await response.json();
1719
- }
1720
- else {
1721
- result = await response.blob();
1722
- }
1723
- }
1724
- catch {
1725
- if (RESPONSE_DATA_SYMBOL in response)
1726
- result = response[RESPONSE_DATA_SYMBOL];
1727
- }
1728
- throw new ResponseError({
1729
- status: response.status,
1730
- message: `HTTP error! Status: ${response.status}`,
1731
- description: result,
1732
- headers: Object.fromEntries(response.headers.entries()),
1733
- });
1734
- }
1735
- if (request.downloadFile) {
1736
- const data = await response.blob();
1737
- const mimeType = response.headers.get("content-type");
1738
- const fileName = response.headers.get("content-disposition");
1739
- if (!mimeType || !fileName)
1740
- throw new Error("Download Error! Empty info!");
1741
- if (IS_BROWSER)
1742
- downloadFile({
1743
- data: data,
1744
- fileName,
1745
- mimeType,
1746
- });
1747
- return responseWithStatus
1748
- ? {
1749
- data: data,
1750
- status: response.status,
1751
- headers: Object.fromEntries(response.headers.entries()),
1752
- }
1753
- : data;
1754
- }
1755
- const contentType = response.headers.get("content-type");
1756
- let result = undefined;
1757
- try {
1758
- if (contentType?.includes?.("text")) {
1759
- result = (await response.text());
1760
- }
1761
- else if (contentType?.includes?.("json")) {
1762
- result = (await response.json());
1763
- }
1764
- else {
1765
- result = (await response.blob());
1766
- }
1767
- }
1768
- catch { }
1769
- const transformedResult = request.transformIncomingData
1770
- ? request.transformIncomingData(result)
1771
- : result;
1772
- return responseWithStatus
1773
- ? {
1774
- data: transformedResult,
1775
- status: response.status,
1776
- headers: Object.fromEntries(response.headers.entries()),
1777
- }
1778
- : transformedResult;
1779
- }
1780
- async function requestApi(request) {
1781
- return handleRequest(request, false);
1782
- }
1783
- async function requestApiWithMeta(request) {
1784
- return handleRequest(request, true);
1785
- }
1786
- return {
1787
- requestApi,
1788
- requestApiWithMeta,
1789
- setMiddlewares,
1790
- };
1791
- }
1792
-
1793
- function getColorFormat(color) {
1794
- if (color.startsWith("#")) {
1795
- return COLOR_FORMATS.Hex;
1796
- }
1797
- if (color.startsWith("rgba")) {
1798
- return COLOR_FORMATS.Rgba;
1799
- }
1800
- if (color.startsWith("rgb")) {
1801
- return COLOR_FORMATS.Rgb;
1802
- }
1803
- if (color.startsWith("hsl")) {
1804
- return COLOR_FORMATS.Hsl;
1805
- }
1806
- }
1807
-
1808
- function transformHEXtoRGB(hex) {
1809
- return `rgb(${hex.match(/\w\w/g)?.map((x) => +`0x${x}`)})`;
1810
- }
1811
-
1812
- function transformRGBtoRGBA(rgb, opacity) {
1813
- const code = rgb.match(/\d+/g);
1814
- code?.push(String(opacity / 100));
1815
- return `rgba(${code?.join(",")})`;
1816
- }
1817
-
1818
- function transformRGBAtoRGB(rgba) {
1819
- const code = rgba.match(/\d+/g);
1820
- code?.splice(3);
1821
- return `rgb(${code?.join(",")})`;
1822
- }
1823
-
1824
- function takeOpacityColors(color, opacities) {
1825
- let rgbColor = color;
1826
- if (!rgbColor)
1827
- return [];
1828
- if (getColorFormat(rgbColor) === COLOR_FORMATS.Hex) {
1829
- rgbColor = transformHEXtoRGB(rgbColor);
1830
- }
1831
- else if (getColorFormat(rgbColor) === COLOR_FORMATS.Rgba) {
1832
- rgbColor = transformRGBAtoRGB(rgbColor);
1833
- }
1834
- if (getColorFormat(rgbColor) !== COLOR_FORMATS.Rgb)
1835
- return [];
1836
- return [...opacities.map((opacity) => transformRGBtoRGBA(rgbColor, opacity))];
1837
- }
1838
-
1839
- function transformToColor(currentColor, defaultColor = "black", defaultFormat = COLOR_FORMATS.Hex) {
1840
- if (!isString(currentColor))
1841
- return defaultColor;
1842
- let correctColor = currentColor;
1843
- if (!getColorFormat(correctColor)) {
1844
- switch (defaultFormat) {
1845
- case COLOR_FORMATS.Hex: {
1846
- correctColor = `#${correctColor}`;
1847
- break;
1848
- }
1849
- case COLOR_FORMATS.Rgb: {
1850
- correctColor = `rgb(${correctColor})`;
1851
- break;
1852
- }
1853
- case COLOR_FORMATS.Rgba: {
1854
- correctColor = `rgba(${correctColor})`;
1855
- break;
1856
- }
1857
- case COLOR_FORMATS.Hsl: {
1858
- correctColor = `hsl(${correctColor})`;
1859
- break;
1860
- }
1861
- default: {
1862
- correctColor = `#${correctColor}`;
1863
- break;
1864
- }
1865
- }
1866
- }
1867
- return correctColor;
1389
+ return correctColor;
1868
1390
  }
1869
1391
 
1870
1392
  function getRandomColor() {
@@ -1880,23 +1402,14 @@ function type(value) {
1880
1402
  : Object.prototype.toString.call(value).slice(8, -1);
1881
1403
  }
1882
1404
 
1883
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
1884
- function cloneDeep(value, map) {
1885
- map ??= new Map();
1886
- // this avoids the slower switch with a quick if decision removing some milliseconds in each run.
1405
+ function cloneDeep(value) {
1887
1406
  if (isPrimitive(value)) {
1888
1407
  return value;
1889
1408
  }
1890
1409
  function copy(copiedValue) {
1891
- // Check for circular and same references on the object graph and return its corresponding clone.
1892
- const cachedCopy = map.get(value);
1893
- if (cachedCopy) {
1894
- return cachedCopy;
1895
- }
1896
- map.set(value, copiedValue);
1897
1410
  for (const key in value) {
1898
1411
  if (Object.hasOwn(value, key)) {
1899
- copiedValue[key] = cloneDeep(value[key], map);
1412
+ copiedValue[key] = cloneDeep(value[key]);
1900
1413
  }
1901
1414
  }
1902
1415
  return copiedValue;
@@ -1937,8 +1450,7 @@ function cloneRegExp(pattern) {
1937
1450
  (pattern.dotAll ? "s" : ""));
1938
1451
  }
1939
1452
 
1940
- /* eslint-disable @typescript-eslint/no-explicit-any */
1941
- function debounce({ delay }, func) {
1453
+ function debounce(func, { delay }) {
1942
1454
  let timer;
1943
1455
  let active = true;
1944
1456
  const debounced = (...args) => {
@@ -2058,7 +1570,7 @@ function isEqual(aVal, bVal) {
2058
1570
  }
2059
1571
 
2060
1572
  /* eslint-disable @typescript-eslint/no-explicit-any */
2061
- function throttle({ interval }, func) {
1573
+ function throttle(func, { interval }) {
2062
1574
  let ready = true;
2063
1575
  let timer;
2064
1576
  const throttled = (...args) => {
@@ -2077,7 +1589,570 @@ function throttle({ interval }, func) {
2077
1589
  return throttled;
2078
1590
  }
2079
1591
 
2080
- exports.API_MIDDLEWARES = API_MIDDLEWARES;
1592
+ const RESPONSE_DATA_SYMBOL = Symbol("response data");
1593
+ const REQUEST_ERROR = {
1594
+ HTTP_ERROR: "http",
1595
+ NETWORK_ERROR: "network",
1596
+ TIMEOUT_ERROR: "timeout",
1597
+ ABORT_ERROR: "abort",
1598
+ VALIDATION_ERROR: "validation",
1599
+ CACHE_ERROR: "cache",
1600
+ UNKNOWN_ERROR: "unknown",
1601
+ };
1602
+ class OauthState {
1603
+ _fetching = false;
1604
+ get fetching() {
1605
+ return this._fetching;
1606
+ }
1607
+ set fetching(value) {
1608
+ this._fetching = value;
1609
+ }
1610
+ }
1611
+ const OAUTH_STATE = new OauthState();
1612
+
1613
+ async function getOauthTokenFromOtherWindow(options) {
1614
+ let waiting = true;
1615
+ const url = new URL(typeof options.refreshTokenWindowUrl === "function"
1616
+ ? options.refreshTokenWindowUrl()
1617
+ : (options.refreshTokenWindowUrl ?? window.origin));
1618
+ url.searchParams.append(options.onlyRefreshTokenWindowQueryName, "true");
1619
+ let windowInstance = window.open(url.toString(), "_blank", "width=800,height=600,left=100,top=100");
1620
+ windowInstance ??= window.open(url.toString(), "_blank");
1621
+ if (windowInstance) {
1622
+ const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);
1623
+ const windowCloseObserver = setInterval(() => {
1624
+ if (windowInstance.closed) {
1625
+ if (waiting) {
1626
+ waiting = false;
1627
+ channel.close();
1628
+ clearInterval(windowCloseObserver);
1629
+ }
1630
+ }
1631
+ }, options.closeObserveInterval ?? 500);
1632
+ channel.onmessage = () => {
1633
+ if (waiting) {
1634
+ waiting = false;
1635
+ channel.close();
1636
+ clearInterval(windowCloseObserver);
1637
+ }
1638
+ };
1639
+ setTimeout(() => {
1640
+ if (waiting) {
1641
+ waiting = false;
1642
+ channel.close();
1643
+ clearInterval(windowCloseObserver);
1644
+ }
1645
+ if (windowInstance && !windowInstance.closed) {
1646
+ windowInstance.close();
1647
+ }
1648
+ }, options.wait ?? 15000);
1649
+ }
1650
+ else {
1651
+ if (options.onWindowOpenError)
1652
+ options.onWindowOpenError();
1653
+ waiting = false;
1654
+ return;
1655
+ }
1656
+ await waitUntil(() => waiting);
1657
+ }
1658
+ async function refetchAfterOauth(options, refetch) {
1659
+ OAUTH_STATE.fetching = true;
1660
+ await getOauthTokenFromOtherWindow({
1661
+ onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,
1662
+ onWindowOpenError: options.onWindowOpenError,
1663
+ refreshTokenWindowUrl: options.refreshTokenWindowUrl,
1664
+ wait: options.wait,
1665
+ expiresTokenStorageName: options.expiresTokenStorageName,
1666
+ closeObserveInterval: options.closeObserveInterval,
1667
+ });
1668
+ if (options.tokenRequest) {
1669
+ const token = await options.tokenRequest();
1670
+ if (token != undefined && options.tokenStorageName) {
1671
+ localStorage.setItem(options.tokenStorageName, token);
1672
+ }
1673
+ }
1674
+ OAUTH_STATE.fetching = false;
1675
+ return await refetch();
1676
+ }
1677
+ function getOauthToken(options) {
1678
+ const queries = getQueryValues([
1679
+ options.expiresTokenQueryName,
1680
+ options.onlyRefreshTokenWindowQueryName,
1681
+ ]);
1682
+ const refreshQuery = queries?.[options.onlyRefreshTokenWindowQueryName];
1683
+ const expiresQuery = queries?.[options.expiresTokenQueryName];
1684
+ /** Is OnlyRefresh window */
1685
+ const isRefresh = isString(refreshQuery)
1686
+ ? refreshQuery === "true"
1687
+ : isArray(refreshQuery)
1688
+ ? refreshQuery[refreshQuery.length - 1] === "true"
1689
+ : false;
1690
+ /** Expires token */
1691
+ const expires = isString(expiresQuery)
1692
+ ? expiresQuery
1693
+ : isArray(expiresQuery)
1694
+ ? expiresQuery[expiresQuery.length - 1]
1695
+ : false;
1696
+ /** OAuth flow if not expires */
1697
+ if (!expires) {
1698
+ window.location.replace(typeof options.oauthUrl === "function" ? options.oauthUrl() : options.oauthUrl);
1699
+ return null;
1700
+ }
1701
+ localStorage.setItem(options.expiresTokenStorageName, expires);
1702
+ /** Close if OnlyRefresh window */
1703
+ if (isRefresh) {
1704
+ const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);
1705
+ channel.postMessage(true);
1706
+ channel.close();
1707
+ window.close();
1708
+ }
1709
+ /** Delete expires query */
1710
+ if (expires) {
1711
+ const url = new URL(window.location.href);
1712
+ url.searchParams.delete(options.expiresTokenQueryName);
1713
+ window.location.replace(url.toString());
1714
+ return null;
1715
+ }
1716
+ return expires;
1717
+ }
1718
+
1719
+ function createFetchClient(options) {
1720
+ let client = options.client;
1721
+ let oauthOptions = options.oauthOptions;
1722
+ let beforeHandlers = options.beforeHandlers;
1723
+ let afterHandlers = options.afterHandlers;
1724
+ let retries = options.retries;
1725
+ let timeout = options.timeout;
1726
+ function recreate(options) {
1727
+ if ("client" in options) {
1728
+ client = options.client;
1729
+ }
1730
+ if ("oauthOptions" in options) {
1731
+ oauthOptions = options.oauthOptions;
1732
+ }
1733
+ if ("beforeHandlers" in options) {
1734
+ beforeHandlers = options.beforeHandlers;
1735
+ }
1736
+ if ("afterHandlers" in options) {
1737
+ afterHandlers = options.afterHandlers;
1738
+ }
1739
+ if ("retries" in options) {
1740
+ retries = options.retries;
1741
+ }
1742
+ if ("timeout" in options) {
1743
+ timeout = options.timeout;
1744
+ }
1745
+ }
1746
+ async function handleRequest(request) {
1747
+ const timeoutController = new AbortController();
1748
+ const requestController = new AbortController();
1749
+ const requestTimeout = request.timeout ?? timeout;
1750
+ const requestRetries = request.retries ?? retries;
1751
+ try {
1752
+ if (request.delay) {
1753
+ await wait(request.delay);
1754
+ }
1755
+ if (request.mock) {
1756
+ const mock = typeof request.mock === "function" ? request.mock() : request.mock;
1757
+ const transformedResult = request.transformIncomingData
1758
+ ? request.transformIncomingData(mock)
1759
+ : mock;
1760
+ return { data: transformedResult, error: null, response: null };
1761
+ }
1762
+ if (requestTimeout != undefined && requestTimeout != 0) {
1763
+ setTimeout(() => {
1764
+ if (requestController.signal.aborted)
1765
+ return;
1766
+ timeoutController.abort();
1767
+ }, requestTimeout);
1768
+ timeoutController.signal.addEventListener("abort", () => requestController.abort(), {
1769
+ once: true,
1770
+ signal: requestController.signal,
1771
+ });
1772
+ }
1773
+ if (request.signal) {
1774
+ request.signal.addEventListener("abort", () => requestController.abort(), {
1775
+ once: true,
1776
+ signal: requestController.signal,
1777
+ });
1778
+ }
1779
+ {
1780
+ let handlers = [];
1781
+ if (request.beforeHandlers) {
1782
+ handlers = request.beforeHandlers;
1783
+ }
1784
+ else if (beforeHandlers) {
1785
+ handlers = beforeHandlers;
1786
+ }
1787
+ if (request.additionalBeforeHandlers) {
1788
+ handlers = handlers.concat(request.additionalBeforeHandlers);
1789
+ }
1790
+ if (handlers.length > 0) {
1791
+ await executeBeforeHandlers(handlers, request);
1792
+ }
1793
+ }
1794
+ const { method, body, path, queries, headers = {}, refetchNoAuth = true } = request;
1795
+ const url = createURLWithQueries({ baseURL: path, params: queries });
1796
+ let [, requestContentType] = Object.entries(headers).find(([header]) => header.toLowerCase() === "content-type") ?? [];
1797
+ if (isArray(requestContentType)) {
1798
+ requestContentType = requestContentType[0];
1799
+ }
1800
+ let preparedBody = body;
1801
+ if (request.transformOutcomingData) {
1802
+ preparedBody = request.transformOutcomingData(body);
1803
+ }
1804
+ if (requestContentType == undefined &&
1805
+ !(preparedBody instanceof FormData) &&
1806
+ preparedBody != undefined &&
1807
+ !isString(preparedBody)) {
1808
+ headers["content-type"] = "application/json; charset=UTF-8";
1809
+ }
1810
+ if ((requestContentType == undefined || requestContentType.toLowerCase().includes("json")) &&
1811
+ preparedBody != undefined &&
1812
+ !(preparedBody instanceof FormData) &&
1813
+ !isString(preparedBody)) {
1814
+ preparedBody = JSON.stringify(preparedBody);
1815
+ }
1816
+ const response = await client(url, {
1817
+ method,
1818
+ body: preparedBody,
1819
+ headers: headers,
1820
+ signal: requestController.signal,
1821
+ cache: request.cache,
1822
+ credentials: request.credentials,
1823
+ integrity: request.integrity,
1824
+ keepalive: request.keepalive,
1825
+ mode: request.mode,
1826
+ priority: request.priority,
1827
+ redirect: request.redirect,
1828
+ referrer: request.referrer,
1829
+ referrerPolicy: request.referrerPolicy,
1830
+ compress: request.compress,
1831
+ follow: request.follow,
1832
+ });
1833
+ {
1834
+ let handlers = [];
1835
+ if (request.afterHandlers) {
1836
+ handlers = request.afterHandlers;
1837
+ }
1838
+ else if (afterHandlers) {
1839
+ handlers = afterHandlers;
1840
+ }
1841
+ if (request.additionalAfterHandlers) {
1842
+ handlers = handlers.concat(request.additionalAfterHandlers);
1843
+ }
1844
+ if (handlers.length > 0) {
1845
+ await executeAfterHandlers(handlers, request, response);
1846
+ }
1847
+ }
1848
+ if (!response.ok) {
1849
+ if (response.status === 304) {
1850
+ const error = new ResponseError({
1851
+ message: REQUEST_ERROR.CACHE_ERROR,
1852
+ status: response.status,
1853
+ headers: Object.fromEntries(response.headers.entries()),
1854
+ });
1855
+ request.onError?.(REQUEST_ERROR.CACHE_ERROR, error);
1856
+ return { data: error, error: REQUEST_ERROR.CACHE_ERROR, response };
1857
+ }
1858
+ if (response.status === 401 && refetchNoAuth && oauthOptions) {
1859
+ return await refetchAfterOauth(oauthOptions, () => handleRequest({ ...request, refetchNoAuth: false }));
1860
+ }
1861
+ if (request.defaultResponse) {
1862
+ const defaultResponse = typeof request.defaultResponse === "function"
1863
+ ? request.defaultResponse()
1864
+ : request.defaultResponse;
1865
+ const transformedResult = request.transformIncomingData
1866
+ ? request.transformIncomingData(defaultResponse)
1867
+ : defaultResponse;
1868
+ return {
1869
+ data: transformedResult,
1870
+ error: null,
1871
+ response: null,
1872
+ };
1873
+ }
1874
+ if (requestRetries && requestRetries.length > 0) {
1875
+ await wait(requestRetries[0]);
1876
+ return await handleRequest({ ...request, retries: requestRetries.slice(1) });
1877
+ }
1878
+ let result;
1879
+ try {
1880
+ const contentType = response.headers.get("content-type");
1881
+ if (RESPONSE_DATA_SYMBOL in response) {
1882
+ result = response[RESPONSE_DATA_SYMBOL];
1883
+ }
1884
+ else if (contentType?.includes?.("text")) {
1885
+ result = await response.text();
1886
+ }
1887
+ else if (contentType?.includes?.("json")) {
1888
+ result = await response.json();
1889
+ }
1890
+ else {
1891
+ result = await response.blob();
1892
+ }
1893
+ }
1894
+ catch { }
1895
+ const error = new ResponseError({
1896
+ status: response.status,
1897
+ message: REQUEST_ERROR.HTTP_ERROR,
1898
+ description: result,
1899
+ headers: Object.fromEntries(response.headers.entries()),
1900
+ });
1901
+ request.onError?.(REQUEST_ERROR.HTTP_ERROR, error);
1902
+ return {
1903
+ data: error,
1904
+ error: REQUEST_ERROR.HTTP_ERROR,
1905
+ response,
1906
+ };
1907
+ }
1908
+ if (request.download) {
1909
+ const data = await response.blob();
1910
+ const mimeType = response.headers.get("content-type");
1911
+ const fileName = response.headers.get("content-disposition");
1912
+ if (!mimeType) {
1913
+ console.warn("couldn't download file because content-type header is not exist");
1914
+ }
1915
+ else if (!fileName) {
1916
+ console.warn("couldn't download file because content-disposition header is not exist");
1917
+ }
1918
+ if (IS_BROWSER && mimeType && fileName)
1919
+ downloadFile({
1920
+ data: data,
1921
+ fileName,
1922
+ mimeType,
1923
+ });
1924
+ return {
1925
+ data: data,
1926
+ error: null,
1927
+ response,
1928
+ };
1929
+ }
1930
+ const contentType = response.headers.get("content-type");
1931
+ let result = undefined;
1932
+ if (RESPONSE_DATA_SYMBOL in response) {
1933
+ result = response[RESPONSE_DATA_SYMBOL];
1934
+ }
1935
+ else if (contentType?.includes?.("text")) {
1936
+ result = (await response.text());
1937
+ }
1938
+ else if (contentType?.includes?.("json")) {
1939
+ result = (await response.json());
1940
+ }
1941
+ else {
1942
+ result = (await response.blob());
1943
+ }
1944
+ const transformedResult = request.transformIncomingData
1945
+ ? request.transformIncomingData(result)
1946
+ : result;
1947
+ return {
1948
+ data: transformedResult,
1949
+ error: null,
1950
+ response,
1951
+ };
1952
+ }
1953
+ catch (err) {
1954
+ if (request.defaultResponse) {
1955
+ const defaultResponse = typeof request.defaultResponse === "function"
1956
+ ? request.defaultResponse()
1957
+ : request.defaultResponse;
1958
+ const transformedResult = request.transformIncomingData
1959
+ ? request.transformIncomingData(defaultResponse)
1960
+ : defaultResponse;
1961
+ return {
1962
+ data: transformedResult,
1963
+ error: null,
1964
+ response: null,
1965
+ };
1966
+ }
1967
+ if (requestRetries && requestRetries.length > 0 && request?.signal?.aborted !== true) {
1968
+ await wait(requestRetries[0]);
1969
+ return await handleRequest({ ...request, retries: requestRetries.slice(1) });
1970
+ }
1971
+ if (err instanceof TypeError) {
1972
+ const error = new ResponseError({
1973
+ message: REQUEST_ERROR.NETWORK_ERROR,
1974
+ status: 0,
1975
+ description: String(err.message),
1976
+ });
1977
+ request.onError?.(REQUEST_ERROR.NETWORK_ERROR, error);
1978
+ return { data: error, error: REQUEST_ERROR.NETWORK_ERROR, response: null };
1979
+ }
1980
+ if (err instanceof Error && err.name === "AbortError") {
1981
+ if (timeoutController.signal.aborted) {
1982
+ const error = new ResponseError({
1983
+ message: REQUEST_ERROR.TIMEOUT_ERROR,
1984
+ status: 0,
1985
+ });
1986
+ request.onError?.(REQUEST_ERROR.TIMEOUT_ERROR, error);
1987
+ return { data: error, error: REQUEST_ERROR.TIMEOUT_ERROR, response: null };
1988
+ }
1989
+ const error = new ResponseError({
1990
+ message: REQUEST_ERROR.ABORT_ERROR,
1991
+ status: 0,
1992
+ });
1993
+ request.onError?.(REQUEST_ERROR.ABORT_ERROR, error);
1994
+ return { data: error, error: REQUEST_ERROR.ABORT_ERROR, response: null };
1995
+ }
1996
+ const error = new ResponseError({
1997
+ message: REQUEST_ERROR.UNKNOWN_ERROR,
1998
+ status: 0,
1999
+ description: String(err),
2000
+ });
2001
+ request.onError?.(REQUEST_ERROR.UNKNOWN_ERROR, error);
2002
+ return { data: error, error: REQUEST_ERROR.UNKNOWN_ERROR, response: null };
2003
+ }
2004
+ finally {
2005
+ requestController.abort();
2006
+ }
2007
+ }
2008
+ async function requestWithArrayResponse(request) {
2009
+ const response = await handleRequest(request);
2010
+ return [response.data, response.error, response.response];
2011
+ }
2012
+ async function requestWithObjectResponse(request) {
2013
+ return handleRequest(request);
2014
+ }
2015
+ return {
2016
+ requestWithArrayResponse,
2017
+ requestWithObjectResponse,
2018
+ recreate,
2019
+ };
2020
+ }
2021
+ function executeBeforeHandlers(handlers, request) {
2022
+ return new Promise((resolve) => {
2023
+ void (async () => {
2024
+ for (const handler of handlers) {
2025
+ // eslint-disable-next-line no-await-in-loop
2026
+ await handler(request);
2027
+ }
2028
+ resolve(1);
2029
+ })();
2030
+ });
2031
+ }
2032
+ function executeAfterHandlers(handlers, request, response) {
2033
+ return new Promise((resolve) => {
2034
+ void (async () => {
2035
+ for (const handler of handlers) {
2036
+ // eslint-disable-next-line no-await-in-loop
2037
+ await handler(request, response);
2038
+ }
2039
+ resolve(1);
2040
+ })();
2041
+ });
2042
+ }
2043
+
2044
+ function loggerAfterHandler(options = {}) {
2045
+ return (request, response) => {
2046
+ return new Promise((resolve) => {
2047
+ void (async function logger() {
2048
+ try {
2049
+ if (!response ||
2050
+ (options.filter && !options.filter(response)) ||
2051
+ (options.filterStatus && !options.filterStatus(response.status)) ||
2052
+ (options.filterUrl && !options.filterUrl(response.url)) ||
2053
+ (options.filterHeaders && !options.filterHeaders(response.headers))) {
2054
+ resolve(true);
2055
+ return;
2056
+ }
2057
+ const contentType = response.headers.get("content-type");
2058
+ let result;
2059
+ if (contentType?.includes?.("text")) {
2060
+ result = await response.text();
2061
+ }
2062
+ else if (contentType?.includes?.("json")) {
2063
+ result = await response.json();
2064
+ }
2065
+ else {
2066
+ result = await response.blob();
2067
+ }
2068
+ Object.defineProperty(response, RESPONSE_DATA_SYMBOL, {
2069
+ value: result,
2070
+ writable: false,
2071
+ enumerable: false,
2072
+ configurable: true,
2073
+ });
2074
+ console.log({
2075
+ url: response.url,
2076
+ status: response.status,
2077
+ headers: response.headers,
2078
+ body: result,
2079
+ });
2080
+ resolve(true);
2081
+ }
2082
+ catch {
2083
+ if (response) {
2084
+ console.log({ url: response.url, status: response.status, headers: response.headers });
2085
+ }
2086
+ resolve(true);
2087
+ }
2088
+ })().finally(() => {
2089
+ resolve(true);
2090
+ });
2091
+ });
2092
+ };
2093
+ }
2094
+
2095
+ function loggerBeforeHandler(options = {}) {
2096
+ return (request) => {
2097
+ return new Promise((resolve) => {
2098
+ if ((options.filter &&
2099
+ !options.filter(request)) ||
2100
+ (options.filterHeaders && !options.filterHeaders(request.headers)) ||
2101
+ (options.filterMethod && !options.filterMethod(request.method)) ||
2102
+ (options.filterParams && !options.filterParams(request.queries)) ||
2103
+ (options.filterPath && !options.filterPath(request.path))) {
2104
+ resolve(true);
2105
+ return;
2106
+ }
2107
+ // eslint-disable-next-line no-console
2108
+ console.log(request);
2109
+ resolve(true);
2110
+ });
2111
+ };
2112
+ }
2113
+
2114
+ const oauthBeforeHandler = (options) => async (request) => {
2115
+ if (!options.expiresTokenStorageName) {
2116
+ throw new Error("Auth middleware hasn't required options");
2117
+ }
2118
+ const isSameOrigin = !startWith(request.path, "http");
2119
+ if (request.token) {
2120
+ if (!isSameOrigin)
2121
+ request.headers = {
2122
+ ...request.headers,
2123
+ Authorization: `Bearer ${request.token}`,
2124
+ };
2125
+ return;
2126
+ }
2127
+ if (OAUTH_STATE.fetching)
2128
+ await waitUntil(() => OAUTH_STATE.fetching);
2129
+ const expires = localStorage.getItem(options.expiresTokenStorageName);
2130
+ let token;
2131
+ if (!expires || Number.isNaN(+expires) || Date.now() > +expires) {
2132
+ OAUTH_STATE.fetching = true;
2133
+ await getOauthTokenFromOtherWindow({
2134
+ onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,
2135
+ onWindowOpenError: options.onWindowOpenError,
2136
+ refreshTokenWindowUrl: options.refreshTokenWindowUrl,
2137
+ wait: options.wait,
2138
+ expiresTokenStorageName: options.expiresTokenStorageName,
2139
+ closeObserveInterval: options.closeObserveInterval,
2140
+ });
2141
+ if (options.tokenRequest) {
2142
+ token = await options.tokenRequest();
2143
+ if (token != undefined && options.tokenStorageName) {
2144
+ localStorage.setItem(options.tokenStorageName, token);
2145
+ }
2146
+ }
2147
+ OAUTH_STATE.fetching = false;
2148
+ }
2149
+ if (!isSameOrigin && token)
2150
+ request.headers = {
2151
+ ...request.headers,
2152
+ Authorization: `Bearer ${token}`,
2153
+ };
2154
+ };
2155
+
2081
2156
  exports.COLOR_FORMATS = COLOR_FORMATS;
2082
2157
  exports.DATE_TYPES = DATE_TYPES;
2083
2158
  exports.FIELD_TYPES = FIELD_TYPES;
@@ -2087,17 +2162,19 @@ exports.IS_DENO = IS_DENO;
2087
2162
  exports.IS_JEST = IS_JEST;
2088
2163
  exports.IS_NODE = IS_NODE;
2089
2164
  exports.IS_WEB_WORKER = IS_WEB_WORKER;
2090
- exports.POST_API_MIDDLEWARES = POST_API_MIDDLEWARES;
2165
+ exports.OAUTH_STATE = OAUTH_STATE;
2166
+ exports.REQUEST_ERROR = REQUEST_ERROR;
2167
+ exports.RESPONSE_DATA_SYMBOL = RESPONSE_DATA_SYMBOL;
2091
2168
  exports.ResponseError = ResponseError;
2092
2169
  exports.arrayToMapByKey = arrayToMapByKey;
2093
2170
  exports.buildQueryString = buildQueryString;
2094
2171
  exports.checkType = checkType;
2095
2172
  exports.cloneDeep = cloneDeep;
2096
2173
  exports.copyToClipboard = copyToClipboard;
2174
+ exports.createFetchClient = createFetchClient;
2097
2175
  exports.createGlobalId = createGlobalId;
2098
2176
  exports.createLocalIdGenerator = createLocalIdGenerator;
2099
- exports.createRequestClientInstance = createRequestClientInstance;
2100
- exports.createURLWithParams = createURLWithParams;
2177
+ exports.createURLWithQueries = createURLWithQueries;
2101
2178
  exports.dateDifference = dateDifference;
2102
2179
  exports.dateFormat = dateFormat;
2103
2180
  exports.debounce = debounce;
@@ -2110,7 +2187,6 @@ exports.downloadJson = downloadJson;
2110
2187
  exports.execAnimation = execAnimation;
2111
2188
  exports.extractQueries = extractQueries;
2112
2189
  exports.fieldViewFormat = fieldViewFormat;
2113
- exports.getAuthUser = getAuthUser;
2114
2190
  exports.getByPath = getByPath;
2115
2191
  exports.getCallerFunctionName = getCallerFunctionName;
2116
2192
  exports.getColorFormat = getColorFormat;
@@ -2142,9 +2218,13 @@ exports.isYesterday = isYesterday;
2142
2218
  exports.joinPaths = joinPaths;
2143
2219
  exports.jsonParse = jsonParse;
2144
2220
  exports.limitStreamOfRequests = limitStreamOfRequests;
2221
+ exports.loggerAfterHandler = loggerAfterHandler;
2222
+ exports.loggerBeforeHandler = loggerBeforeHandler;
2223
+ exports.oauthBeforeHandler = oauthBeforeHandler;
2145
2224
  exports.randomNumber = randomNumber;
2146
2225
  exports.randomString = randomString;
2147
2226
  exports.readFile = readFile;
2227
+ exports.refetchAfterOauth = refetchAfterOauth;
2148
2228
  exports.setByPath = setByPath;
2149
2229
  exports.speedTest = speedTest;
2150
2230
  exports.startWith = startWith;
@@ -2160,7 +2240,6 @@ exports.transformToNumber = transformToNumber;
2160
2240
  exports.translit = translit;
2161
2241
  exports.trimUrl = trimUrl;
2162
2242
  exports.type = type;
2163
- exports.updateAuthUser = updateAuthUser;
2164
2243
  exports.wait = wait;
2165
2244
  exports.waitUntil = waitUntil;
2166
2245
  //# sourceMappingURL=index.cjs.map