@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.
- package/lib/cjs/index.cjs +477 -264
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/esm/constants/api.js +1 -2
- package/lib/esm/constants/api.js.map +1 -1
- package/lib/esm/index.js +16 -4
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/lib/api/core.js +2 -2
- package/lib/esm/lib/api/middlewares/index.js +4 -10
- package/lib/esm/lib/api/middlewares/index.js.map +1 -1
- package/lib/esm/lib/api/middlewares/{auth-no-refresh-middleware.js → oauth-middleware.js} +20 -7
- package/lib/esm/lib/api/middlewares/oauth-middleware.js.map +1 -0
- package/lib/esm/lib/api/{auth → oauth}/token.js +41 -79
- package/lib/esm/lib/api/oauth/token.js.map +1 -0
- package/lib/esm/lib/api/oauth/user.js.map +1 -0
- package/lib/esm/lib/browser/copy-to-clipboard.js +37 -0
- package/lib/esm/lib/browser/copy-to-clipboard.js.map +1 -0
- package/lib/esm/lib/browser/download-file.js +1 -1
- package/lib/esm/lib/browser/extract-queries.js +21 -0
- package/lib/esm/lib/browser/extract-queries.js.map +1 -0
- package/lib/esm/lib/lodash/clone-deep.js +62 -0
- package/lib/esm/lib/lodash/clone-deep.js.map +1 -0
- package/lib/esm/lib/lodash/debounce.js +32 -0
- package/lib/esm/lib/lodash/debounce.js.map +1 -0
- package/lib/esm/lib/lodash/difference-by.js +18 -0
- package/lib/esm/lib/lodash/difference-by.js.map +1 -0
- package/lib/esm/lib/lodash/difference-with.js +18 -0
- package/lib/esm/lib/lodash/difference-with.js.map +1 -0
- package/lib/esm/lib/lodash/difference.js +18 -0
- package/lib/esm/lib/lodash/difference.js.map +1 -0
- package/lib/esm/lib/lodash/get-by-path.js.map +1 -0
- package/lib/esm/lib/lodash/is-equal.js +46 -0
- package/lib/esm/lib/lodash/is-equal.js.map +1 -0
- package/lib/esm/lib/lodash/set-by-path.js.map +1 -0
- package/lib/esm/lib/lodash/throttle.js +22 -0
- package/lib/esm/lib/lodash/throttle.js.map +1 -0
- package/lib/esm/lib/lodash/type.js +10 -0
- package/lib/esm/lib/lodash/type.js.map +1 -0
- package/lib/esm/lib/typings/is-primitive.js +7 -0
- package/lib/esm/lib/typings/is-primitive.js.map +1 -0
- package/lib/esm/lib/utils/declination.js +14 -0
- package/lib/esm/lib/utils/declination.js.map +1 -0
- package/lib/esm/lib/utils/sync-object-values.js +2 -2
- package/lib/esm/lib/utils/sync-object-values.js.map +1 -1
- package/lib/index.d.ts +61 -38
- package/package.json +1 -1
- package/lib/esm/lib/api/auth/token.js.map +0 -1
- package/lib/esm/lib/api/auth/user.js.map +0 -1
- package/lib/esm/lib/api/middlewares/auth-middleware.js +0 -57
- package/lib/esm/lib/api/middlewares/auth-middleware.js.map +0 -1
- package/lib/esm/lib/api/middlewares/auth-no-refresh-middleware.js.map +0 -1
- package/lib/esm/lib/utils/get-by-path.js.map +0 -1
- package/lib/esm/lib/utils/set-by-path.js.map +0 -1
- /package/lib/esm/lib/api/{auth → oauth}/user.js +0 -0
- /package/lib/esm/lib/{utils → lodash}/get-by-path.js +0 -0
- /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 @@
|
|
|
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 @@
|
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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
|
|
122
|
-
|
|
108
|
+
type OauthMiddleWareOptions = {
|
|
109
|
+
errorUrl: (() => string) | string;
|
|
110
|
+
oauthUrl: (() => string) | string;
|
|
111
|
+
tokenStorageName?: string;
|
|
123
112
|
expiresTokenStorageName: string;
|
|
124
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
195
|
-
declare function
|
|
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
|
-
|
|
381
|
-
|
|
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 +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
|