@krainovsd/js-helpers 0.14.13 → 0.15.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 (55) hide show
  1. package/lib/cjs/index.cjs +477 -264
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/constants/api.js +1 -2
  4. package/lib/esm/constants/api.js.map +1 -1
  5. package/lib/esm/index.js +16 -4
  6. package/lib/esm/index.js.map +1 -1
  7. package/lib/esm/lib/api/core.js +2 -2
  8. package/lib/esm/lib/api/middlewares/index.js +4 -10
  9. package/lib/esm/lib/api/middlewares/index.js.map +1 -1
  10. package/lib/esm/lib/api/middlewares/{auth-no-refresh-middleware.js → oauth-middleware.js} +20 -7
  11. package/lib/esm/lib/api/middlewares/oauth-middleware.js.map +1 -0
  12. package/lib/esm/lib/api/{auth → oauth}/token.js +41 -79
  13. package/lib/esm/lib/api/oauth/token.js.map +1 -0
  14. package/lib/esm/lib/api/oauth/user.js.map +1 -0
  15. package/lib/esm/lib/browser/copy-to-clipboard.js +37 -0
  16. package/lib/esm/lib/browser/copy-to-clipboard.js.map +1 -0
  17. package/lib/esm/lib/browser/download-file.js +1 -1
  18. package/lib/esm/lib/browser/extract-queries.js +21 -0
  19. package/lib/esm/lib/browser/extract-queries.js.map +1 -0
  20. package/lib/esm/lib/lodash/clone-deep.js +62 -0
  21. package/lib/esm/lib/lodash/clone-deep.js.map +1 -0
  22. package/lib/esm/lib/lodash/debounce.js +32 -0
  23. package/lib/esm/lib/lodash/debounce.js.map +1 -0
  24. package/lib/esm/lib/lodash/difference-by.js +18 -0
  25. package/lib/esm/lib/lodash/difference-by.js.map +1 -0
  26. package/lib/esm/lib/lodash/difference-with.js +18 -0
  27. package/lib/esm/lib/lodash/difference-with.js.map +1 -0
  28. package/lib/esm/lib/lodash/difference.js +18 -0
  29. package/lib/esm/lib/lodash/difference.js.map +1 -0
  30. package/lib/esm/lib/lodash/get-by-path.js.map +1 -0
  31. package/lib/esm/lib/lodash/is-equal.js +46 -0
  32. package/lib/esm/lib/lodash/is-equal.js.map +1 -0
  33. package/lib/esm/lib/lodash/set-by-path.js.map +1 -0
  34. package/lib/esm/lib/lodash/throttle.js +22 -0
  35. package/lib/esm/lib/lodash/throttle.js.map +1 -0
  36. package/lib/esm/lib/lodash/type.js +10 -0
  37. package/lib/esm/lib/lodash/type.js.map +1 -0
  38. package/lib/esm/lib/typings/is-primitive.js +7 -0
  39. package/lib/esm/lib/typings/is-primitive.js.map +1 -0
  40. package/lib/esm/lib/utils/declination.js +14 -0
  41. package/lib/esm/lib/utils/declination.js.map +1 -0
  42. package/lib/esm/lib/utils/sync-object-values.js +2 -2
  43. package/lib/esm/lib/utils/sync-object-values.js.map +1 -1
  44. package/lib/index.d.ts +61 -38
  45. package/package.json +1 -1
  46. package/lib/esm/lib/api/auth/token.js.map +0 -1
  47. package/lib/esm/lib/api/auth/user.js.map +0 -1
  48. package/lib/esm/lib/api/middlewares/auth-middleware.js +0 -57
  49. package/lib/esm/lib/api/middlewares/auth-middleware.js.map +0 -1
  50. package/lib/esm/lib/api/middlewares/auth-no-refresh-middleware.js.map +0 -1
  51. package/lib/esm/lib/utils/get-by-path.js.map +0 -1
  52. package/lib/esm/lib/utils/set-by-path.js.map +0 -1
  53. /package/lib/esm/lib/api/{auth → oauth}/user.js +0 -0
  54. /package/lib/esm/lib/{utils → lodash}/get-by-path.js +0 -0
  55. /package/lib/esm/lib/{utils → lodash}/set-by-path.js +0 -0
