@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
package/lib/esm/constants/api.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["../../../src/constants/api.ts"],"sourcesContent":["export const API_MIDDLEWARES = {\n
|
|
1
|
+
{"version":3,"file":"api.js","sources":["../../../src/constants/api.ts"],"sourcesContent":["export const API_MIDDLEWARES = {\n Oauth: \"oauth\",\n Logger: \"logger\",\n} as const;\n\nexport const POST_API_MIDDLEWARES = {\n Logger: \"logger\",\n} as const;\n"],"names":[],"mappings":"AAAa,MAAA,eAAe,GAAG;AAC7B,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,MAAM,EAAE,QAAQ;;AAGL,MAAA,oBAAoB,GAAG;AAClC,IAAA,MAAM,EAAE,QAAQ;;;;;"}
|
package/lib/esm/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export { ResponseError, createRequestClientInstance } from './lib/api/core.js';
|
|
2
|
-
export {
|
|
3
|
-
export { getAuthUser, updateAuthUser } from './lib/api/
|
|
2
|
+
export { getOauthToken, getOauthTokenFromOtherWindow } from './lib/api/oauth/token.js';
|
|
3
|
+
export { getAuthUser, updateAuthUser } from './lib/api/oauth/user.js';
|
|
4
4
|
export { downloadFile } from './lib/browser/download-file.js';
|
|
5
5
|
export { downloadJson } from './lib/browser/download-json.js';
|
|
6
6
|
export { readFile } from './lib/browser/read-file.js';
|
|
7
7
|
export { getVisiblePosition } from './lib/browser/get-visible-position.js';
|
|
8
8
|
export { getQueryValues } from './lib/browser/get-query-values.js';
|
|
9
9
|
export { execAnimation } from './lib/browser/exec-animation.js';
|
|
10
|
+
export { copyToClipboard } from './lib/browser/copy-to-clipboard.js';
|
|
11
|
+
export { extractQueries } from './lib/browser/extract-queries.js';
|
|
10
12
|
export { getColorFormat } from './lib/colors/get-color-format.js';
|
|
11
13
|
export { takeOpacityColors } from './lib/colors/take-opacity-colors.js';
|
|
12
14
|
export { transformHEXtoRGB } from './lib/colors/transform-hex-to-rgb.js';
|
|
@@ -25,9 +27,7 @@ export { isYesterday } from './lib/date/is-yesterday.js';
|
|
|
25
27
|
export { dateFormat } from './lib/date/date-format.js';
|
|
26
28
|
export { transformToDayjs } from './lib/date/transform-to-dayjs.js';
|
|
27
29
|
export { waitUntil } from './lib/utils/wait-until.js';
|
|
28
|
-
export { getByPath } from './lib/utils/get-by-path.js';
|
|
29
30
|
export { fieldViewFormat } from './lib/utils/field-view-format.js';
|
|
30
|
-
export { setByPath } from './lib/utils/set-by-path.js';
|
|
31
31
|
export { jsonParse } from './lib/utils/json-parse.js';
|
|
32
32
|
export { randomString } from './lib/utils/random-string.js';
|
|
33
33
|
export { wait } from './lib/utils/wait.js';
|
|
@@ -47,6 +47,7 @@ export { joinPaths } from './lib/utils/join-paths.js';
|
|
|
47
47
|
export { speedTest } from './lib/utils/speed-test.js';
|
|
48
48
|
export { createGlobalId } from './lib/utils/create-global-id.js';
|
|
49
49
|
export { createLocalIdGenerator } from './lib/utils/create-local-id-generator.js';
|
|
50
|
+
export { declination } from './lib/utils/declination.js';
|
|
50
51
|
export { checkType } from './lib/typings/check-type.js';
|
|
51
52
|
export { isArray } from './lib/typings/is-array.js';
|
|
52
53
|
export { isBoolean } from './lib/typings/is-boolean.js';
|
|
@@ -58,6 +59,17 @@ export { isObject } from './lib/typings/is-object.js';
|
|
|
58
59
|
export { isString } from './lib/typings/is-string.js';
|
|
59
60
|
export { isUndefined } from './lib/typings/is-undefined.js';
|
|
60
61
|
export { isDate } from './lib/typings/is-date.js';
|
|
62
|
+
export { isPrimitive } from './lib/typings/is-primitive.js';
|
|
63
|
+
export { getByPath } from './lib/lodash/get-by-path.js';
|
|
64
|
+
export { setByPath } from './lib/lodash/set-by-path.js';
|
|
65
|
+
export { cloneDeep } from './lib/lodash/clone-deep.js';
|
|
66
|
+
export { debounce } from './lib/lodash/debounce.js';
|
|
67
|
+
export { difference } from './lib/lodash/difference.js';
|
|
68
|
+
export { differenceBy } from './lib/lodash/difference-by.js';
|
|
69
|
+
export { differenceWith } from './lib/lodash/difference-with.js';
|
|
70
|
+
export { isEqual } from './lib/lodash/is-equal.js';
|
|
71
|
+
export { throttle } from './lib/lodash/throttle.js';
|
|
72
|
+
export { type } from './lib/lodash/type.js';
|
|
61
73
|
export { DATE_TYPES } from './constants/date.js';
|
|
62
74
|
export { API_MIDDLEWARES, POST_API_MIDDLEWARES } from './constants/api.js';
|
|
63
75
|
export { IS_BROWSER, IS_BUN, IS_DENO, IS_JEST, IS_NODE, IS_WEB_WORKER } from './constants/environment.js';
|
package/lib/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/lib/esm/lib/api/core.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { IS_BROWSER } from '../../constants/environment.js';
|
|
2
2
|
import { downloadFile } from '../browser/download-file.js';
|
|
3
3
|
import { isString } from '../typings/is-string.js';
|
|
4
|
-
import 'lodash/get';
|
|
5
4
|
import 'dayjs';
|
|
6
5
|
import '../date/is-today.js';
|
|
7
6
|
import '../date/is-tomorrow.js';
|
|
8
7
|
import '../date/is-yesterday.js';
|
|
9
|
-
import 'lodash/set';
|
|
10
8
|
import { wait } from '../utils/wait.js';
|
|
11
9
|
import { createURLWithParams } from '../utils/create-url-with-params.js';
|
|
10
|
+
import 'lodash/get';
|
|
11
|
+
import 'lodash/set';
|
|
12
12
|
import { RESPONSE_DATA_SYMBOL } from './constants.js';
|
|
13
13
|
import { generateMiddlewares, generatePostMiddlewares } from './middlewares/index.js';
|
|
14
14
|
|
|
@@ -1,22 +1,16 @@
|
|
|
1
1
|
import { API_MIDDLEWARES, POST_API_MIDDLEWARES } from '../../../constants/api.js';
|
|
2
2
|
import { IS_BROWSER, IS_JEST } from '../../../constants/environment.js';
|
|
3
|
-
import { generateAuthMiddleWare } from './auth-middleware.js';
|
|
4
|
-
import { generateAuthNoRefreshMiddleWare } from './auth-no-refresh-middleware.js';
|
|
5
3
|
import { generateConsoleMiddleware } from './console-middleware.js';
|
|
6
4
|
import { generateConsolePostMiddleware } from './console-post-middleware.js';
|
|
5
|
+
import { generateOauthMiddleware } from './oauth-middleware.js';
|
|
7
6
|
|
|
8
7
|
function generateMiddlewares(activeMiddlewares, middlewareOptions, customMiddlewares) {
|
|
9
8
|
const selectedMiddlewares = customMiddlewares;
|
|
10
9
|
for (const key of activeMiddlewares) {
|
|
11
10
|
switch (key) {
|
|
12
|
-
case API_MIDDLEWARES.
|
|
13
|
-
if (middlewareOptions.
|
|
14
|
-
selectedMiddlewares.push(
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
case API_MIDDLEWARES.AuthNoRefresh: {
|
|
18
|
-
if (middlewareOptions.authNoRefresh && (IS_BROWSER || IS_JEST))
|
|
19
|
-
selectedMiddlewares.push(generateAuthNoRefreshMiddleWare(middlewareOptions.authNoRefresh));
|
|
11
|
+
case API_MIDDLEWARES.Oauth: {
|
|
12
|
+
if (middlewareOptions.oauth && (IS_BROWSER || IS_JEST))
|
|
13
|
+
selectedMiddlewares.push(generateOauthMiddleware(middlewareOptions.oauth));
|
|
20
14
|
continue;
|
|
21
15
|
}
|
|
22
16
|
case API_MIDDLEWARES.Logger: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/lib/api/middlewares/index.ts"],"sourcesContent":["import type { Response as NodeResponse } from \"node-fetch\";\nimport { API_MIDDLEWARES, IS_BROWSER, IS_JEST, POST_API_MIDDLEWARES } from \"../../../constants\";\nimport type {\n ActiveMiddleware,\n ActivePostMiddleware,\n Middleware,\n MiddlewaresOptions,\n PostMiddleware,\n PostMiddlewareOptions,\n RequestInterface,\n} from \"../../../types\";\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/lib/api/middlewares/index.ts"],"sourcesContent":["import type { Response as NodeResponse } from \"node-fetch\";\nimport { API_MIDDLEWARES, IS_BROWSER, IS_JEST, POST_API_MIDDLEWARES } from \"../../../constants\";\nimport type {\n ActiveMiddleware,\n ActivePostMiddleware,\n Middleware,\n MiddlewaresOptions,\n PostMiddleware,\n PostMiddlewareOptions,\n RequestInterface,\n} from \"../../../types\";\nimport { generateConsoleMiddleware } from \"./console-middleware\";\nimport { generateConsolePostMiddleware } from \"./console-post-middleware\";\nimport { generateOauthMiddleware } from \"./oauth-middleware\";\n\nexport function generateMiddlewares(\n activeMiddlewares: ActiveMiddleware,\n middlewareOptions: MiddlewaresOptions,\n customMiddlewares: Middleware[],\n) {\n const selectedMiddlewares: Middleware[] = customMiddlewares;\n\n for (const key of activeMiddlewares) {\n switch (key) {\n case API_MIDDLEWARES.Oauth: {\n if (middlewareOptions.oauth && (IS_BROWSER || IS_JEST))\n selectedMiddlewares.push(generateOauthMiddleware(middlewareOptions.oauth));\n continue;\n }\n case API_MIDDLEWARES.Logger: {\n selectedMiddlewares.push(generateConsoleMiddleware(middlewareOptions.logger));\n continue;\n }\n default: {\n continue;\n }\n }\n }\n\n return function executeMiddlewares<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) {\n return new Promise((resolve) => {\n void (async () => {\n for (const middleware of selectedMiddlewares) {\n // eslint-disable-next-line no-await-in-loop\n await middleware(request);\n }\n\n resolve(1);\n })();\n });\n };\n}\n\nexport function generatePostMiddlewares(\n activePostMiddlewares: ActivePostMiddleware,\n postMiddlewaresOptions: PostMiddlewareOptions,\n customPostMiddlewares: PostMiddleware[],\n) {\n const selectedMiddlewares: PostMiddleware[] = customPostMiddlewares;\n\n for (const key of activePostMiddlewares) {\n switch (key) {\n case POST_API_MIDDLEWARES.Logger: {\n selectedMiddlewares.push(generateConsolePostMiddleware(postMiddlewaresOptions.logger));\n continue;\n }\n\n default: {\n continue;\n }\n }\n }\n\n return function executeMiddlewares(response: Response | NodeResponse | undefined) {\n return new Promise((resolve) => {\n void (async () => {\n for (const middleware of selectedMiddlewares) {\n // eslint-disable-next-line no-await-in-loop\n await middleware(response);\n }\n\n resolve(1);\n })();\n });\n };\n}\n"],"names":[],"mappings":";;;;;;SAegB,mBAAmB,CACjC,iBAAmC,EACnC,iBAAqC,EACrC,iBAA+B,EAAA;IAE/B,MAAM,mBAAmB,GAAiB,iBAAiB;AAE3D,IAAA,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE;QACnC,QAAQ,GAAG;AACT,YAAA,KAAK,eAAe,CAAC,KAAK,EAAE;gBAC1B,IAAI,iBAAiB,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,CAAC;oBACpD,mBAAmB,CAAC,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC5E;;AAEF,YAAA,KAAK,eAAe,CAAC,MAAM,EAAE;gBAC3B,mBAAmB,CAAC,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAC7E;;YAEF,SAAS;gBACP;;;;IAKN,OAAO,SAAS,kBAAkB,CAKhC,OAAyE,EAAA;AACzE,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,YAAW;AACf,gBAAA,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;;AAE5C,oBAAA,MAAM,UAAU,CAAC,OAAO,CAAC;;gBAG3B,OAAO,CAAC,CAAC,CAAC;aACX,GAAG;AACN,SAAC,CAAC;AACJ,KAAC;AACH;SAEgB,uBAAuB,CACrC,qBAA2C,EAC3C,sBAA6C,EAC7C,qBAAuC,EAAA;IAEvC,MAAM,mBAAmB,GAAqB,qBAAqB;AAEnE,IAAA,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE;QACvC,QAAQ,GAAG;AACT,YAAA,KAAK,oBAAoB,CAAC,MAAM,EAAE;gBAChC,mBAAmB,CAAC,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBACtF;;YAGF,SAAS;gBACP;;;;IAKN,OAAO,SAAS,kBAAkB,CAAC,QAA6C,EAAA;AAC9E,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,KAAK,CAAC,YAAW;AACf,gBAAA,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;;AAE5C,oBAAA,MAAM,UAAU,CAAC,QAAQ,CAAC;;gBAG5B,OAAO,CAAC,CAAC,CAAC;aACX,GAAG;AACN,SAAC,CAAC;AACJ,KAAC;AACH;;;;"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { waitUntil } from '../../utils/wait-until.js';
|
|
2
|
-
import 'lodash/get';
|
|
3
2
|
import '../../../constants/environment.js';
|
|
4
3
|
import 'dayjs';
|
|
5
4
|
import '../../date/is-today.js';
|
|
6
5
|
import '../../date/is-tomorrow.js';
|
|
7
6
|
import '../../date/is-yesterday.js';
|
|
7
|
+
import 'lodash/get';
|
|
8
8
|
import 'lodash/set';
|
|
9
9
|
import { startWith } from '../../utils/start-with.js';
|
|
10
|
-
import {
|
|
10
|
+
import { getOauthTokenFromOtherWindow } from '../oauth/token.js';
|
|
11
11
|
|
|
12
12
|
let isFetchingAccessToken = false;
|
|
13
|
-
const
|
|
13
|
+
const generateOauthMiddleware = (options) => async (request) => {
|
|
14
14
|
if (!options.oauthUrl || !options.expiresTokenStorageName || !options.errorUrl) {
|
|
15
15
|
throw new Error("Auth middleware hasn't required options");
|
|
16
16
|
}
|
|
@@ -26,12 +26,25 @@ const generateAuthNoRefreshMiddleWare = (options) => async (request) => {
|
|
|
26
26
|
if (isFetchingAccessToken)
|
|
27
27
|
await waitUntil(() => isFetchingAccessToken);
|
|
28
28
|
const expires = localStorage.getItem(options.expiresTokenStorageName);
|
|
29
|
+
let token;
|
|
29
30
|
if (!expires || Number.isNaN(+expires) || Date.now() > +expires) {
|
|
30
31
|
isFetchingAccessToken = true;
|
|
31
|
-
await (
|
|
32
|
+
await getOauthTokenFromOtherWindow({
|
|
33
|
+
onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,
|
|
34
|
+
onWindowOpenError: options.onWindowOpenError,
|
|
35
|
+
refreshTokenWindowUrl: options.refreshTokenWindowUrl,
|
|
36
|
+
wait: options.wait,
|
|
37
|
+
expiresTokenStorageName: options.expiresTokenStorageName,
|
|
38
|
+
closeObserveInterval: options.closeObserveInterval,
|
|
39
|
+
});
|
|
40
|
+
if (options.tokenRequest) {
|
|
41
|
+
token = await options.tokenRequest();
|
|
42
|
+
if (token != undefined && options.tokenStorageName) {
|
|
43
|
+
localStorage.setItem(options.tokenStorageName, token);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
32
46
|
isFetchingAccessToken = false;
|
|
33
47
|
}
|
|
34
|
-
const token = options.tokenStorageName ? localStorage.getItem(options.tokenStorageName) : null;
|
|
35
48
|
if (!isSameOrigin && token)
|
|
36
49
|
request.headers = {
|
|
37
50
|
...request.headers,
|
|
@@ -39,5 +52,5 @@ const generateAuthNoRefreshMiddleWare = (options) => async (request) => {
|
|
|
39
52
|
};
|
|
40
53
|
};
|
|
41
54
|
|
|
42
|
-
export {
|
|
43
|
-
//# sourceMappingURL=
|
|
55
|
+
export { generateOauthMiddleware };
|
|
56
|
+
//# sourceMappingURL=oauth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-middleware.js","sources":["../../../../../src/lib/api/middlewares/oauth-middleware.ts"],"sourcesContent":["import type { Middleware, OauthMiddleWareOptions } from \"../../../types\";\nimport { startWith, waitUntil } from \"../../utils\";\nimport { getOauthTokenFromOtherWindow } from \"../oauth\";\n\nlet isFetchingAccessToken = false;\n\nexport const generateOauthMiddleware =\n (options: OauthMiddleWareOptions): Middleware =>\n async (request) => {\n if (!options.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 let token: string | undefined | null;\n if (!expires || Number.isNaN(+expires) || Date.now() > +expires) {\n isFetchingAccessToken = true;\n await getOauthTokenFromOtherWindow({\n onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,\n onWindowOpenError: options.onWindowOpenError,\n refreshTokenWindowUrl: options.refreshTokenWindowUrl,\n wait: options.wait,\n expiresTokenStorageName: options.expiresTokenStorageName,\n closeObserveInterval: options.closeObserveInterval,\n });\n if (options.tokenRequest) {\n token = await options.tokenRequest();\n if (token != undefined && options.tokenStorageName) {\n localStorage.setItem(options.tokenStorageName, token);\n }\n }\n isFetchingAccessToken = false;\n }\n\n if (!isSameOrigin && token)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${token}`,\n };\n };\n"],"names":[],"mappings":";;;;;;;;;;;AAIA,IAAI,qBAAqB,GAAG,KAAK;AAE1B,MAAM,uBAAuB,GAClC,CAAC,OAA+B,KAChC,OAAO,OAAO,KAAI;AAChB,IAAA,IAAI,CAAC,OAAO,CAAC,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,KAAgC;AACpC,IAAA,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE;QAC/D,qBAAqB,GAAG,IAAI;AAC5B,QAAA,MAAM,4BAA4B,CAAC;YACjC,+BAA+B,EAAE,OAAO,CAAC,+BAA+B;YACxE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;YACpD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;YACxD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;AACnD,SAAA,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,YAAY,EAAE;AACxB,YAAA,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;YACpC,IAAI,KAAK,IAAI,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE;gBAClD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC;;;QAGzD,qBAAqB,GAAG,KAAK;;IAG/B,IAAI,CAAC,YAAY,IAAI,KAAK;QACxB,OAAO,CAAC,OAAO,GAAG;YAChB,GAAG,OAAO,CAAC,OAAO;YAClB,aAAa,EAAE,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA;SACjC;AACL;;;;"}
|
|
@@ -1,104 +1,66 @@
|
|
|
1
1
|
import '../../../constants/environment.js';
|
|
2
2
|
import { waitUntil } from '../../utils/wait-until.js';
|
|
3
|
-
import { getByPath } from '../../utils/get-by-path.js';
|
|
4
3
|
import 'dayjs';
|
|
5
4
|
import '../../date/is-today.js';
|
|
6
5
|
import '../../date/is-tomorrow.js';
|
|
7
6
|
import '../../date/is-yesterday.js';
|
|
8
7
|
import { isArray } from '../../typings/is-array.js';
|
|
9
|
-
import { isNumber } from '../../typings/is-number.js';
|
|
10
8
|
import { isString } from '../../typings/is-string.js';
|
|
11
|
-
import
|
|
12
|
-
import { isObject } from '../../typings/is-object.js';
|
|
13
|
-
import { isUndefined } from '../../typings/is-undefined.js';
|
|
9
|
+
import 'lodash/get';
|
|
14
10
|
import 'lodash/set';
|
|
15
11
|
import { getQueryValues } from '../../browser/get-query-values.js';
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
let waiting = false;
|
|
14
|
+
async function getOauthTokenFromOtherWindow(options) {
|
|
15
|
+
await waitUntil(() => waiting);
|
|
19
16
|
const expires = localStorage.getItem(options.expiresTokenStorageName);
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return void window.location.replace(typeof options.oauthUrl === "function" ? options.oauthUrl() : options.oauthUrl);
|
|
24
|
-
}
|
|
25
|
-
if (isUndefined(token)) {
|
|
26
|
-
return void window.location.replace(typeof options.errorUrl === "function" ? options.errorUrl() : options.errorUrl);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return token;
|
|
30
|
-
}
|
|
31
|
-
async function getAuthToken(options) {
|
|
32
|
-
let status = 0;
|
|
33
|
-
try {
|
|
34
|
-
const response = await fetch(options.authTokenUrl, {
|
|
35
|
-
method: "GET",
|
|
36
|
-
});
|
|
37
|
-
status = response.status;
|
|
38
|
-
if (!response.ok) {
|
|
39
|
-
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
40
|
-
}
|
|
41
|
-
const result = (await response.json());
|
|
42
|
-
try {
|
|
43
|
-
const { expires, token } = transformData(result, options.pathToToken, options.pathToTokenExpires);
|
|
44
|
-
localStorage.setItem(options.expiresTokenStorageName, expires);
|
|
45
|
-
localStorage.setItem(options.tokenStorageName, token);
|
|
46
|
-
return token;
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
return undefined;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
if (status >= 500)
|
|
54
|
-
return undefined;
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function transformData(data, pathToToken, pathToTokenExpires) {
|
|
59
|
-
if (!isObject(data))
|
|
60
|
-
throw new Error("Bad response data");
|
|
61
|
-
const token = getByPath(data, pathToToken);
|
|
62
|
-
const expiresToken = getByPath(data, pathToTokenExpires);
|
|
63
|
-
if ((!isString(expiresToken) && !isNumber(expiresToken)) || !isString(token))
|
|
64
|
-
throw new Error("Bad response data");
|
|
65
|
-
return {
|
|
66
|
-
expires: String(expiresToken),
|
|
67
|
-
token,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
async function getAuthTokenNoRefresh(options) {
|
|
71
|
-
let waiting = true;
|
|
17
|
+
if (expires != undefined && !Number.isNaN(+expires) && Date.now() < +expires)
|
|
18
|
+
return;
|
|
19
|
+
waiting = true;
|
|
72
20
|
const url = new URL(typeof options.refreshTokenWindowUrl === "function"
|
|
73
21
|
? options.refreshTokenWindowUrl()
|
|
74
22
|
: (options.refreshTokenWindowUrl ?? window.origin));
|
|
75
23
|
url.searchParams.append(options.onlyRefreshTokenWindowQueryName, "true");
|
|
76
24
|
let windowInstance = window.open(url.toString(), "_blank", "width=800,height=600,left=100,top=100");
|
|
77
|
-
windowInstance ??= window.open(url.toString());
|
|
78
|
-
if (
|
|
25
|
+
windowInstance ??= window.open(url.toString(), "_blank");
|
|
26
|
+
if (windowInstance) {
|
|
27
|
+
const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);
|
|
28
|
+
const windowCloseObserver = setInterval(() => {
|
|
29
|
+
if (windowInstance.closed) {
|
|
30
|
+
if (waiting) {
|
|
31
|
+
waiting = false;
|
|
32
|
+
channel.close();
|
|
33
|
+
clearInterval(windowCloseObserver);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}, options.closeObserveInterval ?? 500);
|
|
37
|
+
channel.onmessage = () => {
|
|
38
|
+
if (waiting) {
|
|
39
|
+
waiting = false;
|
|
40
|
+
channel.close();
|
|
41
|
+
clearInterval(windowCloseObserver);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
setTimeout(() => {
|
|
45
|
+
if (waiting) {
|
|
46
|
+
waiting = false;
|
|
47
|
+
channel.close();
|
|
48
|
+
clearInterval(windowCloseObserver);
|
|
49
|
+
}
|
|
50
|
+
if (windowInstance && !windowInstance.closed) {
|
|
51
|
+
windowInstance.close();
|
|
52
|
+
}
|
|
53
|
+
}, options.wait ?? 15000);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
79
56
|
if (options.onWindowOpenError)
|
|
80
57
|
options.onWindowOpenError();
|
|
58
|
+
waiting = false;
|
|
81
59
|
return;
|
|
82
60
|
}
|
|
83
|
-
const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);
|
|
84
|
-
channel.onmessage = () => {
|
|
85
|
-
if (waiting) {
|
|
86
|
-
waiting = false;
|
|
87
|
-
channel.close();
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
setTimeout(() => {
|
|
91
|
-
if (waiting) {
|
|
92
|
-
waiting = false;
|
|
93
|
-
channel.close();
|
|
94
|
-
}
|
|
95
|
-
if (windowInstance && !windowInstance.closed) {
|
|
96
|
-
windowInstance.close();
|
|
97
|
-
}
|
|
98
|
-
}, 15000);
|
|
99
61
|
await waitUntil(() => waiting);
|
|
100
62
|
}
|
|
101
|
-
function
|
|
63
|
+
function getOauthToken(options) {
|
|
102
64
|
let expires = localStorage.getItem(options.expiresTokenStorageName);
|
|
103
65
|
if (!expires || Number.isNaN(+expires) || Date.now() > +expires)
|
|
104
66
|
expires = null;
|
|
@@ -149,5 +111,5 @@ function updateAuthTokenNoRefresh(options) {
|
|
|
149
111
|
return expires;
|
|
150
112
|
}
|
|
151
113
|
|
|
152
|
-
export {
|
|
114
|
+
export { getOauthToken, getOauthTokenFromOtherWindow };
|
|
153
115
|
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sources":["../../../../../src/lib/api/oauth/token.ts"],"sourcesContent":["import type { GetOauthTokenFromOtherWindowOptions, GetOauthTokenOptions } from \"../../../types\";\nimport { getQueryValues } from \"../../browser\";\nimport { isArray, isString } from \"../../typings\";\nimport { waitUntil } from \"../../utils\";\n\nlet waiting = false;\n\nexport async function getOauthTokenFromOtherWindow(options: GetOauthTokenFromOtherWindowOptions) {\n await waitUntil(() => waiting);\n const expires: string | null | undefined = localStorage.getItem(options.expiresTokenStorageName);\n if (expires != undefined && !Number.isNaN(+expires) && Date.now() < +expires) return;\n\n waiting = true;\n const url = new URL(\n typeof options.refreshTokenWindowUrl === \"function\"\n ? options.refreshTokenWindowUrl()\n : (options.refreshTokenWindowUrl ?? window.origin),\n );\n url.searchParams.append(options.onlyRefreshTokenWindowQueryName, \"true\");\n\n let windowInstance = window.open(\n url.toString(),\n \"_blank\",\n \"width=800,height=600,left=100,top=100\",\n );\n windowInstance ??= window.open(url.toString(), \"_blank\");\n\n if (windowInstance) {\n const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);\n const windowCloseObserver = setInterval(() => {\n if (windowInstance.closed) {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n }\n }, options.closeObserveInterval ?? 500);\n channel.onmessage = () => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n };\n setTimeout(() => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n if (windowInstance && !windowInstance.closed) {\n windowInstance.close();\n }\n }, options.wait ?? 15000);\n } else {\n if (options.onWindowOpenError) options.onWindowOpenError();\n waiting = false;\n\n return;\n }\n\n await waitUntil(() => waiting);\n}\n\nexport function getOauthToken(options: GetOauthTokenOptions) {\n let expires: string | null | undefined = localStorage.getItem(options.expiresTokenStorageName);\n if (!expires || Number.isNaN(+expires) || Date.now() > +expires) expires = null;\n\n const queries = getQueryValues([\n options.expiresTokenQueryName,\n options.onlyRefreshTokenWindowQueryName,\n ]);\n const refreshQuery = queries?.[options.onlyRefreshTokenWindowQueryName];\n const expiresQuery = queries?.[options.expiresTokenQueryName];\n\n /** Is OnlyRefresh window */\n const isRefresh = isString(refreshQuery)\n ? refreshQuery === \"true\"\n : isArray(refreshQuery)\n ? refreshQuery[refreshQuery.length - 1] === \"true\"\n : false;\n /** Expires token */\n const expiresFromQuery = isString(expiresQuery)\n ? expiresQuery\n : isArray(expiresQuery)\n ? expiresQuery[expiresQuery.length - 1]\n : false;\n\n /** Extract expires from query */\n if (!expires && expiresFromQuery) {\n expires = expiresFromQuery;\n if (!expires || Number.isNaN(+expires) || Date.now() > +expires) expires = null;\n }\n\n /** OAuth flow if not expires */\n if (!expires) {\n window.location.replace(\n typeof options.oauthUrl === \"function\" ? options.oauthUrl() : options.oauthUrl,\n );\n\n return null;\n }\n\n localStorage.setItem(options.expiresTokenStorageName, expires);\n\n /** Close if OnlyRefresh window */\n if (isRefresh) {\n const channel = new BroadcastChannel(options.onlyRefreshTokenWindowQueryName);\n channel.postMessage(true);\n channel.close();\n window.close();\n }\n\n /** Delete expires query */\n if (expiresFromQuery) {\n const url = new URL(window.location.href);\n url.searchParams.delete(options.expiresTokenQueryName);\n window.location.replace(url.toString());\n\n return null;\n }\n\n return expires;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAKA,IAAI,OAAO,GAAG,KAAK;AAEZ,eAAe,4BAA4B,CAAC,OAA4C,EAAA;AAC7F,IAAA,MAAM,SAAS,CAAC,MAAM,OAAO,CAAC;IAC9B,MAAM,OAAO,GAA8B,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;AAChG,IAAA,IAAI,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO;QAAE;IAE9E,OAAO,GAAG,IAAI;IACd,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,OAAO,OAAO,CAAC,qBAAqB,KAAK;AACvC,UAAE,OAAO,CAAC,qBAAqB;WAC5B,OAAO,CAAC,qBAAqB,IAAI,MAAM,CAAC,MAAM,CAAC,CACrD;IACD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE,MAAM,CAAC;AAExE,IAAA,IAAI,cAAc,GAAG,MAAM,CAAC,IAAI,CAC9B,GAAG,CAAC,QAAQ,EAAE,EACd,QAAQ,EACR,uCAAuC,CACxC;AACD,IAAA,cAAc,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC;IAExD,IAAI,cAAc,EAAE;QAClB,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,+BAA+B,CAAC;AAC7E,QAAA,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAK;AAC3C,YAAA,IAAI,cAAc,CAAC,MAAM,EAAE;gBACzB,IAAI,OAAO,EAAE;oBACX,OAAO,GAAG,KAAK;oBACf,OAAO,CAAC,KAAK,EAAE;oBACf,aAAa,CAAC,mBAAmB,CAAC;;;AAGxC,SAAC,EAAE,OAAO,CAAC,oBAAoB,IAAI,GAAG,CAAC;AACvC,QAAA,OAAO,CAAC,SAAS,GAAG,MAAK;YACvB,IAAI,OAAO,EAAE;gBACX,OAAO,GAAG,KAAK;gBACf,OAAO,CAAC,KAAK,EAAE;gBACf,aAAa,CAAC,mBAAmB,CAAC;;AAEtC,SAAC;QACD,UAAU,CAAC,MAAK;YACd,IAAI,OAAO,EAAE;gBACX,OAAO,GAAG,KAAK;gBACf,OAAO,CAAC,KAAK,EAAE;gBACf,aAAa,CAAC,mBAAmB,CAAC;;AAEpC,YAAA,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;gBAC5C,cAAc,CAAC,KAAK,EAAE;;AAE1B,SAAC,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;;SACpB;QACL,IAAI,OAAO,CAAC,iBAAiB;YAAE,OAAO,CAAC,iBAAiB,EAAE;QAC1D,OAAO,GAAG,KAAK;QAEf;;AAGF,IAAA,MAAM,SAAS,CAAC,MAAM,OAAO,CAAC;AAChC;AAEM,SAAU,aAAa,CAAC,OAA6B,EAAA;IACzD,IAAI,OAAO,GAA8B,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;AAC9F,IAAA,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO;QAAE,OAAO,GAAG,IAAI;IAE/E,MAAM,OAAO,GAAG,cAAc,CAAC;AAC7B,QAAA,OAAO,CAAC,qBAAqB;AAC7B,QAAA,OAAO,CAAC,+BAA+B;AACxC,KAAA,CAAC;IACF,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,+BAA+B,CAAC;IACvE,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC;;AAG7D,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY;UACnC,YAAY,KAAK;AACnB,UAAE,OAAO,CAAC,YAAY;cAClB,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK;cAC1C,KAAK;;AAEX,IAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,YAAY;AAC5C,UAAE;AACF,UAAE,OAAO,CAAC,YAAY;cAClB,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;cACpC,KAAK;;AAGX,IAAA,IAAI,CAAC,OAAO,IAAI,gBAAgB,EAAE;QAChC,OAAO,GAAG,gBAAgB;AAC1B,QAAA,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO;YAAE,OAAO,GAAG,IAAI;;;IAIjF,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,CAAC,QAAQ,CAAC,OAAO,CACrB,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAC/E;AAED,QAAA,OAAO,IAAI;;IAGb,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;;IAG9D,IAAI,SAAS,EAAE;QACb,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,+BAA+B,CAAC;AAC7E,QAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;QACzB,OAAO,CAAC,KAAK,EAAE;QACf,MAAM,CAAC,KAAK,EAAE;;;IAIhB,IAAI,gBAAgB,EAAE;QACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACzC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC;QACtD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAEvC,QAAA,OAAO,IAAI;;AAGb,IAAA,OAAO,OAAO;AAChB;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sources":["../../../../../src/lib/api/oauth/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;;;;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { IS_BROWSER, IS_JEST } from '../../constants/environment.js';
|
|
2
|
+
|
|
3
|
+
function copyToClipboard(textToCopy) {
|
|
4
|
+
return new Promise((resolve) => {
|
|
5
|
+
if (!IS_BROWSER && !IS_JEST) {
|
|
6
|
+
resolve(false);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
if (navigator.clipboard && window.isSecureContext) {
|
|
11
|
+
navigator.clipboard
|
|
12
|
+
.writeText(textToCopy)
|
|
13
|
+
.then(() => resolve(true))
|
|
14
|
+
.catch(() => resolve(false));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const textArea = document.createElement("textarea");
|
|
18
|
+
textArea.value = textToCopy;
|
|
19
|
+
textArea.style.position = "fixed";
|
|
20
|
+
textArea.style.left = "-999999px";
|
|
21
|
+
textArea.style.top = "-999999px";
|
|
22
|
+
document.body.appendChild(textArea);
|
|
23
|
+
textArea.focus();
|
|
24
|
+
textArea.select();
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
26
|
+
const result = document.execCommand("copy");
|
|
27
|
+
textArea.remove();
|
|
28
|
+
resolve(result);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
resolve(false);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { copyToClipboard };
|
|
37
|
+
//# sourceMappingURL=copy-to-clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-to-clipboard.js","sources":["../../../../src/lib/browser/copy-to-clipboard.ts"],"sourcesContent":["import { IS_BROWSER, IS_JEST } from \"../../constants\";\n\nexport function copyToClipboard(textToCopy: string) {\n return new Promise<boolean>((resolve) => {\n if (!IS_BROWSER && !IS_JEST) {\n resolve(false);\n\n return;\n }\n\n try {\n if (navigator.clipboard && window.isSecureContext) {\n navigator.clipboard\n .writeText(textToCopy)\n .then(() => resolve(true))\n .catch(() => resolve(false));\n\n return;\n }\n\n const textArea = document.createElement(\"textarea\");\n textArea.value = textToCopy;\n textArea.style.position = \"fixed\";\n textArea.style.left = \"-999999px\";\n textArea.style.top = \"-999999px\";\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const result = document.execCommand(\"copy\");\n textArea.remove();\n\n resolve(result);\n } catch {\n resolve(false);\n }\n });\n}\n"],"names":[],"mappings":";;AAEM,SAAU,eAAe,CAAC,UAAkB,EAAA;AAChD,IAAA,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,KAAI;AACtC,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE;YAC3B,OAAO,CAAC,KAAK,CAAC;YAEd;;AAGF,QAAA,IAAI;YACF,IAAI,SAAS,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,EAAE;AACjD,gBAAA,SAAS,CAAC;qBACP,SAAS,CAAC,UAAU;qBACpB,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC;qBACxB,KAAK,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;gBAE9B;;YAGF,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AACnD,YAAA,QAAQ,CAAC,KAAK,GAAG,UAAU;AAC3B,YAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AACjC,YAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,WAAW;AACjC,YAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW;AAChC,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YACnC,QAAQ,CAAC,KAAK,EAAE;YAChB,QAAQ,CAAC,MAAM,EAAE;;YAGjB,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;YAC3C,QAAQ,CAAC,MAAM,EAAE;YAEjB,OAAO,CAAC,MAAM,CAAC;;AACf,QAAA,MAAM;YACN,OAAO,CAAC,KAAK,CAAC;;AAElB,KAAC,CAAC;AACJ;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { IS_BROWSER, IS_JEST } from '../../constants/environment.js';
|
|
2
|
-
import 'lodash/get';
|
|
3
2
|
import 'dayjs';
|
|
4
3
|
import '../date/is-today.js';
|
|
5
4
|
import '../date/is-tomorrow.js';
|
|
6
5
|
import '../date/is-yesterday.js';
|
|
6
|
+
import 'lodash/get';
|
|
7
7
|
import 'lodash/set';
|
|
8
8
|
import { getFileNameFromHeader } from '../utils/get-file-name-from-header.js';
|
|
9
9
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { IS_BROWSER, IS_JEST } from '../../constants/environment.js';
|
|
2
|
+
|
|
3
|
+
function extractQueries() {
|
|
4
|
+
const queryMap = {};
|
|
5
|
+
if (!IS_BROWSER && !IS_JEST)
|
|
6
|
+
return queryMap;
|
|
7
|
+
const queryString = document.location.search;
|
|
8
|
+
queryString
|
|
9
|
+
.replace(/^\?/, "")
|
|
10
|
+
.split("&")
|
|
11
|
+
.forEach((query) => {
|
|
12
|
+
const [key, value] = query.split("=", 2);
|
|
13
|
+
queryMap[key] ??= [];
|
|
14
|
+
const prev = queryMap[key];
|
|
15
|
+
prev.push(value);
|
|
16
|
+
});
|
|
17
|
+
return queryMap;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { extractQueries };
|
|
21
|
+
//# sourceMappingURL=extract-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-queries.js","sources":["../../../../src/lib/browser/extract-queries.ts"],"sourcesContent":["import { IS_BROWSER, IS_JEST } from \"../../constants\";\n\nexport function extractQueries() {\n const queryMap: Record<string, string[] | undefined> = {};\n if (!IS_BROWSER && !IS_JEST) return queryMap;\n\n const queryString = document.location.search;\n queryString\n .replace(/^\\?/, \"\")\n .split(\"&\")\n .forEach((query) => {\n const [key, value] = query.split(\"=\", 2);\n\n queryMap[key] ??= [];\n const prev = queryMap[key];\n prev.push(value);\n });\n\n return queryMap;\n}\n"],"names":[],"mappings":";;SAEgB,cAAc,GAAA;IAC5B,MAAM,QAAQ,GAAyC,EAAE;AACzD,IAAA,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,QAAQ;AAE5C,IAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM;IAC5C;AACG,SAAA,OAAO,CAAC,KAAK,EAAE,EAAE;SACjB,KAAK,CAAC,GAAG;AACT,SAAA,OAAO,CAAC,CAAC,KAAK,KAAI;AACjB,QAAA,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AAExC,QAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE;AACpB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,KAAC,CAAC;AAEJ,IAAA,OAAO,QAAQ;AACjB;;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { isPrimitive } from '../typings/is-primitive.js';
|
|
2
|
+
import { type } from './type.js';
|
|
3
|
+
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
5
|
+
function cloneDeep(value, map) {
|
|
6
|
+
map ??= new Map();
|
|
7
|
+
// this avoids the slower switch with a quick if decision removing some milliseconds in each run.
|
|
8
|
+
if (isPrimitive(value)) {
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function copy(copiedValue) {
|
|
12
|
+
// Check for circular and same references on the object graph and return its corresponding clone.
|
|
13
|
+
const cachedCopy = map.get(value);
|
|
14
|
+
if (cachedCopy) {
|
|
15
|
+
return cachedCopy;
|
|
16
|
+
}
|
|
17
|
+
map.set(value, copiedValue);
|
|
18
|
+
for (const key in value) {
|
|
19
|
+
if (Object.hasOwn(value, key)) {
|
|
20
|
+
copiedValue[key] = cloneDeep(value[key], map);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return copiedValue;
|
|
24
|
+
}
|
|
25
|
+
switch (type(value)) {
|
|
26
|
+
case "Object":
|
|
27
|
+
return copy(Object.create(Object.getPrototypeOf(value)));
|
|
28
|
+
case "Array":
|
|
29
|
+
return copy(Array(value.length));
|
|
30
|
+
case "Date":
|
|
31
|
+
return new Date(value.valueOf());
|
|
32
|
+
case "RegExp":
|
|
33
|
+
return cloneRegExp(value);
|
|
34
|
+
case "Int8Array":
|
|
35
|
+
case "Uint8Array":
|
|
36
|
+
case "Uint8ClampedArray":
|
|
37
|
+
case "Int16Array":
|
|
38
|
+
case "Uint16Array":
|
|
39
|
+
case "Int32Array":
|
|
40
|
+
case "Uint32Array":
|
|
41
|
+
case "Float32Array":
|
|
42
|
+
case "Float64Array":
|
|
43
|
+
case "BigInt64Array":
|
|
44
|
+
case "BigUint64Array":
|
|
45
|
+
return value.slice();
|
|
46
|
+
default:
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function cloneRegExp(pattern) {
|
|
51
|
+
return new RegExp(pattern.source, pattern.flags
|
|
52
|
+
? pattern.flags
|
|
53
|
+
: (pattern.global ? "g" : "") +
|
|
54
|
+
(pattern.ignoreCase ? "i" : "") +
|
|
55
|
+
(pattern.multiline ? "m" : "") +
|
|
56
|
+
(pattern.sticky ? "y" : "") +
|
|
57
|
+
(pattern.unicode ? "u" : "") +
|
|
58
|
+
(pattern.dotAll ? "s" : ""));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { cloneDeep };
|
|
62
|
+
//# sourceMappingURL=clone-deep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-deep.js","sources":["../../../../src/lib/lodash/clone-deep.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { isPrimitive } from \"../typings\";\nimport { type } from \"./type\";\n\nexport function cloneDeep(value: unknown, map?: Map<unknown, unknown>) {\n map ??= new Map();\n\n // this avoids the slower switch with a quick if decision removing some milliseconds in each run.\n if (isPrimitive(value)) {\n return value;\n }\n\n function copy(copiedValue: object) {\n // Check for circular and same references on the object graph and return its corresponding clone.\n const cachedCopy = map!.get(value);\n\n if (cachedCopy) {\n return cachedCopy;\n }\n\n map!.set(value, copiedValue);\n\n for (const key in value as object) {\n if (Object.hasOwn(value as object, key)) {\n (copiedValue as Record<string, unknown>)[key] = cloneDeep(\n (value as Record<string, unknown>)[key],\n map,\n );\n }\n }\n\n return copiedValue;\n }\n\n switch (type(value)) {\n case \"Object\":\n return copy(Object.create(Object.getPrototypeOf(value) as object) as object);\n case \"Array\":\n return copy(Array((value as unknown[]).length));\n case \"Date\":\n return new Date((value as Date).valueOf());\n case \"RegExp\":\n return cloneRegExp(value as RegExp);\n case \"Int8Array\":\n case \"Uint8Array\":\n case \"Uint8ClampedArray\":\n case \"Int16Array\":\n case \"Uint16Array\":\n case \"Int32Array\":\n case \"Uint32Array\":\n case \"Float32Array\":\n case \"Float64Array\":\n case \"BigInt64Array\":\n case \"BigUint64Array\":\n return (value as Int8Array).slice();\n default:\n return value;\n }\n}\n\nfunction cloneRegExp(pattern: RegExp) {\n return new RegExp(\n pattern.source,\n pattern.flags\n ? pattern.flags\n : (pattern.global ? \"g\" : \"\") +\n (pattern.ignoreCase ? \"i\" : \"\") +\n (pattern.multiline ? \"m\" : \"\") +\n (pattern.sticky ? \"y\" : \"\") +\n (pattern.unicode ? \"u\" : \"\") +\n (pattern.dotAll ? \"s\" : \"\"),\n );\n}\n"],"names":[],"mappings":";;;AAAA;AAIgB,SAAA,SAAS,CAAC,KAAc,EAAE,GAA2B,EAAA;AACnE,IAAA,GAAG,KAAK,IAAI,GAAG,EAAE;;AAGjB,IAAA,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK;;IAGd,SAAS,IAAI,CAAC,WAAmB,EAAA;;QAE/B,MAAM,UAAU,GAAG,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAElC,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,UAAU;;AAGnB,QAAA,GAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;AAE5B,QAAA,KAAK,MAAM,GAAG,IAAI,KAAe,EAAE;YACjC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAe,EAAE,GAAG,CAAC,EAAE;AACtC,gBAAA,WAAuC,CAAC,GAAG,CAAC,GAAG,SAAS,CACtD,KAAiC,CAAC,GAAG,CAAC,EACvC,GAAG,CACJ;;;AAIL,QAAA,OAAO,WAAW;;AAGpB,IAAA,QAAQ,IAAI,CAAC,KAAK,CAAC;AACjB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAW,CAAW,CAAC;AAC9E,QAAA,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,KAAK,CAAE,KAAmB,CAAC,MAAM,CAAC,CAAC;AACjD,QAAA,KAAK,MAAM;YACT,OAAO,IAAI,IAAI,CAAE,KAAc,CAAC,OAAO,EAAE,CAAC;AAC5C,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,WAAW,CAAC,KAAe,CAAC;AACrC,QAAA,KAAK,WAAW;AAChB,QAAA,KAAK,YAAY;AACjB,QAAA,KAAK,mBAAmB;AACxB,QAAA,KAAK,YAAY;AACjB,QAAA,KAAK,aAAa;AAClB,QAAA,KAAK,YAAY;AACjB,QAAA,KAAK,aAAa;AAClB,QAAA,KAAK,cAAc;AACnB,QAAA,KAAK,cAAc;AACnB,QAAA,KAAK,eAAe;AACpB,QAAA,KAAK,gBAAgB;AACnB,YAAA,OAAQ,KAAmB,CAAC,KAAK,EAAE;AACrC,QAAA;AACE,YAAA,OAAO,KAAK;;AAElB;AAEA,SAAS,WAAW,CAAC,OAAe,EAAA;IAClC,OAAO,IAAI,MAAM,CACf,OAAO,CAAC,MAAM,EACd,OAAO,CAAC;UACJ,OAAO,CAAC;AACV,UAAE,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE;aACzB,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC;aAC9B,OAAO,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC;aAC7B,OAAO,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC;aAC1B,OAAO,CAAC,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;AAC5B,aAAC,OAAO,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,CAChC;AACH;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
function debounce({ delay }, func) {
|
|
3
|
+
let timer;
|
|
4
|
+
let active = true;
|
|
5
|
+
const debounced = (...args) => {
|
|
6
|
+
if (active) {
|
|
7
|
+
clearTimeout(timer);
|
|
8
|
+
timer = setTimeout(() => {
|
|
9
|
+
if (active) {
|
|
10
|
+
func(...args);
|
|
11
|
+
}
|
|
12
|
+
timer = undefined;
|
|
13
|
+
}, delay);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
func(...args);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
debounced.isPending = () => {
|
|
20
|
+
return timer !== undefined;
|
|
21
|
+
};
|
|
22
|
+
debounced.cancel = () => {
|
|
23
|
+
active = false;
|
|
24
|
+
};
|
|
25
|
+
debounced.flush = (...args) => {
|
|
26
|
+
func(...args);
|
|
27
|
+
};
|
|
28
|
+
return debounced;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { debounce };
|
|
32
|
+
//# sourceMappingURL=debounce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.js","sources":["../../../../src/lib/lodash/debounce.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function debounce<TArgs extends any[]>(\n { delay }: { delay: number },\n func: (...args: TArgs) => any,\n) {\n let timer: NodeJS.Timeout | undefined;\n let active = true;\n\n const debounced = (...args: TArgs) => {\n if (active) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n if (active) {\n func(...args);\n }\n timer = undefined;\n }, delay);\n } else {\n func(...args);\n }\n };\n debounced.isPending = () => {\n return timer !== undefined;\n };\n debounced.cancel = () => {\n active = false;\n };\n debounced.flush = (...args: TArgs) => {\n func(...args);\n };\n\n return debounced;\n}\n"],"names":[],"mappings":"AAAA;SACgB,QAAQ,CACtB,EAAE,KAAK,EAAqB,EAC5B,IAA6B,EAAA;AAE7B,IAAA,IAAI,KAAiC;IACrC,IAAI,MAAM,GAAG,IAAI;AAEjB,IAAA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAW,KAAI;QACnC,IAAI,MAAM,EAAE;YACV,YAAY,CAAC,KAAK,CAAC;AACnB,YAAA,KAAK,GAAG,UAAU,CAAC,MAAK;gBACtB,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,GAAG,IAAI,CAAC;;gBAEf,KAAK,GAAG,SAAS;aAClB,EAAE,KAAK,CAAC;;aACJ;AACL,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC;;AAEjB,KAAC;AACD,IAAA,SAAS,CAAC,SAAS,GAAG,MAAK;QACzB,OAAO,KAAK,KAAK,SAAS;AAC5B,KAAC;AACD,IAAA,SAAS,CAAC,MAAM,GAAG,MAAK;QACtB,MAAM,GAAG,KAAK;AAChB,KAAC;AACD,IAAA,SAAS,CAAC,KAAK,GAAG,CAAC,GAAG,IAAW,KAAI;AACnC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC;AACf,KAAC;AAED,IAAA,OAAO,SAAS;AAClB;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function differenceBy(first, second, key) {
|
|
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][key]);
|
|
7
|
+
}
|
|
8
|
+
while (idx < first.length) {
|
|
9
|
+
if (!toFilterOut.has(first[idx][key])) {
|
|
10
|
+
out.push(first[idx]);
|
|
11
|
+
}
|
|
12
|
+
idx += 1;
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { differenceBy };
|
|
18
|
+
//# sourceMappingURL=difference-by.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"difference-by.js","sources":["../../../../src/lib/lodash/difference-by.ts"],"sourcesContent":["export function differenceBy<T extends Record<string, unknown>>(\n first: T[],\n second: T[],\n key: keyof T,\n): T[] {\n let idx = 0;\n const out = [];\n const toFilterOut = new Set();\n\n for (let i = 0; i < second.length; i += 1) {\n toFilterOut.add(second[i][key]);\n }\n\n while (idx < first.length) {\n if (!toFilterOut.has(first[idx][key])) {\n out.push(first[idx]);\n }\n idx += 1;\n }\n\n return out;\n}\n"],"names":[],"mappings":"SAAgB,YAAY,CAC1B,KAAU,EACV,MAAW,EACX,GAAY,EAAA;IAEZ,IAAI,GAAG,GAAG,CAAC;IACX,MAAM,GAAG,GAAG,EAAE;AACd,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,GAAG,CAAC,CAAC;;AAGjC,IAAA,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;YACrC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;QAEtB,GAAG,IAAI,CAAC;;AAGV,IAAA,OAAO,GAAG;AACZ;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function differenceWith(first, second, extractPrimitive) {
|
|
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(extractPrimitive(second[i]));
|
|
7
|
+
}
|
|
8
|
+
while (idx < first.length) {
|
|
9
|
+
if (!toFilterOut.has(extractPrimitive(first[idx]))) {
|
|
10
|
+
out.push(first[idx]);
|
|
11
|
+
}
|
|
12
|
+
idx += 1;
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { differenceWith };
|
|
18
|
+
//# sourceMappingURL=difference-with.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"difference-with.js","sources":["../../../../src/lib/lodash/difference-with.ts"],"sourcesContent":["export function differenceWith<T = unknown>(\n first: T[],\n second: T[],\n extractPrimitive: (el: T) => string | number | boolean | undefined | null,\n): T[] {\n let idx = 0;\n const out = [];\n const toFilterOut = new Set();\n\n for (let i = 0; i < second.length; i += 1) {\n toFilterOut.add(extractPrimitive(second[i]));\n }\n\n while (idx < first.length) {\n if (!toFilterOut.has(extractPrimitive(first[idx]))) {\n out.push(first[idx]);\n }\n idx += 1;\n }\n\n return out;\n}\n"],"names":[],"mappings":"SAAgB,cAAc,CAC5B,KAAU,EACV,MAAW,EACX,gBAAyE,EAAA;IAEzE,IAAI,GAAG,GAAG,CAAC;IACX,MAAM,GAAG,GAAG,EAAE;AACd,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,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;AAG9C,IAAA,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAClD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;QAEtB,GAAG,IAAI,CAAC;;AAGV,IAAA,OAAO,GAAG;AACZ;;;;"}
|