@@ -0,0 +1,18 @@
1
+ function difference(first, second) {
2
+ let idx = 0;
3
+ const out = [];
4
+ const toFilterOut = new Set();
5
+ for (let i = 0; i < second.length; i += 1) {
6
+ toFilterOut.add(second[i]);
7
+ }
8
+ while (idx < first.length) {
9
+ if (!toFilterOut.has(first[idx])) {
10
+ out[out.length] = first[idx];
11
+ }
12
+ idx += 1;
13
+ }
14
+ return out;
15
+ }
16
+
17
+ export { difference };
18
+ //# sourceMappingURL=difference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"difference.js","sources":["../../../../src/lib/lodash/difference.ts"],"sourcesContent":["export function difference<T extends string | number | boolean | null | undefined>(\n first: T[],\n second: T[],\n): T[] {\n let idx = 0;\n const out: T[] = [];\n const toFilterOut = new Set();\n\n for (let i = 0; i < second.length; i += 1) {\n toFilterOut.add(second[i]);\n }\n\n while (idx < first.length) {\n if (!toFilterOut.has(first[idx])) {\n out[out.length] = first[idx];\n }\n idx += 1;\n }\n\n return out;\n}\n"],"names":[],"mappings":"AAAgB,SAAA,UAAU,CACxB,KAAU,EACV,MAAW,EAAA;IAEX,IAAI,GAAG,GAAG,CAAC;IACX,MAAM,GAAG,GAAQ,EAAE;AACnB,IAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAE;AAE7B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QACzC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;AAG5B,IAAA,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;QACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;YAChC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;;QAE9B,GAAG,IAAI,CAAC;;AAGV,IAAA,OAAO,GAAG;AACZ;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-by-path.js","sources":["../../../../src/lib/lodash/get-by-path.ts"],"sourcesContent":["import get from \"lodash/get\";\nimport { isArray, isObject, isString } from \"../typings\";\n\nexport function getByPath<T, D = undefined>(data: unknown, path?: string, defaultValue?: D): T | D {\n if ((!isObject(data) && !isArray(data)) || !isString(path)) return defaultValue as D;\n\n return get(data, path, defaultValue) as T | D;\n}\n"],"names":[],"mappings":";;;;;SAGgB,SAAS,CAAmB,IAAa,EAAE,IAAa,EAAE,YAAgB,EAAA;AACxF,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,YAAiB;IAEpF,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAU;AAC/C;;;;"}
@@ -0,0 +1,46 @@
1
+ import { isObject } from '../typings/is-object.js';
2
+
3
+ function isEqual(aVal, bVal) {
4
+ if (aVal === bVal)
5
+ return true;
6
+ if (aVal == undefined ||
7
+ bVal == undefined ||
8
+ typeof aVal !== "object" ||
9
+ typeof bVal !== "object") {
10
+ return aVal === bVal;
11
+ }
12
+ if (aVal instanceof Date && bVal instanceof Date) {
13
+ return aVal.getTime() === bVal.getTime();
14
+ }
15
+ if (aVal instanceof RegExp && bVal instanceof RegExp) {
16
+ return aVal.toString() === bVal.toString();
17
+ }
18
+ if (aVal.constructor !== bVal.constructor) {
19
+ return false;
20
+ }
21
+ if (Array.isArray(aVal) && Array.isArray(bVal)) {
22
+ if (aVal.length !== bVal.length)
23
+ return false;
24
+ for (let i = 0; i < aVal.length; i++) {
25
+ if (!isEqual(aVal[i], bVal[i]))
26
+ return false;
27
+ }
28
+ return true;
29
+ }
30
+ if (isObject(aVal) && isObject(bVal)) {
31
+ const keysA = Object.keys(aVal);
32
+ const keysB = Object.keys(bVal);
33
+ if (keysA.length !== keysB.length)
34
+ return false;
35
+ for (const key of keysA) {
36
+ if (!keysB.includes(key))
37
+ return false;
38
+ if (!isEqual(aVal[key], bVal[key]))
39
+ return false;
40
+ }
41
+ }
42
+ return true;
43
+ }
44
+
45
+ export { isEqual };
46
+ //# sourceMappingURL=is-equal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-equal.js","sources":["../../../../src/lib/lodash/is-equal.ts"],"sourcesContent":["import { isObject } from \"../typings\";\n\nexport function isEqual(aVal: unknown, bVal: unknown) {\n if (aVal === bVal) return true;\n\n if (\n aVal == undefined ||\n bVal == undefined ||\n typeof aVal !== \"object\" ||\n typeof bVal !== \"object\"\n ) {\n return aVal === bVal;\n }\n\n if (aVal instanceof Date && bVal instanceof Date) {\n return aVal.getTime() === bVal.getTime();\n }\n\n if (aVal instanceof RegExp && bVal instanceof RegExp) {\n return aVal.toString() === bVal.toString();\n }\n\n if (aVal.constructor !== bVal.constructor) {\n return false;\n }\n\n if (Array.isArray(aVal) && Array.isArray(bVal)) {\n if (aVal.length !== bVal.length) return false;\n for (let i = 0; i < aVal.length; i++) {\n if (!isEqual(aVal[i], bVal[i])) return false;\n }\n\n return true;\n }\n\n if (isObject(aVal) && isObject(bVal)) {\n const keysA = Object.keys(aVal);\n const keysB = Object.keys(bVal);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!isEqual(aVal[key], bVal[key])) return false;\n }\n }\n\n return true;\n}\n"],"names":[],"mappings":";;AAEgB,SAAA,OAAO,CAAC,IAAa,EAAE,IAAa,EAAA;IAClD,IAAI,IAAI,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;IAE9B,IACE,IAAI,IAAI,SAAS;AACjB,QAAA,IAAI,IAAI,SAAS;QACjB,OAAO,IAAI,KAAK,QAAQ;AACxB,QAAA,OAAO,IAAI,KAAK,QAAQ,EACxB;QACA,OAAO,IAAI,KAAK,IAAI;;IAGtB,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,IAAI,EAAE;QAChD,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE;;IAG1C,IAAI,IAAI,YAAY,MAAM,IAAI,IAAI,YAAY,MAAM,EAAE;QACpD,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE;;IAG5C,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE;AACzC,QAAA,OAAO,KAAK;;AAGd,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC9C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAC7C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;;AAG9C,QAAA,OAAO,IAAI;;IAGb,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAE/B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAE/C,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,KAAK;AACtC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;;;AAIpD,IAAA,OAAO,IAAI;AACb;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-by-path.js","sources":["../../../../src/lib/lodash/set-by-path.ts"],"sourcesContent":["import set from \"lodash/set\";\nimport { isArray, isObject } from \"../typings\";\n\nexport function setByPath(data: Record<string, unknown> | unknown[], path: string, value: unknown) {\n try {\n if (!isObject(data) && !isArray(data)) throw new Error(\"bad data\");\n\n set(data, path, value);\n } catch (error) {\n console.warn(error);\n }\n}\n"],"names":[],"mappings":";;;;SAGgB,SAAS,CAAC,IAAyC,EAAE,IAAY,EAAE,KAAc,EAAA;AAC/F,IAAA,IAAI;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;AAElE,QAAA,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;;IACtB,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;AAEvB;;;;"}
@@ -0,0 +1,22 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ function throttle({ interval }, func) {
3
+ let ready = true;
4
+ let timer;
5
+ const throttled = (...args) => {
6
+ if (!ready)
7
+ return;
8
+ func(...args);
9
+ ready = false;
10
+ timer = setTimeout(() => {
11
+ ready = true;
12
+ timer = undefined;
13
+ }, interval);
14
+ };
15
+ throttled.isThrottled = () => {
16
+ return timer !== undefined;
17
+ };
18
+ return throttled;
19
+ }
20
+
21
+ export { throttle };
22
+ //# sourceMappingURL=throttle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.js","sources":["../../../../src/lib/lodash/throttle.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function throttle<TArgs extends any[]>(\n { interval }: { interval: number },\n func: (...args: TArgs) => any,\n) {\n let ready = true;\n let timer: NodeJS.Timeout | undefined;\n\n const throttled = (...args: TArgs) => {\n if (!ready) return;\n func(...args);\n ready = false;\n timer = setTimeout(() => {\n ready = true;\n timer = undefined;\n }, interval);\n };\n\n throttled.isThrottled = () => {\n return timer !== undefined;\n };\n\n return throttled;\n}\n"],"names":[],"mappings":"AAAA;SACgB,QAAQ,CACtB,EAAE,QAAQ,EAAwB,EAClC,IAA6B,EAAA;IAE7B,IAAI,KAAK,GAAG,IAAI;AAChB,IAAA,IAAI,KAAiC;AAErC,IAAA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAW,KAAI;AACnC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,KAAK,GAAG,KAAK;AACb,QAAA,KAAK,GAAG,UAAU,CAAC,MAAK;YACtB,KAAK,GAAG,IAAI;YACZ,KAAK,GAAG,SAAS;SAClB,EAAE,QAAQ,CAAC;AACd,KAAC;AAED,IAAA,SAAS,CAAC,WAAW,GAAG,MAAK;QAC3B,OAAO,KAAK,KAAK,SAAS;AAC5B,KAAC;AAED,IAAA,OAAO,SAAS;AAClB;;;;"}
@@ -0,0 +1,10 @@
1
+ function type(value) {
2
+ return value === null
3
+ ? "Null"
4
+ : value === undefined
5
+ ? "Undefined"
6
+ : Object.prototype.toString.call(value).slice(8, -1);
7
+ }
8
+
9
+ export { type };
10
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.js","sources":["../../../../src/lib/lodash/type.ts"],"sourcesContent":["export function type(value: unknown) {\n return value === null\n ? \"Null\"\n : value === undefined\n ? \"Undefined\"\n : Object.prototype.toString.call(value).slice(8, -1);\n}\n"],"names":[],"mappings":"AAAM,SAAU,IAAI,CAAC,KAAc,EAAA;IACjC,OAAO,KAAK,KAAK;AACf,UAAE;UACA,KAAK,KAAK;AACV,cAAE;AACF,cAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AAC1D;;;;"}
@@ -0,0 +1,7 @@
1
+ function isPrimitive(value) {
2
+ const type = typeof value;
3
+ return value == undefined || (type != "object" && type != "function");
4
+ }
5
+
6
+ export { isPrimitive };
7
+ //# sourceMappingURL=is-primitive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-primitive.js","sources":["../../../../src/lib/typings/is-primitive.ts"],"sourcesContent":["export function isPrimitive(value: unknown): value is string | number | boolean | null | undefined {\n const type = typeof value;\n\n return value == undefined || (type != \"object\" && type != \"function\");\n}\n"],"names":[],"mappings":"AAAM,SAAU,WAAW,CAAC,KAAc,EAAA;AACxC,IAAA,MAAM,IAAI,GAAG,OAAO,KAAK;AAEzB,IAAA,OAAO,KAAK,IAAI,SAAS,KAAK,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,UAAU,CAAC;AACvE;;;;"}
@@ -0,0 +1,14 @@
1
+ function declination(value, words) {
2
+ value = Math.abs(value) % 100;
3
+ const num = value % 10;
4
+ if (value > 10 && value < 20)
5
+ return words[2];
6
+ if (num > 1 && num < 5)
7
+ return words[1];
8
+ if (num == 1)
9
+ return words[0];
10
+ return words[2];
11
+ }
12
+
13
+ export { declination };
14
+ //# sourceMappingURL=declination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declination.js","sources":["../../../../src/lib/utils/declination.ts"],"sourcesContent":["export function declination(value: number, words: [string, string, string]) {\n value = Math.abs(value) % 100;\n const num = value % 10;\n if (value > 10 && value < 20) return words[2];\n if (num > 1 && num < 5) return words[1];\n if (num == 1) return words[0];\n\n return words[2];\n}\n"],"names":[],"mappings":"AAAgB,SAAA,WAAW,CAAC,KAAa,EAAE,KAA+B,EAAA;IACxE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG;AAC7B,IAAA,MAAM,GAAG,GAAG,KAAK,GAAG,EAAE;AACtB,IAAA,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE;AAAE,QAAA,OAAO,KAAK,CAAC,CAAC,CAAC;AAC7C,IAAA,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC,CAAC,CAAC;IACvC,IAAI,GAAG,IAAI,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC,CAAC,CAAC;AAE7B,IAAA,OAAO,KAAK,CAAC,CAAC,CAAC;AACjB;;;;"}
@@ -1,6 +1,6 @@
1
+ import { getByPath } from '../lodash/get-by-path.js';
2
+ import { setByPath } from '../lodash/set-by-path.js';
1
3
  import { isUndefined } from '../typings/is-undefined.js';
2
- import { getByPath } from './get-by-path.js';
3
- import { setByPath } from './set-by-path.js';
4
4
 
5
5
  function syncObjectValues(oldObj, newObj, exception = []) {
6
6
  for (const field in newObj) {
@@ -1 +1 @@
1
- {"version":3,"file":"sync-object-values.js","sources":["../../../../src/lib/utils/sync-object-values.ts"],"sourcesContent":["import { isUndefined } from \"../typings\";\nimport { getByPath } from \"./get-by-path\";\nimport { setByPath } from \"./set-by-path\";\n\nexport function syncObjectValues(\n oldObj: Record<string, unknown>,\n newObj: Record<string, unknown>,\n exception: string[] = [],\n) {\n for (const field in newObj) {\n if (exception.includes(field)) continue;\n\n const oldValue = getByPath(oldObj, field, undefined);\n const newValue = getByPath(newObj, field, undefined);\n\n if (isUndefined(oldValue) || isUndefined(newValue)) continue;\n if (oldValue === newValue) continue;\n\n setByPath(oldObj, field, newValue);\n }\n}\n"],"names":[],"mappings":";;;;AAIM,SAAU,gBAAgB,CAC9B,MAA+B,EAC/B,MAA+B,EAC/B,YAAsB,EAAE,EAAA;AAExB,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE;QAE/B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;QACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;QAEpD,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC;YAAE;QACpD,IAAI,QAAQ,KAAK,QAAQ;YAAE;AAE3B,QAAA,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;;AAEtC;;;;"}
1
+ {"version":3,"file":"sync-object-values.js","sources":["../../../../src/lib/utils/sync-object-values.ts"],"sourcesContent":["import { getByPath } from \"../lodash/get-by-path\";\nimport { setByPath } from \"../lodash/set-by-path\";\nimport { isUndefined } from \"../typings\";\n\nexport function syncObjectValues(\n oldObj: Record<string, unknown>,\n newObj: Record<string, unknown>,\n exception: string[] = [],\n) {\n for (const field in newObj) {\n if (exception.includes(field)) continue;\n\n const oldValue = getByPath(oldObj, field, undefined);\n const newValue = getByPath(newObj, field, undefined);\n\n if (isUndefined(oldValue) || isUndefined(newValue)) continue;\n if (oldValue === newValue) continue;\n\n setByPath(oldObj, field, newValue);\n }\n}\n"],"names":[],"mappings":";;;;AAIM,SAAU,gBAAgB,CAC9B,MAA+B,EAC/B,MAA+B,EAC/B,YAAsB,EAAE,EAAA;AAExB,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE;QAE/B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;QACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;QAEpD,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC;YAAE;QACpD,IAAI,QAAQ,KAAK,QAAQ;YAAE;AAE3B,QAAA,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;;AAEtC;;;;"}
package/lib/index.d.ts CHANGED
@@ -11,8 +11,7 @@ declare const DATE_TYPES: {
11
11
  };
12
12
 
13
13
  declare const API_MIDDLEWARES: {
14
- readonly Auth: "auth";
15
- readonly AuthNoRefresh: "authNoRefresh";
14
+ readonly Oauth: "oauth";
16
15
  readonly Logger: "logger";
17
16
  };
18
17
  declare const POST_API_MIDDLEWARES: {
@@ -87,17 +86,6 @@ type PostMiddlewareOptions = {
87
86
  };
88
87
  type MiddlewareType = ValueOf<typeof API_MIDDLEWARES>;
89
88
  type ActiveMiddleware = MiddlewareType[];
90
- type AuthMiddleWareOptions = {
91
- errorUrl: (() => string) | string;
92
- oauthUrl: (() => string) | string;
93
- refreshTokenWindowUrl?: (() => string) | string;
94
- authTokenUrl: string;
95
- expiresTokenStorageName: string;
96
- tokenStorageName: string;
97
- pathToToken: string;
98
- pathToTokenExpires: string;
99
- tokenRequest?: () => Promise<string | null | undefined>;
100
- };
101
89
  type LoggerMiddlewareOptions = {
102
90
  filter?: (request: RequestInterface<unknown, unknown, unknown, unknown>) => boolean;
103
91
  filterPath?: (path: string) => boolean;
@@ -106,8 +94,7 @@ type LoggerMiddlewareOptions = {
106
94
  filterHeaders?: (headers?: Record<string, string | undefined>) => boolean;
107
95
  };
108
96
  type MiddlewaresOptions = {
109
- auth?: AuthMiddleWareOptions;
110
- authNoRefresh?: AuthNoRefreshMiddleWareOptions;
97
+ oauth?: OauthMiddleWareOptions;
111
98
  logger?: LoggerMiddlewareOptions;
112
99
  };
113
100
  type AuthUserUpdateRequestOptions<User extends Record<string, unknown>> = AuthUserRequestOptions & {
@@ -118,29 +105,31 @@ type AuthUserUpdateRequestOptions<User extends Record<string, unknown>> = AuthUs
118
105
  type AuthUserRequestOptions = {
119
106
  authUserUrl: string;
120
107
  };
121
- type AuthTokenRequestOptions = {
122
- authTokenUrl: string;
108
+ type OauthMiddleWareOptions = {
109
+ errorUrl: (() => string) | string;
110
+ oauthUrl: (() => string) | string;
111
+ tokenStorageName?: string;
123
112
  expiresTokenStorageName: string;
124
- tokenStorageName: string;
125
- pathToToken: string;
126
- pathToTokenExpires: string;
127
- };
128
- type AuthTokenNoRefreshRequestOptions = {
113
+ tokenRequest?: () => Promise<string | null | undefined>;
129
114
  refreshTokenWindowUrl?: (() => string) | string;
130
- expiresTokenStorageName: string;
131
115
  onlyRefreshTokenWindowQueryName: string;
132
116
  onWindowOpenError?: () => void;
117
+ wait?: number;
118
+ closeObserveInterval?: number;
133
119
  };
134
- type AuthNoRefreshMiddleWareOptions = {
135
- errorUrl: (() => string) | string;
120
+ type GetOauthTokenOptions = {
136
121
  oauthUrl: (() => string) | string;
137
- refreshTokenWindowUrl?: (() => string) | string;
138
- tokenStorageName?: string;
139
122
  expiresTokenStorageName: string;
140
123
  expiresTokenQueryName: string;
141
124
  onlyRefreshTokenWindowQueryName: string;
142
- tokenRequest?: () => Promise<string | null | undefined>;
125
+ };
126
+ type GetOauthTokenFromOtherWindowOptions = {
127
+ refreshTokenWindowUrl?: (() => string) | string;
128
+ onlyRefreshTokenWindowQueryName: string;
129
+ expiresTokenStorageName: string;
143
130
  onWindowOpenError?: () => void;
131
+ wait?: number;
132
+ closeObserveInterval?: number;
144
133
  };
145
134
 
146
135
  type DateType = ValueOf<typeof DATE_TYPES>;
@@ -191,10 +180,8 @@ declare function createRequestClientInstance(options: CreateRequestClientInstanc
191
180
  setMiddlewares: ({ activeMiddlewares, middlewareOptions, customMiddlewares, activePostMiddlewares, postMiddlewaresOptions, customPostMiddlewares, }?: Omit<CreateRequestClientInstance, "client">) => void;
192
181
  };
193
182
 
194
- declare function updateAuthToken(options: AuthMiddleWareOptions): Promise<string | undefined>;
195
- declare function getAuthToken(options: AuthTokenRequestOptions): Promise<string | null | undefined>;
196
- declare function getAuthTokenNoRefresh(options: AuthTokenNoRefreshRequestOptions): Promise<void>;
197
- declare function updateAuthTokenNoRefresh(options: AuthNoRefreshMiddleWareOptions): string | null;
183
+ declare function getOauthTokenFromOtherWindow(options: GetOauthTokenFromOtherWindowOptions): Promise<void>;
184
+ declare function getOauthToken(options: GetOauthTokenOptions): string | null;
198
185
 
199
186
  declare function updateAuthUser<User extends Record<string, unknown>>(options: AuthUserUpdateRequestOptions<User>): Promise<User | undefined>;
200
187
  declare function getAuthUser<User extends Record<string, unknown>>(options: AuthUserRequestOptions): Promise<User | null | undefined>;
@@ -243,6 +230,10 @@ declare function getQueryValues<K extends string>(keys: K[]): Record<K, string |
243
230
 
244
231
  declare function execAnimation(element: HTMLElement | null | undefined, className: string, autoCloseDelay?: number): Promise<unknown>;
245
232
 
233
+ declare function copyToClipboard(textToCopy: string): Promise<boolean>;
234
+
235
+ declare function extractQueries(): Record<string, string[] | undefined>;
236
+
246
237
  declare function getColorFormat(color: string): "HEX" | "RGB" | "RGBA" | "HSL" | undefined;
247
238
 
248
239
  declare function takeOpacityColors(color: string | undefined, opacities: number[]): string[];
@@ -288,12 +279,8 @@ declare function transformToDayjs(date: Date | string | number): Dayjs;
288
279
 
289
280
  declare const waitUntil: (condition: () => boolean, checkInterval?: number) => Promise<unknown>;
290
281
 
291
- declare function getByPath<T, D = undefined>(data: unknown, path?: string, defaultValue?: D): T | D;
292
-
293
282
  declare function fieldViewFormat(field: unknown, type?: FieldType): string;
294
283
 
295
- declare function setByPath(data: Record<string, unknown> | unknown[], path: string, value: unknown): void;
296
-
297
284
  declare function jsonParse<T>(json: unknown): T | null;
298
285
 
299
286
  declare function randomString(length?: number, allowCharacters?: string): string;
@@ -355,6 +342,8 @@ declare function createGlobalId(): number;
355
342
 
356
343
  declare function createLocalIdGenerator(): () => number;
357
344
 
345
+ declare function declination(value: number, words: [string, string, string]): string;
346
+
358
347
  declare function checkType<R>(value: unknown, condition: boolean): value is R;
359
348
 
360
349
  declare function isArray(value: unknown): value is unknown[];
@@ -377,5 +366,39 @@ declare function isUndefined(value: unknown): value is undefined;
377
366
 
378
367
  declare function isDate(value: unknown): value is Date;
379
368
 
380
- 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, createGlobalId, createLocalIdGenerator, createRequestClientInstance, createURLWithParams, dateDifference, dateFormat, downloadFile, downloadJson, execAnimation, fieldViewFormat, getAuthToken, getAuthTokenNoRefresh, getAuthUser, getByPath, getCallerFunctionName, getColorFormat, getDateByRules, getFileNameFromHeader, getQueryValues, getRandomColor, getToday, getTomorrow, getVisiblePosition, getYesterday, isArray, isBoolean, isDate, isId, isNull, isNullable, isNumber, isObject, isString, isToday, isTomorrow, isUndefined, isYesterday, joinPaths, jsonParse, limitStreamOfRequests, randomNumber, randomString, readFile, setByPath, speedTest, startWith, syncObjectValues, takeOpacityColors, transformHEXtoRGB, transformRGBAtoRGB, transformRGBtoRGBA, transformToColor, transformToDayjs, transformToNumber, translit, trimUrl, updateAuthToken, updateAuthTokenNoRefresh, updateAuthUser, wait, waitUntil };
381
- export type { ActiveMiddleware, ActivePostMiddleware, AuthMiddleWareOptions, AuthNoRefreshMiddleWareOptions, AuthTokenNoRefreshRequestOptions, AuthTokenRequestOptions, AuthUserRequestOptions, AuthUserUpdateRequestOptions, ColorFormat, DateGetterRule, DateType, DayJS, FieldType, IsEqual, LoggerMiddlewareOptions, LoggerPostMiddlewareOptions, Maybe, Middleware, MiddlewareType, MiddlewaresOptions, ParamValueType, ParamsType, PositionPlacements, PostMiddleware, PostMiddlewareOptions, PostMiddlewareType, RequestInstance, RequestInterface, RequestMethod, RequestTransformIncoming, RequestTransformOutcoming, ValueOf, VisiblePosition };
369
+ declare function isPrimitive(value: unknown): value is string | number | boolean | null | undefined;
370
+
371
+ declare function getByPath<T, D = undefined>(data: unknown, path?: string, defaultValue?: D): T | D;
372
+
373
+ declare function setByPath(data: Record<string, unknown> | unknown[], path: string, value: unknown): void;
374
+
375
+ declare function cloneDeep(value: unknown, map?: Map<unknown, unknown>): {} | null | undefined;
376
+
377
+ declare function debounce<TArgs extends any[]>({ delay }: {
378
+ delay: number;
379
+ }, func: (...args: TArgs) => any): {
380
+ (...args: TArgs): void;
381
+ isPending(): boolean;
382
+ cancel(): void;
383
+ flush(...args: TArgs): void;
384
+ };
385
+
386
+ declare function difference<T extends string | number | boolean | null | undefined>(first: T[], second: T[]): T[];
387
+
388
+ declare function differenceBy<T extends Record<string, unknown>>(first: T[], second: T[], key: keyof T): T[];
389
+
390
+ declare function differenceWith<T = unknown>(first: T[], second: T[], extractPrimitive: (el: T) => string | number | boolean | undefined | null): T[];
391
+
392
+ declare function isEqual(aVal: unknown, bVal: unknown): boolean;
393
+
394
+ declare function throttle<TArgs extends any[]>({ interval }: {
395
+ interval: number;
396
+ }, func: (...args: TArgs) => any): {
397
+ (...args: TArgs): void;
398
+ isThrottled(): boolean;
399
+ };
400
+
401
+ declare function type(value: unknown): string;
402
+
403
+ 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 };
404
+ 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krainovsd/js-helpers",
3
- "version": "0.14.13",
3
+ "version": "0.15.1",
4
4
  "description": "Krainov helpers",
5
5
  "type": "module",
6
6
  "author": "KrainovSD <denislosev48@gmail.com>",
@@ -1 +0,0 @@
1
- {"version":3,"file":"token.js","sources":["../../../../../src/lib/api/auth/token.ts"],"sourcesContent":["import type {\n AuthMiddleWareOptions,\n AuthNoRefreshMiddleWareOptions,\n AuthTokenNoRefreshRequestOptions,\n AuthTokenRequestOptions,\n} from \"../../../types\";\nimport { getQueryValues } from \"../../browser\";\nimport { isArray, isNull, isNumber, isObject, isString, isUndefined } from \"../../typings\";\nimport { getByPath, waitUntil } from \"../../utils\";\n\nexport async function updateAuthToken(options: AuthMiddleWareOptions) {\n let token: string | null | undefined = localStorage.getItem(options.tokenStorageName);\n const expires: string | null | undefined = localStorage.getItem(options.expiresTokenStorageName);\n\n if (!token || !expires || Date.now() > +expires) {\n token = await (options.tokenRequest ? options.tokenRequest() : getAuthToken(options));\n if (isNull(token)) {\n return void window.location.replace(\n typeof options.oauthUrl === \"function\" ? options.oauthUrl() : options.oauthUrl,\n );\n }\n if (isUndefined(token)) {\n return void window.location.replace(\n typeof options.errorUrl === \"function\" ? options.errorUrl() : options.errorUrl,\n );\n }\n }\n\n return token;\n}\n\nexport async function getAuthToken(options: AuthTokenRequestOptions) {\n let status = 0;\n try {\n const response = await fetch(options.authTokenUrl, {\n method: \"GET\",\n });\n status = response.status;\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n\n const result = (await response.json()) as Record<string, unknown>;\n\n try {\n const { expires, token } = transformData(\n result,\n options.pathToToken,\n options.pathToTokenExpires,\n );\n\n localStorage.setItem(options.expiresTokenStorageName, expires);\n localStorage.setItem(options.tokenStorageName, token);\n\n return token;\n } catch {\n return undefined;\n }\n } catch {\n if (status >= 500) return undefined;\n\n return null;\n }\n}\n\nfunction transformData(data: unknown, pathToToken: string, pathToTokenExpires: string) {\n if (!isObject(data)) throw new Error(\"Bad response data\");\n\n const token = getByPath(data, pathToToken);\n const expiresToken = getByPath(data, pathToTokenExpires);\n\n if ((!isString(expiresToken) && !isNumber(expiresToken)) || !isString(token))\n throw new Error(\"Bad response data\");\n\n return {\n expires: String(expiresToken),\n token,\n };\n}\n\nexport async function getAuthTokenNoRefresh(options: AuthTokenNoRefreshRequestOptions) {\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 let windowInstance = window.open(\n url.toString(),\n \"_blank\",\n \"width=800,height=600,left=100,top=100\",\n );\n\n windowInstance ??= window.open(url.toString());\n\n if (!windowInstance) {\n if (options.onWindowOpenError) options.onWindowOpenError();\n\n return;\n }\n\n const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);\n channel.onmessage = () => {\n if (waiting) {\n waiting = false;\n channel.close();\n }\n };\n setTimeout(() => {\n if (waiting) {\n waiting = false;\n channel.close();\n }\n if (windowInstance && !windowInstance.closed) {\n windowInstance.close();\n }\n }, 15000);\n\n await waitUntil(() => waiting);\n}\n\nexport function updateAuthTokenNoRefresh(options: AuthNoRefreshMiddleWareOptions) {\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 +0,0 @@
1
- {"version":3,"file":"user.js","sources":["../../../../../src/lib/api/auth/user.ts"],"sourcesContent":["import type { AuthUserRequestOptions, AuthUserUpdateRequestOptions } from \"../../../types\";\nimport { isNull, isUndefined } from \"../../typings\";\n\nexport async function updateAuthUser<User extends Record<string, unknown>>(\n options: AuthUserUpdateRequestOptions<User>,\n) {\n const userInfo = await (options.userRequest ? options.userRequest() : getAuthUser<User>(options));\n if (isNull(userInfo)) {\n return void window.location.replace(options.oauthUrl());\n }\n if (isUndefined(userInfo)) {\n return void window.location.replace(options.errorUrl);\n }\n\n return userInfo;\n}\n\nexport async function getAuthUser<User extends Record<string, unknown>>(\n options: AuthUserRequestOptions,\n): Promise<User | null | undefined> {\n let status = 0;\n try {\n const response = await fetch(options.authUserUrl, {\n method: \"GET\",\n });\n status = response.status;\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n\n const result = (await response.json()) as User;\n\n return result;\n } catch {\n if (status >= 500) return undefined;\n\n return null;\n }\n}\n"],"names":[],"mappings":";;;AAGO,eAAe,cAAc,CAClC,OAA2C,EAAA;IAE3C,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,WAAW,CAAO,OAAO,CAAC,CAAC;AACjG,IAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE;AACpB,QAAA,OAAO,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;;AAEzD,IAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE;QACzB,OAAO,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;;AAGvD,IAAA,OAAO,QAAQ;AACjB;AAEO,eAAe,WAAW,CAC/B,OAA+B,EAAA;IAE/B,IAAI,MAAM,GAAG,CAAC;AACd,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;AAChD,YAAA,MAAM,EAAE,KAAK;AACd,SAAA,CAAC;AACF,QAAA,MAAM,GAAG,QAAQ,CAAC,MAAM;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,EAAuB,QAAQ,CAAC,MAAM,CAAE,CAAA,CAAC;;QAG3D,MAAM,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAS;AAE9C,QAAA,OAAO,MAAM;;AACb,IAAA,MAAM;QACN,IAAI,MAAM,IAAI,GAAG;AAAE,YAAA,OAAO,SAAS;AAEnC,QAAA,OAAO,IAAI;;AAEf;;;;"}
@@ -1,57 +0,0 @@
1
- import { isNull } from '../../typings/is-null.js';
2
- import { isUndefined } from '../../typings/is-undefined.js';
3
- import { waitUntil } from '../../utils/wait-until.js';
4
- import 'lodash/get';
5
- import '../../../constants/environment.js';
6
- import 'dayjs';
7
- import '../../date/is-today.js';
8
- import '../../date/is-tomorrow.js';
9
- import '../../date/is-yesterday.js';
10
- import 'lodash/set';
11
- import { startWith } from '../../utils/start-with.js';
12
- import { getAuthToken } from '../auth/token.js';
13
-
14
- let isFetchingAccessToken = false;
15
- const generateAuthMiddleWare = (options) => async (request) => {
16
- if (!options.authTokenUrl ||
17
- !options.oauthUrl ||
18
- !options.expiresTokenStorageName ||
19
- !options.tokenStorageName ||
20
- !options.pathToTokenExpires ||
21
- !options.pathToToken ||
22
- !options.errorUrl) {
23
- throw new Error("Auth middleware hasn't required options");
24
- }
25
- const isSameOrigin = !startWith(request.path, "http");
26
- if (request.token) {
27
- if (!isSameOrigin)
28
- request.headers = {
29
- ...request.headers,
30
- Authorization: `Bearer ${request.token}`,
31
- };
32
- return;
33
- }
34
- if (isFetchingAccessToken)
35
- await waitUntil(() => isFetchingAccessToken);
36
- const expires = localStorage.getItem(options.expiresTokenStorageName);
37
- let token = localStorage.getItem(options.tokenStorageName);
38
- if (!expires || Date.now() > +expires || !token) {
39
- isFetchingAccessToken = true;
40
- token = await (options.tokenRequest ? options.tokenRequest() : getAuthToken(options));
41
- isFetchingAccessToken = false;
42
- if (isNull(token)) {
43
- return void window.location.replace(typeof options.oauthUrl === "function" ? options.oauthUrl() : options.oauthUrl);
44
- }
45
- if (isUndefined(token)) {
46
- return void window.location.replace(typeof options.errorUrl === "function" ? options.errorUrl() : options.errorUrl);
47
- }
48
- }
49
- if (!isSameOrigin)
50
- request.headers = {
51
- ...request.headers,
52
- Authorization: `Bearer ${token}`,
53
- };
54
- };
55
-
56
- export { generateAuthMiddleWare };
57
- //# sourceMappingURL=auth-middleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-middleware.js","sources":["../../../../../src/lib/api/middlewares/auth-middleware.ts"],"sourcesContent":["import type { AuthMiddleWareOptions, Middleware } from \"../../../types\";\nimport { isNull, isUndefined } from \"../../typings\";\nimport { startWith, waitUntil } from \"../../utils\";\nimport { getAuthToken } from \"../auth\";\n\nlet isFetchingAccessToken = false;\n\nexport const generateAuthMiddleWare =\n (options: AuthMiddleWareOptions): Middleware =>\n async (request) => {\n if (\n !options.authTokenUrl ||\n !options.oauthUrl ||\n !options.expiresTokenStorageName ||\n !options.tokenStorageName ||\n !options.pathToTokenExpires ||\n !options.pathToToken ||\n !options.errorUrl\n ) {\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 | null | undefined = localStorage.getItem(options.tokenStorageName);\n\n if (!expires || Date.now() > +expires || !token) {\n isFetchingAccessToken = true;\n token = await (options.tokenRequest ? options.tokenRequest() : getAuthToken(options));\n isFetchingAccessToken = false;\n\n if (isNull(token)) {\n return void window.location.replace(\n typeof options.oauthUrl === \"function\" ? options.oauthUrl() : options.oauthUrl,\n );\n }\n if (isUndefined(token)) {\n return void window.location.replace(\n typeof options.errorUrl === \"function\" ? options.errorUrl() : options.errorUrl,\n );\n }\n }\n\n if (!isSameOrigin)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${token}`,\n };\n };\n"],"names":[],"mappings":";;;;;;;;;;;;;AAKA,IAAI,qBAAqB,GAAG,KAAK;AAE1B,MAAM,sBAAsB,GACjC,CAAC,OAA8B,KAC/B,OAAO,OAAO,KAAI;IAChB,IACE,CAAC,OAAO,CAAC,YAAY;QACrB,CAAC,OAAO,CAAC,QAAQ;QACjB,CAAC,OAAO,CAAC,uBAAuB;QAChC,CAAC,OAAO,CAAC,gBAAgB;QACzB,CAAC,OAAO,CAAC,kBAAkB;QAC3B,CAAC,OAAO,CAAC,WAAW;AACpB,QAAA,CAAC,OAAO,CAAC,QAAQ,EACjB;AACA,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;IACrE,IAAI,KAAK,GAA8B,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAErF,IAAA,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE;QAC/C,qBAAqB,GAAG,IAAI;QAC5B,KAAK,GAAG,OAAO,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrF,qBAAqB,GAAG,KAAK;AAE7B,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;YACjB,OAAO,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,CACjC,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAC/E;;AAEH,QAAA,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;YACtB,OAAO,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,CACjC,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAC/E;;;AAIL,IAAA,IAAI,CAAC,YAAY;QACf,OAAO,CAAC,OAAO,GAAG;YAChB,GAAG,OAAO,CAAC,OAAO;YAClB,aAAa,EAAE,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA;SACjC;AACL;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-no-refresh-middleware.js","sources":["../../../../../src/lib/api/middlewares/auth-no-refresh-middleware.ts"],"sourcesContent":["import type { AuthNoRefreshMiddleWareOptions, Middleware } from \"../../../types\";\nimport { startWith, waitUntil } from \"../../utils\";\nimport { getAuthTokenNoRefresh } from \"../auth\";\n\nlet isFetchingAccessToken = false;\n\nexport const generateAuthNoRefreshMiddleWare =\n (options: AuthNoRefreshMiddleWareOptions): Middleware =>\n async (request) => {\n if (!options.oauthUrl || !options.expiresTokenStorageName || !options.errorUrl) {\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 if (!expires || Number.isNaN(+expires) || Date.now() > +expires) {\n isFetchingAccessToken = true;\n await (options.tokenRequest ? options.tokenRequest() : getAuthTokenNoRefresh(options));\n isFetchingAccessToken = false;\n }\n const token = options.tokenStorageName ? localStorage.getItem(options.tokenStorageName) : null;\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,+BAA+B,GAC1C,CAAC,OAAuC,KACxC,OAAO,OAAO,KAAI;AAChB,IAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AAC9E,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,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,OAAO,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtF,qBAAqB,GAAG,KAAK;;IAE/B,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAE9F,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 +0,0 @@
1
- {"version":3,"file":"get-by-path.js","sources":["../../../../src/lib/utils/get-by-path.ts"],"sourcesContent":["import get from \"lodash/get\";\nimport { isArray, isObject, isString } from \"../typings\";\n\nexport function getByPath<T, D = undefined>(data: unknown, path?: string, defaultValue?: D): T | D {\n if ((!isObject(data) && !isArray(data)) || !isString(path)) return defaultValue as D;\n\n return get(data, path, defaultValue) as T | D;\n}\n"],"names":[],"mappings":";;;;;SAGgB,SAAS,CAAmB,IAAa,EAAE,IAAa,EAAE,YAAgB,EAAA;AACxF,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,YAAiB;IAEpF,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAU;AAC/C;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"set-by-path.js","sources":["../../../../src/lib/utils/set-by-path.ts"],"sourcesContent":["import set from \"lodash/set\";\nimport { isArray, isObject } from \"../typings\";\n\nexport function setByPath(data: Record<string, unknown> | unknown[], path: string, value: unknown) {\n try {\n if (!isObject(data) && !isArray(data)) throw new Error(\"bad data\");\n\n set(data, path, value);\n } catch (error) {\n console.warn(error);\n }\n}\n"],"names":[],"mappings":";;;;SAGgB,SAAS,CAAC,IAAyC,EAAE,IAAY,EAAE,KAAc,EAAA;AAC/F,IAAA,IAAI;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;AAElE,QAAA,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;;IACtB,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;AAEvB;;;;"}
File without changes
File without changes
File without changes